package vehicle import ( "testing" "time" "github.com/glebarez/sqlite" "github.com/stretchr/testify/require" "gorm.io/gorm" "wails-app/internal/dao" "wails-app/internal/global" ) func setupShortlistTestDB(t *testing.T) *gorm.DB { t.Helper() db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{DisableForeignKeyConstraintWhenMigrating: true}) require.NoError(t, err) require.NoError(t, db.AutoMigrate(&dao.Vehicle{}, &dao.Shortlist{})) global.GVA_DB = db t.Cleanup(func() { global.GVA_DB = nil }) return db } func TestCheckVehicleShortlistExpiration(t *testing.T) { db := setupShortlistTestDB(t) vehicle := dao.Vehicle{PlateNumber: "TEST001", RFIDTag: "RFID001", VehicleTypeID: 1} require.NoError(t, db.Create(&vehicle).Error) service := &ShortlistService{} tests := []struct { name string listType string expiresAt *time.Time wantBlack bool wantWhite bool }{ {name: "永久白名单", listType: "白名单", wantWhite: true}, {name: "有效白名单", listType: "白名单", expiresAt: timePtr(time.Now().Add(time.Hour)), wantWhite: true}, {name: "到期白名单", listType: "白名单", expiresAt: timePtr(time.Now()), wantWhite: false}, {name: "过期白名单", listType: "白名单", expiresAt: timePtr(time.Now().Add(-time.Hour)), wantWhite: false}, {name: "有效黑名单", listType: "黑名单", expiresAt: timePtr(time.Now().Add(time.Hour)), wantBlack: true}, {name: "过期黑名单", listType: "黑名单", expiresAt: timePtr(time.Now().Add(-time.Hour)), wantBlack: false}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { require.NoError(t, db.Unscoped().Where("1 = 1").Delete(&dao.Shortlist{}).Error) require.NoError(t, db.Create(&dao.Shortlist{ VehicleId: int(vehicle.ID), ListType: tt.listType, ExpirationTime: tt.expiresAt, }).Error) isBlack, isWhite := service.CheckVehicleShortlist(vehicle.PlateNumber, "") require.Equal(t, tt.wantBlack, isBlack) require.Equal(t, tt.wantWhite, isWhite) }) } } func TestCheckVehicleShortlistBlackTakesPrecedence(t *testing.T) { db := setupShortlistTestDB(t) vehicle := dao.Vehicle{PlateNumber: "TEST002", RFIDTag: "RFID002", VehicleTypeID: 1} require.NoError(t, db.Create(&vehicle).Error) expiresAt := time.Now().Add(time.Hour) require.NoError(t, db.Create(&[]dao.Shortlist{ {VehicleId: int(vehicle.ID), ListType: "白名单", ExpirationTime: &expiresAt}, {VehicleId: int(vehicle.ID), ListType: "黑名单", ExpirationTime: &expiresAt}, }).Error) isBlack, isWhite := (&ShortlistService{}).CheckVehicleShortlist("", vehicle.RFIDTag) require.True(t, isBlack) require.False(t, isWhite) } func timePtr(value time.Time) *time.Time { return &value }