Skip to content
quarry Artifact [a58f7bfa27]
Login

Artifact [a58f7bfa27]

Artifact a58f7bfa27be1fea63245218b79f38cbaf1ef6697965cb7b10686705d99ec591:


package web

import (
	"os"
	"path/filepath"
	"strings"
	"testing"
)

// The new-repository flow's pages as fixtures, so each can be looked at
// at phone and desktop width without a running forge and a session:
// QUARRY_SHOT_NEWREPO names a directory, and every page is written
// into it beside the stylesheet.
func TestWriteNewRepoShot(t *testing.T) {
	dir := os.Getenv("QUARRY_SHOT_NEWREPO")
	if dir == "" {
		t.Skip("QUARRY_SHOT_NEWREPO unset")
	}
	if err := os.WriteFile(filepath.Join(dir, "quarry.css"), []byte(sheet), 0o644); err != nil {
		t.Fatal(err)
	}
	github := newRepoForm{Kind: "github", Name: "src", From: "https://github.com/NetBSD/src", Source: "git", Format: "zit", Every: 3600}
	pages := map[string]struct {
		page *pageTemplate
		data pageData
	}{
		"start":   {newRepoPage, pageData{Title: "New repository"}},
		"github":  {newRepoSetupPage, pageData{Title: "Mirror", NewRepo: &github}},
		"empty":   {newRepoSetupPage, pageData{Title: "New", NewRepo: &newRepoForm{Kind: "empty", Readme: true, Every: 3600}}},
		"import":  {newRepoSetupPage, pageData{Title: "Import", NewRepo: &newRepoForm{Kind: "import", Source: "git", Format: "zit", Every: 3600}}},
		"fossil":  {newRepoSetupPage, pageData{Title: "Mirror", NewRepo: &newRepoForm{Kind: "fossil", Source: "fossil", Every: 21600}}},
		"review":  {newRepoReviewPage, pageData{Title: "Review", NewRepo: &github}},
		"copying": {newRepoProgressPage, pageData{Title: "Preparing", NewImport: &newRepoImport{Name: "src", State: "copying", Bytes: 812 << 20}}},
		"failed":  {newRepoProgressPage, pageData{Title: "Preparing", NewImport: &newRepoImport{Name: "src", State: "failed", Error: "git fetch: repository not found"}}},
		"ready":   {newRepoProgressPage, pageData{Title: "Preparing", NewImport: &newRepoImport{Name: "src", State: "ready"}}},
	}
	for name, p := range pages {
		var buf strings.Builder
		p.data.SheetURL = "quarry.css"
		p.data.OwnH1 = true
		if err := noHooks.template(p.page).Execute(&buf, p.data); err != nil {
			t.Fatalf("%s: %v", name, err)
		}
		if err := os.WriteFile(filepath.Join(dir, name+".html"), []byte(buf.String()), 0o644); err != nil {
			t.Fatal(err)
		}
	}
}

// The flow fits a phone: every two-column layout in it (the start
// page's cards, the mirror's form and summary, the review and its
// action box) becomes one column at phone width, and none of its pages
// is held to a one-form column on a desktop.
func TestNewRepoFlowStacksOnAPhone(t *testing.T) {
	compact := strings.Join(strings.Fields(sheet), "")
	for _, rule := range []string{
		"@media(max-width:44rem){.start-grid,.mirror-layout,.review-layout{grid-template-columns:1fr",
		".mirror-pair,.mirror-format-options{grid-template-columns:1fr",
	} {
		if !strings.Contains(compact, rule) {
			t.Errorf("FAIL: a layout keeps two columns on a phone; missing %s", rule)
		}
	}
	for _, p := range []*pageTemplate{newRepoPage, newRepoSetupPage, newRepoReviewPage, newRepoProgressPage} {
		if narrowPages[p] {
			t.Errorf("FAIL: a new-repository page is held to a one-form column")
		}
	}
	for _, p := range []*pageTemplate{loginPage, invitePage} {
		if !narrowPages[p] {
			t.Errorf("FAIL: a one-form page lost its narrow column")
		}
	}
}