175 lines
3.8 KiB
Go
175 lines
3.8 KiB
Go
|
|
package catalog
|
||
|
|
|
||
|
|
import (
|
||
|
|
"bytes"
|
||
|
|
"context"
|
||
|
|
"strings"
|
||
|
|
"testing"
|
||
|
|
|
||
|
|
"github.com/a-h/templ"
|
||
|
|
)
|
||
|
|
|
||
|
|
func TestPagesIncludeTokensAndButtons(t *testing.T) {
|
||
|
|
pages := Pages()
|
||
|
|
|
||
|
|
if len(pages) == 0 {
|
||
|
|
t.Fatal("expected catalog pages")
|
||
|
|
}
|
||
|
|
|
||
|
|
var hasTokens bool
|
||
|
|
var hasButtons bool
|
||
|
|
for _, page := range pages {
|
||
|
|
switch page.Slug {
|
||
|
|
case "tokens":
|
||
|
|
hasTokens = true
|
||
|
|
case "buttons":
|
||
|
|
hasButtons = true
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if !hasTokens {
|
||
|
|
t.Fatal("expected tokens page")
|
||
|
|
}
|
||
|
|
if !hasButtons {
|
||
|
|
t.Fatal("expected buttons page")
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestPagesIncludePrimitiveCatalogCoverage(t *testing.T) {
|
||
|
|
pages := Pages()
|
||
|
|
|
||
|
|
for _, slug := range []string{
|
||
|
|
"badges",
|
||
|
|
"icon-buttons",
|
||
|
|
"inputs",
|
||
|
|
"form-fields",
|
||
|
|
"modals",
|
||
|
|
"tables",
|
||
|
|
"empty-states",
|
||
|
|
"cards",
|
||
|
|
} {
|
||
|
|
if _, ok := FindPage(slug); !ok {
|
||
|
|
t.Fatalf("expected catalog page %q", slug)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if len(pages) < 10 {
|
||
|
|
t.Fatalf("expected expanded primitive catalog, got %d pages", len(pages))
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestButtonPageExamplesRenderRealPrimitives(t *testing.T) {
|
||
|
|
page, ok := FindPage("buttons")
|
||
|
|
if !ok {
|
||
|
|
t.Fatal("expected buttons page")
|
||
|
|
}
|
||
|
|
if len(page.Examples) == 0 {
|
||
|
|
t.Fatal("expected button examples")
|
||
|
|
}
|
||
|
|
|
||
|
|
html := renderToString(t, page.Examples[0].Preview)
|
||
|
|
for _, want := range []string{
|
||
|
|
`ui-button`,
|
||
|
|
`ui-button-primary`,
|
||
|
|
`Nouveau projet`,
|
||
|
|
} {
|
||
|
|
if !strings.Contains(html, want) {
|
||
|
|
t.Fatalf("expected %q in %q", want, html)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestCatalogPageRendersMetadataAndExamples(t *testing.T) {
|
||
|
|
page, ok := FindPage("tokens")
|
||
|
|
if !ok {
|
||
|
|
t.Fatal("expected tokens page")
|
||
|
|
}
|
||
|
|
|
||
|
|
html := renderToString(t, CatalogPage(page))
|
||
|
|
for _, want := range []string{
|
||
|
|
`Design System`,
|
||
|
|
page.Title,
|
||
|
|
`catalog-example`,
|
||
|
|
} {
|
||
|
|
if !strings.Contains(html, want) {
|
||
|
|
t.Fatalf("expected %q in %q", want, html)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestCatalogIndexLinksToPrimitivePages(t *testing.T) {
|
||
|
|
html := renderToString(t, CatalogIndex(Pages()))
|
||
|
|
|
||
|
|
for _, want := range []string{
|
||
|
|
`href="./inputs.html"`,
|
||
|
|
`href="./buttons.html"`,
|
||
|
|
`class="catalog-page-link-card"`,
|
||
|
|
} {
|
||
|
|
if !strings.Contains(html, want) {
|
||
|
|
t.Fatalf("expected %q in %q", want, html)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestCatalogPageRendersSharedNavigationWithActivePage(t *testing.T) {
|
||
|
|
page, ok := FindPage("inputs")
|
||
|
|
if !ok {
|
||
|
|
t.Fatal("expected inputs page")
|
||
|
|
}
|
||
|
|
|
||
|
|
html := renderToString(t, CatalogPage(page))
|
||
|
|
for _, want := range []string{
|
||
|
|
`href="./index.html"`,
|
||
|
|
`href="./buttons.html"`,
|
||
|
|
`href="./inputs.html"`,
|
||
|
|
`catalog-nav-link is-active`,
|
||
|
|
} {
|
||
|
|
if !strings.Contains(html, want) {
|
||
|
|
t.Fatalf("expected %q in %q", want, html)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestPrimitiveExamplesRenderRealMarkup(t *testing.T) {
|
||
|
|
testCases := []struct {
|
||
|
|
slug string
|
||
|
|
want []string
|
||
|
|
}{
|
||
|
|
{slug: "badges", want: []string{`ui-badge`, `En cours`}},
|
||
|
|
{slug: "icon-buttons", want: []string{`borderless-icon-button`, `aria-label="Supprimer le projet"`}},
|
||
|
|
{slug: "inputs", want: []string{`class="ui-input"`, `placeholder="Nom du projet"`}},
|
||
|
|
{slug: "form-fields", want: []string{`ui-form-field`, `ui-form-label`}},
|
||
|
|
{slug: "modals", want: []string{`ui-modal-panel`, `Créer le projet`}},
|
||
|
|
{slug: "tables", want: []string{`class="ui-table"`, `Table View`}},
|
||
|
|
{slug: "empty-states", want: []string{`ui-empty-state`, `Aucun projet trouvé`}},
|
||
|
|
{slug: "cards", want: []string{`ui-card`, `Header`}},
|
||
|
|
}
|
||
|
|
|
||
|
|
for _, tt := range testCases {
|
||
|
|
page, ok := FindPage(tt.slug)
|
||
|
|
if !ok {
|
||
|
|
t.Fatalf("expected page %q", tt.slug)
|
||
|
|
}
|
||
|
|
if len(page.Examples) == 0 {
|
||
|
|
t.Fatalf("expected examples for %q", tt.slug)
|
||
|
|
}
|
||
|
|
|
||
|
|
html := renderToString(t, page.Examples[0].Preview)
|
||
|
|
for _, want := range tt.want {
|
||
|
|
if !strings.Contains(html, want) {
|
||
|
|
t.Fatalf("page %q expected %q in %q", tt.slug, want, html)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func renderToString(t *testing.T, component templ.Component) string {
|
||
|
|
t.Helper()
|
||
|
|
|
||
|
|
var buf bytes.Buffer
|
||
|
|
if err := component.Render(context.Background(), &buf); err != nil {
|
||
|
|
t.Fatalf("render component: %v", err)
|
||
|
|
}
|
||
|
|
return buf.String()
|
||
|
|
}
|