check / check (push) Waiting to run
The target toggle loaded the target, flipped its active flag and saved the whole row, so an edit of the same target's name or settings saved in between was written back over and lost, although it reported success. The toggle now updates only the active column, so it can no longer undo an edit. A test saves an edit just after the toggle has read the target and shows the edit survives and the state flips. The entrypoint toggle is unchanged, since an entrypoint has no edit form. Model: opus-5-5
67 lines
1.7 KiB
Go
67 lines
1.7 KiB
Go
package handlers_test
|
|
|
|
import (
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
// TestHandleTargetToggle_DoesNotUndoAnEdit proves that a toggle which
|
|
// loaded the target before an edit of it was saved does not write the
|
|
// old name and settings back over the edit. The edit is submitted from
|
|
// a callback on the toggle's own read of the target, so it is saved
|
|
// after that read and before the toggle writes.
|
|
func TestHandleTargetToggle_DoesNotUndoAnEdit(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
env := setupSourceTest(t)
|
|
wh, tgt := seedHTTPTarget(t, env, "", "")
|
|
require.True(t, tgt.Active)
|
|
|
|
var (
|
|
edited bool
|
|
editCode int
|
|
)
|
|
|
|
require.NoError(t, env.db.DB().Callback().Query().
|
|
After("gorm:query").
|
|
Register("test:edit_after_toggle_read", func(tx *gorm.DB) {
|
|
// The edit reads the target too; only the toggle's read,
|
|
// the first, submits it.
|
|
if tx.Statement.Table != "targets" || edited {
|
|
return
|
|
}
|
|
|
|
edited = true
|
|
editCode = submitTargetEdit(
|
|
env, wh.ID, tgt.ID,
|
|
editForm(editReplacedURL, "", ""),
|
|
).Code
|
|
}),
|
|
)
|
|
|
|
req := postRequest(
|
|
"/hook/"+wh.ID+"/targets/"+tgt.ID+"/toggle",
|
|
env.cookies,
|
|
map[string]string{paramSourceID: wh.ID, paramTargetID: tgt.ID},
|
|
)
|
|
w := httptest.NewRecorder()
|
|
|
|
env.handlers.HandleTargetToggle().ServeHTTP(w, req)
|
|
|
|
require.Equal(t, http.StatusSeeOther, w.Code)
|
|
require.Equal(t, http.StatusSeeOther, editCode)
|
|
|
|
stored := storedTarget(t, env, tgt.ID)
|
|
assert.False(t, stored.Active)
|
|
assert.Equal(t, "edited-name", stored.Name)
|
|
assert.Equal(t, 5, stored.MaxRetries)
|
|
assert.Equal(
|
|
t, editReplacedURL, storedHTTPConfig(t, env, tgt.ID).URL,
|
|
)
|
|
}
|