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 <clio-agent@sisyphuslabs.ai>
This commit is contained in:
2026-04-30 11:48:18 +01:00
co-authored by Sisyphus
parent a9273be201
commit acd50e0210
+101
View File
@@ -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})"