コード例 #1
0
    def test_do_import_no_project(self, worksheet_importer_constructor):
        # given:
        template_mgr = MagicMock(name='template_manager')
        worksheet_importer = WorksheetImporter(template_mgr)
        worksheet_importer_constructor.return_value = worksheet_importer
        no_errors = []
        expected_error = {
            'location': 'File',
            'type': 'NoProjectFound',
            'detail': 'The spreadsheet should be associated to a project.'
        }

        # and:
        item = MetadataEntity(concrete_type='product',
                              domain_type='product',
                              object_id=910)
        worksheet_importer.do_import = MagicMock(side_effect=[([item],
                                                               no_errors)])

        # and:
        workbook = create_test_workbook('Item')
        workbook_importer = WorkbookImporter(template_mgr)

        # when:
        spreadsheet_json, errors = workbook_importer.do_import(
            IngestWorkbook(workbook), is_update=False)

        # then:
        self.assertIn(
            expected_error, errors,
            f'Errors expected to contain {NoProjectFound.__name__}.')
コード例 #2
0
 def setup_workbook_with_project_worksheets(self,
                                            worksheet_importer_constructor):
     self.template_mgr.get_concrete_type = MagicMock(return_value='project')
     worksheet_importer = WorkbookImporter(self.template_mgr)
     worksheet_importer_constructor.return_value = worksheet_importer
     no_errors = []
     # and:
     project = MetadataEntity(domain_type='project',
                              concrete_type='project',
                              content={'description': 'test project'})
     jsmith = MetadataEntity(domain_type='project',
                             concrete_type='contact',
                             content={
                                 'contributors': {
                                     'name': 'John',
                                     'email': '*****@*****.**'
                                 }
                             })
     ppan = MetadataEntity(domain_type='project',
                           concrete_type='contact',
                           content={
                               'contributors': {
                                   'name': 'Peter',
                                   'email': '*****@*****.**'
                               }
                           })
     worksheet_importer.do_import = MagicMock(
         side_effect=[([project], no_errors), ([jsmith, ppan], no_errors)])
     # and:
     workbook = create_test_workbook('Project', 'Project - Contributors')
     ingest_workbook = IngestWorkbook(workbook)
     return ingest_workbook
コード例 #3
0
    def test_get_module_field_name(self):
        # given:
        workbook = create_test_workbook('Product - Reviews',
                                        'User - SN Profiles',
                                        'Log - file-names', 'Account')

        # and: simple
        reviews_sheet = workbook['Product - Reviews']
        reviews = IngestWorksheet(reviews_sheet)

        # and: with space in between
        sn_profiles_sheet = workbook['User - SN Profiles']
        sn_profiles = IngestWorksheet(sn_profiles_sheet)

        # and: with hyphen
        file_names_sheet = workbook['Log - file-names']
        file_names = IngestWorksheet(file_names_sheet)

        # and: not module worksheet
        account_sheet = workbook['Account']
        account = IngestWorksheet(account_sheet)

        # expect:
        self.assertEqual('reviews', reviews.get_module_field_name())
        self.assertEqual('sn_profiles', sn_profiles.get_module_field_name())
        self.assertEqual('file_names', file_names.get_module_field_name())
        self.assertIsNone(account.get_module_field_name())
コード例 #4
0
 def setUp(self, worksheet_importer_constructor) -> None:
     self.template_mgr = MagicMock(name='template_manager')
     self.template_mgr.template.json_schemas = self.mock_json_schemas
     self.concrete_type_map = {'Project': 'project', 'Users': 'users'}
     self.template_mgr.get_concrete_type = lambda key: self.concrete_type_map.get(
         key)
     self.worksheet_importer = WorksheetImporter(self.template_mgr)
     worksheet_importer_constructor.return_value = self.worksheet_importer
     self.workbook_importer = WorkbookImporter(self.template_mgr)
     self.workbook = create_test_workbook('Project', 'Users')
     self.ingest_workbook = IngestWorkbook(self.workbook)
コード例 #5
0
    def test_get_title(self):
        # given:
        workbook = create_test_workbook('User', 'User - SN Profiles')
        user_sheet = workbook['User']
        sn_profiles_sheet = workbook['User - SN Profiles']

        # and:
        user = IngestWorksheet(user_sheet)
        sn_profiles = IngestWorksheet(sn_profiles_sheet)

        # expect:
        self.assertEqual('User', user.title)
        self.assertEqual('User - SN Profiles', sn_profiles.title)
