def test_changed_introduced_at(self): old, _, _ = self.get_metadata(module='old', code=""" from acceptable import * service = AcceptableService('myservice', 'group') api = service.api('/', 'api', introduced_at=1) @api def view(): "Docs" """) new, locations, _ = self.get_metadata(module='new', code=""" from acceptable import * service = AcceptableService('myservice', 'group') api = service.api('/', 'api', introduced_at=2) @api def view(): "Docs" """) msgs = list(lint.metadata_lint(old, new, locations)) self.assertEqual(msgs[0].level, lint.ERROR) self.assertEqual('introduced_at', msgs[0].name) self.assertIn('changed from 1 to 2', msgs[0].msg) # new api shouldn't warn about introduced at msgs = list(lint.metadata_lint({}, new, locations)) self.assertEqual(0, len(msgs))
def test_missing_api_documentation(self): metadata, locations, path = self.get_metadata(""" from acceptable import * service = AcceptableService('myservice', 'group') api = service.api('/', 'api', introduced_at=1) @api def view(): pass """) msgs = list(lint.metadata_lint(metadata, metadata, locations)) self.assertEqual(msgs[0].level, lint.WARNING) self.assertEqual('doc', msgs[0].name), self.assertEqual('api', msgs[0].api_name), self.assertEqual(msgs[0].location['filename'], path) self.assertEqual(msgs[0].location['lineno'], 6) # test with new api msgs = list(lint.metadata_lint({}, metadata, locations)) self.assertEqual(msgs[0].level, lint.ERROR) self.assertEqual('doc', msgs[0].name), self.assertEqual('api', msgs[0].api_name), self.assertEqual(msgs[0].location['filename'], path) self.assertEqual(msgs[0].location['lineno'], 6)
def test_url_changed_is_error(self): old, _, _ = self.get_metadata(module='old', code=""" from acceptable import * service = AcceptableService('myservice', 'group') api = service.api('/', 'api', introduced_at=1) @api def view(): "Docs" """) new, locations, _ = self.get_metadata(module='new', code=""" from acceptable import * service = AcceptableService('myservice', 'group') api = service.api('/other', 'api', introduced_at=1) @api def view(): "Docs" """) msgs = list(lint.metadata_lint(old, new, locations)) self.assertEqual(msgs[0].level, lint.ERROR) self.assertEqual('url', msgs[0].name) self.assertIn('/other', msgs[0].msg)
def test_schema_removed_is_error(self): old, _, _ = self.get_metadata(module='old', code=""" from acceptable import * service = AcceptableService('myservice', 'group') api = service.api('/other', 'api', introduced_at=1) api.request_schema = { 'type': 'object', 'properties': { 'context': {'type': 'string', 'description': 'Context'} }, 'required': ['context'] } @api def view(): "Docs" """) new, locations, _ = self.get_metadata(module='new', code=""" from acceptable import * service = AcceptableService('myservice', 'group') api = service.api('/other', 'api', introduced_at=1) @api def view(): "Docs" """) self.assertEqual( ['Request schema removed'], [i.msg for i in lint.metadata_lint(old, new, locations)])
def test_method_added_is_ok(self): old, _, _ = self.get_metadata(module='old', code=""" from acceptable import * service = AcceptableService('myservice', 'group') api = service.api('/', 'api', introduced_at=1) @api def view(): "Docs" """) new, locations, _ = self.get_metadata(module='new', code=""" from acceptable import * service = AcceptableService('myservice', 'group') api = service.api( '/', 'api', introduced_at=1, methods=['GET', 'POST']) @api def view(): "Docs" """) self.assertEqual([], list(lint.metadata_lint(old, new, locations)))
def lint_cmd(cli_args, stream=sys.stdout): metadata = load_metadata(cli_args.metadata) import_metadata(cli_args.modules) current, locations = get_metadata().serialize() has_errors = False display_level = lint.WARNING error_level = lint.DOCUMENTATION if cli_args.strict: display_level = lint.WARNING error_level = lint.WARNING elif cli_args.quiet: display_level = lint.DOCUMENTATION for message in lint.metadata_lint(metadata, current, locations): if message.level >= display_level: stream.write('{}\n'.format(message)) if message.level >= error_level: has_errors = True if cli_args.update: if not has_errors or cli_args.force: with open(cli_args.metadata.name, 'w') as f: json.dump(current, f, indent=2) return 1 if has_errors else 0
def test_new_api_introduced_at_enforced(self): old, _, _ = self.get_metadata(module='old', code=""" from acceptable import AcceptableService service = AcceptableService('myservice', 'group') api1 = service.api('/api1', 'api1', introduced_at=1) @api1 def view(): "Docs" """) new, locations, _ = self.get_metadata(module='new', code=""" from acceptable import AcceptableService service = AcceptableService('myservice', 'group') api1 = service.api('/api1', 'api1', introduced_at=1) @api1 def view1(): "Docs" api2 = service.api('/api2', 'api2', introduced_at=1) @api2 def view2(): "Docs" """) self.assertEqual( ['introduced_at should be > 1'], [i.msg for i in lint.metadata_lint(old, new, locations)] )
def test_changelog_required_for_revision_new_api(self): old, _, _ = self.get_metadata(module='old', code=""" """) new, locations, _ = self.get_metadata(module='new', code=""" from acceptable import * service = AcceptableService('myservice', 'group') api = service.api('/other', 'api', introduced_at=1) api.request_schema = { 'type': 'object', 'properties': { 'context': { 'type': 'string', 'introduced_at': 2, 'description': 'Context' } }, } @api def view(): "Docs" """) self.assertEqual( ['No changelog entry for revision 2'], [i.msg for i in lint.metadata_lint(old, new, locations)])
def test_not_modify(self): metadata, locations, path = self.get_metadata(""" from acceptable import * service = AcceptableService('myservice', 'group') api = service.api('/', 'api') @api def view(): "Docs" """) self.assertIn('$version', metadata) orig = metadata.copy() list(lint.metadata_lint(metadata, metadata, locations)) self.assertEqual(metadata, orig)
def test_missing_introduced_at(self): metadata, locations, path = self.get_metadata(""" from acceptable import * service = AcceptableService('myservice', 'group') api = service.api('/', 'api') @api def view(): "Docs" """) msgs = list(lint.metadata_lint({}, metadata, locations)) self.assertEqual(msgs[0].level, lint.ERROR) self.assertEqual('introduced_at', msgs[0].name), self.assertEqual('api', msgs[0].api_name), self.assertEqual(msgs[0].location['filename'], path) self.assertEqual(msgs[0].location['lineno'], 3)