From 6520d719570446557602da39464a67ca08be35e5 Mon Sep 17 00:00:00 2001 From: Jonas Buchholz Date: Wed, 15 Oct 2025 11:55:44 +0200 Subject: [PATCH 1/3] logs for debugging test_poi_category_form_view:test_no_changes_were_made_message --- .../poi_categories/poi_category_form_view.py | 5 +++++ integreat_cms/core/settings.py | 4 ++++ .../test_poi_category_form_view.py | 16 ++++++++++++++++ 3 files changed, 25 insertions(+) diff --git a/integreat_cms/cms/views/poi_categories/poi_category_form_view.py b/integreat_cms/cms/views/poi_categories/poi_category_form_view.py index 61fb8901ec..cf688fad16 100644 --- a/integreat_cms/cms/views/poi_categories/poi_category_form_view.py +++ b/integreat_cms/cms/views/poi_categories/poi_category_form_view.py @@ -243,9 +243,14 @@ def form_valid(self, form: POICategoryForm) -> HttpResponseRedirect: if TYPE_CHECKING: assert self.object assert self.formset + logger.debug(f"formset changed: {self.formset.has_changed()}; form changed: {form.has_changed()}") if not self.formset.has_changed() and not form.has_changed(): + logger.debug("form has not changed") messages.info(self.request, _("No changes made")) else: + logger.debug("form has changed") + logger.debug(f"changed data in form is {form.changed_data}") + logger.debug(f"changed data in formset is {list(f.changed_data for f in self.formset)}") self.formset.save() messages.success( self.request, diff --git a/integreat_cms/core/settings.py b/integreat_cms/core/settings.py index 76e46e9080..ee5d75c859 100644 --- a/integreat_cms/core/settings.py +++ b/integreat_cms/core/settings.py @@ -752,6 +752,10 @@ "handlers": ["console-colored", "logfile"], "level": LOG_LEVEL, }, + "tests": { + "handlers": ["console-colored", "logfile"], + "level": "DEBUG", + }, "integreat_cms.core.management.commands": { "handlers": [ "management-command-stdout", diff --git a/tests/cms/views/poi_categories/test_poi_category_form_view.py b/tests/cms/views/poi_categories/test_poi_category_form_view.py index e990e7adf7..5b4ebe802f 100644 --- a/tests/cms/views/poi_categories/test_poi_category_form_view.py +++ b/tests/cms/views/poi_categories/test_poi_category_form_view.py @@ -1,4 +1,5 @@ import pytest +from django.utils.html import strip_tags from django.conf import settings from django.test.client import Client from django.urls import resolve, reverse @@ -7,6 +8,11 @@ from integreat_cms.cms.models.pois.poi import POI from tests.conftest import ANONYMOUS, CMS_TEAM, ROOT, SERVICE_TEAM, STAFF_ROLES +import re +import logging +logger = logging.getLogger(__name__) +logger.setLevel(logging.DEBUG) + DEFAULT_POST_DATA = { "icon": "daily_routine", "color": "#1DC6C6", @@ -279,6 +285,16 @@ def test_no_changes_were_made_message( response = client.get(edit_url) assert response.status_code == 200 + content = response.content.decode("utf-8") + + # clean up response content for logs: + # add newlines where HTML block elements usually separate content + clean_content = re.sub(r"]*>", "\n", content, flags=re.IGNORECASE) + clean_content = strip_tags(clean_content) + clean_content = re.sub(r"\s*\n\s*", "\n", clean_content) # clean up newlines + clean_content = re.sub(r"\n{2,}", "\n", clean_content) # collapse double newlines + logger.debug(f"response is: {clean_content}") + assert "Keine Änderungen vorgenommen" in response.content.decode("utf-8") From cec2d6d73ce13d2488ce5505c60b8643120ebdf1 Mon Sep 17 00:00:00 2001 From: Hanna Seithe Date: Thu, 16 Oct 2025 13:44:12 +0200 Subject: [PATCH 2/3] Fix ruff errors --- .../poi_categories/poi_category_form_view.py | 14 +++++++++++--- .../test_poi_category_form_view.py | 16 +++++++++++----- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/integreat_cms/cms/views/poi_categories/poi_category_form_view.py b/integreat_cms/cms/views/poi_categories/poi_category_form_view.py index cf688fad16..a97a5e02d6 100644 --- a/integreat_cms/cms/views/poi_categories/poi_category_form_view.py +++ b/integreat_cms/cms/views/poi_categories/poi_category_form_view.py @@ -243,14 +243,22 @@ def form_valid(self, form: POICategoryForm) -> HttpResponseRedirect: if TYPE_CHECKING: assert self.object assert self.formset - logger.debug(f"formset changed: {self.formset.has_changed()}; form changed: {form.has_changed()}") + formset_has_changed = self.formset.has_changed() + form_has_changed = form.has_changed() + logger.debug( + "formset changed: %s; form changed: %s", + formset_has_changed, + form_has_changed, + ) if not self.formset.has_changed() and not form.has_changed(): logger.debug("form has not changed") messages.info(self.request, _("No changes made")) else: logger.debug("form has changed") - logger.debug(f"changed data in form is {form.changed_data}") - logger.debug(f"changed data in formset is {list(f.changed_data for f in self.formset)}") + logger.debug("changed data in form is %s", form.changed_data) + logger.debug( + "changed data in formset is %s", [f.changed_data for f in self.formset] + ) self.formset.save() messages.success( self.request, diff --git a/tests/cms/views/poi_categories/test_poi_category_form_view.py b/tests/cms/views/poi_categories/test_poi_category_form_view.py index 5b4ebe802f..bcf7a1b80c 100644 --- a/tests/cms/views/poi_categories/test_poi_category_form_view.py +++ b/tests/cms/views/poi_categories/test_poi_category_form_view.py @@ -1,15 +1,16 @@ +import logging +import re + import pytest -from django.utils.html import strip_tags from django.conf import settings from django.test.client import Client from django.urls import resolve, reverse +from django.utils.html import strip_tags from integreat_cms.cms.models.poi_categories.poi_category import POICategory from integreat_cms.cms.models.pois.poi import POI from tests.conftest import ANONYMOUS, CMS_TEAM, ROOT, SERVICE_TEAM, STAFF_ROLES -import re -import logging logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) @@ -289,11 +290,16 @@ def test_no_changes_were_made_message( # clean up response content for logs: # add newlines where HTML block elements usually separate content - clean_content = re.sub(r"]*>", "\n", content, flags=re.IGNORECASE) + clean_content = re.sub( + r"]*>", + "\n", + content, + flags=re.IGNORECASE, + ) clean_content = strip_tags(clean_content) clean_content = re.sub(r"\s*\n\s*", "\n", clean_content) # clean up newlines clean_content = re.sub(r"\n{2,}", "\n", clean_content) # collapse double newlines - logger.debug(f"response is: {clean_content}") + logger.debug("response is: %s", clean_content) assert "Keine Änderungen vorgenommen" in response.content.decode("utf-8") From ca1b028c83b00bba7dd47da29bda979cbdaf010a Mon Sep 17 00:00:00 2001 From: Hanna Seithe Date: Fri, 17 Oct 2025 09:53:24 +0200 Subject: [PATCH 3/3] Run failing container --- .circleci/config.yml | 10 ++++--- test_selection.txt | 8 ++++++ .../test_poi_category_form_view.py | 25 +++++++++++++++++ tests/conftest.py | 27 +++++++++++++++++++ 4 files changed, 67 insertions(+), 3 deletions(-) create mode 100644 test_selection.txt diff --git a/.circleci/config.yml b/.circleci/config.yml index ca96de611b..c51890d5ab 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -251,7 +251,7 @@ jobs: POSTGRES_DB: integreat POSTGRES_PASSWORD: password resource_class: large - parallelism: 16 + parallelism: 1 steps: - checkout - attach_workspace: @@ -266,8 +266,12 @@ jobs: name: Migrate database command: integreat-cms-cli migrate --settings=integreat_cms.core.circleci_settings - run: - name: Run tests - command: pytest --circleci-parallelize --disable-warnings --cov=integreat_cms --cov-report=xml:coverage.xml --junitxml=test-results/junit.xml --ds=integreat_cms.core.circleci_settings + name: Run specific tests in strict order + command: | + pytest tests/cms/views/status_code/test_view_status_code_11.py tests/pdf/test_pdf_export.py tests/cms/test_media_library.py tests/cms/test_page_filters.py tests/cms/views/utils/test_hix.py tests/cms/views/poi_categories/test_poi_category_form_view.py tests/cms/views/test_public_view_status_code.py tests/core/management/commands/test_summ_ai_bulk.py --disable-warnings --ds=integreat_cms.core.circleci_settings + #- run: + # name: Run tests + # command: pytest --circleci-parallelize --disable-warnings --cov=integreat_cms --cov-report=xml:coverage.xml --junitxml=test-results/junit.xml --ds=integreat_cms.core.circleci_settings - store_test_results: path: test-results - store_artifacts: diff --git a/test_selection.txt b/test_selection.txt new file mode 100644 index 0000000000..8488ef47cc --- /dev/null +++ b/test_selection.txt @@ -0,0 +1,8 @@ +tests/cms/views/status_code/test_view_status_code_11.py +tests/pdf/test_pdf_export.py +tests/cms/test_media_library.py +tests/cms/test_page_filters.py +tests/cms/views/utils/test_hix.py +tests/cms/views/poi_categories/test_poi_category_form_view.py +tests/cms/views/test_public_view_status_code.py +tests/core/management/commands/test_summ_ai_bulk.py \ No newline at end of file diff --git a/tests/cms/views/poi_categories/test_poi_category_form_view.py b/tests/cms/views/poi_categories/test_poi_category_form_view.py index bcf7a1b80c..d38e737f00 100644 --- a/tests/cms/views/poi_categories/test_poi_category_form_view.py +++ b/tests/cms/views/poi_categories/test_poi_category_form_view.py @@ -7,6 +7,7 @@ from django.urls import resolve, reverse from django.utils.html import strip_tags +from integreat_cms.cms.models.languages.language import Language from integreat_cms.cms.models.poi_categories.poi_category import POICategory from integreat_cms.cms.models.pois.poi import POI from tests.conftest import ANONYMOUS, CMS_TEAM, ROOT, SERVICE_TEAM, STAFF_ROLES @@ -243,6 +244,9 @@ def test_no_changes_were_made_message( new_poicategory_url = reverse("new_poicategory") + for language in Language.objects.all(): + logger.debug("Language: %s - language-id: %s - slug:%s",language, language.id, language.slug) + response = client.post( new_poicategory_url, data=DEFAULT_POST_DATA @@ -257,6 +261,12 @@ def test_no_changes_were_made_message( poicategory = POICategory.objects.get(id=id_of_poicategory) translation = poicategory.translations.get(language__slug="de") + translations = poicategory.translations.all() + + logger.debug("Translations after first save") + for translation in translations: + logger.debug("Translation: %s - language: %s", translation, translation.language) + response = client.post( edit_url, data={ @@ -282,6 +292,21 @@ def test_no_changes_were_made_message( }, ) + edit_url = response.headers.get("location") + + id_of_poicategory = resolve(edit_url).kwargs["pk"] + + poicategory = POICategory.objects.get(id=id_of_poicategory) + translation = poicategory.translations.get(language__slug="de") + + translations = poicategory.translations.all() + + logger.debug("Translations after second save") + for translation in translations: + logger.debug("Translation: %s - language: %s", translation, translation.language) + + + assert response.status_code == 302 response = client.get(edit_url) assert response.status_code == 200 diff --git a/tests/conftest.py b/tests/conftest.py index 26478585ad..d9acd54ecd 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -161,3 +161,30 @@ def configure_celery_for_tests(settings: SettingsWrapper) -> None: # so we set celery to run synchronously and propagate errors to the test runner settings.CELERY_TASK_ALWAYS_EAGER = True settings.CELERY_TASK_EAGER_PROPAGATES = True + +def pytest_collection_modifyitems(items): + DESIRED_ORDER = [ + "tests.cms.views.status_code.test_view_status_code_11", + "tests.pdf.test_pdf_export", + "tests.cms.test_media_library", + "tests.cms.test_page_filters", + "test_hix", + "test_poi_category_form_view", + "tests.cms.views.test_public_view_status_code", + "tests.core.management.commands.test_summ_ai_bulk", + ] + + def module_name(item): + return item.module.__name__ + + sorted_items = [] + remaining = items.copy() + + for module in DESIRED_ORDER: + matching = [it for it in remaining if module_name(it) == module] + remaining = [it for it in remaining if module_name(it) != module] + sorted_items.extend(matching) + + print(sorted_items) + + items[:] = sorted_items \ No newline at end of file