package redisstate import ( "testing" "time" "github.com/alicebob/miniredis/v2" "github.com/redis/go-redis/v9" "github.com/stretchr/testify/require" ) func TestKeyspaceBuildsStableKeys(t *testing.T) { t.Parallel() keyspace := Keyspace{} require.Equal(t, "mail:delivery_commands", keyspace.DeliveryCommands()) require.Equal(t, "mail:stream_offsets:bWFpbDpkZWxpdmVyeV9jb21tYW5kcw", keyspace.StreamOffset("mail:delivery_commands")) } func TestStreamOffsetStoreRoundTrip(t *testing.T) { t.Parallel() server := miniredis.RunT(t) client := redis.NewClient(&redis.Options{Addr: server.Addr()}) t.Cleanup(func() { _ = client.Close() }) store, err := NewStreamOffsetStore(client) require.NoError(t, err) stream := "mail:delivery_commands" require.NoError(t, store.Save(t.Context(), stream, "1234-5")) got, ok, err := store.Load(t.Context(), stream) require.NoError(t, err) require.True(t, ok) require.Equal(t, "1234-5", got) } func TestUnmarshalStreamOffsetRequiresUpdatedAt(t *testing.T) { t.Parallel() payload, err := MarshalStreamOffset(StreamOffset{ Stream: "mail:delivery_commands", LastProcessedEntryID: "1-0", UpdatedAt: time.Now().UTC(), }) require.NoError(t, err) got, err := UnmarshalStreamOffset(payload) require.NoError(t, err) require.Equal(t, "1-0", got.LastProcessedEntryID) _, err = UnmarshalStreamOffset([]byte(`{"stream":"x","last_processed_entry_id":"1"}`)) require.Error(t, err) }