Implements tests/_plans and previously deferred packages; updates plan README with new coverage numbers.
114 lines
5.7 KiB
Go
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])
|
|
})
|
|
}
|
|
}
|