コード例 #6
0
    def test_is_module_tab(self):
        # given:
        workbook = create_test_workbook('Product', 'Product - History')
        product_sheet = workbook['Product']
        history_sheet = workbook['Product - History']

        # and:
        product = IngestWorksheet(product_sheet)
        history = IngestWorksheet(history_sheet)

        # expect:
        self.assertFalse(product.is_module_tab())
        self.assertTrue(history.is_module_tab())
コード例 #7
0
    def test_add_schemas_worksheet(self):
        # given
        sheets = ['A', 'B', 'C', 'X']
        workbook = create_test_workbook(*sheets)
        wb = IngestWorkbook(workbook)

        # when
        wb.add_schemas_worksheet(['schema1', 'schema2', 'schema3'])

        # then
        self.assertEqual(wb.workbook['Schemas'].cell(1, 1).value, 'Schemas')
        self.assertEqual(wb.workbook['Schemas'].cell(2, 1).value, 'schema1')
        self.assertEqual(wb.workbook['Schemas'].cell(3, 1).value, 'schema2')
        self.assertEqual(wb.workbook['Schemas'].cell(4, 1).value, 'schema3')
コード例 #8
0
    def test_do_import_update_project_but_no_project_worksheet(self):
        # given:
        workbook = create_test_workbook('Users')

        # when:
        spreadsheet_json, errors = self.workbook_importer.do_import(
            IngestWorkbook(workbook),
            project_uuid='project-uuid',
            update_project=True,
            is_update=False)

        # then:
        self.assertEqual(len(errors), 1)
        self.assertEqual('NoProjectWorksheet', errors[0].get('type'))
コード例 #9
0
    def test_add_entity_uuids(self):
        # given:
        entities = [Entity('type', 'AA', 'content', concrete_type='a', ingest_json={'uuid': {'uuid': 'A-1-uuid'}},
                           spreadsheet_location={'row_index': 5, 'worksheet_title': 'A'}),
                    Entity('type', 'AA', 'content', concrete_type='a', ingest_json={'uuid': {'uuid': 'A-2-uuid'}},
                           spreadsheet_location={'row_index': 6, 'worksheet_title': 'A'}),
                    Entity('type', 'AA', 'content', concrete_type='a', ingest_json={'uuid': {'uuid': 'A-3-uuid'}},
                           spreadsheet_location={'row_index': 7, 'worksheet_title': 'A'}),
                    Entity('type', 'BB', 'content', concrete_type='b', ingest_json={'uuid': {'uuid': 'B-1-uuid'}},
                           spreadsheet_location={'row_index': 5, 'worksheet_title': 'B'}),
                    Entity('type', 'BB', 'content', concrete_type='b', ingest_json={'uuid': {'uuid': 'B-2-uuid'}},
                           spreadsheet_location={'row_index': 6, 'worksheet_title': 'B'}),
                    Entity('type', 'BB', 'content', concrete_type='b', ingest_json={'uuid': {'uuid': 'B-3-uuid'}},
                           spreadsheet_location={'row_index': 7, 'worksheet_title': 'B'}),
                    Entity('type', 'CC', 'content', concrete_type='c', ingest_json={'uuid': {'uuid': 'C-1-uuid'}},
                           spreadsheet_location={'row_index': 5, 'worksheet_title': 'C'}),
                    Entity('type', 'CC', 'content', concrete_type='c', ingest_json={'uuid': {'uuid': 'C-2-uuid'}},
                           spreadsheet_location={'row_index': 6, 'worksheet_title': 'C'}),
                    Entity('type', 'CC', 'content', concrete_type='c', ingest_json={'uuid': {'uuid': 'C-3-uuid'}},
                           spreadsheet_location={'row_index': 7, 'worksheet_title': 'C'}),
                    Entity('type', 'XX', 'content', concrete_type='x', ingest_json={'uuid': {'uuid': 'X-3-uuid'}})]

        mock_submission = Mock('submission')
        mock_submission.get_entities = Mock(return_value=entities)

        sheets = ['A', 'B', 'C', 'X']
        workbook = create_test_workbook(*sheets)
        wb = IngestWorkbook(workbook)

        # when
        wb.add_entity_uuids(mock_submission)

        # then
        self.assertEqual(wb.workbook['A'].cell(4, 1).value, 'a.uuid')
        self.assertEqual(wb.workbook['A'].cell(5, 1).value, 'A-1-uuid')
        self.assertEqual(wb.workbook['A'].cell(6, 1).value, 'A-2-uuid')
        self.assertEqual(wb.workbook['A'].cell(7, 1).value, 'A-3-uuid')

        self.assertEqual(wb.workbook['B'].cell(4, 1).value, 'b.uuid')
        self.assertEqual(wb.workbook['B'].cell(5, 1).value, 'B-1-uuid')
        self.assertEqual(wb.workbook['B'].cell(6, 1).value, 'B-2-uuid')
        self.assertEqual(wb.workbook['B'].cell(7, 1).value, 'B-3-uuid')

        self.assertEqual(wb.workbook['C'].cell(4, 1).value, 'c.uuid')
        self.assertEqual(wb.workbook['C'].cell(5, 1).value, 'C-1-uuid')
        self.assertEqual(wb.workbook['C'].cell(6, 1).value, 'C-2-uuid')
        self.assertEqual(wb.workbook['C'].cell(7, 1).value, 'C-3-uuid')

        self.assertFalse(wb.workbook['X'].cell(5, 1).value, None)
