memos/store/test/reaction_test.go

190 lines
4.4 KiB
Go

package test
import (
"context"
"testing"
"github.com/stretchr/testify/require"
"github.com/usememos/memos/store"
)
func TestReactionStore(t *testing.T) {
t.Parallel()
ctx := context.Background()
ts := NewTestingStore(ctx, t)
user, err := createTestingHostUser(ctx, ts)
require.NoError(t, err)
contentID := "test_content_id"
reaction, err := ts.UpsertReaction(ctx, &store.Reaction{
CreatorID: user.ID,
ContentID: contentID,
ReactionType: "💗",
})
require.NoError(t, err)
require.NotNil(t, reaction)
require.NotEmpty(t, reaction.ID)
reactions, err := ts.ListReactions(ctx, &store.FindReaction{
ContentID: &contentID,
})
require.NoError(t, err)
require.Len(t, reactions, 1)
require.Equal(t, reaction, reactions[0])
// Test GetReaction.
gotReaction, err := ts.GetReaction(ctx, &store.FindReaction{
ID: &reaction.ID,
})
require.NoError(t, err)
require.NotNil(t, gotReaction)
require.Equal(t, reaction.ID, gotReaction.ID)
require.Equal(t, reaction.CreatorID, gotReaction.CreatorID)
require.Equal(t, reaction.ContentID, gotReaction.ContentID)
require.Equal(t, reaction.ReactionType, gotReaction.ReactionType)
// Test GetReaction with non-existent ID.
nonExistentID := int32(99999)
notFoundReaction, err := ts.GetReaction(ctx, &store.FindReaction{
ID: &nonExistentID,
})
require.NoError(t, err)
require.Nil(t, notFoundReaction)
err = ts.DeleteReaction(ctx, &store.DeleteReaction{
ID: reaction.ID,
})
require.NoError(t, err)
reactions, err = ts.ListReactions(ctx, &store.FindReaction{
ContentID: &contentID,
})
require.NoError(t, err)
require.Len(t, reactions, 0)
ts.Close()
}
func TestReactionListByCreatorID(t *testing.T) {
t.Parallel()
ctx := context.Background()
ts := NewTestingStore(ctx, t)
user1, err := createTestingHostUser(ctx, ts)
require.NoError(t, err)
user2, err := createTestingUserWithRole(ctx, ts, "user2", store.RoleUser)
require.NoError(t, err)
contentID := "shared_content"
// User 1 creates reaction
_, err = ts.UpsertReaction(ctx, &store.Reaction{
CreatorID: user1.ID,
ContentID: contentID,
ReactionType: "👍",
})
require.NoError(t, err)
// User 2 creates reaction
_, err = ts.UpsertReaction(ctx, &store.Reaction{
CreatorID: user2.ID,
ContentID: contentID,
ReactionType: "❤️",
})
require.NoError(t, err)
// List all reactions for content
reactions, err := ts.ListReactions(ctx, &store.FindReaction{
ContentID: &contentID,
})
require.NoError(t, err)
require.Len(t, reactions, 2)
// List by creator ID
user1Reactions, err := ts.ListReactions(ctx, &store.FindReaction{
CreatorID: &user1.ID,
})
require.NoError(t, err)
require.Len(t, user1Reactions, 1)
require.Equal(t, "👍", user1Reactions[0].ReactionType)
ts.Close()
}
func TestReactionMultipleContentIDs(t *testing.T) {
t.Parallel()
ctx := context.Background()
ts := NewTestingStore(ctx, t)
user, err := createTestingHostUser(ctx, ts)
require.NoError(t, err)
contentID1 := "content_1"
contentID2 := "content_2"
// Create reactions for different contents
_, err = ts.UpsertReaction(ctx, &store.Reaction{
CreatorID: user.ID,
ContentID: contentID1,
ReactionType: "👍",
})
require.NoError(t, err)
_, err = ts.UpsertReaction(ctx, &store.Reaction{
CreatorID: user.ID,
ContentID: contentID2,
ReactionType: "❤️",
})
require.NoError(t, err)
// List by content ID list
reactions, err := ts.ListReactions(ctx, &store.FindReaction{
ContentIDList: []string{contentID1, contentID2},
})
require.NoError(t, err)
require.Len(t, reactions, 2)
ts.Close()
}
func TestReactionUpsertDifferentTypes(t *testing.T) {
t.Parallel()
ctx := context.Background()
ts := NewTestingStore(ctx, t)
user, err := createTestingHostUser(ctx, ts)
require.NoError(t, err)
contentID := "test_content"
// Create first reaction
reaction1, err := ts.UpsertReaction(ctx, &store.Reaction{
CreatorID: user.ID,
ContentID: contentID,
ReactionType: "👍",
})
require.NoError(t, err)
// Create second reaction with different type (should create new, not update)
reaction2, err := ts.UpsertReaction(ctx, &store.Reaction{
CreatorID: user.ID,
ContentID: contentID,
ReactionType: "❤️",
})
require.NoError(t, err)
// Both reactions should exist
require.NotEqual(t, reaction1.ID, reaction2.ID)
reactions, err := ts.ListReactions(ctx, &store.FindReaction{
ContentID: &contentID,
})
require.NoError(t, err)
require.Len(t, reactions, 2)
ts.Close()
}