package web import ( "encoding/json" "fmt" "io/fs" "net" "net/http" "os" "testing" "time" ) // TestDevCasino is not a test. It is the casino, running, on a port, with one // signed-in player who has chips — so the table can be driven in a real browser, // which is the only honest way to review an animation. // // Skipped unless you ask for it: // // PETE_DEV_CASINO=:7788 go test ./internal/web -run TestDevCasino -timeout 0 // // It prints the session cookie to plant. The routes are wired here rather than // taken from New(), because New() decides whether the casino exists at the // moment it builds the mux, and the test rig only signs the player in afterwards. func TestDevCasino(t *testing.T) { addr := os.Getenv("PETE_DEV_CASINO") if addr == "" { t.Skip("set PETE_DEV_CASINO=:port to run the casino for a browser") } s := newCasino(t) fund(t, 5000) payload, _ := json.Marshal(SessionUser{ Sub: "sub-1", Username: "reala", Name: "Reala", Exp: time.Now().Add(24 * time.Hour).Unix(), }) cookie := s.auth.sign(payload) staticSub, err := fs.Sub(staticFS, "static") if err != nil { t.Fatal(err) } mux := http.NewServeMux() mux.Handle("GET /static/", http.StripPrefix("/static/", http.FileServer(http.FS(staticSub)))) mux.HandleFunc("GET /games", s.handleLobby) mux.HandleFunc("GET /games/blackjack", s.handleBlackjack) mux.HandleFunc("GET /api/games/table", s.handleTable) mux.HandleFunc("POST /api/games/buyin", s.handleBuyIn) mux.HandleFunc("POST /api/games/cashout", s.handleCashOut) mux.HandleFunc("POST /api/games/blackjack/deal", s.handleDeal) mux.HandleFunc("POST /api/games/blackjack/move", s.handleMove) ln, err := net.Listen("tcp", addr) if err != nil { t.Fatal(err) } // Written to a file, not printed: `go test` buffers stdout, and the browser // driver needs the cookie while the server is still running. if out := os.Getenv("PETE_DEV_COOKIE_FILE"); out != "" { if err := os.WriteFile(out, []byte(cookie), 0o600); err != nil { t.Fatal(err) } } fmt.Printf("\nCASINO http://localhost%s/games/blackjack\nCOOKIE %s=%s\n\n", addr, sessionCookie, cookie) srv := &http.Server{Handler: mux, ReadHeaderTimeout: 5 * time.Second} t.Cleanup(func() { _ = srv.Close() }) _ = srv.Serve(ln) }