Files
relspecgo/pkg/ui/screens_smoke_test.go
T
warkanum 495a21b67b test: expand coverage across readers, writers, cmd, ui, diff and merge
Implements tests/_plans and previously deferred packages; updates plan
README with new coverage numbers.
2026-10-03 21:33:59 +02:00

114 lines
5.7 KiB
Go

package ui
import (
"testing"
"git.warky.dev/wdevs/relspecgo/pkg/models"
)
// richEditor returns an editor whose database has one of every object the screens render.
func richEditor(t *testing.T) *SchemaEditor {
t.Helper()
se := NewSchemaEditor(newTestEditor().db)
db := se.db
tbl := db.Schemas[0].Tables[0]
col := tbl.Columns["id"]
col.Type, col.IsPrimaryKey, col.NotNull = "integer", true, true
tbl.Relationships["fk_self"] = &models.Relationship{Name: "fk_self", FromTable: "users", ToTable: "users", FromColumns: []string{"id"}, ToColumns: []string{"id"}}
se.createDomainNoUI("core")
if err := se.AssignTableToDomain(0, "public", "users"); err != nil {
t.Fatal(err)
}
_ = se.SaveIndex(0, 0, "", &models.Index{Name: "idx_e", Columns: []string{"email"}})
_ = se.SaveView(0, -1, &models.View{Name: "v", Definition: "select 1"})
_ = se.SaveSequence(0, -1, &models.Sequence{Name: "s", IncrementBy: 1, StartValue: 1})
_ = se.SaveScript(0, -1, &models.Script{Name: "sc", SQL: "select 1"})
return se
}
// TestScreensRender builds every screen and dialog against a populated database
// and checks that none panics and that each registers a page.
func TestScreensRender(t *testing.T) {
col := func(se *SchemaEditor) *models.Column { return se.db.Schemas[0].Tables[0].Columns["id"] }
cases := []struct {
name string
page string
run func(se *SchemaEditor)
}{
{"schema list", "schemas", func(se *SchemaEditor) { se.showSchemaList() }},
{"schema editor", "schema-editor", func(se *SchemaEditor) { se.showSchemaEditor(0, se.db.Schemas[0]) }},
{"new schema", "new-schema", func(se *SchemaEditor) { se.showNewSchemaDialog() }},
{"edit schema", "edit-schema", func(se *SchemaEditor) { se.showEditSchemaDialog(0) }},
{"table list", "tables", func(se *SchemaEditor) { se.showTableList() }},
{"table editor", "table-editor", func(se *SchemaEditor) { se.showTableEditor(0, 0, se.db.Schemas[0].Tables[0]) }},
{"new table", "new-table", func(se *SchemaEditor) { se.showNewTableDialog(0) }},
{"new table from list", "new-table-from-list", func(se *SchemaEditor) { se.showNewTableDialogFromList() }},
{"edit table", "edit-table", func(se *SchemaEditor) { se.showEditTableDialog(0, 0) }},
{"column editor", "column-editor", func(se *SchemaEditor) { se.showColumnEditor(0, 0, 0, col(se)) }},
{"new column", "new-column", func(se *SchemaEditor) { se.showNewColumnDialog(0, 0) }},
{"relationship list", "relationships", func(se *SchemaEditor) { se.showRelationshipList(0, 0) }},
{"new relationship", "new-relationship", func(se *SchemaEditor) { se.showNewRelationshipDialog(0, 0) }},
{"edit relationship", "edit-relationship", func(se *SchemaEditor) { se.showEditRelationshipDialog(0, 0, "fk_self") }},
{"delete relationship", "delete-relationship-confirm", func(se *SchemaEditor) { se.showDeleteRelationshipConfirm(0, 0, "fk_self") }},
{"domain list", "domains", func(se *SchemaEditor) { se.showDomainList() }},
{"new domain", "new-domain", func(se *SchemaEditor) { se.showNewDomainDialog() }},
{"domain editor", "edit-domain", func(se *SchemaEditor) { se.showDomainEditor(0, se.db.Domains[0]) }},
{"delete domain", "delete-domain-confirm", func(se *SchemaEditor) { se.showDeleteDomainConfirm(0) }},
{"domain tables", "domain-tables", func(se *SchemaEditor) { se.showDomainTables(0) }},
{"assign domain table", "assign-domain-table", func(se *SchemaEditor) { se.showAssignDomainTable(0, func() {}) }},
{"edit database", "edit-database", func(se *SchemaEditor) { se.showEditDatabaseForm() }},
{"exit confirm", "exit-confirm", func(se *SchemaEditor) { se.showExitConfirmation("a", "main") }},
{"exit editor confirm", "exit-editor-confirm", func(se *SchemaEditor) { se.showExitEditorConfirm() }},
{"delete schema confirm", "confirm-delete-schema", func(se *SchemaEditor) { se.showDeleteSchemaConfirm(0) }},
{"delete table confirm", "confirm-delete-table", func(se *SchemaEditor) { se.showDeleteTableConfirm(0, 0) }},
{"delete column confirm", "confirm-delete-column", func(se *SchemaEditor) { se.showDeleteColumnConfirm(0, 0, "id") }},
{"load screen", "load-database", func(se *SchemaEditor) { se.showLoadScreen() }},
{"save screen", "save-database", func(se *SchemaEditor) { se.showSaveScreen() }},
{"import screen", "import-database", func(se *SchemaEditor) { se.showImportScreen() }},
{"update existing confirm", "update-confirm", func(se *SchemaEditor) {
se.loadConfig = &LoadConfig{SourceType: "json", FilePath: "x.json"}
se.showUpdateExistingDatabaseConfirm()
}},
{"import confirm", "import-confirm", func(se *SchemaEditor) {
se.showImportConfirmation(models.InitDatabase("src"), false, false, false, false, false, "")
}},
{"conn builder", "", func(se *SchemaEditor) { se.showConnStringBuilder("", "", "main", func(string) {}) }},
}
for _, tt := range cases {
t.Run(tt.name, func(t *testing.T) {
se := richEditor(t)
before := len(se.pages.GetPageNames(false))
defer func() {
if r := recover(); r != nil {
t.Fatalf("panic: %v", r)
}
}()
tt.run(se)
if tt.page != "" && !se.pages.HasPage(tt.page) {
t.Errorf("page %q not registered; pages: %v", tt.page, se.pages.GetPageNames(false))
}
if tt.page == "" && len(se.pages.GetPageNames(false)) <= before {
t.Error("no page added")
}
})
}
}
func TestObjectScreensRender(t *testing.T) {
se := richEditor(t)
for name, k := range map[string]objectKind{
"indexes": se.indexKind(), "views": se.viewKind(), "sequences": se.sequenceKind(), "scripts": se.scriptKind(),
} {
t.Run(name, func(t *testing.T) {
se.showObjectList(k)
if !se.pages.HasPage(k.page) {
t.Errorf("list page %q missing; pages: %v", k.page, se.pages.GetPageNames(false))
}
rows := k.rows()
se.showObjectForm(k, nil)
se.showObjectForm(k, &rows[0])
})
}
}