drive.sh 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. #!/usr/bin/env bash
  2. set -euo pipefail
  3. B=${BASE_URL:-http://localhost:8787}
  4. COOKIE_DIR=$(mktemp -d)
  5. trap 'rm -rf "$COOKIE_DIR"' EXIT
  6. TOM="$COOKIE_DIR/tom"
  7. SAM="$COOKIE_DIR/sam"
  8. PHONE="$COOKIE_DIR/phone"
  9. j(){ curl --silent --show-error --fail-with-body -b "$1" -c "$1" -H 'Content-Type: application/json' "${@:2}"; }
  10. # two members: anonymous sign-in, set names
  11. j "$TOM" -X POST "$B/api/auth/sign-in/anonymous" -d '{}' >/dev/null; j "$TOM" -X POST "$B/api/me/name" -d '{"name":"Tom"}' >/dev/null
  12. j "$SAM" -X POST "$B/api/auth/sign-in/anonymous" -d '{}' >/dev/null; j "$SAM" -X POST "$B/api/me/name" -d '{"name":"Sam"}' >/dev/null
  13. # phone OTP path smoke test
  14. j "$PHONE" -X POST "$B/api/auth/phone-number/send-otp" -d '{"phoneNumber":"+61400000000"}'; echo " <- send-otp"
  15. H=$(j "$TOM" -X POST "$B/api/hands" -d '{"question":"Friday dinner","options":["Thai","Pizza","Ramen","Cook at home"],"constraints":["Sam is trying to spend less this month"]}' | python3 -c 'import sys,json;print(json.load(sys.stdin)["id"])')
  16. echo "hand $H"
  17. A(){ j "$1" -X POST "$B/api/hands/$H/act" -d "$2" >/dev/null; }
  18. A "$TOM" '{"op":"join"}'; A "$SAM" '{"op":"join"}'
  19. A "$TOM" '{"op":"place","option":"o1","n":6}'; A "$TOM" '{"op":"place","option":"o3","n":4}'
  20. A "$SAM" '{"op":"place","option":"o2","n":8}'; A "$SAM" '{"op":"place","option":"o4","n":2}'
  21. A "$TOM" '{"op":"veto","option":"o2"}' # Tom vetoes pizza; Sam's 8 chips come back
  22. sleep 1.2
  23. curl --silent --show-error --fail-with-body "$B/api/hands/$H" | python3 -c '
  24. import sys,json; s=json.load(sys.stdin); r=s["round"]
  25. print("members",[m["name"] for m in s["members"]],"live",s["live"],"vetoed",r["vetoed"])
  26. print("chips",r["chips"])
  27. o=r["odds"]; print("odds", {k:round(v,2) for k,v in o["probabilities"].items()}, "conf",round(o["confidence"],2),"spice",round(o["spice"],2),"format",o["format"],"about",o["about"], o["ms"],"ms")'
  28. A "$SAM" '{"op":"place","option":"o4","n":8}' # Sam goes all in on cooking
  29. sleep 0.6
  30. A "$TOM" '{"op":"lock"}'; A "$SAM" '{"op":"lock"}' # both locked -> lever pulls
  31. sleep 1.5
  32. curl --silent --show-error --fail-with-body "$B/api/hands/$H" | python3 -c '
  33. import sys,json; s=json.load(sys.stdin); r=s["round"]; p=r["pull"]
  34. lab=lambda i: next(o["label"] for o in r["options"] if o["id"]==i)
  35. print("status",s["status"]); print("odds at pull",{lab(k):round(v,2) for k,v in p["odds"].items()})
  36. print("WINNER",lab(p["winner"]),"| runner-up",lab(p["runnerUp"]),"| reel order",[lab(x) for x in p["order"]],"| seed",p["seed"])
  37. print("dealer:",p["dealer"])'
  38. A "$TOM" '{"op":"again"}'; sleep 0.3
  39. A "$TOM" '{"op":"place","option":"o1","n":10}'; A "$SAM" '{"op":"place","option":"o1","n":10}'; sleep 1
  40. A "$TOM" '{"op":"lock"}'; A "$SAM" '{"op":"lock"}'; sleep 1.5
  41. A "$TOM" '{"op":"accept"}'; A "$SAM" '{"op":"accept"}'
  42. curl --silent --show-error --fail-with-body "$B/api/hands/$H" | python3 -c '
  43. import sys,json; s=json.load(sys.stdin); r=s["round"]; p=r["pull"]
  44. lab=lambda i: next(o["label"] for o in r["options"] if o["id"]==i)
  45. print("round",r["n"],"status",s["status"],"winner",lab(p["winner"]),{lab(k):round(v,2) for k,v in p["odds"].items()},"format",r["odds"]["format"]); print("dealer:",p["dealer"])'