package redisstate import ( "context" "testing" "time" "galaxy/mail/internal/domain/common" deliverydomain "galaxy/mail/internal/domain/delivery" "galaxy/mail/internal/domain/idempotency" "galaxy/mail/internal/service/acceptauthdelivery" "github.com/alicebob/miniredis/v2" "github.com/redis/go-redis/v9" "github.com/stretchr/testify/require" ) func TestAcceptanceStoreCreateAndReadQueuedDelivery(t *testing.T) { t.Parallel() server := miniredis.RunT(t) client := redis.NewClient(&redis.Options{Addr: server.Addr()}) t.Cleanup(func() { require.NoError(t, client.Close()) }) store, err := NewAcceptanceStore(client) require.NoError(t, err) record := validDelivery(t) record.Source = deliverydomain.SourceAuthSession record.ResendParentDeliveryID = "" record.Status = deliverydomain.StatusQueued record.AttemptCount = 1 record.LastAttemptStatus = "" record.ProviderSummary = "" record.LocaleFallbackUsed = false record.UpdatedAt = record.CreatedAt record.SentAt = nil require.NoError(t, record.Validate()) input := acceptauthdelivery.CreateAcceptanceInput{ Delivery: record, FirstAttempt: ptr(validScheduledAttempt(t, record.DeliveryID)), Idempotency: validIdempotencyRecord(t, record.Source, record.DeliveryID, record.IdempotencyKey), } require.NoError(t, store.CreateAcceptance(context.Background(), input)) storedDelivery, found, err := store.GetDelivery(context.Background(), record.DeliveryID) require.NoError(t, err) require.True(t, found) require.Equal(t, record, storedDelivery) storedIdempotency, found, err := store.GetIdempotency(context.Background(), record.Source, record.IdempotencyKey) require.NoError(t, err) require.True(t, found) require.Equal(t, input.Idempotency, storedIdempotency) } func TestAcceptanceStoreCreateAndReadSuppressedDelivery(t *testing.T) { t.Parallel() server := miniredis.RunT(t) client := redis.NewClient(&redis.Options{Addr: server.Addr()}) t.Cleanup(func() { require.NoError(t, client.Close()) }) store, err := NewAcceptanceStore(client) require.NoError(t, err) record := validDelivery(t) record.Source = deliverydomain.SourceAuthSession record.ResendParentDeliveryID = "" record.Status = deliverydomain.StatusSuppressed record.AttemptCount = 0 record.LastAttemptStatus = "" record.ProviderSummary = "" record.LocaleFallbackUsed = false record.UpdatedAt = record.CreatedAt.Add(time.Minute) record.SentAt = nil record.SuppressedAt = ptr(record.UpdatedAt) require.NoError(t, record.Validate()) input := acceptauthdelivery.CreateAcceptanceInput{ Delivery: record, Idempotency: validIdempotencyRecord(t, record.Source, record.DeliveryID, record.IdempotencyKey), } require.NoError(t, store.CreateAcceptance(context.Background(), input)) storedDelivery, found, err := store.GetDelivery(context.Background(), record.DeliveryID) require.NoError(t, err) require.True(t, found) require.Equal(t, record, storedDelivery) attemptExists := server.Exists(Keyspace{}.Attempt(record.DeliveryID, 1)) require.False(t, attemptExists) } func TestAcceptanceStoreReturnsNotFound(t *testing.T) { t.Parallel() server := miniredis.RunT(t) client := redis.NewClient(&redis.Options{Addr: server.Addr()}) t.Cleanup(func() { require.NoError(t, client.Close()) }) store, err := NewAcceptanceStore(client) require.NoError(t, err) deliveryRecord, found, err := store.GetDelivery(context.Background(), common.DeliveryID("missing")) require.NoError(t, err) require.False(t, found) require.Equal(t, deliverydomain.Delivery{}, deliveryRecord) idempotencyRecord, found, err := store.GetIdempotency(context.Background(), deliverydomain.SourceAuthSession, common.IdempotencyKey("missing")) require.NoError(t, err) require.False(t, found) require.Equal(t, idempotency.Record{}, idempotencyRecord) }