From acd50e021075de3a3f05f9cd7a830842df585574 Mon Sep 17 00:00:00 2001 From: Stephen Adamson Date: Thu, 30 Apr 2026 11:48:18 +0100 Subject: [PATCH] seed: add guest booking scenarios and time blockers Guest bookings: create 4 guest accounts (3 unique + 1 shared-email), 3 guest bookings across different days, and verify registered-email collision is properly blocked. Time blockers: staff meeting, holiday morning block, and late start block to demonstrate unavailable-time behaviour. Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus --- local-dev-2.sh | 101 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) diff --git a/local-dev-2.sh b/local-dev-2.sh index 7c782df..15e7fa4 100755 --- a/local-dev-2.sh +++ b/local-dev-2.sh @@ -701,6 +701,105 @@ for ((i=0; i<${#PENDING_BOOKING_IDS[@]}; i++)); do done echo "${C_GREEN}✅ Confirmed $confirmed_count bookings, left $skipped_count pending for admin review${C_RESET}" +# =========================================================================== +# 6. GUEST BOOKINGS +# =========================================================================== +echo -e "\n${C_BLUE}👤 Creating Guest Accounts & Bookings...${C_RESET}" + +# Create guest users via the public guest endpoint +create_guest() { + local name="$1" email="$2" phone="$3" + curl -s -X POST -H 'Content-Type: application/json' \ + -d "{\"firstName\":\"$name\",\"lastName\":\"Guest\",\"email\":\"$email\",\"phone\":\"$phone\"}" \ + "$BASE_URL/users/guest" \ + | tr -d '\r\n\t ' \ + | sed -n 's/.*"id":"\([^"]*\)".*/\1/p' +} + +GUEST1_ID=$(create_guest "Alice" "alice.guest@example.com" "+447000000020") +GUEST2_ID=$(create_guest "Bob" "bob.guest@example.com" "+447000000021") +GUEST3_ID=$(create_guest "Carol" "carol.guest@example.com" "+447000000022") +# Same email as GUEST1 — should create a separate account (duplicate emails allowed for guests) +GUEST4_ID=$(create_guest "Diana" "alice.guest@example.com" "+447000000023") +# Same email as registered user — should fail (blocked) +GUEST5_ID=$(create_guest "Evil" "$USER_EMAIL" "+447000000024") + +count_guest=0 + +if [[ -n "$GUEST1_ID" ]]; then + echo "${C_GREEN}✅ Created guest: Alice ($GUEST1_ID)${C_RESET}" + # Book tomorrow at slot B + GUEST1_TIME=$(format_london_time "$TOMORROW" "$SLOT_B") + GUEST1_JSON="{\"user_id\":\"$GUEST1_ID\",\"start_time\":\"$GUEST1_TIME\",\"service_ids\":[\"$(get_svc 0)\"]}" + G1_RESP=$(curl -s -w "\n%{http_code}" -X POST -H 'Content-Type: application/json' -d "$GUEST1_JSON" "$BASE_URL/bookings") + G1_CODE=$(echo "$G1_RESP" | tail -n1) + if [[ "$G1_CODE" =~ ^2 ]]; then count_guest=$((count_guest+1)); echo "${C_GREEN}✅ Guest booking: Alice - Classic Manicure${C_RESET}"; fi +fi + +if [[ -n "$GUEST2_ID" ]]; then + echo "${C_GREEN}✅ Created guest: Bob ($GUEST2_ID)${C_RESET}" + D_G2=$(open_day "$(TZ=Europe/London date -d "$TODAY +3 days" +%Y-%m-%d)") + GUEST2_TIME=$(format_london_time "$D_G2" "$SLOT_C") + GUEST2_JSON="{\"user_id\":\"$GUEST2_ID\",\"start_time\":\"$GUEST2_TIME\",\"service_ids\":[\"$(get_svc 3)\"]}" + G2_RESP=$(curl -s -w "\n%{http_code}" -X POST -H 'Content-Type: application/json' -d "$GUEST2_JSON" "$BASE_URL/bookings") + G2_CODE=$(echo "$G2_RESP" | tail -n1) + if [[ "$G2_CODE" =~ ^2 ]]; then count_guest=$((count_guest+1)); echo "${C_GREEN}✅ Guest booking: Bob - Express Mani & Pedi${C_RESET}"; fi +fi + +if [[ -n "$GUEST3_ID" ]]; then + echo "${C_GREEN}✅ Created guest: Carol ($GUEST3_ID)${C_RESET}" + D_G3=$(open_day "$(TZ=Europe/London date -d "$TODAY +5 days" +%Y-%m-%d)") + GUEST3_TIME=$(format_london_time "$D_G3" "$SLOT_D") + GUEST3_JSON="{\"user_id\":\"$GUEST3_ID\",\"start_time\":\"$GUEST3_TIME\",\"service_ids\":[\"$(get_svc 1)\"]}" + G3_RESP=$(curl -s -w "\n%{http_code}" -X POST -H 'Content-Type: application/json' -d "$GUEST3_JSON" "$BASE_URL/bookings") + G3_CODE=$(echo "$G3_RESP" | tail -n1) + if [[ "$G3_CODE" =~ ^2 ]]; then count_guest=$((count_guest+1)); echo "${C_GREEN}✅ Guest booking: Carol - Gel Manicure${C_RESET}"; fi +fi + +if [[ -n "$GUEST4_ID" && "$GUEST4_ID" != "$GUEST1_ID" ]]; then + echo "${C_GREEN}✅ Created guest: Diana ($GUEST4_ID) — shares email with Alice (separate account)${C_RESET}" +else + echo "${C_YELLOW}⚠️ Diana guest creation — should be separate from Alice${C_RESET}" +fi + +if [[ -z "$GUEST5_ID" ]]; then + echo "${C_GREEN}✅ Blocked guest booking with registered email ($USER_EMAIL) — correct behaviour${C_RESET}" +else + echo "${C_YELLOW}⚠️ Guest booking with registered email should have been blocked${C_RESET}" +fi + +echo "${C_GREEN}✅ Created $count_guest Guest Bookings${C_RESET}" + +# =========================================================================== +# 7. TIME BLOCKERS (admin-blocked time) +# =========================================================================== +echo -e "\n${C_BLUE}🚫 Creating Time Blockers...${C_RESET}" +count_blockers=0 + +# Staff meeting block — tomorrow 14:00-15:00 +TB1_TIME=$(format_london_time "$TOMORROW" "14:00:00") +TB1_JSON="{\"start_time\":\"$TB1_TIME\",\"duration_minutes\":60,\"description\":\"Staff meeting\"}" +TB1_RESP=$(curl -s -w "\n%{http_code}" -X POST -H 'Content-Type: application/json' -H "Authorization: Bearer $ADMIN_TOKEN" -d "$TB1_JSON" "$BASE_URL/admin/time-blockers") +TB1_CODE=$(echo "$TB1_RESP" | tail -n1) +if [[ "$TB1_CODE" =~ ^2 ]]; then count_blockers=$((count_blockers+1)); echo "${C_GREEN}✅ Time blocker: Staff meeting (tomorrow 14:00)${C_RESET}"; fi + +# Holiday block — 7 days out, all day (just block a slot to demonstrate) +D_TB2=$(open_day "$(TZ=Europe/London date -d "$TODAY +7 days" +%Y-%m-%d)") +TB2_TIME=$(format_london_time "$D_TB2" "$SLOT_A") +TB2_JSON="{\"start_time\":\"$TB2_TIME\",\"duration_minutes\":120,\"description\":\"Holiday — closed morning\"}" +TB2_RESP=$(curl -s -w "\n%{http_code}" -X POST -H 'Content-Type: application/json' -H "Authorization: Bearer $ADMIN_TOKEN" -d "$TB2_JSON" "$BASE_URL/admin/time-blockers") +TB2_CODE=$(echo "$TB2_RESP" | tail -n1) +if [[ "$TB2_CODE" =~ ^2 ]]; then count_blockers=$((count_blockers+1)); echo "${C_GREEN}✅ Time blocker: Holiday ($D_TB2 morning)${C_RESET}"; fi + +# Late start block — block tomorrow morning until 11am +TB3_TIME=$(format_london_time "$TOMORROW" "09:00:00") +TB3_JSON="{\"start_time\":\"$TB3_TIME\",\"duration_minutes\":120,\"description\":\"Late start — closed until 11am\"}" +TB3_RESP=$(curl -s -w "\n%{http_code}" -X POST -H 'Content-Type: application/json' -H "Authorization: Bearer $ADMIN_TOKEN" -d "$TB3_JSON" "$BASE_URL/admin/time-blockers") +TB3_CODE=$(echo "$TB3_RESP" | tail -n1) +if [[ "$TB3_CODE" =~ ^2 ]]; then count_blockers=$((count_blockers+1)); echo "${C_GREEN}✅ Time blocker: Late start (tomorrow until 11am)${C_RESET}"; fi + +echo "${C_GREEN}✅ Created $count_blockers Time Blockers${C_RESET}" + # --------------------------------------------------------------------------- # CANCELLATIONS # Both POST /admin/bookings/{id}/cancel and DELETE /bookings/{id} have backend @@ -859,6 +958,8 @@ echo -e " Bookings — future : $count_future" echo -e " Bookings — total : $TOTAL_BOOKINGS" echo -e " Cancellations : $cancel_count" echo -e " Confirmed : $confirmed_count | Still pending: $skipped_count" +echo -e " Bookings — guest : $count_guest" +echo -e " Time blockers : $count_blockers" echo -e " Schedule groups : $sched_success/3" echo "" echo -e " Quick login creds (all pass: ${C_YELLOW}password${C_RESET})"