def test_node_json_validation(self): node = { '@context': OPENBADGES_CONTEXT_V2_URI, 'id': 'http://example.com/1', 'type': 'Assertion', 'schema:location': { '@context': 'https://w3id.org/openbadges/extensions/geoCoordinatesExtension/context.json', 'type': ['Extension', 'extensions:GeoCoordinates'], 'description': 'That place in the woods where we built the fort', 'schema:geo': { 'schema:latitude': 44.580900, 'schema:longitude': -123.301815 } } } loader = CachableDocumentLoader(use_cache=True) loader.session.cache.remove_old_entries(datetime.datetime.utcnow()) loader.contexts = set() options = {'jsonld_options': {'documentLoader': loader}} set_up_context_mock() loader(OPENBADGES_CONTEXT_V2_URI) schema_url = list(GeoLocation.validation_schema)[0] responses.add(responses.GET, GeoLocation.context_url, status=200, json=GeoLocation.context_json) loader(GeoLocation.context_url) responses.add(responses.GET, schema_url, status=200, json=GeoLocation.validation_schema[schema_url]) loader.session.get(schema_url) state = INITIAL_STATE task = add_task(INTAKE_JSON, data=json.dumps(node), node_id=node['id']) result, message, actions = task_named(INTAKE_JSON)(state, task, **options) state = main_reducer(state, actions[0]) result, message, actions = task_named(actions[1]['name'])( state, actions[1], **options) # JSONLD_COMPACT_DATE state = main_reducer(state, actions[0]) # ADD_NODE task_meta = actions[1] # VALIDATE_EXTENSION_NODE result, message, actions = validate_extension_node(state, task_meta) self.assertTrue(result, "A valid expression of the extension should pass") self.assertIn('validated on node', message) self.assertEqual(len(actions), 0) del state['graph'][0]['schema:location']['schema:geo'][ 'schema:latitude'] result, message, actions = validate_extension_node(state, task_meta) self.assertFalse( result, "A required property not present should be detected by JSON-schema." )
def test_validation_breaks_down_multiple_extensions(self): self.load_mocks() # Load up ApplyLink schema and context responses.add(responses.GET, ApplyLink.context_url, status=200, json=ApplyLink.context_json) self.options['jsonld_options']['documentLoader'](ApplyLink.context_url) schema_url = list(ApplyLink.validation_schema)[0] responses.add(responses.GET, schema_url, status=200, json=ApplyLink.validation_schema[schema_url]) self.options['jsonld_options']['documentLoader'].session.get( schema_url) self.state['graph'][0]['extensions:exampleExtension']['type'].append( 'extensions:ApplyLink') task_meta = self.validation_task.copy() task_meta['context_urls'].append(ApplyLink.context_url) task_meta['types_to_test'].append('extensions:ApplyLink') result, message, actions = validate_extension_node( self.state, task_meta, **self.options) self.assertTrue(result, "Task breakdown should succeed.") self.assertIn('Multiple extension types', message) self.assertEqual(len(actions), 2) self.assertTrue( all(a['name'] == VALIDATE_EXTENSION_SINGLE for a in actions), 'All tasks created should be of correct type') for action in actions: aresult, amessage, aactions = validate_extension_node( self.state, task_meta, **self.options) self.assertTrue(aresult)
def test_queue_validation_on_unknown_extension(self): set_up_context_mock() self.set_up_test_extension() first_node_json = { '@context': OPENBADGES_CONTEXT_V2_URI, 'id': 'http://example.org/assertion', 'extensions:exampleExtension': { '@context': self.extension_context_url, 'type': ['Extension', 'extensions:UnknownExtension'], 'unknownProperty': 'I\'m a property, short and sweet' }, 'evidence': 'http://example.org/evidence' } state = INITIAL_STATE task_meta = add_task( INTAKE_JSON, data=json.dumps(first_node_json), node_id=first_node_json['id']) result, message, actions = task_named(INTAKE_JSON)(state, task_meta) for action in actions: state = main_reducer(state, action) # Compact JSON result, message, actions = task_named(state['tasks'][0]['name'])(state, state['tasks'][0]) self.assertEqual(len(actions), 3) state = main_reducer(state, actions[0]) validation_action = actions[1] result, message, actions = validate_extension_node(state, validation_action) self.assertTrue(result)
def test_validate_extension_node_basic(self): self.load_mocks() task_meta = self.validation_task result, message, actions = validate_extension_node(self.state, task_meta, **self.options) self.assertTrue(result, "A valid expression of the extension should pass") self.assertIn('validated on node', message) self.assertEqual(len(actions), 0)
def test_validate_extension_node_invalid(self): self.load_mocks() task_meta = self.validation_task # String value is required, we'll try a number self.state['graph'][0]['extensions:exampleExtension']['schema:text'] = 1337 result, message, actions = validate_extension_node(self.state, task_meta, **self.options) self.assertFalse(result, "An invalid expression of a rule in schema should fail") self.assertIn('did not validate', message) self.assertEqual(len(actions), 0)
def test_report_message_on_unknown_extension(self): first_node = { 'id': 'http://example.org/assertion', 'extensions:exampleExtension': '_:b0', 'evidence': '_:b1' } extension = { 'id': '_:b0', 'type': ['Extension', 'extensions:UnknownExtension'], 'schema:unknownProperty': 'I\'m a property, short and sweet' } state = {'graph': [first_node, extension]} task_meta = add_task(VALIDATE_EXTENSION_NODE, node_id=extension['id']) result, message, actions = validate_extension_node(state, task_meta) self.assertFalse(result, "An unknown extension will fail for now.")
def test_queue_validation_on_unknown_extension(self): set_up_context_mock() extension_schema = { "$schema": "http://json-schema.org/draft-04/schema#", "title": "1.1 Open Badge Example Extension for testing: Unknown Extension", "description": "An extension that allows you to add a single string unknownProperty to an extension object for unknown reasons.", "type": "object", "properties": { "unknownProperty": { "type": "string" } }, "required": ["unknownProperty"] } extension_schema_url = 'http://example.org/unkownSchema' extension_context = { '@context': { "obi": "https://w3id.org/openbadges#", "extensions": "https://w3id.org/openbadges/extensions#", 'unknownProperty': 'http://schema.org/unknownProperty' }, "obi:validation": [ { "obi:validatesType": "extensions:UnknownExtension", "obi:validationSchema": extension_schema_url } ] } extension_context_url = 'http://example.org/unknownExtensionContext' first_node_json = { '@context': OPENBADGES_CONTEXT_V2_URI, 'id': 'http://example.org/assertion', 'extensions:exampleExtension': { '@context': extension_context_url, 'type': ['Extension', 'extensions:UnknownExtension'], 'unknownProperty': 'I\'m a property, short and sweet' }, 'evidence': 'http://example.org/evidence' } responses.add( responses.GET, extension_context_url, json=extension_context ) responses.add( responses.GET, extension_schema_url, json=extension_schema ) state = INITIAL_STATE task_meta = add_task( INTAKE_JSON, data=json.dumps(first_node_json), node_id=first_node_json['id']) result, message, actions = task_named(INTAKE_JSON)(state, task_meta) for action in actions: state = main_reducer(state, action) # Compact JSON result, message, actions = task_named(state['tasks'][0]['name'])(state, state['tasks'][0]) self.assertEqual(len(actions), 3) state = main_reducer(state, actions[0]) validation_action = actions[1] result, message, actions = validate_extension_node(state, validation_action) self.assertTrue(result)