package testkit import ( "context" "errors" "github.com/stretchr/testify/require" "testing" "time" "galaxy/authsession/internal/domain/challenge" "galaxy/authsession/internal/domain/common" "galaxy/authsession/internal/ports" ) func TestInMemoryChallengeStoreCreateAndGet(t *testing.T) { t.Parallel() store := &InMemoryChallengeStore{} record := challengeFixture() if err := store.Create(context.Background(), record); err != nil { require.Failf(t, "test failed", "Create() returned error: %v", err) } got, err := store.Get(context.Background(), record.ID) if err != nil { require.Failf(t, "test failed", "Get() returned error: %v", err) } if got.ID != record.ID { require.Failf(t, "test failed", "Get().ID = %q, want %q", got.ID, record.ID) } if &got.CodeHash[0] == &record.CodeHash[0] { require.FailNow(t, "Get() returned aliased code hash slice") } } func TestInMemoryChallengeStoreGetNotFound(t *testing.T) { t.Parallel() store := &InMemoryChallengeStore{} _, err := store.Get(context.Background(), common.ChallengeID("missing")) if !errors.Is(err, ports.ErrNotFound) { require.Failf(t, "test failed", "Get() error = %v, want ErrNotFound", err) } } func TestInMemoryChallengeStoreCompareAndSwapConflict(t *testing.T) { t.Parallel() store := &InMemoryChallengeStore{} record := challengeFixture() if err := store.Create(context.Background(), record); err != nil { require.Failf(t, "test failed", "Create() returned error: %v", err) } previous := record previous.Attempts.Confirm = 1 next := record next.Status = challenge.StatusSent next.DeliveryState = challenge.DeliverySent err := store.CompareAndSwap(context.Background(), previous, next) if !errors.Is(err, ports.ErrConflict) { require.Failf(t, "test failed", "CompareAndSwap() error = %v, want ErrConflict", err) } } func challengeFixture() challenge.Challenge { timestamp := time.Unix(20, 0).UTC() return challenge.Challenge{ ID: common.ChallengeID("challenge-1"), Email: common.Email("pilot@example.com"), CodeHash: []byte("hash"), Status: challenge.StatusPendingSend, DeliveryState: challenge.DeliveryPending, CreatedAt: timestamp, ExpiresAt: timestamp.Add(10 * time.Minute), } }