303 lines
7.2 KiB
Go
303 lines
7.2 KiB
Go
package expiry
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestRepository_CreateFindUpdateDelete(t *testing.T) {
|
|
db := newTestDB(t)
|
|
repo := NewRepository(db)
|
|
|
|
expiryDate := mustDate(t, "2030-01-10")
|
|
shelf := 30
|
|
|
|
item := &ExpiryItem{
|
|
UserID: 100,
|
|
MiniProgramID: 1,
|
|
Name: "牛奶",
|
|
Category: CategoryFood,
|
|
ExpiryDate: expiryDate,
|
|
ShelfLifeDays: &shelf,
|
|
Quantity: 2,
|
|
Status: StatusNormal,
|
|
}
|
|
|
|
if err := repo.Create(item); err != nil {
|
|
t.Fatalf("create item: %v", err)
|
|
}
|
|
if item.ID == 0 {
|
|
t.Fatalf("expected item id > 0")
|
|
}
|
|
|
|
found, err := repo.FindByID(item.ID, item.UserID)
|
|
if err != nil {
|
|
t.Fatalf("find by id: %v", err)
|
|
}
|
|
if found.Name != "牛奶" {
|
|
t.Fatalf("unexpected name: %s", found.Name)
|
|
}
|
|
|
|
found.Name = "牛奶(更新)"
|
|
if err := repo.Update(found); err != nil {
|
|
t.Fatalf("update item: %v", err)
|
|
}
|
|
|
|
updated, err := repo.FindByID(item.ID, item.UserID)
|
|
if err != nil {
|
|
t.Fatalf("find updated item: %v", err)
|
|
}
|
|
if updated.Name != "牛奶(更新)" {
|
|
t.Fatalf("unexpected updated name: %s", updated.Name)
|
|
}
|
|
|
|
if err := repo.UpdateStatus(item.ID, item.UserID, StatusUsed); err != nil {
|
|
t.Fatalf("update status: %v", err)
|
|
}
|
|
|
|
afterStatus, err := repo.FindByID(item.ID, item.UserID)
|
|
if err != nil {
|
|
t.Fatalf("find after status: %v", err)
|
|
}
|
|
if afterStatus.Status != StatusUsed {
|
|
t.Fatalf("expected status used, got %s", afterStatus.Status)
|
|
}
|
|
|
|
if err := repo.Delete(item.ID, item.UserID); err != nil {
|
|
t.Fatalf("delete item: %v", err)
|
|
}
|
|
|
|
_, err = repo.FindByID(item.ID, item.UserID)
|
|
if err != ErrExpiryItemNotFound {
|
|
t.Fatalf("expected ErrExpiryItemNotFound after delete, got %v", err)
|
|
}
|
|
}
|
|
|
|
func TestRepository_FindByUserAndSummary(t *testing.T) {
|
|
db := newTestDB(t)
|
|
repo := NewRepository(db)
|
|
|
|
now := dateOnly(mustDate(t, "2030-01-01"))
|
|
|
|
items := []ExpiryItem{
|
|
{
|
|
UserID: 200,
|
|
MiniProgramID: 1,
|
|
Name: "过期食品",
|
|
Category: CategoryFood,
|
|
ExpiryDate: now.AddDate(0, 0, -1),
|
|
Quantity: 1,
|
|
Status: StatusNormal,
|
|
},
|
|
{
|
|
UserID: 200,
|
|
MiniProgramID: 1,
|
|
Name: "临期药品",
|
|
Category: CategoryMedicine,
|
|
ExpiryDate: now.AddDate(0, 0, 3),
|
|
Quantity: 1,
|
|
Status: StatusNormal,
|
|
},
|
|
{
|
|
UserID: 200,
|
|
MiniProgramID: 1,
|
|
Name: "正常化妆品",
|
|
Category: CategoryCosmetic,
|
|
ExpiryDate: now.AddDate(0, 0, 30),
|
|
Quantity: 1,
|
|
Status: StatusNormal,
|
|
},
|
|
{
|
|
UserID: 200,
|
|
MiniProgramID: 1,
|
|
Name: "已使用",
|
|
Category: CategoryOther,
|
|
ExpiryDate: now.AddDate(0, 0, 30),
|
|
Quantity: 1,
|
|
Status: StatusUsed,
|
|
},
|
|
{
|
|
UserID: 200,
|
|
MiniProgramID: 1,
|
|
Name: "已丢弃",
|
|
Category: CategoryOther,
|
|
ExpiryDate: now.AddDate(0, 0, 30),
|
|
Quantity: 1,
|
|
Status: StatusDiscarded,
|
|
},
|
|
}
|
|
|
|
for idx := range items {
|
|
if err := repo.Create(&items[idx]); err != nil {
|
|
t.Fatalf("create item %d: %v", idx, err)
|
|
}
|
|
}
|
|
|
|
list, total, err := repo.FindByUser(200, map[string]interface{}{
|
|
"status": "all",
|
|
"category": "all",
|
|
"sort": "expiry_date",
|
|
}, 1, 20)
|
|
if err != nil {
|
|
t.Fatalf("find by user all: %v", err)
|
|
}
|
|
if total != 5 || len(list) != 5 {
|
|
t.Fatalf("expected 5 items total/list, got total=%d len=%d", total, len(list))
|
|
}
|
|
|
|
usedList, usedTotal, err := repo.FindByUser(200, map[string]interface{}{
|
|
"status": StatusUsed,
|
|
"category": "all",
|
|
"sort": "expiry_date",
|
|
}, 1, 20)
|
|
if err != nil {
|
|
t.Fatalf("find used list: %v", err)
|
|
}
|
|
if usedTotal != 1 || len(usedList) != 1 {
|
|
t.Fatalf("expected used list 1, got total=%d len=%d", usedTotal, len(usedList))
|
|
}
|
|
|
|
summary, err := repo.GetSummary(200)
|
|
if err != nil {
|
|
t.Fatalf("get summary: %v", err)
|
|
}
|
|
|
|
if summary["total_items"] != 3 {
|
|
t.Fatalf("expected total_items=3, got %d", summary["total_items"])
|
|
}
|
|
|
|
if summary["used"] != 1 || summary["discarded"] != 1 {
|
|
t.Fatalf("unexpected used/discarded: %+v", summary)
|
|
}
|
|
}
|
|
|
|
func TestRepository_SettingsCRUD(t *testing.T) {
|
|
db := newTestDB(t)
|
|
repo := NewRepository(db)
|
|
|
|
settings, err := repo.GetSettings(300)
|
|
if err != nil {
|
|
t.Fatalf("get empty settings: %v", err)
|
|
}
|
|
if settings != nil {
|
|
t.Fatalf("expected nil settings for new user")
|
|
}
|
|
|
|
saved, err := repo.UpdateSettings(300, []int{7, 3, 1})
|
|
if err != nil {
|
|
t.Fatalf("create settings: %v", err)
|
|
}
|
|
if len(saved.RemindDays) != 3 {
|
|
t.Fatalf("expected 3 remind days, got %d", len(saved.RemindDays))
|
|
}
|
|
|
|
updated, err := repo.UpdateSettings(300, []int{10, 5, 2})
|
|
if err != nil {
|
|
t.Fatalf("update settings: %v", err)
|
|
}
|
|
|
|
if len(updated.RemindDays) != 3 || updated.RemindDays[0] != 10 {
|
|
t.Fatalf("unexpected remind days: %+v", updated.RemindDays)
|
|
}
|
|
|
|
loaded, err := repo.GetSettings(300)
|
|
if err != nil {
|
|
t.Fatalf("reload settings: %v", err)
|
|
}
|
|
if len(loaded.RemindDays) != 3 || loaded.RemindDays[0] != 10 {
|
|
t.Fatalf("unexpected loaded remind days: %+v", loaded.RemindDays)
|
|
}
|
|
}
|
|
|
|
func TestRepository_ErrorAndFilterBranches(t *testing.T) {
|
|
db := newTestDB(t)
|
|
repo := NewRepository(db)
|
|
|
|
if err := repo.Delete(999, 1); err != ErrExpiryItemNotFound {
|
|
t.Fatalf("expected delete not found, got %v", err)
|
|
}
|
|
if err := repo.UpdateStatus(999, 1, StatusUsed); err != ErrExpiryItemNotFound {
|
|
t.Fatalf("expected update status not found, got %v", err)
|
|
}
|
|
|
|
_, err := repo.FindByID(999, 1)
|
|
if err != ErrExpiryItemNotFound {
|
|
t.Fatalf("expected find not found, got %v", err)
|
|
}
|
|
|
|
now := dateOnly(time.Now())
|
|
sevenDaysLater := now.AddDate(0, 0, 7)
|
|
items := []ExpiryItem{
|
|
{
|
|
UserID: 400,
|
|
MiniProgramID: 1,
|
|
Name: "过期",
|
|
Category: CategoryFood,
|
|
ExpiryDate: now.AddDate(0, 0, -1),
|
|
Quantity: 1,
|
|
},
|
|
{
|
|
UserID: 400,
|
|
MiniProgramID: 1,
|
|
Name: "临期",
|
|
Category: CategoryFood,
|
|
ExpiryDate: now.AddDate(0, 0, 1),
|
|
Quantity: 1,
|
|
},
|
|
{
|
|
UserID: 400,
|
|
MiniProgramID: 1,
|
|
Name: "正常",
|
|
Category: CategoryMedicine,
|
|
ExpiryDate: sevenDaysLater.AddDate(0, 0, 3),
|
|
Quantity: 1,
|
|
},
|
|
}
|
|
|
|
for i := range items {
|
|
if err := repo.Create(&items[i]); err != nil {
|
|
t.Fatalf("seed item %d: %v", i, err)
|
|
}
|
|
}
|
|
|
|
expiredList, _, err := repo.FindByUser(400, map[string]interface{}{
|
|
"status": StatusExpired,
|
|
"sort": "created_at",
|
|
}, 1, 10)
|
|
if err != nil {
|
|
t.Fatalf("find expired: %v", err)
|
|
}
|
|
if len(expiredList) != 1 {
|
|
t.Fatalf("expected 1 expired, got %d", len(expiredList))
|
|
}
|
|
|
|
expiringList, _, err := repo.FindByUser(400, map[string]interface{}{
|
|
"status": StatusExpiring,
|
|
}, 1, 10)
|
|
if err != nil {
|
|
t.Fatalf("find expiring: %v", err)
|
|
}
|
|
if len(expiringList) != 1 {
|
|
t.Fatalf("expected 1 expiring, got %d", len(expiringList))
|
|
}
|
|
|
|
normalList, _, err := repo.FindByUser(400, map[string]interface{}{
|
|
"status": StatusNormal,
|
|
"category": CategoryMedicine,
|
|
}, 1, 10)
|
|
if err != nil {
|
|
t.Fatalf("find normal: %v", err)
|
|
}
|
|
if len(normalList) != 1 {
|
|
t.Fatalf("expected 1 normal, got %d", len(normalList))
|
|
}
|
|
|
|
summary, err := repo.GetSummary(400)
|
|
if err != nil {
|
|
t.Fatalf("get summary: %v", err)
|
|
}
|
|
if summary["expired"] != 1 || summary["expiring_soon"] != 1 || summary["normal"] != 1 {
|
|
t.Fatalf("unexpected summary: %+v", summary)
|
|
}
|
|
}
|