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

140 lines
4.9 KiB
Go

package service
import (
"context"
"testing"
"github.com/gochat/gochat/internal/model"
"github.com/gochat/gochat/internal/repository"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"gorm.io/gorm"
)
// ========== Article test helpers ==========
// setupArticleService creates ArticleRepo + ArticleService test instances.
func setupArticleService(t *testing.T) (*gorm.DB, *repository.ArticleRepo, *ArticleService) {
t.Helper()
db := setupServiceTestDB(t)
repo := repository.NewArticleRepo(db)
svc := NewArticleService(repo)
return db, repo, svc
}
// ========== BulkActions ==========
func TestArticleService_BulkActions_Publish(t *testing.T) {
db, _, svc := setupArticleService(t)
account := createTestAccount(t, db)
a1 := createTestArticle(t, db, account.ID, 1, func(a *model.Article) { a.Slug = "publish-art-1" })
a2 := createTestArticle(t, db, account.ID, 1, func(a *model.Article) { a.Slug = "publish-art-2" })
err := svc.BulkActions(context.Background(), &BulkActionsRequest{
Action: "publish",
IDs: []uint{a1.ID, a2.ID},
})
require.NoError(t, err)
// Verify both articles have status "published"
var updated1, updated2 model.Article
require.NoError(t, db.First(&updated1, a1.ID).Error)
require.NoError(t, db.First(&updated2, a2.ID).Error)
assert.Equal(t, string(model.ArticleStatusPublished), updated1.Status)
assert.Equal(t, string(model.ArticleStatusPublished), updated2.Status)
}
func TestArticleService_BulkActions_Archive(t *testing.T) {
db, _, svc := setupArticleService(t)
account := createTestAccount(t, db)
a1 := createTestArticle(t, db, account.ID, 1, func(a *model.Article) { a.Slug = "archive-art-1" })
a2 := createTestArticle(t, db, account.ID, 1, func(a *model.Article) { a.Slug = "archive-art-2" })
err := svc.BulkActions(context.Background(), &BulkActionsRequest{
Action: "archive",
IDs: []uint{a1.ID, a2.ID},
})
require.NoError(t, err)
var updated1, updated2 model.Article
require.NoError(t, db.First(&updated1, a1.ID).Error)
require.NoError(t, db.First(&updated2, a2.ID).Error)
assert.Equal(t, string(model.ArticleStatusArchived), updated1.Status)
assert.Equal(t, string(model.ArticleStatusArchived), updated2.Status)
}
func TestArticleService_BulkActions_Delete(t *testing.T) {
db, _, svc := setupArticleService(t)
account := createTestAccount(t, db)
a1 := createTestArticle(t, db, account.ID, 1, func(a *model.Article) { a.Slug = "delete-art-1" })
a2 := createTestArticle(t, db, account.ID, 1, func(a *model.Article) { a.Slug = "delete-art-2" })
err := svc.BulkActions(context.Background(), &BulkActionsRequest{
Action: "delete",
IDs: []uint{a1.ID, a2.ID},
})
require.NoError(t, err)
// Verify both articles are deleted (not found in DB)
var found model.Article
assert.ErrorIs(t, db.First(&found, a1.ID).Error, gorm.ErrRecordNotFound)
assert.ErrorIs(t, db.First(&found, a2.ID).Error, gorm.ErrRecordNotFound)
}
func TestArticleService_BulkActions_InvalidAction(t *testing.T) {
_, _, svc := setupArticleService(t)
err := svc.BulkActions(context.Background(), &BulkActionsRequest{
Action: "invalid",
IDs: []uint{1, 2},
})
assert.Error(t, err)
assert.Contains(t, err.Error(), "unsupported action")
}
// ========== BulkUpdateStatus ==========
func TestArticleService_BulkUpdateStatus_ValidStatus(t *testing.T) {
db, _, svc := setupArticleService(t)
account := createTestAccount(t, db)
a1 := createTestArticle(t, db, account.ID, 1, func(a *model.Article) { a.Slug = "status-art-1" })
a2 := createTestArticle(t, db, account.ID, 1, func(a *model.Article) { a.Slug = "status-art-2" })
err := svc.BulkUpdateStatus(context.Background(), []uint{a1.ID, a2.ID}, string(model.ArticleStatusPublished))
require.NoError(t, err)
var updated1, updated2 model.Article
require.NoError(t, db.First(&updated1, a1.ID).Error)
require.NoError(t, db.First(&updated2, a2.ID).Error)
assert.Equal(t, string(model.ArticleStatusPublished), updated1.Status)
assert.Equal(t, string(model.ArticleStatusPublished), updated2.Status)
}
func TestArticleService_BulkUpdateStatus_InvalidStatus(t *testing.T) {
_, _, svc := setupArticleService(t)
err := svc.BulkUpdateStatus(context.Background(), []uint{1, 2}, "invalid_status")
assert.Error(t, err)
assert.Contains(t, err.Error(), "invalid status")
}
// ========== BulkDelete ==========
func TestArticleService_BulkDelete_Success(t *testing.T) {
db, _, svc := setupArticleService(t)
account := createTestAccount(t, db)
a1 := createTestArticle(t, db, account.ID, 1, func(a *model.Article) { a.Slug = "bulkdel-art-1" })
a2 := createTestArticle(t, db, account.ID, 1, func(a *model.Article) { a.Slug = "bulkdel-art-2" })
err := svc.BulkDelete(context.Background(), []uint{a1.ID, a2.ID})
require.NoError(t, err)
var found model.Article
assert.ErrorIs(t, db.First(&found, a1.ID).Error, gorm.ErrRecordNotFound)
assert.ErrorIs(t, db.First(&found, a2.ID).Error, gorm.ErrRecordNotFound)
}