mirror of
https://github.com/pocketbase/pocketbase.git
synced 2025-01-10 00:43:36 +02:00
120 lines
2.9 KiB
Go
120 lines
2.9 KiB
Go
package daos_test
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/pocketbase/pocketbase/models"
|
|
"github.com/pocketbase/pocketbase/models/schema"
|
|
"github.com/pocketbase/pocketbase/tests"
|
|
"github.com/pocketbase/pocketbase/tools/list"
|
|
)
|
|
|
|
func TestSyncRecordTableSchema(t *testing.T) {
|
|
app, _ := tests.NewTestApp()
|
|
defer app.Cleanup()
|
|
|
|
oldCollection, err := app.Dao().FindCollectionByNameOrId("demo2")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
updatedCollection, err := app.Dao().FindCollectionByNameOrId("demo2")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
updatedCollection.Name = "demo_renamed"
|
|
updatedCollection.Schema.RemoveField(updatedCollection.Schema.GetFieldByName("active").Id)
|
|
updatedCollection.Schema.AddField(
|
|
&schema.SchemaField{
|
|
Name: "new_field",
|
|
Type: schema.FieldTypeEmail,
|
|
},
|
|
)
|
|
updatedCollection.Schema.AddField(
|
|
&schema.SchemaField{
|
|
Id: updatedCollection.Schema.GetFieldByName("title").Id,
|
|
Name: "title_renamed",
|
|
Type: schema.FieldTypeEmail,
|
|
},
|
|
)
|
|
|
|
scenarios := []struct {
|
|
newCollection *models.Collection
|
|
oldCollection *models.Collection
|
|
expectedTableName string
|
|
expectedColumns []string
|
|
}{
|
|
// new base collection
|
|
{
|
|
&models.Collection{
|
|
Name: "new_table",
|
|
Schema: schema.NewSchema(
|
|
&schema.SchemaField{
|
|
Name: "test",
|
|
Type: schema.FieldTypeText,
|
|
},
|
|
),
|
|
},
|
|
nil,
|
|
"new_table",
|
|
[]string{"id", "created", "updated", "test"},
|
|
},
|
|
// new auth collection
|
|
{
|
|
&models.Collection{
|
|
Name: "new_table_auth",
|
|
Type: models.CollectionTypeAuth,
|
|
Schema: schema.NewSchema(
|
|
&schema.SchemaField{
|
|
Name: "test",
|
|
Type: schema.FieldTypeText,
|
|
},
|
|
),
|
|
},
|
|
nil,
|
|
"new_table_auth",
|
|
[]string{
|
|
"id", "created", "updated", "test",
|
|
"username", "email", "verified", "emailVisibility",
|
|
"tokenKey", "passwordHash", "lastResetSentAt", "lastVerificationSentAt",
|
|
},
|
|
},
|
|
// no changes
|
|
{
|
|
oldCollection,
|
|
oldCollection,
|
|
"demo3",
|
|
[]string{"id", "created", "updated", "title", "active"},
|
|
},
|
|
// renamed table, deleted column, renamed columnd and new column
|
|
{
|
|
updatedCollection,
|
|
oldCollection,
|
|
"demo_renamed",
|
|
[]string{"id", "created", "updated", "title_renamed", "new_field"},
|
|
},
|
|
}
|
|
|
|
for i, scenario := range scenarios {
|
|
err := app.Dao().SyncRecordTableSchema(scenario.newCollection, scenario.oldCollection)
|
|
if err != nil {
|
|
t.Errorf("(%d) %v", i, err)
|
|
continue
|
|
}
|
|
|
|
if !app.Dao().HasTable(scenario.newCollection.Name) {
|
|
t.Errorf("(%d) Expected table %s to exist", i, scenario.newCollection.Name)
|
|
}
|
|
|
|
cols, _ := app.Dao().GetTableColumns(scenario.newCollection.Name)
|
|
if len(cols) != len(scenario.expectedColumns) {
|
|
t.Errorf("(%d) Expected columns %v, got %v", i, scenario.expectedColumns, cols)
|
|
}
|
|
|
|
for _, c := range cols {
|
|
if !list.ExistInSlice(c, scenario.expectedColumns) {
|
|
t.Errorf("(%d) Couldn't find column %s in %v", i, c, scenario.expectedColumns)
|
|
}
|
|
}
|
|
}
|
|
}
|