def test_source_version_delete(self): source = OrganizationSourceFactory(version=HEAD) concept = ConceptFactory( mnemonic='concept1', version=HEAD, sources=[source], parent=source ) self.assertTrue(source.is_latest_version) self.assertEqual(concept.get_latest_version().sources.count(), 1) version1 = OrganizationSourceFactory.build( name='version1', version='v1', mnemonic=source.mnemonic, organization=source.organization ) Source.persist_new_version(version1, source.created_by) source.refresh_from_db() self.assertEqual(concept.get_latest_version().sources.count(), 2) self.assertTrue(version1.is_latest_version) self.assertFalse(source.is_latest_version) source_versions = Source.objects.filter( mnemonic=source.mnemonic, version='v1', ) self.assertTrue(source_versions.exists()) self.assertEqual(version1.concepts.count(), 1) version1.delete() source.refresh_from_db() self.assertFalse(Source.objects.filter( version='v1', mnemonic=source.mnemonic, ).exists()) self.assertTrue(source.is_latest_version) self.assertEqual(concept.get_latest_version().sources.count(), 1)
def test_persist_new_version(self): source = OrganizationSourceFactory(version=HEAD) concept = ConceptFactory(mnemonic='concept1', parent=source) self.assertEqual(source.concepts_set.count(), 2) # parent-child self.assertEqual(source.concepts.count(), 2) self.assertEqual(concept.sources.count(), 1) self.assertTrue(source.is_latest_version) version1 = OrganizationSourceFactory.build( name='version1', version='v1', mnemonic=source.mnemonic, organization=source.organization) Source.persist_new_version(version1, source.created_by) source.refresh_from_db() self.assertFalse(source.is_latest_version) self.assertEqual(source.concepts_set.count(), 2) # parent-child self.assertEqual(source.concepts.count(), 2) self.assertTrue(version1.is_latest_version) self.assertEqual(version1.concepts.count(), 1) self.assertEqual( version1.concepts.first(), source.concepts.filter(is_latest_version=True).first()) self.assertEqual(version1.concepts_set.count(), 0) # no direct child
class SourceLatestVersionRetrieveUpdateViewTest(OCLAPITestCase): def setUp(self): super().setUp() self.organization = Organization.objects.first() self.user = UserProfile.objects.filter(is_superuser=True).first() self.token = self.user.get_token() self.source = OrganizationSourceFactory(organization=self.organization) self.latest_version = OrganizationSourceFactory( mnemonic=self.source.mnemonic, is_latest_version=True, organization=self.organization, version='v1', released=True) def test_get_200(self): response = self.client.get('/orgs/{}/sources/{}/latest/'.format( self.organization.mnemonic, self.source.mnemonic), format='json') self.assertEqual(response.status_code, 200) self.assertEqual(response.data['id'], 'v1') self.assertEqual(response.data['uuid'], str(self.latest_version.id)) self.assertEqual(response.data['short_code'], self.source.mnemonic) def test_put_200(self): self.assertIsNone(self.latest_version.external_id) external_id = '123' response = self.client.put('/orgs/{}/sources/{}/latest/'.format( self.organization.mnemonic, self.source.mnemonic), dict(external_id=external_id), HTTP_AUTHORIZATION='Token ' + self.token, format='json') self.assertEqual(response.status_code, 200) self.assertEqual(response.data['id'], 'v1') self.assertEqual(response.data['uuid'], str(self.latest_version.id)) self.assertEqual(response.data['short_code'], self.source.mnemonic) self.assertEqual(response.data['external_id'], external_id) self.latest_version.refresh_from_db() self.assertEqual(self.latest_version.external_id, external_id) def test_put_400(self): response = self.client.put('/orgs/{}/sources/{}/latest/'.format( self.organization.mnemonic, self.source.mnemonic), dict(id=None), HTTP_AUTHORIZATION='Token ' + self.token, format='json') self.assertEqual(response.status_code, 400) self.assertEqual(response.data, { 'id': [ErrorDetail(string='This field may not be null.', code='null')] })
def test_add_processing(self): source = OrganizationSourceFactory() self.assertEqual(source._background_process_ids, []) # pylint: disable=protected-access source.add_processing('123') self.assertEqual(source._background_process_ids, ['123']) # pylint: disable=protected-access source.add_processing('123') self.assertEqual(source._background_process_ids, ['123', '123']) # pylint: disable=protected-access source.add_processing('abc') self.assertEqual(source._background_process_ids, ['123', '123', 'abc']) # pylint: disable=protected-access source.refresh_from_db() self.assertEqual(source._background_process_ids, ['123', '123', 'abc']) # pylint: disable=protected-access
def test_org_active_inactive_should_affect_children(self): org = OrganizationFactory(is_active=True) source = OrganizationSourceFactory(organization=org, is_active=True) collection = OrganizationCollectionFactory(organization=org, is_active=True) org.is_active = False org.save() source.refresh_from_db() collection.refresh_from_db() self.assertFalse(org.is_active) self.assertFalse(source.is_active) self.assertFalse(collection.is_active) org.is_active = True org.save() source.refresh_from_db() collection.refresh_from_db() self.assertTrue(org.is_active) self.assertTrue(source.is_active) self.assertTrue(collection.is_active)
def test_user_active_inactive_should_affect_children(self): user = UserProfileFactory(is_active=True) source = OrganizationSourceFactory(user=user, is_active=True) collection = OrganizationCollectionFactory(user=user, is_active=True) user.is_active = False user.save() source.refresh_from_db() collection.refresh_from_db() self.assertFalse(user.is_active) self.assertFalse(source.is_active) self.assertFalse(collection.is_active) user.is_active = True user.save() source.refresh_from_db() collection.refresh_from_db() self.assertTrue(user.is_active) self.assertTrue(source.is_active) self.assertTrue(collection.is_active)
def test_put_hierarchy_root(self): source = OrganizationSourceFactory(organization=self.organization) self.assertTrue(source.is_head) self.assertEqual(source.versions.count(), 1) concept = ConceptFactory(parent=source) sources_url = "/orgs/{}/sources/{}/".format(self.organization.mnemonic, source.mnemonic) response = self.client.put(sources_url, dict(hierarchy_root_url=concept.uri), HTTP_AUTHORIZATION='Token ' + self.token, format='json') self.assertEqual(response.status_code, 200) self.assertEqual(response.data['hierarchy_root_url'], concept.uri) source.refresh_from_db() self.assertEqual(source.hierarchy_root_id, concept.id) concept2 = ConceptFactory(parent=source) sources_url = "/orgs/{}/sources/{}/".format(self.organization.mnemonic, source.mnemonic) response = self.client.put(sources_url, dict(hierarchy_root_url=concept2.uri), HTTP_AUTHORIZATION='Token ' + self.token, format='json') self.assertEqual(response.status_code, 200) self.assertEqual(response.data['hierarchy_root_url'], concept2.uri) source.refresh_from_db() self.assertEqual(source.hierarchy_root_id, concept2.id) unknown_concept = ConceptFactory() sources_url = "/orgs/{}/sources/{}/".format(self.organization.mnemonic, source.mnemonic) response = self.client.put( sources_url, dict(hierarchy_root_url=unknown_concept.uri), HTTP_AUTHORIZATION='Token ' + self.token, format='json') self.assertEqual(response.status_code, 400) self.assertEqual(response.data, { 'hierarchy_root': ['Hierarchy Root must belong to the same Source.'] }) source.refresh_from_db() self.assertEqual(source.hierarchy_root_id, concept2.id)
def test_new_version_should_not_affect_last_child_update(self): source = OrganizationSourceFactory(version=HEAD) source_updated_at = source.updated_at source_last_child_update = source.last_child_update self.assertIsNotNone(source.id) self.assertEqual(source_updated_at, source_last_child_update) concept = ConceptFactory(sources=[source], parent=source) source.refresh_from_db() self.assertEqual(source.updated_at, source_updated_at) self.assertEqual(source.last_child_update, concept.updated_at) self.assertNotEqual(source.last_child_update, source_updated_at) self.assertNotEqual(source.last_child_update, source_last_child_update) source_last_child_update = source.last_child_update source_v1 = OrganizationSourceFactory.build(version='v1', mnemonic=source.mnemonic, organization=source.parent) Source.persist_new_version(source_v1, source.created_by) source_v1 = source.versions.filter(version='v1').first() source.refresh_from_db() self.assertIsNotNone(source_v1.id) self.assertEqual(source.last_child_update, source_last_child_update) self.assertEqual(source.updated_at, source_updated_at) source_v1_updated_at = source_v1.updated_at source_v1_last_child_update = source_v1.last_child_update source_v2 = OrganizationSourceFactory.build(version='v2', mnemonic=source.mnemonic, organization=source.parent) Source.persist_new_version(source_v2, source.created_by) source_v2 = source.versions.filter(version='v2').first() source.refresh_from_db() source_v1.refresh_from_db() self.assertIsNotNone(source_v2.id) self.assertEqual(source.last_child_update, source_last_child_update) self.assertEqual(source.updated_at, source_updated_at) self.assertEqual(source_v1.last_child_update, source_v1_last_child_update) self.assertEqual(source_v1.updated_at, source_v1_updated_at)
class SourceExtraRetrieveUpdateDestroyViewTest(OCLAPITestCase): def setUp(self): super().setUp() self.organization = Organization.objects.first() self.user = UserProfile.objects.filter(is_superuser=True).first() self.token = self.user.get_token() self.extras = dict(foo='bar', tao='ching') self.source = OrganizationSourceFactory(organization=self.organization, extras=self.extras) def test_get_200(self): response = self.client.get(self.source.uri + 'extras/foo/', HTTP_AUTHORIZATION='Token ' + self.token, format='json') self.assertEqual(response.status_code, 200) self.assertEqual(response.data, dict(foo='bar')) def test_get_404(self): response = self.client.get(self.source.uri + 'extras/bar/', HTTP_AUTHORIZATION='Token ' + self.token, format='json') self.assertEqual(response.status_code, 404) def test_put_200(self): response = self.client.put(self.source.uri + 'extras/foo/', dict(foo='foobar'), HTTP_AUTHORIZATION='Token ' + self.token, format='json') self.assertEqual(response.status_code, 200) self.assertEqual(response.data, dict(foo='foobar')) self.source.refresh_from_db() self.assertEqual(self.source.extras, dict(foo='foobar', tao='ching')) def test_put_400(self): response = self.client.put(self.source.uri + 'extras/foo/', dict(tao='te-ching'), HTTP_AUTHORIZATION='Token ' + self.token, format='json') self.assertEqual(response.status_code, 400) self.assertEqual(response.data, ['Must specify foo param in body.']) def test_delete(self): response = self.client.delete(self.source.uri + 'extras/foo/', HTTP_AUTHORIZATION='Token ' + self.token, format='json') self.assertEqual(response.status_code, 204) self.source.refresh_from_db() self.assertEqual(self.source.extras, dict(tao='ching')) response = self.client.delete(self.source.uri + 'extras/foo/', HTTP_AUTHORIZATION='Token ' + self.token, format='json') self.assertEqual(response.status_code, 404) self.source.refresh_from_db() self.assertEqual(self.source.extras, dict(tao='ching'))
class SourceVersionRetrieveUpdateDestroyViewTest(OCLAPITestCase): def setUp(self): super().setUp() self.organization = Organization.objects.first() self.user = UserProfile.objects.filter(is_superuser=True).first() self.token = self.user.get_token() self.source = OrganizationSourceFactory(organization=self.organization) self.source_v1 = OrganizationSourceFactory( mnemonic=self.source.mnemonic, organization=self.organization, version='v1', ) def test_get_200(self): response = self.client.get(self.source_v1.uri, HTTP_AUTHORIZATION='Token ' + self.token, format='json') self.assertEqual(response.status_code, 200) self.assertEqual(response.data['version'], 'v1') def test_put_200(self): self.assertEqual(self.source.extras, dict()) self.assertEqual(self.source_v1.extras, dict()) extras = dict(foo='bar') response = self.client.put(self.source_v1.uri, dict(extras=extras), HTTP_AUTHORIZATION='Token ' + self.token, format='json') self.assertEqual(response.status_code, 200) self.assertEqual(response.data['extras'], extras) self.source_v1.refresh_from_db() self.assertEqual(self.source_v1.extras, extras) self.assertEqual(self.source.extras, dict()) def test_put_400(self): response = self.client.put(self.source_v1.uri, dict(id=None), HTTP_AUTHORIZATION='Token ' + self.token, format='json') self.assertEqual(response.status_code, 400) self.assertEqual(response.data, { 'id': [ErrorDetail(string='This field may not be null.', code='null')] }) @patch('core.common.services.S3.delete_objects', Mock()) def test_version_delete_204(self): self.assertEqual(self.source.versions.count(), 2) response = self.client.delete(self.source_v1.uri, HTTP_AUTHORIZATION='Token ' + self.token, format='json') self.assertEqual(response.status_code, 204) self.assertEqual(self.source.versions.count(), 1) self.assertFalse(self.source.versions.filter(version='v1').exists()) @patch('core.common.services.S3.delete_objects', Mock()) def test_version_delete_400( self): # sources content referred in a private collection concept = ConceptFactory(parent=self.source_v1) collection = OrganizationCollectionFactory(public_access='None') collection.add_references([concept.uri]) self.assertEqual(collection.concepts.count(), 1) self.assertEqual(collection.concepts.first(), concept.get_latest_version()) response = self.client.delete(self.source_v1.uri, HTTP_AUTHORIZATION='Token ' + self.token, format='json') self.assertEqual(response.status_code, 400) self.assertEqual(response.data, { 'detail': [CONTENT_REFERRED_PRIVATELY.format(self.source_v1.mnemonic)] }) self.assertEqual(self.source.versions.count(), 2) self.assertTrue(self.source.versions.filter(version='v1').exists())