package app import ( "bytes" "io" "strings" "testing" "time" ) func TestPortalTemplateExecutes(t *testing.T) { t.Parallel() templates, err := parseTemplates(time.UTC) if err != nil { t.Fatal(err) } err = templates.ExecuteTemplate(io.Discard, "portal.html", pageData{ Title: "Test", Technician: &technician{DisplayName: "Technician"}, Packages: []packageRecord{{ ID: 1, Slug: "sentinelone-linux", DisplayName: "SentinelOne Linux Agent", PackageVersion: "26.1.1.31", Enabled: true, }}, Actions: []actionRecord{{ Slug: "install-rmm", DisplayName: "Install RMM", Enabled: true, }}, Authorizations: []authorizationRecord{{ ID: 1, CreatedBy: "taiadmin", ExpiresAt: time.Now().Add(time.Hour), Packages: "SentinelOne Linux Agent", Actions: "Install RMM", }}, }) if err != nil { t.Fatal(err) } } func TestPackageAndAuditTemplatesExecute(t *testing.T) { t.Parallel() templates, err := parseTemplates(time.UTC) if err != nil { t.Fatal(err) } data := pageData{ Title: "Test", Technician: &technician{DisplayName: "Technician"}, CSRFToken: "csrf", CurrentView: "packages", Packages: []packageRecord{{ ID: 1, Slug: "sentinelone-linux", DisplayName: "SentinelOne Linux Agent", PackageVersion: "26.1.1.31", Enabled: true, }}, } if err := templates.ExecuteTemplate(io.Discard, "packages.html", data); err != nil { t.Fatal(err) } data.CurrentView = "audit" data.AuditFilters.TimeRange = "30d" data.AuditEventTypes = []string{"package_downloaded"} data.AuditEvents = []auditRecord{{ EventType: "package_downloaded", CustomerLabel: "Acme cluster refresh", Hostname: "pve01", SourceIP: "203.0.113.10", LANIP: "10.10.1.25", CreatedAt: time.Now(), }} if err := templates.ExecuteTemplate(io.Discard, "audit.html", data); err != nil { t.Fatal(err) } } func TestAuditTemplateUsesConfiguredTimeZone(t *testing.T) { t.Parallel() location, err := time.LoadLocation("America/Chicago") if err != nil { t.Fatal(err) } templates, err := parseTemplates(location) if err != nil { t.Fatal(err) } var output bytes.Buffer err = templates.ExecuteTemplate(&output, "audit.html", pageData{ Title: "Test", Technician: &technician{DisplayName: "Technician"}, CurrentView: "audit", AuditFilters: auditFilters{ TimeRange: "30d", }, AuditEvents: []auditRecord{{ EventType: "code_exchanged", CreatedAt: time.Date(2026, time.January, 15, 12, 0, 0, 0, time.UTC), }}, }) if err != nil { t.Fatal(err) } if !strings.Contains(output.String(), "Jan 15, 2026 6:00 AM CST") { t.Fatalf("audit timestamp was not rendered in America/Chicago: %s", output.String()) } }