package systemviews
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestRenderAppFrame_ReturnsFragment(t *testing.T) {
t.Parallel()
page := renderedPage{
route: RouteHistory,
subtitle: "History",
body: `
`,
}
theme := shellTheme{RootClass: "sv-dark"}
out := renderAppFrame(page, theme)
// Must be a fragment — no full document tags.
assert.NotContains(t, out, "hello`)
// Subtitle rendered.
assert.Contains(t, out, "History")
}
func TestRenderAppFrame_DefaultThemeClass(t *testing.T) {
t.Parallel()
page := renderedPage{
route: RouteFavorites,
subtitle: "Favorites",
body: `content
`,
}
// Empty theme — should still get sv-app with sv-dark default.
out := renderAppFrame(page, shellTheme{})
assert.Contains(t, out, `class="sv-app sv-dark"`)
assert.Contains(t, out, `data-route="favorites"`)
assert.Contains(t, out, `data-page-title="Favorites"`)
}
func TestRenderAppFrame_DocumentTitleUsesExplicitTitle(t *testing.T) {
t.Parallel()
page := renderedPage{
route: RouteHistory,
title: "History — 12 entries",
subtitle: "Recent visits",
body: `content
`,
}
out := renderAppFrame(page, shellTheme{})
assert.Contains(t, out, `data-page-title="History — 12 entries"`)
assert.Contains(t, out, "Recent visits")
}
func TestRenderAppFrame_InlineVarsApplied(t *testing.T) {
t.Parallel()
page := renderedPage{
route: RouteConfig,
subtitle: "Config",
body: `settings
`,
}
theme := shellTheme{
RootClass: "sv-light",
InlineVars: "--sv-background: #fff;",
}
out := renderAppFrame(page, theme)
assert.Contains(t, out, `style="--sv-background: #fff;"`)
assert.Contains(t, out, `class="sv-app sv-light"`)
}
func TestListHTMLWrapsRows(t *testing.T) {
t.Parallel()
out := listHTML(`entry`, "Nothing here")
assert.Contains(t, out, `class="sv-list"`)
assert.Contains(t, out, `class="sv-list-row"`)
assert.Contains(t, out, "entry")
}
func TestListHTMLEmptyState(t *testing.T) {
t.Parallel()
out := listHTML("", "Nothing here")
assert.Contains(t, out, `class="sv-empty"`)
assert.Contains(t, out, "Nothing here")
}
func TestLinkHTMLSanitizesHref(t *testing.T) {
t.Parallel()
out := linkHTML("javascript:alert(1)", "Bad")
assert.Contains(t, out, `class="sv-link"`)
assert.Contains(t, out, `href="#"`)
assert.Contains(t, out, "Bad")
}
func TestKVHTMLRendersPairs(t *testing.T) {
t.Parallel()
out := kvHTML([]kvPair{{Label: "Engine", Value: "webkit"}})
assert.Contains(t, out, `class="sv-kv"`)
assert.Contains(t, out, "Engine")
assert.Contains(t, out, "webkit")
}
func TestKVHTMLEmptySlice(t *testing.T) {
t.Parallel()
out := kvHTML(nil)
assert.Contains(t, out, `class="sv-empty"`)
assert.Contains(t, out, "No configuration details")
}
func TestKVHTMLAllEmptyRows(t *testing.T) {
t.Parallel()
out := kvHTML([]kvPair{{}, {Label: " ", Value: ""}})
assert.Contains(t, out, `class="sv-empty"`)
assert.Contains(t, out, "No configuration details")
}
func TestErrorStateHTML(t *testing.T) {
t.Parallel()
out := errorStateHTML("boom")
assert.Contains(t, out, `class="sv-error"`)
assert.Contains(t, out, `role="alert"`)
assert.Contains(t, out, "boom")
}
func TestSectionHTML(t *testing.T) {
t.Parallel()
out := sectionHTML("test-section", "Test Title", "inner
")
assert.Contains(t, out, `class="sv-section test-section"`)
assert.Contains(t, out, "Test Title")
assert.Contains(t, out, "inner
")
}
func TestEmptyStateHTML(t *testing.T) {
t.Parallel()
out := emptyStateHTML("Nothing here")
assert.Contains(t, out, `class="sv-empty"`)
assert.Contains(t, out, "Nothing here")
}