check / check (push) Waiting to run
Every reference from a model to the record it belongs to is now json:"-", so the webhook and target models (and the other parent and child pairs in internal/database) can no longer marshal each other in a loop. Preloading maps associations without reading json tags, so it still fills these references; a new test preloads a webhook with its targets and entrypoints and a target with its webhook, checks the references are filled, and checks the marshalled JSON leaves them out. Model: opus-5-5
66 lines
1.7 KiB
Go
66 lines
1.7 KiB
Go
package database_test
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/google/uuid"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
"sneak.berlin/go/webhooker/internal/database"
|
|
)
|
|
|
|
// TestPreloadedModelsMarshalWithoutTheirParent pins that a child's
|
|
// reference to the record it belongs to is left out of the JSON, so a
|
|
// webhook and its targets cannot marshal each other in a loop, and that
|
|
// GORM still preloads that reference, since it ignores json tags.
|
|
func TestPreloadedModelsMarshalWithoutTheirParent(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
db := startedTestDB(t)
|
|
|
|
stored := database.Webhook{
|
|
UserID: uuid.New().String(),
|
|
Name: testWebhookName,
|
|
Entrypoints: []database.Entrypoint{{Path: uuid.New().String()}},
|
|
Targets: []database.Target{{
|
|
Name: "log",
|
|
Type: database.TargetTypeLog,
|
|
}},
|
|
}
|
|
require.NoError(t, db.Create(&stored).Error)
|
|
|
|
entrypointID := stored.Entrypoints[0].ID
|
|
targetID := stored.Targets[0].ID
|
|
|
|
var webhook database.Webhook
|
|
|
|
require.NoError(t, db.
|
|
Preload("Entrypoints.Webhook").
|
|
Preload("Targets.Webhook").
|
|
First(&webhook, "id = ?", stored.ID).Error)
|
|
|
|
require.Len(t, webhook.Entrypoints, 1)
|
|
require.Len(t, webhook.Targets, 1)
|
|
assert.Equal(t, stored.ID, webhook.Entrypoints[0].Webhook.ID)
|
|
assert.Equal(t, stored.ID, webhook.Targets[0].Webhook.ID)
|
|
|
|
encoded := marshalModel(t, webhook)
|
|
|
|
assert.Contains(t, encoded, entrypointID)
|
|
assert.Contains(t, encoded, targetID)
|
|
assert.NotContains(t, encoded, `"webhook":`)
|
|
|
|
var target database.Target
|
|
|
|
require.NoError(t, db.
|
|
Preload("Webhook").
|
|
First(&target, "id = ?", targetID).Error)
|
|
|
|
assert.Equal(t, stored.ID, target.Webhook.ID)
|
|
|
|
encoded = marshalModel(t, target)
|
|
|
|
assert.Contains(t, encoded, stored.ID)
|
|
assert.NotContains(t, encoded, `"webhook":`)
|
|
}
|