| 
									
										
										
										
											2024-09-30 00:23:19 +08:00
										 |  |  | package core_test | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"context" | 
					
						
							|  |  |  | 	"strings" | 
					
						
							|  |  |  | 	"testing" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	validation "github.com/go-ozzo/ozzo-validation/v4" | 
					
						
							|  |  |  | 	"github.com/pocketbase/pocketbase/core" | 
					
						
							|  |  |  | 	"github.com/pocketbase/pocketbase/tests" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func testFieldBaseMethods(t *testing.T, fieldType string) { | 
					
						
							|  |  |  | 	factory, ok := core.Fields[fieldType] | 
					
						
							|  |  |  | 	if !ok { | 
					
						
							|  |  |  | 		t.Fatalf("Missing %q field factory", fieldType) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	f := factory() | 
					
						
							|  |  |  | 	if f == nil { | 
					
						
							|  |  |  | 		t.Fatal("Expected non-nil Field instance") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	t.Run("type", func(t *testing.T) { | 
					
						
							|  |  |  | 		if v := f.Type(); v != fieldType { | 
					
						
							|  |  |  | 			t.Fatalf("Expected type %q, got %q", fieldType, v) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	t.Run("id", func(t *testing.T) { | 
					
						
							|  |  |  | 		testValues := []string{"new_id", ""} | 
					
						
							|  |  |  | 		for _, expected := range testValues { | 
					
						
							|  |  |  | 			f.SetId(expected) | 
					
						
							|  |  |  | 			if v := f.GetId(); v != expected { | 
					
						
							|  |  |  | 				t.Fatalf("Expected id %q, got %q", expected, v) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	t.Run("name", func(t *testing.T) { | 
					
						
							|  |  |  | 		testValues := []string{"new_name", ""} | 
					
						
							|  |  |  | 		for _, expected := range testValues { | 
					
						
							|  |  |  | 			f.SetName(expected) | 
					
						
							|  |  |  | 			if v := f.GetName(); v != expected { | 
					
						
							|  |  |  | 				t.Fatalf("Expected name %q, got %q", expected, v) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	t.Run("system", func(t *testing.T) { | 
					
						
							|  |  |  | 		testValues := []bool{false, true} | 
					
						
							|  |  |  | 		for _, expected := range testValues { | 
					
						
							|  |  |  | 			f.SetSystem(expected) | 
					
						
							|  |  |  | 			if v := f.GetSystem(); v != expected { | 
					
						
							|  |  |  | 				t.Fatalf("Expected system %v, got %v", expected, v) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	t.Run("hidden", func(t *testing.T) { | 
					
						
							|  |  |  | 		testValues := []bool{false, true} | 
					
						
							|  |  |  | 		for _, expected := range testValues { | 
					
						
							|  |  |  | 			f.SetHidden(expected) | 
					
						
							|  |  |  | 			if v := f.GetHidden(); v != expected { | 
					
						
							|  |  |  | 				t.Fatalf("Expected hidden %v, got %v", expected, v) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func testDefaultFieldIdValidation(t *testing.T, fieldType string) { | 
					
						
							|  |  |  | 	app, _ := tests.NewTestApp() | 
					
						
							|  |  |  | 	defer app.Cleanup() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	collection := core.NewBaseCollection("test_collection") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	scenarios := []struct { | 
					
						
							|  |  |  | 		name        string | 
					
						
							|  |  |  | 		field       func() core.Field | 
					
						
							|  |  |  | 		expectError bool | 
					
						
							|  |  |  | 	}{ | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			"empty value", | 
					
						
							|  |  |  | 			func() core.Field { | 
					
						
							|  |  |  | 				f := core.Fields[fieldType]() | 
					
						
							|  |  |  | 				return f | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			true, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			"invalid length", | 
					
						
							|  |  |  | 			func() core.Field { | 
					
						
							|  |  |  | 				f := core.Fields[fieldType]() | 
					
						
							| 
									
										
										
										
											2024-11-11 22:18:24 +08:00
										 |  |  | 				f.SetId(strings.Repeat("a", 101)) | 
					
						
							| 
									
										
										
										
											2024-09-30 00:23:19 +08:00
										 |  |  | 				return f | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			true, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			"valid length", | 
					
						
							|  |  |  | 			func() core.Field { | 
					
						
							|  |  |  | 				f := core.Fields[fieldType]() | 
					
						
							| 
									
										
										
										
											2024-11-11 22:18:24 +08:00
										 |  |  | 				f.SetId(strings.Repeat("a", 100)) | 
					
						
							| 
									
										
										
										
											2024-09-30 00:23:19 +08:00
										 |  |  | 				return f | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			false, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for _, s := range scenarios { | 
					
						
							|  |  |  | 		t.Run("[id] "+s.name, func(t *testing.T) { | 
					
						
							|  |  |  | 			errs, _ := s.field().ValidateSettings(context.Background(), app, collection).(validation.Errors) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			hasErr := errs["id"] != nil | 
					
						
							|  |  |  | 			if hasErr != s.expectError { | 
					
						
							|  |  |  | 				t.Fatalf("Expected hasErr %v, got %v", s.expectError, hasErr) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func testDefaultFieldNameValidation(t *testing.T, fieldType string) { | 
					
						
							|  |  |  | 	app, _ := tests.NewTestApp() | 
					
						
							|  |  |  | 	defer app.Cleanup() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	collection := core.NewBaseCollection("test_collection") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	scenarios := []struct { | 
					
						
							|  |  |  | 		name        string | 
					
						
							|  |  |  | 		field       func() core.Field | 
					
						
							|  |  |  | 		expectError bool | 
					
						
							|  |  |  | 	}{ | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			"empty value", | 
					
						
							|  |  |  | 			func() core.Field { | 
					
						
							|  |  |  | 				f := core.Fields[fieldType]() | 
					
						
							|  |  |  | 				return f | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			true, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			"invalid length", | 
					
						
							|  |  |  | 			func() core.Field { | 
					
						
							|  |  |  | 				f := core.Fields[fieldType]() | 
					
						
							| 
									
										
										
										
											2024-11-11 22:18:24 +08:00
										 |  |  | 				f.SetName(strings.Repeat("a", 101)) | 
					
						
							| 
									
										
										
										
											2024-09-30 00:23:19 +08:00
										 |  |  | 				return f | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			true, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			"valid length", | 
					
						
							|  |  |  | 			func() core.Field { | 
					
						
							|  |  |  | 				f := core.Fields[fieldType]() | 
					
						
							| 
									
										
										
										
											2024-11-11 22:18:24 +08:00
										 |  |  | 				f.SetName(strings.Repeat("a", 100)) | 
					
						
							| 
									
										
										
										
											2024-09-30 00:23:19 +08:00
										 |  |  | 				return f | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			false, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			"invalid regex", | 
					
						
							|  |  |  | 			func() core.Field { | 
					
						
							|  |  |  | 				f := core.Fields[fieldType]() | 
					
						
							|  |  |  | 				f.SetName("test(") | 
					
						
							|  |  |  | 				return f | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			true, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			"valid regex", | 
					
						
							|  |  |  | 			func() core.Field { | 
					
						
							|  |  |  | 				f := core.Fields[fieldType]() | 
					
						
							|  |  |  | 				f.SetName("test_123") | 
					
						
							|  |  |  | 				return f | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			false, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			"_via_", | 
					
						
							|  |  |  | 			func() core.Field { | 
					
						
							|  |  |  | 				f := core.Fields[fieldType]() | 
					
						
							|  |  |  | 				f.SetName("a_via_b") | 
					
						
							|  |  |  | 				return f | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			true, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			"system reserved - null", | 
					
						
							|  |  |  | 			func() core.Field { | 
					
						
							|  |  |  | 				f := core.Fields[fieldType]() | 
					
						
							|  |  |  | 				f.SetName("null") | 
					
						
							|  |  |  | 				return f | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			true, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			"system reserved - false", | 
					
						
							|  |  |  | 			func() core.Field { | 
					
						
							|  |  |  | 				f := core.Fields[fieldType]() | 
					
						
							|  |  |  | 				f.SetName("false") | 
					
						
							|  |  |  | 				return f | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			true, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			"system reserved - true", | 
					
						
							|  |  |  | 			func() core.Field { | 
					
						
							|  |  |  | 				f := core.Fields[fieldType]() | 
					
						
							|  |  |  | 				f.SetName("true") | 
					
						
							|  |  |  | 				return f | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			true, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			"system reserved - _rowid_", | 
					
						
							|  |  |  | 			func() core.Field { | 
					
						
							|  |  |  | 				f := core.Fields[fieldType]() | 
					
						
							|  |  |  | 				f.SetName("_rowid_") | 
					
						
							|  |  |  | 				return f | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			true, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			"system reserved - expand", | 
					
						
							|  |  |  | 			func() core.Field { | 
					
						
							|  |  |  | 				f := core.Fields[fieldType]() | 
					
						
							|  |  |  | 				f.SetName("expand") | 
					
						
							|  |  |  | 				return f | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			true, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			"system reserved - collectionId", | 
					
						
							|  |  |  | 			func() core.Field { | 
					
						
							|  |  |  | 				f := core.Fields[fieldType]() | 
					
						
							|  |  |  | 				f.SetName("collectionId") | 
					
						
							|  |  |  | 				return f | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			true, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			"system reserved - collectionName", | 
					
						
							|  |  |  | 			func() core.Field { | 
					
						
							|  |  |  | 				f := core.Fields[fieldType]() | 
					
						
							|  |  |  | 				f.SetName("collectionName") | 
					
						
							|  |  |  | 				return f | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			true, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for _, s := range scenarios { | 
					
						
							|  |  |  | 		t.Run("[name] "+s.name, func(t *testing.T) { | 
					
						
							|  |  |  | 			errs, _ := s.field().ValidateSettings(context.Background(), app, collection).(validation.Errors) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			hasErr := errs["name"] != nil | 
					
						
							|  |  |  | 			if hasErr != s.expectError { | 
					
						
							|  |  |  | 				t.Fatalf("Expected hasErr %v, got %v", s.expectError, hasErr) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } |