package db import ( "testing" "time" "crypto-miner-server/internal/models" ) func TestLogCampaignHitAndPublicBuilds(t *testing.T) { d := openTestDB(t) if err := d.LogCampaignEvent("wave-a", "b1", CampaignEventPageHit, "install.sh", "10.0.0.1", "curl"); err != nil { t.Fatal(err) } if err := d.LogCampaignEvent("wave-a", "b1", CampaignEventDownload, "get", "10.0.0.2", "curl"); err != nil { t.Fatal(err) } hits, err := d.ListCampaignHits(10) if err != nil || len(hits) != 1 || hits[0].Campaign != "wave-a" || hits[0].Count != 2 { t.Fatalf("hits=%v err=%v", hits, err) } war, err := d.ListWarRoom(7) if err != nil { t.Fatal(err) } if len(war.Campaigns) != 1 { t.Fatalf("war room campaigns=%v", war.Campaigns) } c := war.Campaigns[0] if c.Hits != 1 || c.Downloads != 1 { t.Fatalf("funnel hits=%d downloads=%d", c.Hits, c.Downloads) } a := &models.Agent{ ID: "ag-1", Name: "w1", Wallet: "w", IP: "10.0.0.3", Version: "1", Status: "online", CPUCores: 4, MemoryGB: 8, LastSeen: time.Now(), Campaign: "wave-a", Hashrate15m: 1200, } if err := d.UpsertAgent(a); err != nil { t.Fatal(err) } _ = d.UpdateAgentStats("ag-1", 0, 0, 1200, 0, 0, 0, 0, 0, 0) war, err = d.ListWarRoom(7) if err != nil { t.Fatal(err) } c = war.Campaigns[0] if c.Agents != 1 || c.FirstBeacon != 1 || c.Mining != 1 || c.Online != 1 || c.Hashrate != 1200 { t.Fatalf("agents=%d beacon=%d mining=%d online=%d hashrate=%v", c.Agents, c.FirstBeacon, c.Mining, c.Online, c.Hashrate) } if c.ConversionPct != 100 { t.Fatalf("conversion=%v want 100", c.ConversionPct) } b1 := &models.BuildRecord{ ID: "b1", WorkerName: "w1", ServerURL: "http://x", Wallet: "w", Threads: 1, Platform: "linux", CreatedAt: time.Now(), } b2 := &models.BuildRecord{ ID: "b2", WorkerName: "w2", ServerURL: "http://x", Wallet: "w", Threads: 1, Platform: "windows", CreatedAt: time.Now().Add(time.Second), } _ = d.InsertBuild(b1) _ = d.InsertBuild(b2) _ = d.SetBuildPublic("b1", true) pub, err := d.ListPublicBuilds(false, 1) if err != nil { t.Fatal(err) } ids := map[string]bool{} for _, b := range pub { ids[b.ID] = true } if !ids["b1"] || !ids["b2"] { t.Fatalf("expected public b1 and latest b2, got %v", ids) } ok, err := d.IsBuildPubliclyDownloadable("b2", false, 1) if err != nil || !ok { t.Fatalf("latest build should be public ok=%v err=%v", ok, err) } }