package adminstore import ( "context" "testing" ) func TestStatsAndBulk(t *testing.T) { s := newTestStore(t) ctx := context.Background() base, err := s.Stats(ctx) if err != nil { t.Fatalf("stats: %v", err) } var p1, p2 string if err := s.pool.QueryRow(ctx, "INSERT INTO product (name, status) VALUES ($1,'active') RETURNING id", "批量测试1 "+randomHex(4)).Scan(&p1); err != nil { t.Fatalf("insert p1: %v", err) } if err := s.pool.QueryRow(ctx, "INSERT INTO product (name, status) VALUES ($1,'active') RETURNING id", "批量测试2 "+randomHex(4)).Scan(&p2); err != nil { t.Fatalf("insert p2: %v", err) } t.Cleanup(func() { _, _ = s.pool.Exec(ctx, "DELETE FROM product WHERE id = ANY($1)", []string{p1, p2}) }) after, err := s.Stats(ctx) if err != nil { t.Fatalf("stats after: %v", err) } if after.Products != base.Products+2 { t.Fatalf("product count: got %d want %d", after.Products, base.Products+2) } // Bulk set status to deprecated. n, err := s.BulkSetStatus(ctx, "tester", []string{p1, p2}, "deprecated") if err != nil || n != 2 { t.Fatalf("bulk status: n=%d err=%v", n, err) } var deprecated int if err := s.pool.QueryRow(ctx, "SELECT count(*) FROM product WHERE id = ANY($1) AND status='deprecated'", []string{p1, p2}).Scan(&deprecated); err != nil { t.Fatalf("verify: %v", err) } if deprecated != 2 { t.Fatalf("expected 2 deprecated, got %d", deprecated) } // Invalid status rejected. if _, err := s.BulkSetStatus(ctx, "tester", []string{p1}, "nope"); err != ErrInvalidStatus { t.Fatalf("expected ErrInvalidStatus, got %v", err) } // Empty selection rejected. if _, err := s.BulkSetStatus(ctx, "tester", nil, "active"); err != ErrNoTargets { t.Fatalf("expected ErrNoTargets, got %v", err) } // Global audit log should contain the bulk_status entry. rows, total, err := s.ListAllAudit(ctx, 10, 0) if err != nil { t.Fatalf("audit: %v", err) } if total == 0 || len(rows) == 0 { t.Fatalf("expected audit rows, got total=%d", total) } }