diff --git a/veza-backend-api/cmd/tools/seed/config.go b/veza-backend-api/cmd/tools/seed/config.go index e26ce76cc..3ea225bc0 100644 --- a/veza-backend-api/cmd/tools/seed/config.go +++ b/veza-backend-api/cmd/tools/seed/config.go @@ -4,6 +4,13 @@ import "flag" // Config holds all seed volume parameters. type Config struct { + // CIMode: when true, main.go only runs SeedUsers / SeedTracks / + // SeedPlaylists and skips Chat/Live/Marketplace/Analytics/Content/ + // Moderation/Notifications/Misc. Used by E2E CI to avoid the ~60s + // full seed when all the suite needs is the 5 test accounts and a + // handful of tracks/playlists. + CIMode bool + // Users TotalUsers int NormalUsers int @@ -163,10 +170,43 @@ func MinimalConfig() Config { } } +// CIConfig returns the bare-minimum configuration for E2E CI: +// just the 5 hardcoded test accounts (admin/artist/user/mod/new) plus +// a small fixture set of tracks and playlists. main.go skips the +// non-essential seeders when CIMode is true. +func CIConfig() Config { + return Config{ + CIMode: true, + + // 5 test accounts only — TotalUsers == len(testAccounts) so + // SeedUsers' "remaining" branch is a no-op. + TotalUsers: 5, + NormalUsers: 2, + Artists: 1, + Labels: 0, + Moderators: 1, + Admins: 1, + + // Small fixture set so player / playlist tests have content. + Tracks: 10, + Albums: 0, + Playlists: 3, + PlaylistMinTracks: 1, + PlaylistMaxTracks: 3, + + // Everything else stays at zero — corresponding seeders are + // either skipped via CIMode or run as no-ops on zero counts. + } +} + // ParseFlags parses CLI flags and returns the appropriate config. func ParseFlags() Config { minimal := flag.Bool("minimal", false, "Use reduced volumes (50 users, 200 tracks) for fast dev") + ci := flag.Bool("ci", false, "Bare-minimum seed for E2E CI (5 test accounts + 10 tracks + 3 playlists, skips chat/live/marketplace/analytics)") flag.Parse() + if *ci { + return CIConfig() + } if *minimal { return MinimalConfig() } diff --git a/veza-backend-api/cmd/tools/seed/main.go b/veza-backend-api/cmd/tools/seed/main.go index 1f52a8e2e..a9198d664 100644 --- a/veza-backend-api/cmd/tools/seed/main.go +++ b/veza-backend-api/cmd/tools/seed/main.go @@ -72,51 +72,58 @@ func main() { log.Fatalf("seed playlists: %v", err) } - // Level 2: Social (depends on users, tracks) - if err := SeedSocial(db, cfg, users, tracks); err != nil { - log.Fatalf("seed social: %v", err) - } + // CI mode stops here — the E2E suite only needs the test accounts + // + a fixture set of tracks/playlists. Skipping the remaining + // seeders shaves ~50s off the typical CI seed time. + if cfg.CIMode { + fmt.Println("\n═══ CI MODE: skipping social/chat/live/marketplace/analytics/content/moderation/notifications/misc ═══") + } else { + // Level 2: Social (depends on users, tracks) + if err := SeedSocial(db, cfg, users, tracks); err != nil { + log.Fatalf("seed social: %v", err) + } - // Level 2: Chat (depends on users) - _, err = SeedChat(db, cfg, users) - if err != nil { - log.Fatalf("seed chat: %v", err) - } + // Level 2: Chat (depends on users) + _, err = SeedChat(db, cfg, users) + if err != nil { + log.Fatalf("seed chat: %v", err) + } - // Level 2: Live streams (depends on users) - if err := SeedLive(db, cfg, users, tracks); err != nil { - log.Fatalf("seed live: %v", err) - } + // Level 2: Live streams (depends on users) + if err := SeedLive(db, cfg, users, tracks); err != nil { + log.Fatalf("seed live: %v", err) + } - // Level 2: Marketplace (depends on users, tracks) - _, err = SeedMarketplace(db, cfg, users, tracks) - if err != nil { - log.Fatalf("seed marketplace: %v", err) - } + // Level 2: Marketplace (depends on users, tracks) + _, err = SeedMarketplace(db, cfg, users, tracks) + if err != nil { + log.Fatalf("seed marketplace: %v", err) + } - // Level 3: Analytics (depends on users, tracks — heaviest step) - if err := SeedAnalytics(db, cfg, users, tracks); err != nil { - log.Fatalf("seed analytics: %v", err) - } + // Level 3: Analytics (depends on users, tracks — heaviest step) + if err := SeedAnalytics(db, cfg, users, tracks); err != nil { + log.Fatalf("seed analytics: %v", err) + } - // Level 2: Content (depends on users, tracks) - if err := SeedContent(db, cfg, users, tracks); err != nil { - log.Fatalf("seed content: %v", err) - } + // Level 2: Content (depends on users, tracks) + if err := SeedContent(db, cfg, users, tracks); err != nil { + log.Fatalf("seed content: %v", err) + } - // Level 2: Moderation (depends on users, tracks) - if err := SeedModeration(db, cfg, users, tracks); err != nil { - log.Fatalf("seed moderation: %v", err) - } + // Level 2: Moderation (depends on users, tracks) + if err := SeedModeration(db, cfg, users, tracks); err != nil { + log.Fatalf("seed moderation: %v", err) + } - // Level 2: Notifications (depends on users) - if err := SeedNotifications(db, cfg, users); err != nil { - log.Fatalf("seed notifications: %v", err) - } + // Level 2: Notifications (depends on users) + if err := SeedNotifications(db, cfg, users); err != nil { + log.Fatalf("seed notifications: %v", err) + } - // Level 2: Misc (depends on users) - if err := SeedMisc(db, cfg, users); err != nil { - log.Fatalf("seed misc: %v", err) + // Level 2: Misc (depends on users) + if err := SeedMisc(db, cfg, users); err != nil { + log.Fatalf("seed misc: %v", err) + } } // ── VALIDATION ─────────────────────────────────────────────────────────── @@ -170,6 +177,9 @@ func main() { } func modeName(cfg Config) string { + if cfg.CIMode { + return "CI" + } if cfg.TotalUsers <= 100 { return "MINIMAL" }