diff --git a/backend/benefit/terms/admin.py b/backend/benefit/terms/admin.py index 0d45d97867..f8c0ae46ba 100644 --- a/backend/benefit/terms/admin.py +++ b/backend/benefit/terms/admin.py @@ -29,7 +29,7 @@ class TermsAdmin(admin.ModelAdmin): list_display = ("id", "terms_type", "effective_from") class Media: - css = {"all": ("css/markdownx.css",)} + css = {"all": ("css/markdown.css",)} class ApprovedApplicantConsentInline(admin.ModelAdmin): diff --git a/backend/benefit/terms/models.py b/backend/benefit/terms/models.py index 639be277d4..2f457409bb 100644 --- a/backend/benefit/terms/models.py +++ b/backend/benefit/terms/models.py @@ -35,9 +35,15 @@ class Terms(UUIDModel, TimeStampedModel): default=TermsType.APPLICANT_TERMS, ) - terms_md_fi = models.TextField(verbose_name=_("Finnish terms (md)"), blank=True) - terms_md_en = models.TextField(verbose_name=_("English terms (md)"), blank=True) - terms_md_sv = models.TextField(verbose_name=_("Swedish terms (md)"), blank=True) + terms_md_fi = models.TextField( + verbose_name=_("Finnish terms (md)"), blank=True, default="" + ) + terms_md_en = models.TextField( + verbose_name=_("English terms (md)"), blank=True, default="" + ) + terms_md_sv = models.TextField( + verbose_name=_("Swedish terms (md)"), blank=True, default="" + ) """ If effective_from is set to null, that means the terms are not to be displayed to the applicant. diff --git a/backend/benefit/terms/static/css/markdownx.css b/backend/benefit/terms/static/css/markdown.css similarity index 94% rename from backend/benefit/terms/static/css/markdownx.css rename to backend/benefit/terms/static/css/markdown.css index 7165fb72ac..fb339475cf 100644 --- a/backend/benefit/terms/static/css/markdownx.css +++ b/backend/benefit/terms/static/css/markdown.css @@ -39,3 +39,7 @@ list-style: disc; font-size: 1em; } + +label[for*="id_terms_md_"] { + float: none; +} diff --git a/backend/benefit/terms/tests/factories.py b/backend/benefit/terms/tests/factories.py index cf8efbf94e..c08ad2659d 100644 --- a/backend/benefit/terms/tests/factories.py +++ b/backend/benefit/terms/tests/factories.py @@ -24,11 +24,20 @@ class Meta: model = ApplicantConsent +markdown_content = """# Heading 1 + +Lorem ipsum dolor sit amet""" + + class TermsFactory(factory.django.DjangoModelFactory): terms_pdf_fi = "terms_fi.pdf" terms_pdf_en = "terms_en.pdf" terms_pdf_sv = "terms_sv.pdf" + terms_md_fi = markdown_content + terms_md_en = markdown_content + terms_md_sv = markdown_content + applicant_consent_1 = factory.RelatedFactory( ApplicantConsentFactory, factory_related_name="terms", diff --git a/backend/benefit/terms/tests/test_terms_of_service_api.py b/backend/benefit/terms/tests/test_terms_of_service_api.py index 683f68c2b0..477710e543 100644 --- a/backend/benefit/terms/tests/test_terms_of_service_api.py +++ b/backend/benefit/terms/tests/test_terms_of_service_api.py @@ -18,7 +18,7 @@ def get_current_user_url(): return "/v1/users/me/" -def test_terms_of_service_in_effect( +def test_terms_of_service_in_effect_pdf( api_client, mock_get_organisation_roles_and_create_company ): """ @@ -60,6 +60,58 @@ def test_terms_of_service_in_effect( assert response.status_code == 200 +def test_terms_of_service_in_effect_md( + api_client, mock_get_organisation_roles_and_create_company +): + """ + Test that the API returns the correct Terms and ApplicantConsents in the terms_of_service_in_effect field. + """ + current_terms = TermsFactory( + effective_from=date.today(), terms_type=TermsType.TERMS_OF_SERVICE + ) + + markdown_content = """# Heading 1 + +Lorem ipsum dolor sit amet""" + + # Create some extra terms that should not be returned + # ... old terms + TermsFactory( + effective_from=date.today() - timedelta(days=1), + terms_type=TermsType.TERMS_OF_SERVICE, + ) + # ... future terms + TermsFactory( + effective_from=date.today() + timedelta(days=1), + terms_type=TermsType.TERMS_OF_SERVICE, + ) + # ... wrong type of terms + TermsFactory(effective_from=date.today(), terms_type=TermsType.APPLICANT_TERMS) + response = api_client.get(get_current_user_url()) + + assert ( + get_company_from_request(response.wsgi_request) + == mock_get_organisation_roles_and_create_company + ) + assert response.data["terms_of_service_in_effect"]["id"] == str(current_terms.pk) + assert ( + response.data["terms_of_service_in_effect"]["terms_md_fi"] == markdown_content + ) + assert ( + response.data["terms_of_service_in_effect"]["terms_md_en"] == markdown_content + ) + assert ( + response.data["terms_of_service_in_effect"]["terms_md_sv"] == markdown_content + ) + + assert { + obj["id"] + for obj in response.data["terms_of_service_in_effect"]["applicant_consents"] + } == {str(obj.pk) for obj in current_terms.applicant_consents.all()} + + assert response.status_code == 200 + + @pytest.mark.parametrize("previously_approved", [False, True]) def test_approve_terms_success( api_client,