コード例 #10
0
    def test_importable_worksheets(self):
        # given:
        importable_names = ['Organ From Donor', 'Cell Suspension', 'Project']
        workbook = create_test_workbook(*importable_names)
        workbook.create_sheet('Schemas')

        # and:
        ingest_workbook = IngestWorkbook(workbook)

        # when:
        actual_worksheets = ingest_workbook.importable_worksheets()

        # then:
        actual_titles = [ingest_worksheet.title for ingest_worksheet in actual_worksheets]
        self.assertEqual(importable_names, actual_titles)
コード例 #11
0
    def test_do_import_do_not_update_project_and_no_project_worksheet(self):
        # given:
        workbook = create_test_workbook('Users')

        # when:
        spreadsheet_json, errors = self.workbook_importer.do_import(
            IngestWorkbook(workbook),
            project_uuid='project-uuid',
            update_project=False,
            is_update=False)

        # then:
        self.assertEqual(len(errors), 0)
        self.assertEqual(len(spreadsheet_json.get('project', {}).keys()), 1)
        self.assertFalse(
            spreadsheet_json['project']['project-uuid']['is_reference'])
        self.assertTrue(spreadsheet_json['project']['project-uuid']
                        ['is_linking_reference'])
コード例 #12
0
    def test_add_schemas_worksheet_existing_schemas(self):
        # given
        sheets = ['A', 'B', 'C']
        workbook = create_test_workbook(*sheets)
        wb = IngestWorkbook(workbook)

        wb.workbook.create_sheet('Schemas')
        wb.workbook['Schemas'].cell(1, 1).value = 'X'
        wb.workbook['Schemas'].cell(2, 1).value = 'x'
        wb.workbook['Schemas'].cell(3, 1).value = 'y'
        wb.workbook['Schemas'].cell(4, 1).value = 'z'

        # when
        wb.add_schemas_worksheet(['schema1', 'schema2', 'schema3'])

        # then
        self.assertEqual(wb.workbook['Schemas'].cell(1, 1).value, 'X')
        self.assertEqual(wb.workbook['Schemas'].cell(2, 1).value, 'x')
        self.assertEqual(wb.workbook['Schemas'].cell(3, 1).value, 'y')
        self.assertEqual(wb.workbook['Schemas'].cell(4, 1).value, 'z')
コード例 #13
0
    def test_do_import_multiple_projects(self, worksheet_importer_constructor):
        # given:
        template_mgr = MagicMock(name='template_manager')
        template_mgr.template.json_schemas = self.mock_json_schemas
        template_mgr.get_concrete_type = MagicMock(return_value='project')

        worksheet_importer = WorksheetImporter(template_mgr)
        worksheet_importer_constructor.return_value = worksheet_importer
        no_errors = []
        expected_error = {
            'location':
            'sheet=Project',
            'type':
            'MultipleProjectsFound',
            'detail':
            'The spreadsheet should only be associated to a single project.'
        }

        # and:
        project_1 = MetadataEntity(concrete_type='project',
                                   domain_type='project',
                                   object_id=1)
        project_2 = MetadataEntity(concrete_type='project',
                                   domain_type='project',
                                   object_id=2)
        worksheet_importer.do_import = MagicMock(
            side_effect=[([project_1, project_2], no_errors)])

        # and:
        workbook = create_test_workbook('Project')
        workbook_importer = WorkbookImporter(template_mgr)

        # when:
        spreadsheet_json, errors = workbook_importer.do_import(
            IngestWorkbook(workbook), is_update=False)

        # then:
        self.assertIn(
            expected_error, errors,
            f'Errors expected to contain {MultipleProjectsFound.__name__}.')
