from django.conf import settings from django.core import mail from django.test import SimpleTestCase, TestCase, override_settings from django.urls import reverse, resolve from items.models import Category, Item @override_settings(EMAIL_BACKEND="django.core.mail.backends.locmem.EmailBackend", ADMINISTRATOR_EMAIL="admin@example.com") class FaqQuestionTests(TestCase): def test_faq_question_form_sends_email_to_administrator(self): response = self.client.post( reverse("home"), data={ "name": "Иван Петров", "phone": "+375291112233", "question": "Сколько стоит доставка?", "accept": "on", }, ) self.assertEqual(response.status_code, 302) self.assertEqual(response["Location"], reverse("home") + "#faq-section") self.assertEqual(len(mail.outbox), 1) self.assertEqual(mail.outbox[0].to, ["admin@example.com"]) self.assertIn("Иван Петров", mail.outbox[0].body) self.assertIn("Сколько стоит доставка?", mail.outbox[0].body) def test_faq_question_form_requires_consent(self): response = self.client.post( reverse("home"), data={ "name": "Иван Петров", "phone": "+375291112233", "question": "Сколько стоит доставка?", }, ) self.assertEqual(response.status_code, 200) self.assertEqual(len(mail.outbox), 0) self.assertContains(response, "Необходимо согласие на обработку персональных данных.") def test_faq_question_form_rejects_digits_in_name(self): response = self.client.post( reverse("home"), data={ "name": "Иван123", "phone": "+375291112233", "question": "Сколько стоит доставка?", "accept": "on", }, ) self.assertEqual(response.status_code, 200) self.assertEqual(len(mail.outbox), 0) self.assertContains(response, "Имя не должно содержать цифры.") def test_faq_question_form_rejects_invalid_phone_characters(self): response = self.client.post( reverse("home"), data={ "name": "Иван Петров", "phone": "+375 (29) abc", "question": "Сколько стоит доставка?", "accept": "on", }, ) self.assertEqual(response.status_code, 200) self.assertEqual(len(mail.outbox), 0) self.assertContains(response, "Телефон может содержать только цифры и дефисы.") def test_faq_question_form_accepts_phone_with_plus_and_dashes(self): response = self.client.post( reverse("home"), data={ "name": "Иван Петров", "phone": "+375-29-111-22-33", "question": "Сколько стоит доставка?", "accept": "on", }, ) self.assertEqual(response.status_code, 302) self.assertEqual(len(mail.outbox), 1) def test_faq_question_form_accepts_phone_starting_with_digit(self): response = self.client.post( reverse("home"), data={ "name": "Иван Петров", "phone": "375291112233", "question": "Сколько стоит доставка?", "accept": "on", }, ) self.assertEqual(response.status_code, 302) self.assertEqual(len(mail.outbox), 1) def test_faq_question_form_rejects_phone_with_invalid_digits_count(self): response = self.client.post( reverse("home"), data={ "name": "Иван Петров", "phone": "+12345", "question": "Сколько стоит доставка?", "accept": "on", }, ) self.assertEqual(response.status_code, 200) self.assertEqual(len(mail.outbox), 0) self.assertContains(response, "Телефон должен содержать от 9 до 15 цифр.") class HomePopularProductsTests(TestCase): def setUp(self): self.category = Category.objects.create(name="Plumbing", slug="plumbing") def test_home_page_renders_available_products(self): visible_item = Item.objects.create( name="Visible sink", slug="visible-sink", category=self.category, price="1600.00", is_available=True, ) Item.objects.create( name="Hidden sink", slug="hidden-sink", category=self.category, price="1800.00", is_available=False, ) response = self.client.get(reverse("home")) self.assertEqual(response.status_code, 200) self.assertContains(response, visible_item.name) self.assertContains(response, reverse("detail", args=[self.category.slug, visible_item.slug])) self.assertContains( response, f'