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"}}},
"waiting": {newRepoProgressPage, pageData{Title: "Preparing", NewImport: &newRepoImport{Name: "linux", State: "failed", Confirm: "submanifests",
Error: "too large for flat manifests: 1,500,942 commits of up to 92,716 files"}}},
}
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")
}
}
}