コード例 #14
0
    def test_do_import_with_module_tab(self, worksheet_importer_constructor):
        # given:
        concrete_type_map = {
            'Project': 'project',
            'User': '******',
            'User - SN Profiles': 'users'
        }
        self.template_mgr.get_concrete_type = lambda key: concrete_type_map.get(
            key)

        project = MetadataEntity(concrete_type='Project',
                                 domain_type='Project')
        user = MetadataEntity(concrete_type='user',
                              domain_type='user',
                              object_id=773,
                              content={'user_name': 'janedoe'})
        fb_profile = MetadataEntity(concrete_type='sn_profile',
                                    domain_type='user',
                                    object_id=773,
                                    content={
                                        'sn_profiles': {
                                            'name': 'facebook',
                                            'id': '392'
                                        },
                                        'description': 'extra fb field'
                                    })
        ig_profile = MetadataEntity(concrete_type='sn_profile',
                                    domain_type='user',
                                    object_id=773,
                                    content={
                                        'sn_profiles': {
                                            'name': 'instagram',
                                            'id': 'a92'
                                        },
                                        'description': 'extra ig field'
                                    })

        no_errors = []
        self.worksheet_importer.do_import = MagicMock(side_effect=[(
            [project],
            no_errors), ([user],
                         no_errors), ([fb_profile, ig_profile], no_errors)])

        self.workbook = create_test_workbook('Project', 'User',
                                             'User - SN Profiles')
        self.ingest_workbook = IngestWorkbook(self.workbook)

        # when:
        spreadsheet_json, errors = self.workbook_importer.do_import(
            self.ingest_workbook, is_update=False)

        # then:
        expected_errors = [{
            'key': 'description',
            'value': 'extra fb field'
        }, {
            'key': 'description',
            'value': 'extra ig field'
        }]

        self.assertIsNotNone(spreadsheet_json)
        self.assertEqual(
            errors,
            self.workbook_importer.list_data_removal_errors(
                'User - SN Profiles', expected_errors))
        self.assertEqual(2, len(spreadsheet_json))

        # and:
        user_map = spreadsheet_json.get('user')
        self.assertIsNotNone(user_map)

        # and:
        janedoe = user_map.get(773)
        self.assertIsNotNone(janedoe)
        content = janedoe.get('content')
        self.assertEqual('janedoe', content.get('user_name'))
        self.assertEqual(['user_name', 'sn_profiles'], list(content.keys()))

        # and:
        sn_profiles = content.get('sn_profiles')
        self.assertIsNotNone(sn_profiles)
        self.assertEqual(2, len(sn_profiles))

        # and:
        self.assertEqual({'name': 'facebook', 'id': '392'}, sn_profiles[0])
        self.assertEqual({'name': 'instagram', 'id': 'a92'}, sn_profiles[1])
コード例 #15
0
    def test_create_row_template_for_module_worksheet(self,
                                                      determine_strategy):
        # given:
        template = MagicMock(name='schema_template')
        ingest_api = MagicMock(name='mock_ingest_api')

        # and:
        spec_map = {
            'product': {
                'schema': {
                    'domain_entity': 'merchandise/product'
                }
            }
        }
        template.lookup_property_from_template = lambda key: spec_map.get(
            key, None)

        domain_entity = "merchandise/product"
        schema_url = "http://schema.sample.com/product"
        template.get_tabs_config = MagicMock()
        template.lookup_metadata_schema_name_given_title = MagicMock(
            return_value="product_type")
        template.get_latest_schema = MagicMock(return_value=schema_url)
        schema = {
            "schema": {
                "domain_entity": domain_entity,
                "url": schema_url
            }
        }
        property_one_schema = {
            "description": "Property one description",
            "value_type": "string"
        }
        property_two_schema = {
            "description": "Property two description",
            "value_type": "string"
        }
        spec_map = {
            "product_type": schema,
            "product.info.id": property_one_schema,
            "product.reviews.rating": property_two_schema
        }
        template.lookup_property_attributes_in_metadata = lambda key: spec_map.get(
            key)

        # and:
        template_mgr = TemplateManager(template, ingest_api)

        # and:
        workbook = create_test_workbook('Product - Reviews')
        reviews_worksheet = workbook['Product - Reviews']
        reviews_worksheet['A4'] = 'product.info.id'
        reviews_worksheet['B4'] = 'product.reviews.rating'

        # and: set up strategies
        id_strategy = MagicMock(name='id_strategy')
        rating_strategy = MagicMock(name='rating_strategy')
        determine_strategy.side_effect = [id_strategy, rating_strategy]

        # when:
        row_template = template_mgr.create_row_template(
            IngestWorksheet(reviews_worksheet))

        # and:
        self.assertIsNotNone(row_template)
        self.assertIn(id_strategy, row_template.cell_conversions)
        self.assertIn(rating_strategy, row_template.cell_conversions)