check / check (push) Successful in 3m26s
The target toggle loaded the target and saved the whole row, so an edit saved between that load and the save was overwritten with the old name and settings although it had reported success. The toggle now updates only the active column. The entrypoint toggle is unchanged: an entrypoint has no edit form, so the toggle is the only thing that changes one after creation. 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,
|
|
)
|
|
}
|