Esempio n. 1
0
class AggregatorImportViewTest(TestCase):
    def setUp(self):
        self.aggregator = AggregatorFactory()
        self.update_url = self.aggregator.get_absolute_url() + 'post/'
        self.post_data = dict()
        self.post_data['silk_rule_file'] = open(
            self._get_test_file('config.xml', 'controller')
        )

    def test_post(self):
        self.client_login('admin')

        archiveitem = ArchiveItemFactory()
        self.post_data['archiveitems'] = [archiveitem.pk]
        response = self.client.post(self.update_url, data=self.post_data)
        self.assertRedirects(response, self.aggregator.get_absolute_url())

        aggregator = Aggregator.objects.get(pk=self.aggregator.pk)
        self.assertEqual(
            aggregator.silk_rule.strip().replace("\n", ""),
            '<LinkageRule>        '
            '<Compare id="unnamed_5" metric="levenshtein" required="false" '
            'threshold="0.0" weight="1">          '
            '<TransformInput function="lowerCase" id="unnamed_3">            '
            '<Input id="unnamed_1" path="?a/sd:Event#name" />          '
            '</TransformInput>          <TransformInput function="lowerCase" '
            'id="unnamed_4">            '
            '<Input id="unnamed_2" path="?b/sd:Event#name" />          '
            '</TransformInput>          <Param name="minChar" value="0" />'
            '          <Param name="maxChar" value="z" />        '
            '</Compare>      </LinkageRule>'.strip()
        )
Esempio n. 2
0
class AggregatorImportViewTest(TestCase):
    def setUp(self):
        self.aggregator = AggregatorFactory()
        self.update_url = self.aggregator.get_absolute_url() + 'post/'
        self.post_data = dict()
        self.post_data['silk_rule_file'] = open(
            self._get_test_file('config.xml', 'controller'))

    def test_post(self):
        self.client_login('admin')

        archiveitem = ArchiveItemFactory()
        self.post_data['archiveitems'] = [archiveitem.pk]
        response = self.client.post(self.update_url, data=self.post_data)
        self.assertRedirects(response, self.aggregator.get_absolute_url())

        aggregator = Aggregator.objects.get(pk=self.aggregator.pk)
        self.assertEqual(
            aggregator.silk_rule.strip().replace("\n", ""),
            '<LinkageRule>        '
            '<Compare id="unnamed_5" metric="levenshtein" required="false" '
            'threshold="0.0" weight="1">          '
            '<TransformInput function="lowerCase" id="unnamed_3">            '
            '<Input id="unnamed_1" path="?a/sd:Event#name" />          '
            '</TransformInput>          <TransformInput function="lowerCase" '
            'id="unnamed_4">            '
            '<Input id="unnamed_2" path="?b/sd:Event#name" />          '
            '</TransformInput>          <Param name="minChar" value="0" />'
            '          <Param name="maxChar" value="z" />        '
            '</Compare>      </LinkageRule>'.strip())
Esempio n. 3
0
class AggregatorUpdateViewTest(TestCase):
    def setUp(self):
        self.aggregator = AggregatorFactory()
        self.update_url = self.aggregator.get_absolute_url() + 'edit/'
        self.post_data = dict(AggregatorFactory.attributes())

    def test_get(self):
        self.client_login('admin')
        response = self.client.get(self.update_url)
        self.assertContains(response, self.aggregator.name)
        self.assertContains(response, self.aggregator.description)

    def test_post(self):
        self.client_login('admin')
        archiveitem = ArchiveItemFactory()
        self.post_data['archiveitems'] = [archiveitem.pk]
        print self.post_data
        response = self.client.post(self.update_url, data=self.post_data)
        self.assertRedirects(response, self.aggregator.get_absolute_url())

        aggregator = Aggregator.objects.get(pk=self.aggregator.pk)
        self.assertEqual(aggregator.name, self.post_data['name'])
        self.assertEqual(aggregator.description, self.post_data['description'])
        self.assertIn(archiveitem, aggregator.archiveitems.all())
