Files
gochat/internal/repository/widget_repo_test.go
T
2026-06-04 15:44:48 +08:00

302 lines
8.5 KiB
Go

package repository
import (
"context"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"gorm.io/gorm"
"github.com/gochat/gochat/internal/model"
)
// setupWidgetTestDB uses the shared setupTestDB helper with widget-specific models.
func setupWidgetTestDB(t *testing.T) *gorm.DB {
t.Helper()
return setupTestDB(t,
&model.WidgetThemeConfig{},
&model.WidgetFileUpload{},
&model.PreChatForm{},
)
}
// createWidgetTestAccount creates a minimal Account row so that Inbox can reference it.
func createWidgetTestAccount(t *testing.T, db *gorm.DB) *model.Account {
t.Helper()
account := &model.Account{Name: "Widget Test Account"}
err := db.Create(account).Error
require.NoError(t, err, "failed to create test account")
return account
}
// createWidgetTestInbox creates a minimal Inbox row for a given Account.
func createWidgetTestInbox(t *testing.T, db *gorm.DB, accountID uint) *model.Inbox {
t.Helper()
inbox := &model.Inbox{
AccountID: accountID,
Name: "Widget Test Inbox",
ChannelType: "web_widget",
ChannelID: 1,
}
err := db.Create(inbox).Error
require.NoError(t, err, "failed to create test inbox")
return inbox
}
// ===========================================================================
// WidgetThemeConfigRepo tests
// ===========================================================================
func TestWidgetThemeConfigRepo_Create(t *testing.T) {
db := setupWidgetTestDB(t)
repo := NewWidgetThemeConfigRepo(db)
ctx := context.Background()
account := createWidgetTestAccount(t, db)
inbox := createWidgetTestInbox(t, db, account.ID)
config := &model.WidgetThemeConfig{
InboxID: inbox.ID,
PrimaryColor: "#ff0000",
BackgroundColor: "#ffffff",
TextColor: "#333333",
FontFamily: "Arial, sans-serif",
WidgetPosition: "right",
DarkMode: "light",
}
err := repo.Create(ctx, config)
require.NoError(t, err, "Create should succeed")
assert.NotZero(t, config.ID, "ID should be assigned after Create")
assert.NotZero(t, config.InboxID, "InboxID should be preserved")
assert.Equal(t, "#ff0000", config.PrimaryColor, "PrimaryColor should be preserved")
}
func TestWidgetThemeConfigRepo_FindByInboxID(t *testing.T) {
db := setupWidgetTestDB(t)
repo := NewWidgetThemeConfigRepo(db)
ctx := context.Background()
account := createWidgetTestAccount(t, db)
inbox := createWidgetTestInbox(t, db, account.ID)
config := &model.WidgetThemeConfig{
InboxID: inbox.ID,
PrimaryColor: "#1f93ff",
WidgetPosition: "right",
}
err := repo.Create(ctx, config)
require.NoError(t, err)
// Positive case: find by existing inbox ID
found, err := repo.FindByInboxID(ctx, inbox.ID)
require.NoError(t, err)
assert.Equal(t, config.ID, found.ID)
assert.Equal(t, inbox.ID, found.InboxID)
assert.Equal(t, "#1f93ff", found.PrimaryColor)
// Negative case: find by non-existing inbox ID
found2, err := repo.FindByInboxID(ctx, 99999)
assert.Nil(t, found2)
assert.Error(t, err, "FindByInboxID with non-existing ID should return error")
}
func TestWidgetThemeConfigRepo_FindByID(t *testing.T) {
db := setupWidgetTestDB(t)
repo := NewWidgetThemeConfigRepo(db)
ctx := context.Background()
account := createWidgetTestAccount(t, db)
inbox := createWidgetTestInbox(t, db, account.ID)
config := &model.WidgetThemeConfig{
InboxID: inbox.ID,
PrimaryColor: "#aabbcc",
}
err := repo.Create(ctx, config)
require.NoError(t, err)
// Positive case
found, err := repo.FindByID(ctx, config.ID)
require.NoError(t, err)
assert.Equal(t, config.InboxID, found.InboxID)
assert.Equal(t, "#aabbcc", found.PrimaryColor)
// Negative case: non-existing ID
found2, err := repo.FindByID(ctx, 99999)
assert.Nil(t, found2)
assert.Error(t, err)
}
func TestWidgetThemeConfigRepo_Update(t *testing.T) {
db := setupWidgetTestDB(t)
repo := NewWidgetThemeConfigRepo(db)
ctx := context.Background()
account := createWidgetTestAccount(t, db)
inbox := createWidgetTestInbox(t, db, account.ID)
config := &model.WidgetThemeConfig{
InboxID: inbox.ID,
PrimaryColor: "#1f93ff",
WidgetPosition: "right",
DarkMode: "light",
}
err := repo.Create(ctx, config)
require.NoError(t, err)
// Update fields
config.PrimaryColor = "#00ff00"
config.WidgetPosition = "left"
config.DarkMode = "dark"
err = repo.Update(ctx, config)
require.NoError(t, err, "Update should succeed")
// Verify update
found, err := repo.FindByID(ctx, config.ID)
require.NoError(t, err)
assert.Equal(t, "#00ff00", found.PrimaryColor, "PrimaryColor should be updated")
assert.Equal(t, "left", found.WidgetPosition, "WidgetPosition should be updated")
assert.Equal(t, "dark", found.DarkMode, "DarkMode should be updated")
}
func TestWidgetThemeConfigRepo_Delete(t *testing.T) {
db := setupWidgetTestDB(t)
repo := NewWidgetThemeConfigRepo(db)
ctx := context.Background()
account := createWidgetTestAccount(t, db)
inbox := createWidgetTestInbox(t, db, account.ID)
config := &model.WidgetThemeConfig{
InboxID: inbox.ID,
PrimaryColor: "#1f93ff",
}
err := repo.Create(ctx, config)
require.NoError(t, err)
// Delete
err = repo.Delete(ctx, config.ID)
require.NoError(t, err, "Delete should succeed")
// Verify soft-delete: FindByID should fail
found, err := repo.FindByID(ctx, config.ID)
assert.Nil(t, found)
assert.Error(t, err, "FindByID after Delete should return error")
}
func TestWidgetThemeConfigRepo_DeleteByInboxID(t *testing.T) {
db := setupWidgetTestDB(t)
repo := NewWidgetThemeConfigRepo(db)
ctx := context.Background()
account := createWidgetTestAccount(t, db)
inbox := createWidgetTestInbox(t, db, account.ID)
config := &model.WidgetThemeConfig{
InboxID: inbox.ID,
PrimaryColor: "#1f93ff",
}
err := repo.Create(ctx, config)
require.NoError(t, err)
// Delete by inbox ID
err = repo.DeleteByInboxID(ctx, inbox.ID)
require.NoError(t, err, "DeleteByInboxID should succeed")
// Verify soft-delete
found, err := repo.FindByInboxID(ctx, inbox.ID)
assert.Nil(t, found)
assert.Error(t, err, "FindByInboxID after DeleteByInboxID should return error")
}
func TestWidgetThemeConfigRepo_DuplicateInboxID(t *testing.T) {
db := setupWidgetTestDB(t)
repo := NewWidgetThemeConfigRepo(db)
ctx := context.Background()
account := createWidgetTestAccount(t, db)
inbox := createWidgetTestInbox(t, db, account.ID)
config1 := &model.WidgetThemeConfig{
InboxID: inbox.ID,
PrimaryColor: "#111111",
}
err := repo.Create(ctx, config1)
require.NoError(t, err)
// Creating a second config for the same inbox should be allowed
// (no unique constraint on InboxID in the model definition)
config2 := &model.WidgetThemeConfig{
InboxID: inbox.ID,
PrimaryColor: "#222222",
}
err = repo.Create(ctx, config2)
require.NoError(t, err, "second config with same InboxID should be created")
// FindByInboxID returns the first matching record
found, err := repo.FindByInboxID(ctx, inbox.ID)
require.NoError(t, err)
assert.Equal(t, config1.ID, found.ID, "FindByInboxID returns first match")
}
func TestWidgetThemeConfigRepo_CRUDLifecycle(t *testing.T) {
db := setupWidgetTestDB(t)
repo := NewWidgetThemeConfigRepo(db)
ctx := context.Background()
account := createWidgetTestAccount(t, db)
inbox := createWidgetTestInbox(t, db, account.ID)
// Create
config := &model.WidgetThemeConfig{
InboxID: inbox.ID,
PrimaryColor: "#1f93ff",
BackgroundColor: "#ffffff",
TextColor: "#1f1f1f",
FontFamily: "Inter, sans-serif",
FontSize: "14px",
WidgetPosition: "right",
WidgetAlignment: "bottom",
AvatarRadius: "50%",
ButtonRadius: "8px",
DarkMode: "auto",
HideMessageBubble: false,
ShowPopUpWindow: false,
}
err := repo.Create(ctx, config)
require.NoError(t, err)
assert.NotZero(t, config.ID)
// Read
found, err := repo.FindByID(ctx, config.ID)
require.NoError(t, err)
assert.Equal(t, config.InboxID, found.InboxID)
assert.Equal(t, "auto", found.DarkMode)
foundByInbox, err := repo.FindByInboxID(ctx, inbox.ID)
require.NoError(t, err)
assert.Equal(t, config.ID, foundByInbox.ID)
// Update
found.DarkMode = "dark"
found.PrimaryColor = "#00cc00"
err = repo.Update(ctx, found)
require.NoError(t, err)
updated, err := repo.FindByID(ctx, config.ID)
require.NoError(t, err)
assert.Equal(t, "dark", updated.DarkMode)
assert.Equal(t, "#00cc00", updated.PrimaryColor)
// Delete
err = repo.Delete(ctx, config.ID)
require.NoError(t, err)
_, err = repo.FindByID(ctx, config.ID)
assert.Error(t, err, "should not find deleted record")
}