check / check (push) Waiting to run
A target's settings move from the per-type JSON string in targets.config to columns: url, headers, timeout_seconds, forward_query, archive_expiry and archive_rotation. A column a type does not use stays empty. headers holds the header map as JSON text through GORM's JSON serializer, and archive_expiry holds a time.Duration, 0 meaning never. The forms check each setting once, with the same refusals and messages, and the edit form is filled from the columns, so the per-type config structs, their parsers and the "could not be read" branches are gone. A delivery task carries the six settings in place of the JSON string; tests check that each copy into a task, and back out of one, keeps all six. Model: opus-5-5
64 lines
1.6 KiB
Go
64 lines
1.6 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"
|
|
)
|
|
|
|
// newHTTPTarget returns an http target that makes maxAttempts attempts
|
|
// at each delivery.
|
|
func newHTTPTarget(maxAttempts int) *database.Target {
|
|
return &database.Target{
|
|
WebhookID: uuid.New().String(),
|
|
Name: "target",
|
|
Type: database.TargetTypeHTTP,
|
|
URL: "https://example.com/",
|
|
MaxAttempts: maxAttempts,
|
|
}
|
|
}
|
|
|
|
// TestTargetCreate_RefusesZeroAttempts relies on the targets table
|
|
// alone: nothing in the model checks the number, so the check
|
|
// constraint is what keeps a target with 0 attempts out of the
|
|
// database.
|
|
func TestTargetCreate_RefusesZeroAttempts(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
db := startedTestDB(t)
|
|
|
|
err := db.Create(newHTTPTarget(0)).Error
|
|
require.Error(t, err)
|
|
assert.Contains(t, err.Error(), "CHECK constraint failed")
|
|
}
|
|
|
|
func TestTargetCreate_AcceptsOneAttempt(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
db := startedTestDB(t)
|
|
|
|
require.NoError(t, db.Create(newHTTPTarget(1)).Error)
|
|
}
|
|
|
|
// TestTargetHeaders_StoredAsJSON reads the headers column back as
|
|
// text, to show it holds the header map as JSON.
|
|
func TestTargetHeaders_StoredAsJSON(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
db := startedTestDB(t)
|
|
|
|
target := newHTTPTarget(1)
|
|
target.Headers = map[string]string{"Authorization": "Bearer x"}
|
|
require.NoError(t, db.Create(target).Error)
|
|
|
|
var headers string
|
|
|
|
require.NoError(t, db.Raw(
|
|
"SELECT headers FROM targets WHERE id = ?", target.ID,
|
|
).Scan(&headers).Error)
|
|
assert.JSONEq(t, `{"Authorization":"Bearer x"}`, headers)
|
|
}
|