mirror of
https://github.com/bitechdev/ResolveSpec.git
synced 2026-06-08 14:53:46 +00:00
test(handler): add tests for valid nested request verbs
This commit is contained in:
@@ -846,6 +846,87 @@ func TestProcessNestedCUD_BelongsToUnchanged(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestProcessNestedCUD_AddAlias(t *testing.T) {
|
||||||
|
db := newMockDatabase()
|
||||||
|
registry := &mockModelRegistry{}
|
||||||
|
relProvider := newMockRelationshipProvider()
|
||||||
|
|
||||||
|
processor := NewNestedCUDProcessor(db, registry, relProvider)
|
||||||
|
|
||||||
|
data := map[string]interface{}{
|
||||||
|
"_request": "add",
|
||||||
|
"name": "New Department",
|
||||||
|
}
|
||||||
|
|
||||||
|
result, err := processor.ProcessNestedCUD(context.Background(), "insert", data, Department{}, nil, "departments")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("ProcessNestedCUD with _request=add failed: %v", err)
|
||||||
|
}
|
||||||
|
if result.ID == nil {
|
||||||
|
t.Error("Expected result.ID to be set after add")
|
||||||
|
}
|
||||||
|
if len(db.insertCalls) != 1 {
|
||||||
|
t.Errorf("Expected 1 insert call, got %d", len(db.insertCalls))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestProcessNestedCUD_RemoveAlias(t *testing.T) {
|
||||||
|
db := newMockDatabase()
|
||||||
|
registry := &mockModelRegistry{}
|
||||||
|
relProvider := newMockRelationshipProvider()
|
||||||
|
|
||||||
|
processor := NewNestedCUDProcessor(db, registry, relProvider)
|
||||||
|
|
||||||
|
data := map[string]interface{}{
|
||||||
|
"_request": "remove",
|
||||||
|
"ID": int64(42),
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err := processor.ProcessNestedCUD(context.Background(), "delete", data, Department{}, nil, "departments")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("ProcessNestedCUD with _request=remove failed: %v", err)
|
||||||
|
}
|
||||||
|
if len(db.deleteCalls) != 1 {
|
||||||
|
t.Errorf("Expected 1 delete call, got %d", len(db.deleteCalls))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestProcessNestedCUD_NestedAddRemoveAliases(t *testing.T) {
|
||||||
|
db := newMockDatabase()
|
||||||
|
registry := &mockModelRegistry{}
|
||||||
|
relProvider := newMockRelationshipProvider()
|
||||||
|
|
||||||
|
relProvider.RegisterRelation("Department", "employees", &RelationshipInfo{
|
||||||
|
FieldName: "Employees",
|
||||||
|
JSONName: "employees",
|
||||||
|
RelationType: "has_many",
|
||||||
|
ForeignKey: "DepartmentID",
|
||||||
|
RelatedModel: Employee{},
|
||||||
|
})
|
||||||
|
|
||||||
|
processor := NewNestedCUDProcessor(db, registry, relProvider)
|
||||||
|
|
||||||
|
data := map[string]interface{}{
|
||||||
|
"ID": int64(1),
|
||||||
|
"name": "Engineering",
|
||||||
|
"employees": []interface{}{
|
||||||
|
map[string]interface{}{"_request": "add", "name": "Alice"},
|
||||||
|
map[string]interface{}{"_request": "remove", "ID": int64(5)},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err := processor.ProcessNestedCUD(context.Background(), "update", data, Department{}, nil, "departments")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("ProcessNestedCUD with nested add/remove failed: %v", err)
|
||||||
|
}
|
||||||
|
if len(db.insertCalls) != 1 {
|
||||||
|
t.Errorf("Expected 1 insert (add alias) for employee, got %d", len(db.insertCalls))
|
||||||
|
}
|
||||||
|
if len(db.deleteCalls) != 1 {
|
||||||
|
t.Errorf("Expected 1 delete (remove alias) for employee, got %d", len(db.deleteCalls))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestGetPrimaryKeyName(t *testing.T) {
|
func TestGetPrimaryKeyName(t *testing.T) {
|
||||||
dept := Department{}
|
dept := Department{}
|
||||||
pkName := reflection.GetPrimaryKeyName(dept)
|
pkName := reflection.GetPrimaryKeyName(dept)
|
||||||
|
|||||||
@@ -2120,7 +2120,7 @@ func isValidNestedRequest(item map[string]interface{}) bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
switch strings.ToLower(strings.TrimSpace(s)) {
|
switch strings.ToLower(strings.TrimSpace(s)) {
|
||||||
case "insert", "create", "add", "change", "update", "modify", "delete", "remove":
|
case "insert", "add", "change", "update", "delete", "remove":
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
|
|||||||
@@ -352,6 +352,45 @@ func (m *mockRegistry) GetAllModels() map[string]interface{} {
|
|||||||
return m.models
|
return m.models
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TestIsValidNestedRequest verifies that only the allowed _request verbs are accepted
|
||||||
|
// and that items missing the key are rejected.
|
||||||
|
func TestIsValidNestedRequest(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
item map[string]interface{}
|
||||||
|
expected bool
|
||||||
|
}{
|
||||||
|
// Valid verbs
|
||||||
|
{name: "insert", item: map[string]interface{}{"_request": "insert"}, expected: true},
|
||||||
|
{name: "add", item: map[string]interface{}{"_request": "add"}, expected: true},
|
||||||
|
{name: "update", item: map[string]interface{}{"_request": "update"}, expected: true},
|
||||||
|
{name: "change", item: map[string]interface{}{"_request": "change"}, expected: true},
|
||||||
|
{name: "delete", item: map[string]interface{}{"_request": "delete"}, expected: true},
|
||||||
|
{name: "remove", item: map[string]interface{}{"_request": "remove"}, expected: true},
|
||||||
|
// Case-insensitive
|
||||||
|
{name: "INSERT uppercase", item: map[string]interface{}{"_request": "INSERT"}, expected: true},
|
||||||
|
{name: "Remove mixed case", item: map[string]interface{}{"_request": "Remove"}, expected: true},
|
||||||
|
// Whitespace trimmed
|
||||||
|
{name: "insert with spaces", item: map[string]interface{}{"_request": " insert "}, expected: true},
|
||||||
|
// Invalid / missing
|
||||||
|
{name: "missing _request", item: map[string]interface{}{"name": "foo"}, expected: false},
|
||||||
|
{name: "empty string", item: map[string]interface{}{"_request": ""}, expected: false},
|
||||||
|
{name: "unknown verb", item: map[string]interface{}{"_request": "create"}, expected: false},
|
||||||
|
{name: "unknown verb modify", item: map[string]interface{}{"_request": "modify"}, expected: false},
|
||||||
|
{name: "non-string value", item: map[string]interface{}{"_request": 42}, expected: false},
|
||||||
|
{name: "nil value", item: map[string]interface{}{"_request": nil}, expected: false},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
got := isValidNestedRequest(tt.item)
|
||||||
|
if got != tt.expected {
|
||||||
|
t.Errorf("isValidNestedRequest(%v) = %v, want %v", tt.item, got, tt.expected)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// TestMultiLevelRelationExtraction tests extracting deeply nested relations
|
// TestMultiLevelRelationExtraction tests extracting deeply nested relations
|
||||||
func TestMultiLevelRelationExtraction(t *testing.T) {
|
func TestMultiLevelRelationExtraction(t *testing.T) {
|
||||||
registry := &mockRegistry{
|
registry := &mockRegistry{
|
||||||
|
|||||||
Reference in New Issue
Block a user