mirror of
https://github.com/pocketbase/pocketbase.git
synced 2025-01-10 00:43:36 +02:00
269 lines
6.5 KiB
Go
269 lines
6.5 KiB
Go
|
package jsvm_test
|
||
|
|
||
|
import (
|
||
|
"reflect"
|
||
|
"testing"
|
||
|
|
||
|
"github.com/pocketbase/pocketbase/daos"
|
||
|
"github.com/pocketbase/pocketbase/models"
|
||
|
"github.com/pocketbase/pocketbase/models/schema"
|
||
|
"github.com/pocketbase/pocketbase/plugins/jsvm"
|
||
|
"github.com/pocketbase/pocketbase/tests"
|
||
|
)
|
||
|
|
||
|
func TestBaseVMUnmarshal(t *testing.T) {
|
||
|
vm := jsvm.NewBaseVM()
|
||
|
|
||
|
v, err := vm.RunString(`unmarshal({ name: "test" }, new Collection())`)
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
|
||
|
m, ok := v.Export().(*models.Collection)
|
||
|
if !ok {
|
||
|
t.Fatalf("Expected models.Collection, got %v", m)
|
||
|
}
|
||
|
|
||
|
if m.Name != "test" {
|
||
|
t.Fatalf("Expected collection with name %q, got %q", "test", m.Name)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestBaseVMRecordBind(t *testing.T) {
|
||
|
app, _ := tests.NewTestApp()
|
||
|
defer app.Cleanup()
|
||
|
|
||
|
collection, err := app.Dao().FindCollectionByNameOrId("users")
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
|
||
|
vm := jsvm.NewBaseVM()
|
||
|
vm.Set("collection", collection)
|
||
|
|
||
|
// without record data
|
||
|
// ---
|
||
|
v1, err := vm.RunString(`new Record(collection)`)
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
|
||
|
m1, ok := v1.Export().(*models.Record)
|
||
|
if !ok {
|
||
|
t.Fatalf("Expected m1 to be models.Record, got \n%v", m1)
|
||
|
}
|
||
|
|
||
|
// with record data
|
||
|
// ---
|
||
|
v2, err := vm.RunString(`new Record(collection, { email: "test@example.com" })`)
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
|
||
|
m2, ok := v2.Export().(*models.Record)
|
||
|
if !ok {
|
||
|
t.Fatalf("Expected m2 to be models.Record, got \n%v", m2)
|
||
|
}
|
||
|
|
||
|
if m2.Collection().Name != "users" {
|
||
|
t.Fatalf("Expected record with collection %q, got \n%v", "users", m2.Collection())
|
||
|
}
|
||
|
|
||
|
if m2.Email() != "test@example.com" {
|
||
|
t.Fatalf("Expected record with email field set to %q, got \n%v", "test@example.com", m2)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// @todo enable after https://github.com/dop251/goja/issues/426
|
||
|
// func TestBaseVMRecordGetAndSetBind(t *testing.T) {
|
||
|
// app, _ := tests.NewTestApp()
|
||
|
// defer app.Cleanup()
|
||
|
|
||
|
// collection, err := app.Dao().FindCollectionByNameOrId("users")
|
||
|
// if err != nil {
|
||
|
// t.Fatal(err)
|
||
|
// }
|
||
|
|
||
|
// vm := jsvm.NewBaseVM()
|
||
|
// vm.Set("collection", collection)
|
||
|
// vm.Set("getRecord", func() *models.Record {
|
||
|
// return models.NewRecord(collection)
|
||
|
// })
|
||
|
|
||
|
// _, runErr := vm.RunString(`
|
||
|
// const jsRecord = new Record(collection);
|
||
|
// jsRecord.email = "test@example.com"; // test js record setter
|
||
|
// const email = jsRecord.email; // test js record getter
|
||
|
|
||
|
// const goRecord = getRecord()
|
||
|
// goRecord.name = "test" // test go record setter
|
||
|
// const name = goRecord.name; // test go record getter
|
||
|
// `)
|
||
|
// if runErr != nil {
|
||
|
// t.Fatal(runErr)
|
||
|
// }
|
||
|
|
||
|
// expectedEmail := "test@example.com"
|
||
|
// expectedName := "test"
|
||
|
|
||
|
// jsRecord, ok := vm.Get("jsRecord").Export().(*models.Record)
|
||
|
// if !ok {
|
||
|
// t.Fatalf("Failed to export jsRecord")
|
||
|
// }
|
||
|
// if v := jsRecord.Email(); v != expectedEmail {
|
||
|
// t.Fatalf("Expected the js created record to have email %q, got %q", expectedEmail, v)
|
||
|
// }
|
||
|
|
||
|
// email := vm.Get("email").Export().(string)
|
||
|
// if email != expectedEmail {
|
||
|
// t.Fatalf("Expected exported email %q, got %q", expectedEmail, email)
|
||
|
// }
|
||
|
|
||
|
// goRecord, ok := vm.Get("goRecord").Export().(*models.Record)
|
||
|
// if !ok {
|
||
|
// t.Fatalf("Failed to export goRecord")
|
||
|
// }
|
||
|
// if v := goRecord.GetString("name"); v != expectedName {
|
||
|
// t.Fatalf("Expected the go created record to have name %q, got %q", expectedName, v)
|
||
|
// }
|
||
|
|
||
|
// name := vm.Get("name").Export().(string)
|
||
|
// if name != expectedName {
|
||
|
// t.Fatalf("Expected exported name %q, got %q", expectedName, name)
|
||
|
// }
|
||
|
|
||
|
// // ensure that the two record instances are not mixed
|
||
|
// if v := goRecord.Email(); v != "" {
|
||
|
// t.Fatalf("Expected the go created record to not have an email, got %q", v)
|
||
|
// }
|
||
|
// if v := jsRecord.GetString("name"); v != "" {
|
||
|
// t.Fatalf("Expected the js created record to not have a name, got %q", v)
|
||
|
// }
|
||
|
// }
|
||
|
|
||
|
func TestBaseVMCollectionBind(t *testing.T) {
|
||
|
vm := jsvm.NewBaseVM()
|
||
|
|
||
|
v, err := vm.RunString(`new Collection({ name: "test", schema: [{name: "title", "type": "text"}] })`)
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
|
||
|
m, ok := v.Export().(*models.Collection)
|
||
|
if !ok {
|
||
|
t.Fatalf("Expected models.Collection, got %v", m)
|
||
|
}
|
||
|
|
||
|
if m.Name != "test" {
|
||
|
t.Fatalf("Expected collection with name %q, got %q", "test", m.Name)
|
||
|
}
|
||
|
|
||
|
if f := m.Schema.GetFieldByName("title"); f == nil {
|
||
|
t.Fatalf("Expected schema to be set, got %v", m.Schema)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestBaseVMAdminBind(t *testing.T) {
|
||
|
vm := jsvm.NewBaseVM()
|
||
|
|
||
|
v, err := vm.RunString(`new Admin({ email: "test@example.com" })`)
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
|
||
|
m, ok := v.Export().(*models.Admin)
|
||
|
if !ok {
|
||
|
t.Fatalf("Expected models.Admin, got %v", m)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestBaseVMSchemaBind(t *testing.T) {
|
||
|
vm := jsvm.NewBaseVM()
|
||
|
|
||
|
v, err := vm.RunString(`new Schema([{name: "title", "type": "text"}])`)
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
|
||
|
m, ok := v.Export().(*schema.Schema)
|
||
|
if !ok {
|
||
|
t.Fatalf("Expected schema.Schema, got %v", m)
|
||
|
}
|
||
|
|
||
|
if f := m.GetFieldByName("title"); f == nil {
|
||
|
t.Fatalf("Expected schema fields to be loaded, got %v", m.Fields())
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestBaseVMSchemaFieldBind(t *testing.T) {
|
||
|
vm := jsvm.NewBaseVM()
|
||
|
|
||
|
v, err := vm.RunString(`new SchemaField({name: "title", "type": "text"})`)
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
|
||
|
f, ok := v.Export().(*schema.SchemaField)
|
||
|
if !ok {
|
||
|
t.Fatalf("Expected schema.SchemaField, got %v", f)
|
||
|
}
|
||
|
|
||
|
if f.Name != "title" {
|
||
|
t.Fatalf("Expected field %q, got %v", "title", f)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestBaseVMDaoBind(t *testing.T) {
|
||
|
app, _ := tests.NewTestApp()
|
||
|
defer app.Cleanup()
|
||
|
|
||
|
vm := jsvm.NewBaseVM()
|
||
|
vm.Set("db", app.DB())
|
||
|
|
||
|
v, err := vm.RunString(`new Dao(db)`)
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
|
||
|
d, ok := v.Export().(*daos.Dao)
|
||
|
if !ok {
|
||
|
t.Fatalf("Expected daos.Dao, got %v", d)
|
||
|
}
|
||
|
|
||
|
if d.DB() != app.DB() {
|
||
|
t.Fatalf("The db instances doesn't match")
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestFieldMapper(t *testing.T) {
|
||
|
mapper := jsvm.FieldMapper{}
|
||
|
|
||
|
scenarios := []struct {
|
||
|
name string
|
||
|
expected string
|
||
|
}{
|
||
|
{"", ""},
|
||
|
{"test", "test"},
|
||
|
{"Test", "test"},
|
||
|
{"miXeD", "miXeD"},
|
||
|
{"MiXeD", "miXeD"},
|
||
|
{"ResolveRequestAsJSON", "resolveRequestAsJSON"},
|
||
|
{"Variable_with_underscore", "variable_with_underscore"},
|
||
|
{"ALLCAPS", "allcaps"},
|
||
|
{"NOTALLCAPs", "nOTALLCAPs"},
|
||
|
{"ALL_CAPS_WITH_UNDERSCORE", "all_caps_with_underscore"},
|
||
|
}
|
||
|
|
||
|
for i, s := range scenarios {
|
||
|
field := reflect.StructField{Name: s.name}
|
||
|
if v := mapper.FieldName(nil, field); v != s.expected {
|
||
|
t.Fatalf("[%d] Expected FieldName %q, got %q", i, s.expected, v)
|
||
|
}
|
||
|
|
||
|
method := reflect.Method{Name: s.name}
|
||
|
if v := mapper.MethodName(nil, method); v != s.expected {
|
||
|
t.Fatalf("[%d] Expected MethodName %q, got %q", i, s.expected, v)
|
||
|
}
|
||
|
}
|
||
|
}
|