Esempio n. 4
0
class AggregatorUpdateViewTest(TestCase):
    def setUp(self):
        self.aggregator = AggregatorFactory()
        self.update_url = self.aggregator.get_absolute_url() + 'edit/'
        self.post_data = dict(AggregatorFactory.attributes())

    def test_get(self):
        self.client_login('admin')
        response = self.client.get(self.update_url)
        self.assertContains(response, self.aggregator.name)
        self.assertContains(response, self.aggregator.description)

    def test_post(self):
        self.client_login('admin')
        archiveitem = ArchiveItemFactory()
        self.post_data['archiveitems'] = [archiveitem.pk]
        print self.post_data
        response = self.client.post(self.update_url, data=self.post_data)
        self.assertRedirects(response, self.aggregator.get_absolute_url())

        aggregator = Aggregator.objects.get(pk=self.aggregator.pk)
        self.assertEqual(aggregator.name, self.post_data['name'])
        self.assertEqual(aggregator.description, self.post_data['description'])
        self.assertIn(archiveitem, aggregator.archiveitems.all())
Esempio n. 5
0
class AggregatorDetailViewTest(TestCase):
    def setUp(self):
        self.client_login('admin')

        self.aggregator = AggregatorFactory()
        self.export_url = reverse(
            'aggregator_export', args=(self.aggregator.pk, )
        )
        self.workflow_url = reverse(
            'aggregator_workflow', args=[self.aggregator.pk, ])

    def test_get(self):
        response = self.client.get(self.aggregator.get_absolute_url())
        self.assertContains(response, self.aggregator.name)

    def test_contains_edit_link(self):
        response = self.client.get(self.aggregator.get_absolute_url())
        self.assertContains(
            response, self.aggregator.get_absolute_url() + 'edit/'
        )

    def test_contains_archiveitems(self):
        item1 = ArchiveItemFactory()
        item2 = ArchiveItemFactory()
        for item in (item1, item2):
            AggregatorArchiveItem.objects.create(
                aggregator=self.aggregator,
                archiveitem=item
            )

        response = self.client.get(self.aggregator.get_absolute_url())
        self.assertContains(response, item1.get_absolute_url())
        self.assertContains(response, item2.get_absolute_url())

    def test_contains_rule(self):
        self.aggregator.silk_rule = 'tanto gentile e tanto onesta pare'
        self.aggregator.save()

        response = self.client.get(self.aggregator.get_absolute_url())
        self.assertContains(response, self.aggregator.silk_rule)

    def test_contains_schedulers(self):
        response = self.client.get(self.aggregator.get_absolute_url())
        self.assertContains(response, 'No scheduler found')

        scheduler = AggregatorSchedulerFactory(object_id=self.aggregator.pk)
        response = self.client.get(self.aggregator.get_absolute_url())
        self.assertNotContains(response, 'No scheduler found')
        self.assertContains(response, scheduler.get_absolute_url())

    def test_contains_silk_link(self):
        response = self.client.get(self.aggregator.get_absolute_url())
        silk_url = 'http://{}:{}/workbench/'.format(
            settings.SILK_EXTERNAL_HOST, settings.SILK_EXTERNAL_PORT
        )
        self.assertContains(response, silk_url)

    def test_can_download_silk_project_file(self):
        self.client_login('admin')

        response = self.client.get(self.aggregator.get_absolute_url())
        self.assertContains(response, self.export_url + '?download')

        response = self.client.get(self.export_url + '?download')
        self.assertEqual(response['Content-Type'], 'text/xml; charset=utf-8')
        self.assertTrue(response.has_header('Content-Disposition'))
        self.assertNotEqual(response.content.strip(), '')

    def test_can_run_workflow(self):
        self.client_login('admin')
        Scheduler.objects.all().delete()
        response = self.client.get(self.aggregator.get_absolute_url())
        self.assertContains(response, self.workflow_url)

        response = self.client.post(self.workflow_url)
        self.assertEqual(response.status_code, 302)
        self.assertTrue(
            response['Location'].startswith('http://testserver/s/task/')
        )
        self.assertEqual(Scheduler.objects.count(), 1)

    def test_can_view_silk_project_file_without_downloading(self):
        self.client_login('admin')
        response = self.client.get(self.export_url)
        self.assertEqual(response['Content-Type'], 'text/xml; charset=utf-8')
        self.assertFalse(response.has_header('Content-Disposition'))
        self.assertNotEqual(response.content.strip(), '')

    def test_silk_project_file_is_valid(self):
        import xml.etree.ElementTree as ET

        self.client_login('admin')

        item1 = ArchiveItemFactory()
        item2 = ArchiveItemFactory()
        for item in (item1, item2):
            AggregatorArchiveItem.objects.create(
                aggregator=self.aggregator,
                archiveitem=item
            )

        response = self.client.get(self.export_url)
        tree = ET.fromstring(response.content)

        self.assertIn(
            (settings.TRIPLE_DATABASE['PREFIXES']['sdv1'], 'sd'),
            [(x.get('namespace'), x.get('id'))
             for x in tree.findall('.//Prefix')]
        )

        # check datasources
        datasources = tree.findall('.//DataSource')
        self.assertEqual(len(datasources), 3)
        self.assertEqual(datasources[0].get('id'), 'master-graph')

        mastergraph = datasources[0]
        datasources = datasources[1:]

        # check datasources endpoints
        self.assertEqual(
            mastergraph.find('Param[@name="host"]').get('value'),
            settings.TRIPLE_DATABASE_MASTER['HOST']
        )
        self.assertEqual(
            [get_virtuoso_endpoint()] * 2,
            [x.find('Param[@name="endpointURI"]').get("value")
             for x in datasources]
        )

        # check datasources graph names
        self.assertEqual(
            mastergraph.find('Param[@name="graph"]').get('value'),
            settings.TRIPLE_DATABASE_MASTER["KWARGS"]["graph"]
        )
        self.assertEqual(
            [item1.datagraph_mapped_name, item2.datagraph_mapped_name],
            [x.find('Param[@name="graph"]').get("value")
             for x in datasources]
        )

        # check tasks
        datasource_ids = [x.get('id') for x in datasources]
        tasks = tree.findall('.//LinkingTask')
        self.assertEqual(len(tasks), 2)
        self.assertEqual(
            datasource_ids,
            [x.find('.//Interlink').get('id') for x in tasks]
        )

        # check task parameters
        for datasource_id, task in zip(datasource_ids, tasks):
            self.assertEqual(
                task.find('.//SourceDataset').get('dataSource'),
                datasource_id
            )
            self.assertEqual(
                task.find('.//TargetDataset').get('dataSource'),
                'master-graph'
            )
            self.assertEqual(
                task.find('.//SourceDataset').find('RestrictTo').text.strip(),
                '?a rdf:type <{}> .'.format(self.aggregator.entity_type)
            )
            self.assertEqual(
                task.find('.//TargetDataset').find('RestrictTo').text.strip(),
                'b -> {}'.format(self.aggregator.vertex_selector)
            )
            self.assertIsNone(task.find('.//LinkageRule').text)
            self.assertIsNone(task.find('.//Filter').text)
            self.assertIsNone(task.find('.//Outputs').text)
            self.assertIsNone(task.find('.//PositiveEntities').text)
            self.assertIsNone(task.find('.//NegativeEntities').text)
            self.assertIsNone(
                task.find('.//Alignment/')
                    .find('{}Alignment'.format('{http://knowledgeweb.'
                                               'semanticweb.org'
                                               '/heterogeneity/alignment#}')
                          ).text
            )
