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]) }) } }