feat: notification service

This commit is contained in:
Ilia Denisov
2026-04-22 08:49:45 +02:00
committed by GitHub
parent 5b7593e6f6
commit 32dc29359a
135 changed files with 21828 additions and 130 deletions
+44
View File
@@ -0,0 +1,44 @@
package notificationintent
import (
"context"
"testing"
"github.com/alicebob/miniredis/v2"
"github.com/redis/go-redis/v9"
"github.com/stretchr/testify/require"
)
func TestPublisherPublishAppendsIntentToDefaultStream(t *testing.T) {
t.Parallel()
redisServer := miniredis.RunT(t)
redisClient := redis.NewClient(&redis.Options{Addr: redisServer.Addr()})
t.Cleanup(func() {
require.NoError(t, redisClient.Close())
})
publisher, err := NewPublisher(PublisherConfig{Client: redisClient})
require.NoError(t, err)
intent, err := NewGameTurnReadyIntent(defaultMetadata(), []string{"user-1"}, GameTurnReadyPayload{
GameID: "game-1",
GameName: "Nebula Clash",
TurnNumber: 54,
})
require.NoError(t, err)
entryID, err := publisher.Publish(context.Background(), intent)
require.NoError(t, err)
require.NotEmpty(t, entryID)
messages, err := redisClient.XRange(context.Background(), DefaultIntentsStream, "-", "+").Result()
require.NoError(t, err)
require.Len(t, messages, 1)
require.Equal(t, entryID, messages[0].ID)
require.Equal(t, NotificationTypeGameTurnReady.String(), messages[0].Values[fieldNotificationType])
require.Equal(t, ProducerGameMaster.String(), messages[0].Values[fieldProducer])
require.Equal(t, AudienceKindUser.String(), messages[0].Values[fieldAudienceKind])
require.Equal(t, `["user-1"]`, messages[0].Values[fieldRecipientUserIDs])
require.Equal(t, `{"game_id":"game-1","game_name":"Nebula Clash","turn_number":54}`, messages[0].Values[fieldPayloadJSON])
}