Add unittests and fix tracking error
This commit is contained in:
@@ -5,7 +5,25 @@ on:
|
|||||||
branches: [master]
|
branches: [master]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
test:
|
||||||
|
runs-on: self-hosted
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Set up Python environment
|
||||||
|
run: |
|
||||||
|
python3 -m venv .venv
|
||||||
|
.venv/bin/pip install --upgrade pip
|
||||||
|
.venv/bin/pip install -r requirements.txt
|
||||||
|
|
||||||
|
- name: Run unit tests
|
||||||
|
run: |
|
||||||
|
cd company_site
|
||||||
|
../.venv/bin/python manage.py test
|
||||||
|
|
||||||
deploy:
|
deploy:
|
||||||
|
needs: test
|
||||||
runs-on: self-hosted
|
runs-on: self-hosted
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
|
|||||||
@@ -155,6 +155,7 @@ EMAIL_USE_TLS = True
|
|||||||
LOGIN_REDIRECT_URL = '/'
|
LOGIN_REDIRECT_URL = '/'
|
||||||
LOGOUT_REDIRECT_URL = '/'
|
LOGOUT_REDIRECT_URL = '/'
|
||||||
|
|
||||||
# Tianji analytics (loaded only after user consent in production)
|
# Tianji analytics (loaded only after user consent)
|
||||||
|
TIANJI_ENABLED = os.environ.get('TIANJI_ENABLED', 'true').lower() in ('1', 'true', 'yes')
|
||||||
TIANJI_TRACKER_URL = 'https://tianji.aimloperations.com/tracker.js'
|
TIANJI_TRACKER_URL = 'https://tianji.aimloperations.com/tracker.js'
|
||||||
TIANJI_WEBSITE_ID = 'cm7w80pyy020oddswy2evl957'
|
TIANJI_WEBSITE_ID = 'cm7w80pyy020oddswy2evl957'
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ from django.conf import settings
|
|||||||
|
|
||||||
def tianji_tracking(request):
|
def tianji_tracking(request):
|
||||||
return {
|
return {
|
||||||
'tianji_enabled': not settings.DEBUG,
|
'tianji_enabled': getattr(settings, 'TIANJI_ENABLED', True),
|
||||||
'tianji_tracker_url': getattr(
|
'tianji_tracker_url': getattr(
|
||||||
settings,
|
settings,
|
||||||
'TIANJI_TRACKER_URL',
|
'TIANJI_TRACKER_URL',
|
||||||
|
|||||||
@@ -1,3 +1,127 @@
|
|||||||
from django.test import TestCase
|
from unittest.mock import patch
|
||||||
|
|
||||||
# Create your tests here.
|
from django.test import Client, TestCase, override_settings
|
||||||
|
from django.urls import reverse
|
||||||
|
|
||||||
|
from .models import Contact
|
||||||
|
|
||||||
|
|
||||||
|
@override_settings(
|
||||||
|
DEBUG=True,
|
||||||
|
EMAIL_BACKEND="django.core.mail.backends.locmem.EmailBackend",
|
||||||
|
)
|
||||||
|
class ContactViewTests(TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
self.client = Client()
|
||||||
|
self.url = reverse("contact")
|
||||||
|
self.valid_payload = {
|
||||||
|
"name": "Jane Doe",
|
||||||
|
"email": "jane@example.com",
|
||||||
|
"subject": "Automation inquiry",
|
||||||
|
"message": "We need help automating our workflow.",
|
||||||
|
}
|
||||||
|
|
||||||
|
def test_contact_get_renders_form(self):
|
||||||
|
response = self.client.get(self.url)
|
||||||
|
|
||||||
|
self.assertEqual(response.status_code, 200)
|
||||||
|
self.assertContains(response, "Send Us a Message")
|
||||||
|
self.assertContains(response, 'name="name"')
|
||||||
|
self.assertContains(response, 'name="email"')
|
||||||
|
self.assertContains(response, 'name="subject"')
|
||||||
|
|
||||||
|
@patch("public.views.send_contact_email")
|
||||||
|
def test_contact_post_success_saves_contact_and_sends_email(self, mock_send_email):
|
||||||
|
response = self.client.post(self.url, self.valid_payload)
|
||||||
|
|
||||||
|
self.assertEqual(response.status_code, 200)
|
||||||
|
self.assertContains(response, "We'll be in contact shortly!")
|
||||||
|
|
||||||
|
contact = Contact.objects.get()
|
||||||
|
self.assertEqual(contact.name, "Jane Doe")
|
||||||
|
self.assertEqual(contact.email, "jane@example.com")
|
||||||
|
self.assertEqual(contact.subject, "Automation inquiry")
|
||||||
|
self.assertEqual(contact.blurb, "We need help automating our workflow.")
|
||||||
|
self.assertFalse(contact.contacted)
|
||||||
|
|
||||||
|
mock_send_email.assert_called_once_with(
|
||||||
|
"jane@example.com",
|
||||||
|
"Automation inquiry",
|
||||||
|
"We need help automating our workflow.",
|
||||||
|
)
|
||||||
|
|
||||||
|
@patch("public.views.send_contact_email")
|
||||||
|
def test_contact_post_without_message_still_succeeds(self, mock_send_email):
|
||||||
|
payload = {**self.valid_payload, "message": ""}
|
||||||
|
|
||||||
|
response = self.client.post(self.url, payload)
|
||||||
|
|
||||||
|
self.assertEqual(response.status_code, 200)
|
||||||
|
self.assertContains(response, "We'll be in contact shortly!")
|
||||||
|
self.assertEqual(Contact.objects.count(), 1)
|
||||||
|
self.assertEqual(Contact.objects.get().blurb, "")
|
||||||
|
mock_send_email.assert_called_once()
|
||||||
|
|
||||||
|
def test_contact_post_missing_name_shows_error(self):
|
||||||
|
payload = {**self.valid_payload, "name": ""}
|
||||||
|
|
||||||
|
response = self.client.post(self.url, payload)
|
||||||
|
|
||||||
|
self.assertEqual(response.status_code, 200)
|
||||||
|
self.assertContains(response, "Name is required")
|
||||||
|
self.assertEqual(Contact.objects.count(), 0)
|
||||||
|
|
||||||
|
def test_contact_post_missing_email_shows_error(self):
|
||||||
|
payload = {**self.valid_payload, "email": ""}
|
||||||
|
|
||||||
|
response = self.client.post(self.url, payload)
|
||||||
|
|
||||||
|
self.assertEqual(response.status_code, 200)
|
||||||
|
self.assertContains(response, "Email is required")
|
||||||
|
self.assertEqual(Contact.objects.count(), 0)
|
||||||
|
|
||||||
|
def test_contact_post_missing_name_and_email_shows_error(self):
|
||||||
|
payload = {**self.valid_payload, "name": "", "email": ""}
|
||||||
|
|
||||||
|
response = self.client.post(self.url, payload)
|
||||||
|
|
||||||
|
self.assertEqual(response.status_code, 200)
|
||||||
|
self.assertContains(response, "Both name and email are required")
|
||||||
|
self.assertEqual(Contact.objects.count(), 0)
|
||||||
|
|
||||||
|
def test_contact_post_missing_subject_does_not_save(self):
|
||||||
|
payload = {**self.valid_payload, "subject": ""}
|
||||||
|
|
||||||
|
response = self.client.post(self.url, payload)
|
||||||
|
|
||||||
|
self.assertEqual(response.status_code, 200)
|
||||||
|
self.assertNotContains(response, "We'll be in contact shortly!")
|
||||||
|
self.assertEqual(Contact.objects.count(), 0)
|
||||||
|
|
||||||
|
@override_settings(DEBUG=False)
|
||||||
|
@patch("public.views.FormWithCaptcha.is_valid", return_value=False)
|
||||||
|
def test_contact_post_invalid_captcha_shows_error(self, _mock_is_valid):
|
||||||
|
response = self.client.post(self.url, self.valid_payload)
|
||||||
|
|
||||||
|
self.assertEqual(response.status_code, 200)
|
||||||
|
self.assertContains(response, "There was an error submitting. Try again")
|
||||||
|
self.assertEqual(Contact.objects.count(), 0)
|
||||||
|
|
||||||
|
|
||||||
|
@override_settings(DEBUG=True, TIANJI_ENABLED=True)
|
||||||
|
class TianjiTrackingTests(TestCase):
|
||||||
|
def test_homepage_includes_consent_banner_when_enabled(self):
|
||||||
|
response = self.client.get(reverse("public_index"))
|
||||||
|
|
||||||
|
self.assertEqual(response.status_code, 200)
|
||||||
|
self.assertContains(response, "cookie-consent-banner")
|
||||||
|
self.assertContains(response, "tianji-config")
|
||||||
|
self.assertContains(response, "tianji-consent.js")
|
||||||
|
|
||||||
|
@override_settings(TIANJI_ENABLED=False)
|
||||||
|
def test_homepage_omits_consent_banner_when_disabled(self):
|
||||||
|
response = self.client.get(reverse("public_index"))
|
||||||
|
|
||||||
|
self.assertEqual(response.status_code, 200)
|
||||||
|
self.assertNotContains(response, "cookie-consent-banner")
|
||||||
|
self.assertNotContains(response, "tianji-config")
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ Django==5.0
|
|||||||
django-enum==2.1.0
|
django-enum==2.1.0
|
||||||
django-phonenumber-field==8.0.0
|
django-phonenumber-field==8.0.0
|
||||||
django-recaptcha==4.0.0
|
django-recaptcha==4.0.0
|
||||||
|
python-dateutil==2.9.0.post0
|
||||||
gunicorn==23.0.0
|
gunicorn==23.0.0
|
||||||
psycopg2-binary==2.9.10
|
psycopg2-binary==2.9.10
|
||||||
filelock==3.17.0
|
filelock==3.17.0
|
||||||
|
|||||||
Reference in New Issue
Block a user