74 lines
2.2 KiB
Go
74 lines
2.2 KiB
Go
package listingstatus
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"hfb_sys/backend/internal/model"
|
|
|
|
"gorm.io/driver/sqlite"
|
|
"gorm.io/gorm"
|
|
"gorm.io/gorm/logger"
|
|
)
|
|
|
|
func setupTestDB(t *testing.T) *gorm.DB {
|
|
t.Helper()
|
|
db, err := gorm.Open(sqlite.Open("file::memory:?cache=shared"), &gorm.Config{
|
|
Logger: logger.Default.LogMode(logger.Silent),
|
|
})
|
|
if err != nil {
|
|
t.Fatalf("open sqlite: %v", err)
|
|
}
|
|
if err := db.AutoMigrate(&model.ListingStatusEvent{}); err != nil {
|
|
t.Fatalf("migrate: %v", err)
|
|
}
|
|
return db
|
|
}
|
|
|
|
func TestAppendSkipsUnchangedOrUnknown(t *testing.T) {
|
|
db := setupTestDB(t)
|
|
|
|
if err := Append(db, Entry{ListingID: 1, FromStatus: "published", ToStatus: "published", EventType: EventPublished}); err != nil {
|
|
t.Fatalf("same status should skip: %v", err)
|
|
}
|
|
if err := Append(db, Entry{ListingID: 1, FromStatus: "draft", ToStatus: "draft", EventType: ""}); err != nil {
|
|
t.Fatalf("unknown should skip: %v", err)
|
|
}
|
|
var count int64
|
|
if err := db.Model(&model.ListingStatusEvent{}).Count(&count).Error; err != nil {
|
|
t.Fatalf("count: %v", err)
|
|
}
|
|
if count != 0 {
|
|
t.Fatalf("expected 0 events, got %d", count)
|
|
}
|
|
}
|
|
|
|
func TestAppendTransitionWritesPublishedAndOffline(t *testing.T) {
|
|
db := setupTestDB(t)
|
|
listing := &model.RentalListing{ID: 9, OwnerID: 3, Status: EventPublished}
|
|
if err := AppendTransition(db, listing, "draft", SourceSeller, ActorUser, 3, "发布"); err != nil {
|
|
t.Fatalf("append published: %v", err)
|
|
}
|
|
listing.Status = EventOffline
|
|
if err := AppendTransition(db, listing, EventPublished, SourceAdmin, ActorAdmin, 1, "后台下架"); err != nil {
|
|
t.Fatalf("append offline: %v", err)
|
|
}
|
|
|
|
var rows []model.ListingStatusEvent
|
|
if err := db.Order("id asc").Find(&rows).Error; err != nil {
|
|
t.Fatalf("find: %v", err)
|
|
}
|
|
if len(rows) != 2 {
|
|
t.Fatalf("expected 2 events, got %d", len(rows))
|
|
}
|
|
if rows[0].EventType != EventPublished || rows[0].Source != SourceSeller {
|
|
t.Fatalf("unexpected first event: %#v", rows[0])
|
|
}
|
|
if rows[1].EventType != EventOffline || rows[1].Source != SourceAdmin {
|
|
t.Fatalf("unexpected second event: %#v", rows[1])
|
|
}
|
|
if rows[0].CreatedAt.IsZero() || rows[1].CreatedAt.After(time.Now().Add(time.Minute)) {
|
|
t.Fatalf("unexpected timestamps: %v %v", rows[0].CreatedAt, rows[1].CreatedAt)
|
|
}
|
|
}
|