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() )
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())
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())
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())
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 )
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)