package publichttp import ( "bytes" "context" "net/http" "testing" "time" "galaxy/authsession/internal/service/confirmemailcode" "galaxy/authsession/internal/service/sendemailcode" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestNewServerRejectsInvalidConfiguration(t *testing.T) { t.Parallel() cfg := DefaultConfig() cfg.Addr = "" _, err := NewServer(cfg, Dependencies{ SendEmailCode: sendEmailCodeFunc(func(context.Context, sendemailcode.Input) (sendemailcode.Result, error) { return sendemailcode.Result{}, nil }), ConfirmEmailCode: confirmEmailCodeFunc(func(context.Context, confirmemailcode.Input) (confirmemailcode.Result, error) { return confirmemailcode.Result{}, nil }), }) require.Error(t, err) assert.Contains(t, err.Error(), "addr") } func TestServerRunAndShutdown(t *testing.T) { t.Parallel() cfg := DefaultConfig() cfg.Addr = "127.0.0.1:0" server, err := NewServer(cfg, Dependencies{ SendEmailCode: sendEmailCodeFunc(func(context.Context, sendemailcode.Input) (sendemailcode.Result, error) { return sendemailcode.Result{ChallengeID: "challenge-123"}, nil }), ConfirmEmailCode: confirmEmailCodeFunc(func(context.Context, confirmemailcode.Input) (confirmemailcode.Result, error) { return confirmemailcode.Result{DeviceSessionID: "device-session-123"}, nil }), }) require.NoError(t, err) runErr := make(chan error, 1) go func() { runErr <- server.Run(context.Background()) }() require.Eventually(t, func() bool { server.stateMu.RLock() defer server.stateMu.RUnlock() return server.listener != nil }, time.Second, 10*time.Millisecond) server.stateMu.RLock() addr := server.listener.Addr().String() server.stateMu.RUnlock() response, err := http.Post( "http://"+addr+"/api/v1/public/auth/send-email-code", "application/json", bytes.NewBufferString(`{"email":"pilot@example.com"}`), ) require.NoError(t, err) defer response.Body.Close() assert.Equal(t, http.StatusOK, response.StatusCode) shutdownCtx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() require.NoError(t, server.Shutdown(shutdownCtx)) require.NoError(t, <-runErr) }