mirror of
https://github.com/pocketbase/pocketbase.git
synced 2025-03-19 22:19:23 +02:00
112 lines
2.3 KiB
Go
112 lines
2.3 KiB
Go
package validators_test
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"testing"
|
|
|
|
validation "github.com/go-ozzo/ozzo-validation/v4"
|
|
"github.com/pocketbase/pocketbase/core/validators"
|
|
"github.com/pocketbase/pocketbase/tests"
|
|
)
|
|
|
|
func TestUniqueId(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
app, _ := tests.NewTestApp()
|
|
defer app.Cleanup()
|
|
|
|
scenarios := []struct {
|
|
id string
|
|
tableName string
|
|
expectError bool
|
|
}{
|
|
{"", "", false},
|
|
{"test", "", true},
|
|
{"wsmn24bux7wo113", "_collections", true},
|
|
{"test_unique_id", "unknown_table", true},
|
|
{"test_unique_id", "_collections", false},
|
|
}
|
|
|
|
for i, s := range scenarios {
|
|
t.Run(fmt.Sprintf("%d_%s_%s", i, s.id, s.tableName), func(t *testing.T) {
|
|
err := validators.UniqueId(app.DB(), s.tableName)(s.id)
|
|
|
|
hasErr := err != nil
|
|
if hasErr != s.expectError {
|
|
t.Fatalf("Expected hasErr to be %v, got %v (%v)", s.expectError, hasErr, err)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestNormalizeUniqueIndexError(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
scenarios := []struct {
|
|
name string
|
|
err error
|
|
table string
|
|
names []string
|
|
expectedKeys []string
|
|
}{
|
|
{
|
|
"nil error (no changes)",
|
|
nil,
|
|
"test",
|
|
[]string{"a", "b"},
|
|
nil,
|
|
},
|
|
{
|
|
"non-unique index error (no changes)",
|
|
errors.New("abc"),
|
|
"test",
|
|
[]string{"a", "b"},
|
|
nil,
|
|
},
|
|
{
|
|
"validation error (no changes)",
|
|
validation.Errors{"c": errors.New("abc")},
|
|
"test",
|
|
[]string{"a", "b"},
|
|
[]string{"c"},
|
|
},
|
|
{
|
|
"unique index error but mismatched table name",
|
|
errors.New("UNIQUE constraint failed for fields test.a,test.b"),
|
|
"example",
|
|
[]string{"a", "b"},
|
|
nil,
|
|
},
|
|
{
|
|
"unique index error but mismatched fields",
|
|
errors.New("UNIQUE constraint failed for fields test.a,test.b"),
|
|
"test",
|
|
[]string{"c", "d"},
|
|
nil,
|
|
},
|
|
{
|
|
"unique index error with matching table name and fields",
|
|
errors.New("UNIQUE constraint failed for fields test.a,test.b"),
|
|
"test",
|
|
[]string{"a", "b", "c"},
|
|
[]string{"a", "b"},
|
|
},
|
|
}
|
|
|
|
for _, s := range scenarios {
|
|
t.Run(s.name, func(t *testing.T) {
|
|
result := validators.NormalizeUniqueIndexError(s.err, s.table, s.names)
|
|
|
|
if len(s.expectedKeys) == 0 {
|
|
if result != s.err {
|
|
t.Fatalf("Expected no error change, got %v", result)
|
|
}
|
|
return
|
|
}
|
|
|
|
tests.TestValidationErrors(t, result, s.expectedKeys)
|
|
})
|
|
}
|
|
}
|