diff options
Diffstat (limited to 'archaeological_operations/tests.py')
| -rw-r--r-- | archaeological_operations/tests.py | 108 | 
1 files changed, 83 insertions, 25 deletions
diff --git a/archaeological_operations/tests.py b/archaeological_operations/tests.py index b13bf99ff..cc0a8cb1b 100644 --- a/archaeological_operations/tests.py +++ b/archaeological_operations/tests.py @@ -24,6 +24,7 @@ from io import StringIO, BytesIO  import tempfile  import locale  from unittest.mock import patch +from urllib.parse import quote as url_quote  import zipfile  import requests @@ -35,7 +36,7 @@ from django.core.files import File as DjangoFile  from django.core.files.uploadedfile import SimpleUploadedFile  from django.db.models import Q  from django.test import tag -from django.test.client import Client +from django.test.client import Client, RequestFactory  from django.urls import reverse  from django.utils.text import slugify @@ -50,6 +51,7 @@ from . import models  from ishtar_common import models_rest  from ishtar_common.admin import update_types_from_source  from ishtar_common.views import document_deletion_steps +from ishtar_common.views_item import get_item, adapt_distant_search  from ishtar_common.serializers import document_serialization  from archaeological_operations import views, serializers @@ -4442,15 +4444,25 @@ class ApiTest(OperationInitTest, APITestCase):          self.create_operation(self.user, self.orgas[0])          self.create_operation(self.user, self.orgas[0])          self.create_operation(self.user, self.orgas[0]) + +        keys = ("old-neolithic", "middle-neolithic", "recent-neolithic", +                "final-neolithic") +        old_neo = models.Period.objects.get(txt_idx='old-neolithic') +        middle_neo = models.Period.objects.get(txt_idx='middle-neolithic') +        recent_neo = models.Period.objects.get(txt_idx='recent-neolithic') +        final_neo = models.Period.objects.get(txt_idx='final-neolithic')          self.operation_0 = models.Operation.objects.get(pk=self.operations[0].pk)          self.operation_0.code_patriarche = "28123"          self.operation_0.save() +        self.operation_0.periods.add(old_neo)          self.operation_1 = models.Operation.objects.get(pk=self.operations[1].pk)          self.operation_1.code_patriarche = "28124"          self.operation_1.save() +        self.operation_1.periods.add(middle_neo)          self.operation_2 = models.Operation.objects.get(pk=self.operations[2].pk)          self.operation_2.code_patriarche = "29123"          self.operation_2.save() +        self.operation_2.periods.add(recent_neo)          self.operation_3 = models.Operation.objects.get(pk=self.operations[3].pk)          self.operation_3.code_patriarche = "29124"          self.operation_3.save() @@ -4755,36 +4767,83 @@ class ApiTest(OperationInitTest, APITestCase):          self.assertIn(msg, response)          # TODO: mark with no update +    def _mock_search(self, mock_get, model, url): +        _get_item = get_item( +            model, +            "get_" + model.SLUG, +            model.SLUG, +            no_permission_check=True +        ) +        mock_get.__call__ = _get_item + +        def __json(): +            return json.loads(mock_get.return_value.text) + +        mock_get.return_value.json = __json +        mock_get.return_value.status_code = 200 + +        factory = RequestFactory() +        request = factory.get(url) +        request.user = self.user +        mock_get.return_value.text = _get_item(request).content + +    def __construct_search(self, source): +        params = {"submited": "1", "search_vector": ['periode="Néolithique final"']} +        adapt_distant_search(params, source, "operation") +        attr = "?" +        for idx, k in enumerate(params.keys()): +            if idx: +                attr += "&" +            value = params[k] +            if isinstance(value, list): +                value = value[0] +            attr += f"{k}={url_quote(value)}" +        return attr +      @patch("requests.get")      def test_query_transformation(self, mock_get): -        # POV: local +        # POV: external          # change query terms from a source Ishtar to match distant Ishtar -        self._mock_request(mock_get) -        self.client.login(username=self.username, password=self.password) +        api_search_model = self.create_api_search_model()          source = self._get_source() -        url = "/admin/{}/{}/".format( -            "ishtar_common", models_rest.ApiExternalSource.__name__.lower() +        content_type = ContentType.objects.get_for_model(models.Period) +        api_key, __ = models_rest.ApiKeyMatch.objects.get_or_create( +            source=source, +            associated_type=content_type, +            search_model=api_search_model.content_type, +            search_keys=["period", "periode"], +            distant_slug="middle-neolithic", +            distant_label="Néolithique moyen", +            local_slug="middle-neolithic", +            local_label="Néolithique moyen", +        ) + +        base_url = reverse("search-external", args=["operation", source.pk]) +        params = self.__construct_search(source) +        url = base_url + params +        self._mock_search(mock_get, models.Operation, "/get-operation/" + params) +        response = self.client.get( +            url, format="json", HTTP_AUTHORIZATION=self.auth_token,          ) -        params = { -            "action": "update_types_from_source", -            "_selected_action": [source.pk], -        } -        self.client.post(url, params, follow=True) +        self.assertEqual(response.status_code, 200) +        j = json.loads(response.content.decode()) +        self.assertEqual(j["recordsTotal"], 0, "error on classic search") +          # change a key match -        content_type = ContentType.objects.get_for_model(models.Period) -        # no republic for local -        models_rest.ApiKeyMatch.objects.get( -            source=source, associated_type=content_type, -            distant_key="republic" -        ).delete() -        # local have only neolithic period no detail -        keys = ("old-neolithic", "middle-neolithic", "recent-neolithic", -                "final-neolithic") -        models_rest.ApiKeyMatch.objects.filter( -            source=source, associated_type=content_type, -            distant_key__in=keys).update( -            local_slug="neolithic", local_label="Néolithique") +        # final neolithic -> middle-neolitic +        api_key.local_slug = "final-neolithic" +        api_key.local_label = "Néolithique final" +        api_key.save() +        params = self.__construct_search(source) +        url = base_url + params +        self._mock_search(mock_get, models.Operation, "/get-operation/" + params) +        response = self.client.get( +            url, format="json", HTTP_AUTHORIZATION=self.auth_token, +        ) +        self.assertEqual(response.status_code, 200) +        j = json.loads(response.content.decode()) +        self.assertEqual(j["recordsTotal"], 1, "error on query transformation")      def test_external_source_query(self):          # POV: local @@ -4808,4 +4867,3 @@ class ApiTest(OperationInitTest, APITestCase):          )          self.assertEqual(response.status_code, 200)          j = json.loads(response.content.decode()) -        print(j)  | 
