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:
+101
@@ -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})"
|
||||
|
||||
Reference in New Issue
Block a user