Esempio n. 6
0
class AggregatorDetailViewTest(TestCase):
    def setUp(self):
        self.client_login('admin')

        self.aggregator = AggregatorFactory()
        self.export_url = reverse('aggregator_export',
                                  args=(self.aggregator.pk, ))
        self.workflow_url = reverse('aggregator_workflow',
                                    args=[
                                        self.aggregator.pk,
                                    ])

    def test_get(self):
        response = self.client.get(self.aggregator.get_absolute_url())
        self.assertContains(response, self.aggregator.name)

    def test_contains_edit_link(self):
        response = self.client.get(self.aggregator.get_absolute_url())
        self.assertContains(response,
                            self.aggregator.get_absolute_url() + 'edit/')

    def test_contains_archiveitems(self):
        item1 = ArchiveItemFactory()
        item2 = ArchiveItemFactory()
        for item in (item1, item2):
            AggregatorArchiveItem.objects.create(aggregator=self.aggregator,
                                                 archiveitem=item)

        response = self.client.get(self.aggregator.get_absolute_url())
        self.assertContains(response, item1.get_absolute_url())
        self.assertContains(response, item2.get_absolute_url())

    def test_contains_rule(self):
        self.aggregator.silk_rule = 'tanto gentile e tanto onesta pare'
        self.aggregator.save()

        response = self.client.get(self.aggregator.get_absolute_url())
        self.assertContains(response, self.aggregator.silk_rule)

    def test_contains_schedulers(self):
        response = self.client.get(self.aggregator.get_absolute_url())
        self.assertContains(response, 'No scheduler found')

        scheduler = AggregatorSchedulerFactory(object_id=self.aggregator.pk)
        response = self.client.get(self.aggregator.get_absolute_url())
        self.assertNotContains(response, 'No scheduler found')
        self.assertContains(response, scheduler.get_absolute_url())

    def test_contains_silk_link(self):
        response = self.client.get(self.aggregator.get_absolute_url())
        silk_url = 'http://{}:{}/workbench/'.format(
            settings.SILK_EXTERNAL_HOST, settings.SILK_EXTERNAL_PORT)
        self.assertContains(response, silk_url)

    def test_can_download_silk_project_file(self):
        self.client_login('admin')

        response = self.client.get(self.aggregator.get_absolute_url())
        self.assertContains(response, self.export_url + '?download')

        response = self.client.get(self.export_url + '?download')
        self.assertEqual(response['Content-Type'], 'text/xml; charset=utf-8')
        self.assertTrue(response.has_header('Content-Disposition'))
        self.assertNotEqual(response.content.strip(), '')

    def test_can_run_workflow(self):
        self.client_login('admin')
        Scheduler.objects.all().delete()
        response = self.client.get(self.aggregator.get_absolute_url())
        self.assertContains(response, self.workflow_url)

        response = self.client.post(self.workflow_url)
        self.assertEqual(response.status_code, 302)
        self.assertTrue(
            response['Location'].startswith('http://testserver/s/task/'))
        self.assertEqual(Scheduler.objects.count(), 1)

    def test_can_view_silk_project_file_without_downloading(self):
        self.client_login('admin')
        response = self.client.get(self.export_url)
        self.assertEqual(response['Content-Type'], 'text/xml; charset=utf-8')
        self.assertFalse(response.has_header('Content-Disposition'))
        self.assertNotEqual(response.content.strip(), '')

    def test_silk_project_file_is_valid(self):
        import xml.etree.ElementTree as ET

        self.client_login('admin')

        item1 = ArchiveItemFactory()
        item2 = ArchiveItemFactory()
        for item in (item1, item2):
            AggregatorArchiveItem.objects.create(aggregator=self.aggregator,
                                                 archiveitem=item)

        response = self.client.get(self.export_url)
        tree = ET.fromstring(response.content)

        self.assertIn((settings.TRIPLE_DATABASE['PREFIXES']['sdv1'], 'sd'),
                      [(x.get('namespace'), x.get('id'))
                       for x in tree.findall('.//Prefix')])

        # check datasources
        datasources = tree.findall('.//DataSource')
        self.assertEqual(len(datasources), 3)
        self.assertEqual(datasources[0].get('id'), 'master-graph')

        mastergraph = datasources[0]
        datasources = datasources[1:]

        # check datasources endpoints
        self.assertEqual(
            mastergraph.find('Param[@name="host"]').get('value'),
            settings.TRIPLE_DATABASE_MASTER['HOST'])
        self.assertEqual([get_virtuoso_endpoint()] * 2, [
            x.find('Param[@name="endpointURI"]').get("value")
            for x in datasources
        ])

        # check datasources graph names
        self.assertEqual(
            mastergraph.find('Param[@name="graph"]').get('value'),
            settings.TRIPLE_DATABASE_MASTER["KWARGS"]["graph"])
        self.assertEqual(
            [item1.datagraph_mapped_name, item2.datagraph_mapped_name],
            [x.find('Param[@name="graph"]').get("value") for x in datasources])

        # check tasks
        datasource_ids = [x.get('id') for x in datasources]
        tasks = tree.findall('.//LinkingTask')
        self.assertEqual(len(tasks), 2)
        self.assertEqual(datasource_ids,
                         [x.find('.//Interlink').get('id') for x in tasks])

        # check task parameters
        for datasource_id, task in zip(datasource_ids, tasks):
            self.assertEqual(
                task.find('.//SourceDataset').get('dataSource'), datasource_id)
            self.assertEqual(
                task.find('.//TargetDataset').get('dataSource'),
                'master-graph')
            self.assertEqual(
                task.find('.//SourceDataset').find('RestrictTo').text.strip(),
                '?a rdf:type <{}> .'.format(self.aggregator.entity_type))
            self.assertEqual(
                task.find('.//TargetDataset').find('RestrictTo').text.strip(),
                'b -> {}'.format(self.aggregator.vertex_selector))
            self.assertIsNone(task.find('.//LinkageRule').text)
            self.assertIsNone(task.find('.//Filter').text)
            self.assertIsNone(task.find('.//Outputs').text)
            self.assertIsNone(task.find('.//PositiveEntities').text)
            self.assertIsNone(task.find('.//NegativeEntities').text)
            self.assertIsNone(
                task.find('.//Alignment/').find('{}Alignment'.format(
                    '{http://knowledgeweb.'
                    'semanticweb.org'
                    '/heterogeneity/alignment#}')).text)