Small fixes
This commit is contained in:
@@ -560,6 +560,18 @@ async def process_wix_form_submission(request: Request, data: dict[str, Any], db
|
||||
name_prefix = data.get("field:anrede")
|
||||
|
||||
email_newsletter = data.get("field:form_field_5a7b", False)
|
||||
|
||||
# if email_newsletter is a string, attempt to convert to boolean, else false
|
||||
if isinstance(email_newsletter, str):
|
||||
email_newsletter = email_newsletter.lower() in [
|
||||
"yes",
|
||||
"true",
|
||||
"1",
|
||||
"on",
|
||||
"selezionato",
|
||||
"angekreuzt",
|
||||
]
|
||||
|
||||
address_line = None
|
||||
city_name = None
|
||||
postal_code = None
|
||||
@@ -585,14 +597,20 @@ async def process_wix_form_submission(request: Request, data: dict[str, Any], db
|
||||
num_children = int(data.get("field:anzahl_kinder") or 0)
|
||||
children_ages = []
|
||||
if num_children > 0:
|
||||
# Collect all child age fields, then take only the first num_children
|
||||
# This handles form updates that may send extra padded/zero fields
|
||||
temp_ages = []
|
||||
for k in data:
|
||||
if k.startswith("field:alter_kind_"):
|
||||
try:
|
||||
age = int(data[k])
|
||||
children_ages.append(age)
|
||||
temp_ages.append(age)
|
||||
except ValueError:
|
||||
_LOGGER.warning("Invalid age value for %s: %s", k, data[k])
|
||||
|
||||
# Only keep the first num_children ages, regardless of their values
|
||||
children_ages = temp_ages[:num_children]
|
||||
|
||||
offer = data.get("field:angebot_auswaehlen")
|
||||
|
||||
# get submissionId and ensure max length 35. Generate one if not present
|
||||
|
||||
@@ -11,6 +11,7 @@ This module tests all FastAPI endpoints including:
|
||||
|
||||
import base64
|
||||
import gzip
|
||||
import json
|
||||
import uuid
|
||||
from pathlib import Path
|
||||
from unittest.mock import patch
|
||||
@@ -263,6 +264,29 @@ class TestWixWebhookEndpoint:
|
||||
data = response.json()
|
||||
assert data["status"] == "success"
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"test_form_file",
|
||||
[
|
||||
Path(__file__).parent / "test_data" / f"test_form{i}.json"
|
||||
for i in range(1, 6)
|
||||
],
|
||||
ids=lambda p: p.name,
|
||||
)
|
||||
def test_wix_webhook_test_endpoint_with_test_forms(self, client, test_form_file):
|
||||
"""Test the test endpoint works with all test form data files."""
|
||||
# Skip if file doesn't exist
|
||||
if not test_form_file.exists():
|
||||
pytest.skip(f"{test_form_file.name} not found")
|
||||
|
||||
# Load test form data
|
||||
with test_form_file.open() as f:
|
||||
form_data = json.load(f)
|
||||
|
||||
response = client.post("/api/webhook/wix-form/test", json=form_data)
|
||||
assert response.status_code == HttpStatusCode.OK
|
||||
data = response.json()
|
||||
assert data["status"] == "success"
|
||||
|
||||
def test_wix_webhook_updates_existing_customer(self, client):
|
||||
"""Test that same contact_id updates customer instead of duplicate."""
|
||||
# First submission
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
{"data": {
|
||||
{
|
||||
"data": {
|
||||
"formName": "Contact us",
|
||||
"submissions": [
|
||||
{
|
||||
@@ -111,7 +112,7 @@
|
||||
"field:utm_source": "",
|
||||
"submissionTime": "2025-10-06T07:05:34.001Z",
|
||||
"field:gad_source": "5",
|
||||
"field:form_field_5a7b": "Angekreuzt",
|
||||
"field:form_field_5a7b": true,
|
||||
"field:gad_campaignid": "23065043477",
|
||||
"field:utm_medium": "",
|
||||
"field:utm_term_id": "",
|
||||
@@ -238,4 +239,5 @@
|
||||
"field:anrede": "Herr",
|
||||
"field:long_answer_3524": "Kommentarsektion vermutlich",
|
||||
"formId": "e084006b-ae83-4e4d-b2f5-074118cdb3b1"
|
||||
}}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
{"data": {
|
||||
{
|
||||
"data": {
|
||||
"formName": "Reservation Request",
|
||||
"submissions": [
|
||||
{
|
||||
@@ -111,7 +112,6 @@
|
||||
"field:utm_source": "google",
|
||||
"submissionTime": "2025-10-06T14:22:15.001Z",
|
||||
"field:gad_source": "1",
|
||||
"field:form_field_5a7b": "Selezionato",
|
||||
"field:gad_campaignid": "98765432",
|
||||
"field:utm_medium": "cpc",
|
||||
"field:utm_term_id": "12345",
|
||||
@@ -239,4 +239,5 @@
|
||||
"field:anrede": "Frau",
|
||||
"field:long_answer_3524": "Benötige ein ruhiges Zimmer, bitte.",
|
||||
"formId": "f195117c-bf94-5f5e-c6g6-185229dde4c2"
|
||||
}}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
{"data": {
|
||||
{
|
||||
"data": {
|
||||
"formName": "Family Vacation Inquiry",
|
||||
"submissions": [
|
||||
{
|
||||
@@ -111,7 +112,7 @@
|
||||
"field:utm_source": "facebook",
|
||||
"submissionTime": "2025-10-06T16:45:22.001Z",
|
||||
"field:gad_source": "",
|
||||
"field:form_field_5a7b": "Angekreuzt",
|
||||
"field:form_field_5a7b": false,
|
||||
"field:gad_campaignid": "",
|
||||
"field:utm_medium": "social",
|
||||
"field:utm_term_id": "54321",
|
||||
@@ -241,4 +242,5 @@
|
||||
"field:anrede": "Herr",
|
||||
"field:long_answer_3524": "Wir planen unseren Weihnachtsurlaub mit drei Kindern. Brauchen Kinderbetten und Nähe zum Spielplatz.",
|
||||
"formId": "g206228d-ch05-6g6f-d7h7-296330eef5d3"
|
||||
}}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
{"data": {
|
||||
{
|
||||
"data": {
|
||||
"formName": "Business Travel Request",
|
||||
"submissions": [
|
||||
{
|
||||
@@ -111,7 +112,7 @@
|
||||
"field:utm_source": "direct",
|
||||
"submissionTime": "2025-10-06T09:15:45.001Z",
|
||||
"field:gad_source": "",
|
||||
"field:form_field_5a7b": "",
|
||||
"field:form_field_5a7b": true,
|
||||
"field:gad_campaignid": "",
|
||||
"field:utm_medium": "none",
|
||||
"field:utm_term_id": "",
|
||||
@@ -238,4 +239,5 @@
|
||||
"field:anrede": "Frau",
|
||||
"field:long_answer_3524": "Business trip for conference. Need WiFi and workspace. Will arrive late on Monday.",
|
||||
"formId": "h317339e-di16-7h7g-e8i8-3a7441ffg6e4"
|
||||
}}
|
||||
}
|
||||
}
|
||||
|
||||
275
tests/test_data/test_form5.json
Normal file
275
tests/test_data/test_form5.json
Normal file
@@ -0,0 +1,275 @@
|
||||
{
|
||||
"data": {
|
||||
"formName": "Contact us",
|
||||
"submissions": [
|
||||
{
|
||||
"label": "Angebot auswählen",
|
||||
"value": "Zimmer: Doppelzimmer"
|
||||
},
|
||||
{
|
||||
"label": "Anreisedatum",
|
||||
"value": "2026-06-25"
|
||||
},
|
||||
{
|
||||
"label": "Abreisedatum",
|
||||
"value": "2026-06-28"
|
||||
},
|
||||
{
|
||||
"label": "Anzahl Erwachsene",
|
||||
"value": "7"
|
||||
},
|
||||
{
|
||||
"label": "Anzahl Kinder",
|
||||
"value": "3"
|
||||
},
|
||||
{
|
||||
"label": "Alter Kind 1",
|
||||
"value": "4"
|
||||
},
|
||||
{
|
||||
"label": "Alter Kind 2",
|
||||
"value": "3"
|
||||
},
|
||||
{
|
||||
"label": "Alter Kind 3",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"label": "Alter Kind 4",
|
||||
"value": "0"
|
||||
},
|
||||
{
|
||||
"label": "Alter Kind 5",
|
||||
"value": "0"
|
||||
},
|
||||
{
|
||||
"label": "Alter Kind 6",
|
||||
"value": "0"
|
||||
},
|
||||
{
|
||||
"label": "Alter Kind 7",
|
||||
"value": "0"
|
||||
},
|
||||
{
|
||||
"label": "Anrede",
|
||||
"value": "Frau"
|
||||
},
|
||||
{
|
||||
"label": "Vorname",
|
||||
"value": "Petra"
|
||||
},
|
||||
{
|
||||
"label": "Nachname",
|
||||
"value": "Pohl"
|
||||
},
|
||||
{
|
||||
"label": "Email",
|
||||
"value": "petrapohl79@yahoo.com"
|
||||
},
|
||||
{
|
||||
"label": "Phone",
|
||||
"value": "+49 176 72219046"
|
||||
},
|
||||
{
|
||||
"label": "Message",
|
||||
"value": "Wir hatten als Familie vor einigen Jahren ein Wochenende bei Ihnen verbracht "
|
||||
},
|
||||
{
|
||||
"label": "utm_Source",
|
||||
"value": ""
|
||||
},
|
||||
{
|
||||
"label": "utm_Medium",
|
||||
"value": ""
|
||||
},
|
||||
{
|
||||
"label": "utm_Campaign",
|
||||
"value": ""
|
||||
},
|
||||
{
|
||||
"label": "utm_Term",
|
||||
"value": ""
|
||||
},
|
||||
{
|
||||
"label": "utm_Content",
|
||||
"value": ""
|
||||
},
|
||||
{
|
||||
"label": "utm_term_id",
|
||||
"value": ""
|
||||
},
|
||||
{
|
||||
"label": "utm_content_id",
|
||||
"value": ""
|
||||
},
|
||||
{
|
||||
"label": "gad_source",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"label": "gad_campaignid",
|
||||
"value": "183901432"
|
||||
},
|
||||
{
|
||||
"label": "gbraid",
|
||||
"value": "0AAAAADxR52Ad0oCzeogeTrupgGeMwD7Yp"
|
||||
},
|
||||
{
|
||||
"label": "gclid",
|
||||
"value": "EAIaIQobChMIpNik0vXskAMVOoCDBx0cSQ1GEAAYASAAEgLog_D_BwE"
|
||||
},
|
||||
{
|
||||
"label": "fbclid",
|
||||
"value": ""
|
||||
},
|
||||
{
|
||||
"label": "hotelid",
|
||||
"value": "39054_001"
|
||||
},
|
||||
{
|
||||
"label": "hotelname",
|
||||
"value": "Bemelmans Post"
|
||||
}
|
||||
],
|
||||
"field:date_picker_7e65": "2026-06-28",
|
||||
"field:alter_kind_7": 0,
|
||||
"field:number_7cf5": 7,
|
||||
"field:utm_source": "",
|
||||
"submissionTime": "2025-11-12T15:32:23.208Z",
|
||||
"field:alter_kind_3": 4,
|
||||
"field:gad_source": "1",
|
||||
"field:gad_campaignid": "183901432",
|
||||
"field:utm_medium": "",
|
||||
"field:utm_term_id": "",
|
||||
"context": {
|
||||
"metaSiteId": "1dea821c-8168-4736-96e4-4b92e8b364cf",
|
||||
"activationId": "84dc33f6-ff90-4a2a-b77b-5f32fe9e3fc2"
|
||||
},
|
||||
"field:email_5139": "petrapohl79@yahoo.com",
|
||||
"field:phone_4c77": "+4917672219046",
|
||||
"_context": {
|
||||
"activation": {
|
||||
"id": "84dc33f6-ff90-4a2a-b77b-5f32fe9e3fc2"
|
||||
},
|
||||
"configuration": {
|
||||
"id": "a976f18c-fa86-495d-be1e-676df188eeae"
|
||||
},
|
||||
"app": {
|
||||
"id": "225dd912-7dea-4738-8688-4b8c6955ffc2"
|
||||
},
|
||||
"action": {
|
||||
"id": "152db4d7-5263-40c4-be2b-1c81476318b7"
|
||||
},
|
||||
"trigger": {
|
||||
"key": "wix_form_app-form_submitted"
|
||||
}
|
||||
},
|
||||
"field:gclid": "EAIaIQobChMIpNik0vXskAMVOoCDBx0cSQ1GEAAYASAAEgLog_D_BwE",
|
||||
"field:alter_kind_8": 0,
|
||||
"formFieldMask": [
|
||||
"field:",
|
||||
"field:",
|
||||
"field:angebot_auswaehlen",
|
||||
"field:date_picker_a7c8",
|
||||
"field:date_picker_7e65",
|
||||
"field:",
|
||||
"field:number_7cf5",
|
||||
"field:anzahl_kinder",
|
||||
"field:alter_kind_3",
|
||||
"field:alter_kind_25",
|
||||
"field:alter_kind_4",
|
||||
"field:alter_kind_5",
|
||||
"field:alter_kind_6",
|
||||
"field:alter_kind_7",
|
||||
"field:alter_kind_8",
|
||||
"field:alter_kind_9",
|
||||
"field:alter_kind_10",
|
||||
"field:alter_kind_11",
|
||||
"field:",
|
||||
"field:anrede",
|
||||
"field:first_name_abae",
|
||||
"field:last_name_d97c",
|
||||
"field:email_5139",
|
||||
"field:phone_4c77",
|
||||
"field:long_answer_3524",
|
||||
"field:form_field_5a7b",
|
||||
"field:",
|
||||
"field:utm_source",
|
||||
"field:utm_medium",
|
||||
"field:utm_campaign",
|
||||
"field:utm_term",
|
||||
"field:utm_content",
|
||||
"field:utm_term_id",
|
||||
"field:utm_content_id",
|
||||
"field:gad_source",
|
||||
"field:gad_campaignid",
|
||||
"field:gbraid",
|
||||
"field:gclid",
|
||||
"field:fbclid",
|
||||
"field:hotelid",
|
||||
"field:hotelname",
|
||||
"field:roomtypecode",
|
||||
"field:roomclassificationcode",
|
||||
"field:",
|
||||
"metaSiteId"
|
||||
],
|
||||
"field:alter_kind_4": 1,
|
||||
"contact": {
|
||||
"name": {
|
||||
"first": "Petra",
|
||||
"last": "Pohl"
|
||||
},
|
||||
"email": "petrapohl79@yahoo.com",
|
||||
"locale": "de-de",
|
||||
"phones": [
|
||||
{
|
||||
"tag": "UNTAGGED",
|
||||
"formattedPhone": "+49 176 72219046",
|
||||
"id": "332e1d29-9ece-4e87-85bd-f39654be00b8",
|
||||
"countryCode": "DE",
|
||||
"e164Phone": "+4917672219046",
|
||||
"primary": true,
|
||||
"phone": "176 72219046"
|
||||
}
|
||||
],
|
||||
"contactId": "5cd8d5a4-8705-49f5-b1be-c61dab5355d1",
|
||||
"emails": [
|
||||
{
|
||||
"id": "4dbbbe7c-2892-47e8-b7e2-982c9f44407d",
|
||||
"tag": "UNTAGGED",
|
||||
"email": "petrapohl79@yahoo.com",
|
||||
"primary": true
|
||||
}
|
||||
],
|
||||
"updatedDate": "2025-11-12T15:32:24.771Z",
|
||||
"phone": "+4917672219046",
|
||||
"createdDate": "2025-11-12T15:32:24.771Z"
|
||||
},
|
||||
"submissionId": "ae8837ee-bb2d-4bad-a065-7e366dde7e6b",
|
||||
"field:anzahl_kinder": 3,
|
||||
"field:alter_kind_25": 3,
|
||||
"field:alter_kind_5": 0,
|
||||
"field:first_name_abae": "Petra",
|
||||
"field:utm_content_id": "",
|
||||
"field:utm_campaign": "",
|
||||
"field:utm_term": "",
|
||||
"contactId": "5cd8d5a4-8705-49f5-b1be-c61dab5355d1",
|
||||
"field:alter_kind_6": 0,
|
||||
"field:date_picker_a7c8": "2026-06-25",
|
||||
"field:hotelname": "Bemelmans Post",
|
||||
"field:angebot_auswaehlen": "Zimmer: Doppelzimmer",
|
||||
"field:utm_content": "",
|
||||
"field:last_name_d97c": "Pohl",
|
||||
"field:hotelid": "39054_001",
|
||||
"submissionsLink": "https://manage.wix.app/forms/submissions/1dea821c-8168-4736-96e4-4b92e8b364cf/e084006b-ae83-4e4d-b2f5-074118cdb3b1?d=https%3A%2F%2Fmanage.wix.com%2Fdashboard%2F1dea821c-8168-4736-96e4-4b92e8b364cf%2Fwix-forms%2Fform%2Fe084006b-ae83-4e4d-b2f5-074118cdb3b1%2Fsubmissions&s=true",
|
||||
"field:gbraid": "0AAAAADxR52Ad0oCzeogeTrupgGeMwD7Yp",
|
||||
"field:fbclid": "",
|
||||
"submissionPdf": {
|
||||
"fileName": "ae8837ee-bb2d-4bad-a065-7e366dde7e6b.pdf",
|
||||
"downloadUrl": "https://manage.wix.com/_api/form-submission-service/v4/submissions/ae8837ee-bb2d-4bad-a065-7e366dde7e6b/download?accessToken=JWS.eyJraWQiOiJWLVNuLWhwZSIsImFsZyI6IkhTMjU2In0.eyJkYXRhIjoie1wibWV0YVNpdGVJZFwiOlwiMWRlYTgyMWMtODE2OC00NzM2LTk2ZTQtNGI5MmU4YjM2NGNmXCJ9IiwiaWF0IjoxNzYyOTYxNTQ1LCJleHAiOjE3NjI5NjIxNDV9.ThbV0VtGcaDfYzuQKsN24uWyUeCtwZq3Z3Z4flTqEBg"
|
||||
},
|
||||
"field:anrede": "Frau",
|
||||
"field:long_answer_3524": "Wir hatten als Familie vor einigen Jahren ein Wochenende bei Ihnen verbracht ",
|
||||
"formId": "e084006b-ae83-4e4d-b2f5-074118cdb3b1"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user