Files
print_forge/site/contacts/tests_merge.py
T
westfarn c9b81ceed7
CI / test (pull_request) Successful in 35s
Add customer accounts, shipment tracking, and purchase reviews.
Shoppers can register, save shipping details, and view order history while cards stay on Stripe. EasyPost tracker updates (including numbers from Pirate Ship) and 1–5 star reviews are limited to buyers. The contact form now only asks for email and a message.
2026-09-07 06:37:52 -05:00

251 lines
8.4 KiB
Python

from django.contrib.auth import get_user_model
from django.test import Client, TestCase
from django.urls import reverse
from contacts.models import Contact
from contacts.services import (
addresses_match,
find_matching_contact,
phones_match,
upsert_contact,
)
from leads.models import Lead
class ContactMatchHelpersTests(TestCase):
def test_phones_match_ignores_formatting(self):
self.assertTrue(phones_match("(630) 452-4443", "+1-630-452-4443"))
self.assertFalse(phones_match("6304524443", "6304524444"))
self.assertFalse(phones_match("4524443", "6304524443")) # too short
def test_addresses_match_by_line1_and_zip(self):
a = Contact.make_postal_address(
line1="123 Main St.",
city="Naperville",
state="IL",
zip_code="60540-1234",
)
b = Contact.make_postal_address(
line1="123 Main St",
city="Elsewhere",
state="IL",
zip_code="60540",
)
self.assertTrue(addresses_match(a, b))
def test_find_by_phone_then_address(self):
existing = Contact.objects.create(
email="one@example.com",
phone="6305551212",
first_name="Pat",
postal_address=Contact.make_postal_address(
line1="9 Oak Ave",
city="Wheaton",
state="IL",
zip_code="60187",
),
)
by_phone, reason = find_matching_contact(
email="other@example.com",
phone="(630) 555-1212",
)
self.assertEqual(by_phone, existing)
self.assertEqual(reason, "phone")
by_addr, reason = find_matching_contact(
email="third@example.com",
phone="9995550000",
postal_address=Contact.make_postal_address(
line1="9 Oak Ave",
city="Wheaton",
state="IL",
zip_code="60187",
),
)
self.assertEqual(by_addr, existing)
self.assertEqual(reason, "address")
class UpsertContactMergeTests(TestCase):
def test_merge_by_phone_keeps_one_contact(self):
original = Contact.objects.create(
email="ryan@example.com",
phone="6305559999",
first_name="Ryan",
)
contact, created, reason = upsert_contact(
email="ryan.alt@example.com",
first_name="Ryan",
last_name="Westfall",
phone="630-555-9999",
)
self.assertFalse(created)
self.assertEqual(reason, "phone")
self.assertEqual(contact.pk, original.pk)
self.assertEqual(Contact.objects.count(), 1)
contact.refresh_from_db()
self.assertEqual(contact.email, "ryan@example.com")
self.assertIn("ryan.alt@example.com", contact.notes)
self.assertEqual(contact.last_name, "Westfall")
def test_merge_by_address(self):
original = Contact.objects.create(
email="home@example.com",
first_name="Sam",
postal_address=Contact.make_postal_address(
line1="100 Lake St",
city="Naperville",
state="IL",
zip_code="60540",
),
)
contact, created, reason = upsert_contact(
email="new@example.com",
first_name="Sam",
postal_address=Contact.make_postal_address(
line1="100 Lake St",
city="Naperville",
state="IL",
zip_code="60540",
),
)
self.assertFalse(created)
self.assertEqual(reason, "address")
self.assertEqual(contact.pk, original.pk)
self.assertEqual(Contact.objects.count(), 1)
class ContactFormMergeTests(TestCase):
def setUp(self):
self.client = Client()
self.existing = Contact.objects.create(
email="primary@example.com",
phone="6301112222",
first_name="Alex",
postal_address=Contact.make_postal_address(
line1="55 River Rd",
city="Aurora",
state="IL",
zip_code="60505",
),
)
def test_contact_form_merges_on_email(self):
url = reverse("public:contact")
response = self.client.post(
url,
{
"email": "primary@example.com",
"interest": "general",
"message": "Looking to buy",
},
)
self.assertEqual(response.status_code, 302)
self.assertEqual(Contact.objects.count(), 1)
lead = Lead.objects.get()
self.assertEqual(lead.contact_id, self.existing.pk)
self.assertIn("Looking to buy", lead.message)
def test_contact_form_skips_name_phone_address(self):
url = reverse("public:contact")
response = self.client.post(
url,
{
"email": "newbuyer@example.com",
"interest": "custom",
"message": "Can you print a fox?",
"first_name": "Ignored",
"phone": "6301112222",
"address_line1": "55 River Rd",
},
)
self.assertEqual(response.status_code, 302)
from contacts.models import Contact as ContactModel
created = ContactModel.objects.get(email="newbuyer@example.com")
self.assertEqual(created.first_name, "")
self.assertEqual(created.phone, "")
self.assertEqual(created.postal_address, {})
class PortalCreateMatchPromptTests(TestCase):
def setUp(self):
User = get_user_model()
self.user = User.objects.create_user(
username="adder", password="test-pass-123", is_staff=True
)
self.client = Client()
self.client.login(username="adder", password="test-pass-123")
self.existing = Contact.objects.create(
email="primary@example.com",
phone="6301112222",
first_name="Alex",
)
def test_phone_match_shows_prompt(self):
url = reverse("contacts:create")
response = self.client.post(
url,
{
"first_name": "Alex",
"email": "alt@example.com",
"phone": "(630) 111-2222",
"consent_email": "1",
},
)
self.assertEqual(response.status_code, 200)
self.assertContains(response, "Possible duplicate")
self.assertContains(response, "Update existing")
self.assertEqual(Contact.objects.count(), 1)
def test_choose_create_new_keeps_both(self):
url = reverse("contacts:create")
response = self.client.post(
url,
{
"first_name": "Alex",
"email": "alt@example.com",
"phone": "(630) 111-2222",
"consent_email": "1",
"resolve_match": "create",
"match_id": str(self.existing.pk),
},
)
self.assertEqual(response.status_code, 302)
self.assertEqual(Contact.objects.count(), 2)
def test_choose_update_merges(self):
url = reverse("contacts:create")
response = self.client.post(
url,
{
"first_name": "Alexander",
"email": "alt@example.com",
"phone": "(630) 111-2222",
"consent_email": "1",
"resolve_match": "update",
"match_id": str(self.existing.pk),
},
)
self.assertEqual(response.status_code, 302)
self.assertEqual(Contact.objects.count(), 1)
self.existing.refresh_from_db()
self.assertEqual(self.existing.first_name, "Alexander")
self.assertIn("alt@example.com", self.existing.notes)
class ContactListTests(TestCase):
def setUp(self):
User = get_user_model()
self.user = User.objects.create_user(
username="lister", password="test-pass-123", is_staff=True
)
self.client = Client()
self.client.login(username="lister", password="test-pass-123")
def test_list_renders_and_links_campaigns(self):
response = self.client.get(reverse("contacts:list"))
self.assertEqual(response.status_code, 200)
self.assertContains(response, "Mailing list")
self.assertContains(response, reverse("email_sms:campaign_list"))