You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
37 lines
1.4 KiB
37 lines
1.4 KiB
package api
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"strings"
|
|
"tera-clone/services/tera-api/internal/startup"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestBootstrapTimeAvailableBeforeLoginButNotReplayable(t *testing.T) {
|
|
now := time.Unix(0, 0)
|
|
clock, _ := startup.NewClockBootstrap(func() time.Time { return now }, func(_ context.Context, v time.Time) error { now = v; return nil })
|
|
token := clock.Token()
|
|
router := NewRouterWithOptions(newPasswordAuthTestStore(t, fixedClock), RouterOptions{CommandsReady: func() bool { return false }, ClockBootstrap: clock})
|
|
status := httptest.NewRecorder()
|
|
router.ServeHTTP(status, httptest.NewRequest("GET", "/api/v1/auth/startup", nil))
|
|
if !strings.Contains(status.Body.String(), token) {
|
|
t.Fatal("missing bootstrap token")
|
|
}
|
|
body := fmt.Sprintf(`{"token":%q,"browser_time":"2026-09-09T01:00:00Z"}`, token)
|
|
for i, want := range []int{http.StatusOK, http.StatusConflict} {
|
|
response := httptest.NewRecorder()
|
|
router.ServeHTTP(response, httptest.NewRequest("POST", "/api/v1/auth/bootstrap-time", strings.NewReader(body)))
|
|
if response.Code != want {
|
|
t.Fatalf("attempt %d: %d %s", i, response.Code, response.Body.String())
|
|
}
|
|
}
|
|
login := httptest.NewRecorder()
|
|
router.ServeHTTP(login, httptest.NewRequest("POST", "/api/v1/auth/login", strings.NewReader(`{}`)))
|
|
if login.Code != http.StatusServiceUnavailable {
|
|
t.Fatal("clock sync bypassed startup readiness")
|
|
}
|
|
}
|
|
|