From 4c5dffc3d11a7b20df657b8e6e571eae7b2f8c71 Mon Sep 17 00:00:00 2001 From: Hein Date: Wed, 30 Sep 2026 17:15:55 +0200 Subject: [PATCH] test(mqttspec): add tests for update behavior with empty strings --- pkg/mqttspec/handler_test.go | 62 ++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/pkg/mqttspec/handler_test.go b/pkg/mqttspec/handler_test.go index 407271a..db30ae2 100644 --- a/pkg/mqttspec/handler_test.go +++ b/pkg/mqttspec/handler_test.go @@ -771,3 +771,65 @@ func TestHandler_HandleIncomingMessage_ValidMessage(t *testing.T) { // Should not panic or error handler.handleIncomingMessage("spec/test-client/request", payload) } + +func TestHandler_Update_OnlyPresentKeysChange(t *testing.T) { + newHook := func(id string, data map[string]interface{}) *HookContext { + return &HookContext{ + Context: context.Background(), + TableName: "users", + Model: &TestUser{}, + ModelPtr: &TestUser{}, + Schema: "public", + Entity: "users", + ID: id, + Data: data, + Options: &common.RequestOptions{}, + } + } + seed := func(t *testing.T, db *gorm.DB) { + require.NoError(t, db.Create(&TestUser{ID: 1, Name: "Original", Email: "orig@example.com", Status: "active"}).Error) + } + + t.Run("empty string clears only that field", func(t *testing.T) { + handler, db := setupTestHandler(t) + seed(t, db) + + _, err := handler.update(newHook("1", map[string]interface{}{"name": ""})) + require.NoError(t, err) + + var got TestUser + require.NoError(t, db.First(&got, 1).Error) + assert.Equal(t, "", got.Name) + assert.Equal(t, "orig@example.com", got.Email) + assert.Equal(t, "active", got.Status) + }) + + t.Run("absent keys are untouched", func(t *testing.T) { + handler, db := setupTestHandler(t) + seed(t, db) + + _, err := handler.update(newHook("1", map[string]interface{}{"status": "inactive"})) + require.NoError(t, err) + + var got TestUser + require.NoError(t, db.First(&got, 1).Error) + assert.Equal(t, "Original", got.Name) + assert.Equal(t, "orig@example.com", got.Email) + assert.Equal(t, "inactive", got.Status) + }) + + t.Run("disallowNulls skips null but applies empty string", func(t *testing.T) { + handler, db := setupTestHandler(t) + handler.SetDisallowNulls(true) + seed(t, db) + + _, err := handler.update(newHook("1", map[string]interface{}{"name": nil, "status": ""})) + require.NoError(t, err) + + var got TestUser + require.NoError(t, db.First(&got, 1).Error) + assert.Equal(t, "Original", got.Name) + assert.Equal(t, "", got.Status) + assert.Equal(t, "orig@example.com", got.Email) + }) +}