diff --git a/organization/models.py b/organization/models.py index 35aaa2069..51e03d0af 100644 --- a/organization/models.py +++ b/organization/models.py @@ -101,7 +101,6 @@ def create( if hasattr(obj, "creator") and user: obj.creator = user obj.save() - print(obj) return obj except IntegrityError: return cls.get(name=name, acronym=acronym, location=location) diff --git a/organization/tests/__init__.py b/organization/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/organization/tests/test_mixins.py b/organization/tests/test_mixins.py new file mode 100644 index 000000000..7fdedcd21 --- /dev/null +++ b/organization/tests/test_mixins.py @@ -0,0 +1,21 @@ +from location.tests.test_mixins import LocationTestMixin +from organization.models import Organization + + +class OrganizationTestMixin(LocationTestMixin): + """Mixin com helpers para criar objetos do app organization em testes.""" + + def make_organization( + self, + user, + name="Universidade de São Paulo", + acronym="USP", + location=None, + ): + if location is None: + # Passa o 'user' que já veio como parâmetro obrigatório no make_organization + location = self.make_location(user) + + return Organization.create( + user=user, name=name, acronym=acronym, location=location + ) diff --git a/organization/tests/test_normaff.py b/organization/tests/test_normaff.py new file mode 100644 index 000000000..844f4cacf --- /dev/null +++ b/organization/tests/test_normaff.py @@ -0,0 +1,125 @@ +import unittest + +from django.contrib.auth import get_user_model +from django.db import IntegrityError +from django.test import TestCase + +from organization.models import NormAffiliation +from organization.tests.test_mixins import OrganizationTestMixin + +User = get_user_model() + + +class NormAffiliationTest(OrganizationTestMixin, TestCase): + """Test cases for NormAffiliation model""" + + def setUp(self): + self.NormAffiliation = NormAffiliation + self.user = User.objects.create_user(username="testuser", password="testpass") + + self.location = self.make_location(self.user) + self.organization = self.make_organization( + self.user, + name="University of São Paulo", + location=self.location, + ) + + def test_create_norm_affiliation(self): + norm_aff = self.NormAffiliation.create( + user=self.user, + organization=self.organization, + location=self.location, + level_1="Faculty of Medicine", + level_2="Department of Surgery", + level_3="Cardiovascular Unit", + ) + self.assertIsNotNone(norm_aff.id) + self.assertEqual(norm_aff.organization, self.organization) + self.assertEqual(norm_aff.location, self.location) + self.assertEqual(norm_aff.level_1, "Faculty of Medicine") + self.assertEqual(norm_aff.level_2, "Department of Surgery") + self.assertEqual(norm_aff.level_3, "Cardiovascular Unit") + self.assertEqual(norm_aff.creator, self.user) + + def test_get_norm_affiliation(self): + norm_aff = self.NormAffiliation.create( + user=self.user, + organization=self.organization, + location=self.location, + level_1="Faculty of Sciences", + level_2="Department of Physics", + ) + retrieved = self.NormAffiliation.get( + organization=self.organization, + location=self.location, + level_1="Faculty of Sciences", + level_2="Department of Physics", + ) + self.assertEqual(retrieved.id, norm_aff.id) + + def test_create_or_update_creates_new(self): + norm_aff = self.NormAffiliation.create_or_update( + user=self.user, + organization=self.organization, + location=self.location, + level_1="Faculty of Engineering", + level_2="Department of Civil Engineering", + ) + self.assertIsNotNone(norm_aff.id) + self.assertEqual(norm_aff.level_1, "Faculty of Engineering") + + def test_create_or_update_updates_existing(self): + norm_aff = self.NormAffiliation.create( + user=self.user, + organization=self.organization, + location=self.location, + level_1="Faculty of Law", + level_2="Department of Criminal Law", + level_3="Criminal Procedure Unit", + ) + original_id = norm_aff.id + + updated = self.NormAffiliation.create_or_update( + user=self.user, + organization=self.organization, + location=self.location, + level_1="Faculty of Law", + level_2="Department of Criminal Law", + level_3="Criminal Procedure Unit", + ) + self.assertEqual(updated.id, original_id) + + @unittest.skip( + "TODO: O model NormAffiliation não possui unique_together " + "configurado. Ajustar o model e a migration antes de reativar este " + "teste." + ) + def test_unique_together_constraint(self): + self.NormAffiliation.create( + user=self.user, + organization=self.organization, + location=self.location, + level_1="Faculty of Arts", + level_2="Department of History", + ) + + with self.assertRaises(IntegrityError): + norm_aff2 = self.NormAffiliation.create( + user=self.user, + organization=self.organization, + location=self.location, + level_1="Faculty of Arts", + level_2="Department of History", + ) + norm_aff2.save() + + def test_str_method(self): + norm_aff = self.NormAffiliation.create( + user=self.user, + organization=self.organization, + location=self.location, + level_1="Faculty of Medicine", + ) + str_repr = str(norm_aff) + self.assertIn("University of São Paulo", str_repr) + self.assertIn("Faculty of Medicine", str_repr) \ No newline at end of file diff --git a/organization/tests/tests.py b/organization/tests/tests.py new file mode 100644 index 000000000..b3845612d --- /dev/null +++ b/organization/tests/tests.py @@ -0,0 +1,300 @@ +from unittest.mock import patch +from django.test import TestCase + +from organization.exceptions import OrganizationCreateOrUpdateError +from organization.models import Organization, OrganizationInstitutionType +from organization.tasks import ( + task_children_migrate_data, + task_migrate_date_institution_to_organization_publisher, +) +from core.users.models import User +from journal.models import PublisherHistory, CopyrightHolderHistory +from institution.models import ( + Institution, + InstitutionIdentification, + Publisher, + CopyrightHolder, +) +from location.models import Location + + +class OrganizationTest(TestCase): + def setUp(self): + self.user = User.objects.create(username="teste", password="teste") + self.institution_identification = InstitutionIdentification.objects.create( + name="Name of institution", + acronym="INSTITUTIONACRON", + is_official=True, + ) + self.location = Location.create_or_update( + user=self.user, + city_name="Fortaleza", + state_name="Ceará", + state_acronym="CE", + country_name="Brasil", + country_acronym="BR", + ) + self.institution = Institution.objects.create( + creator=self.user, + institution_identification=self.institution_identification, + location=self.location, + url="www.teste.com.br", + level_1="level_1", + level_2="level_2", + level_3="level_3", + institution_type="organização sem fins de lucros", + ) + self.institution_type_scielo = OrganizationInstitutionType.create_or_update( + user=self.user, + name="institution_type_scielo", + ) + self.publisher = Publisher.objects.create( + creator=self.user, + institution=self.institution, + ) + self.coyright = CopyrightHolder.objects.create( + creator=self.user, + institution=self.institution, + ) + + def test_create_or_update_organization(self): + self.organization = Organization.create_or_update( + user=self.user, + name=self.institution.institution_identification.name, + acronym=self.institution.institution_identification.acronym, + url=self.institution.url, + location=self.location, + institution_type_scielo=self.institution_type_scielo, + institution_type_mec="institution_type_mec", + is_official=True, + ) + + self.assertEqual(self.organization.name, "Name of institution") + self.assertEqual(self.organization.acronym, "INSTITUTIONACRON") + self.assertEqual(self.organization.url, "www.teste.com.br") + self.assertEqual(self.organization.institution_type_mec, "institution_type_mec") + self.assertEqual( + self.organization.institution_type_scielo.first(), + self.institution_type_scielo, + ) + self.assertEqual(self.organization.location.country.name, "Brasil") + self.assertEqual(self.organization.is_official, True) + + def test_create_or_update_organization_fail(self): + with self.assertRaises(OrganizationCreateOrUpdateError): + self.organization = Organization.create_or_update( + name=None, + user=self.user, + acronym=self.institution.institution_identification.acronym, + url=self.institution.url, + location=self.location, + institution_type_scielo=self.institution_type_scielo, + institution_type_mec="institution_type_mec", + is_official=True, + ) + + + def test_update_institutions(self): + self.organization = Organization.create_or_update( + user=self.user, + name=self.institution.institution_identification.name, + acronym=self.institution.institution_identification.acronym, + url=self.institution.url, + location=self.location, + institution_type_scielo=self.institution_type_scielo, + institution_type_mec="institution_type_mec", + is_official=True, + ) + + self.assertEqual(self.organization.name, "Name of institution") + self.assertEqual(self.organization.acronym, "INSTITUTIONACRON") + self.assertEqual(self.organization.url, "www.teste.com.br") + self.assertEqual(self.organization.institution_type_mec, "institution_type_mec") + self.assertEqual( + self.organization.institution_type_scielo.first(), + self.institution_type_scielo, + ) + self.assertEqual(self.organization.location.country.name, "Brasil") + self.assertEqual(self.organization.is_official, True) + + self.institution_type_scielo_2 =OrganizationInstitutionType.create_or_update( + user=self.user, + name="institution_type_scielo_2", + ) + + self.organization = Organization.create_or_update( + user=self.user, + name=self.institution.institution_identification.name, + acronym=self.institution.institution_identification.acronym, + location=self.location, + institution_type_scielo=self.institution_type_scielo_2, + institution_type_mec="institution_type_mec2", + is_official=True, + url="www.teste2.com.br", + ) + # self.organization.update_institutions(user=self.user, institution_type_mec="institution_type_mec2", institution_type_scielo=self.institution_type_scielo_2, is_official=True) + self.assertEqual(self.organization.institution_type_mec, "institution_type_mec2") + self.assertEqual( + self.organization.institution_type_scielo.count(), + 2 + ) + self.assertEqual( + self.organization.institution_type_scielo.filter(name="institution_type_scielo_2").exists(), + True + ) + self.assertEqual(self.organization.is_official, True) + self.assertEqual(self.organization.url, "www.teste2.com.br") + + +class OrganizationTaskTest(TestCase): + def setUp(self): + self.user = User.objects.create(username="teste", password="teste") + self.institution_identification = InstitutionIdentification.objects.create( + name="Name of institution", + acronym="INSTITUTIONACRON", + is_official=True, + ) + self.location = Location.create_or_update( + user=self.user, + city_name="Fortaleza", + state_name="Ceará", + state_acronym="CE", + country_name="Brasil", + country_acronym="BR", + ) + self.institution = Institution.objects.create( + creator=self.user, + institution_identification=self.institution_identification, + location=self.location, + url="www.teste.com.br", + level_1="level_1", + level_2="level_2", + level_3="level_3", + institution_type="organização sem fins de lucros", + ) + self.institution_type_scielo = OrganizationInstitutionType.create_or_update( + user=self.user, + name="institution_type_scielo", + ) + self.publisher = Publisher.objects.create( + creator=self.user, + institution=self.institution, + ) + self.coyright = CopyrightHolder.objects.create( + creator=self.user, + institution=self.institution, + ) + self.publisher_history = PublisherHistory.get_or_create( + user=self.user, + institution=self.publisher, + ) + self.coyright = CopyrightHolderHistory.get_or_create( + user=self.user, + institution=self.coyright, + ) + + @patch("organization.tasks.task_children_migrate_data.apply_async") + def test_migration_data_institution_publisher_to_organization( + self, mock_apply_async + ): + result = task_migrate_date_institution_to_organization_publisher( + user_id=None, + username="teste", + model="PublisherHistory", + collection=None, + journal=None, + ) + print(self.publisher_history.id) + mock_apply_async.assert_called_once_with( + kwargs=dict( + user_id=None, + username="teste", + model_institutition="PublisherHistory", + model_institutition_id=self.publisher_history.id, + institution_data={ + "institution__name": "Name of institution", + "institution__acronym": "INSTITUTIONACRON", + "institution__is_official": True, + "institution__level_1": "level_1", + "institution__level_2": "level_2", + "institution__level_3": "level_3", + "institution__url": "www.teste.com.br", + "institution__type": "organização sem fins de lucros", + "institution__type_scielo": None, + "location_id": self.location.id, + }, + ) + ) + called_kwargs = mock_apply_async.call_args[1]["kwargs"] + + self.assertEqual( + called_kwargs["institution_data"].get("institution__name"), + "Name of institution", + ) + self.assertEqual( + called_kwargs["institution_data"].get("institution__acronym"), + "INSTITUTIONACRON", + ) + self.assertEqual( + called_kwargs["institution_data"].get("institution__type"), + "organização sem fins de lucros", + ) + self.assertEqual( + called_kwargs["institution_data"].get("institution__level_1"), "level_1" + ) + self.assertEqual( + called_kwargs["institution_data"].get("institution__level_2"), "level_2" + ) + self.assertEqual( + called_kwargs["institution_data"].get("institution__level_3"), "level_3" + ) + self.assertEqual( + called_kwargs["institution_data"].get("institution__url"), + "www.teste.com.br", + ) + + task_children_migrate_data(**called_kwargs) + + organization = Organization.objects.first() + org_level = self.publisher_history.org_level.first() + + self.assertEqual(organization.name, "Name of institution") + self.assertEqual(organization.acronym, "INSTITUTIONACRON") + self.assertEqual( + organization.institution_type_mec, "organização sem fins de lucros" + ) + self.assertEqual(organization.url, "www.teste.com.br") + self.assertEqual(org_level.level_1, "level_1") + self.assertEqual(org_level.level_2, "level_2") + self.assertEqual(org_level.level_3, "level_3") + + self.publisher_history.refresh_from_db() + self.assertEqual(self.publisher_history.organization, organization) + + def test_migration_multiple_data_institution_publisher_to_organization(self): + args = dict( + user_id=None, + username="teste", + model_institutition="PublisherHistory", + model_institutition_id=self.publisher_history.id, + institution_data={ + "institution__name": "Name of institution", + "institution__acronym": "INSTITUTIONACRON", + "institution__is_official": True, + "institution__level_1": "level_1", + "institution__level_2": "level_2", + "institution__level_3": "level_3", + "institution__url": "www.teste.com.br", + "institution__type": "organização sem fins de lucros", + "institution__type_scielo": None, + "location_id": self.location.id, + }, + ) + task_children_migrate_data(**args) + task_children_migrate_data(**args) + + organization = Organization.objects.all() + publisher_history = PublisherHistory.objects.all() + self.assertEqual(organization.count(), 1) + self.assertEqual(publisher_history.count(), 1) + self.assertEqual(publisher_history.first().organization, organization.first())