Пример #1
0
    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."
        )
Пример #2
0
    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)
Пример #6
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)