diff --git a/_tests/test_validate.py b/_tests/test_validate.py index 851597d..bc5d82b 100644 --- a/_tests/test_validate.py +++ b/_tests/test_validate.py @@ -282,6 +282,46 @@ def test_invalidJSONDataAndPath(self): errors ) + @patch('os.path.basename', return_value="invalid addon id") + def test_invalidAddonIdFormat_spaces(self, mock_basename): + """ Error when submission does not include correct addonId format + """ + self.submissionData['addonId'] = "invalid addon id" + self.manifest['name'] = "invalid addon id" + errors = list( + validate.checkAddonId(self.manifest, VALID_SUBMISSION_JSON_FILE, self.submissionData) + ) + + self.assertEqual( + [ # expected errors + "Submission data 'addonId' field does not match the expected format:" + " must start and end with a letter, and contain only letters," + " numbers, and hyphens. " + "ID: invalid addon id" + ], + errors + ) + + @patch('os.path.basename', return_value="1invalid-addon-id") + def test_invalidAddonIdFormat_invalidStartChar(self, mock_basename): + """ Error when submission does not include correct addonId format + """ + self.submissionData['addonId'] = "1invalid-addon-id" + self.manifest['name'] = "1invalid-addon-id" + errors = list( + validate.checkAddonId(self.manifest, VALID_SUBMISSION_JSON_FILE, self.submissionData) + ) + + self.assertEqual( + [ # expected errors + "Submission data 'addonId' field does not match the expected format:" + " must start and end with a letter, and contain only letters," + " numbers, and hyphens. " + "ID: 1invalid-addon-id" + ], + errors + ) + @dataclass class VersionNumber: diff --git a/_validate/validate.py b/_validate/validate.py index f9916cc..2011bc8 100644 --- a/_validate/validate.py +++ b/_validate/validate.py @@ -180,6 +180,13 @@ def checkAddonId( "Submission data 'addonId' field does not match 'name' field in addon manifest:" f" {expectedName} vs {submission['addonId']}" ) + if not re.match(r"^[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9]$", expectedName): + yield ( + "Submission data 'addonId' field does not match the expected format:" + " must start and end with a letter, and contain only letters," + " numbers, and hyphens. " + f"ID: {submission['addonId']}" + ) VERSION_PARSE = re.compile(r"^(\d+)(?:$|(?:\.(\d+)$)|(?:\.(\d+)\.(\d+)$))")