Event log: show only the events with a failed or a pending delivery (closes #390)
check / check (push) Successful in 3m19s
check / check (push) Successful in 3m19s
The event log gains three links above the list: All, Failed (N) and Pending (N), carried in a `show` query parameter; any other value shows every event. Failed lists the events with a failed delivery, Pending those with one pending or retrying, each once, under the full list's 50-row limit and order. A filtered list finds the matching deliveries through `idx_deliveries_status`, looks up their events by ID and sorts them, and reads the rows of only the events shown; its counts read the deliveries alone. The line beside the heading says what a filter counts, and Replay returns to the list it was pressed in. The README and the comments naming the query parameters the service reads include `show`. Model: opus-5-5
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package handlers_test
|
||||
|
||||
import (
|
||||
"io"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"strings"
|
||||
@@ -471,6 +472,66 @@ func TestHandleDeliveryReplay_RefusesWhileEarlierReplayInFlight(
|
||||
)
|
||||
}
|
||||
|
||||
// TestHandleDeliveryReplay_ReturnsToTheListItWasPressedIn proves a
|
||||
// Replay pressed in the Failed list carries that list in its form and
|
||||
// returns to it, and that a show value the event log does not know
|
||||
// returns to the full log.
|
||||
func TestHandleDeliveryReplay_ReturnsToTheListItWasPressedIn(
|
||||
t *testing.T,
|
||||
) {
|
||||
t.Parallel()
|
||||
|
||||
var (
|
||||
h *handlers.Handlers
|
||||
sess *session.Session
|
||||
db *database.Database
|
||||
dbMgr *database.WebhookDBManager
|
||||
)
|
||||
|
||||
app := newTestApp(t, &h, &sess, &db, &dbMgr)
|
||||
app.RequireStart()
|
||||
|
||||
t.Cleanup(app.RequireStop)
|
||||
|
||||
wh := seedWebhook(t, db)
|
||||
tgt := seedConfiguredTarget(
|
||||
t, db, wh.ID, database.TargetTypeHTTP,
|
||||
`{"url":"`+replayTargetURL+`"}`,
|
||||
)
|
||||
|
||||
_, original := seedFailedDelivery(t, dbMgr, wh.ID, tgt.ID)
|
||||
|
||||
assert.Contains(t, renderSourceLogsPageWithQuery(
|
||||
t, h, sess, wh.ID, "?show=failed",
|
||||
), `name="show" value="failed"`)
|
||||
|
||||
// The second replay is refused, as the first is still queued.
|
||||
for _, tc := range []struct{ show, location string }{
|
||||
{"failed", "/hook/" + wh.ID +
|
||||
"/events?notice=replay-queued&show=failed"},
|
||||
{"made-up", "/hook/" + wh.ID + "/events?notice=replay-in-flight"},
|
||||
} {
|
||||
req := postRequest(
|
||||
"/hook/"+wh.ID+"/deliveries/"+original.ID+"/replay",
|
||||
authenticatedCookies(
|
||||
t, sess, deleteTestUserID, deleteTestUsername,
|
||||
),
|
||||
map[string]string{
|
||||
paramSourceID: wh.ID,
|
||||
paramDeliveryID: original.ID,
|
||||
},
|
||||
)
|
||||
req.Body = io.NopCloser(strings.NewReader("show=" + tc.show))
|
||||
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
|
||||
|
||||
w := httptest.NewRecorder()
|
||||
h.HandleDeliveryReplay().ServeHTTP(w, req)
|
||||
|
||||
require.Equal(t, http.StatusSeeOther, w.Code, tc.show)
|
||||
assert.Equal(t, tc.location, w.Header().Get("Location"), tc.show)
|
||||
}
|
||||
}
|
||||
|
||||
// TestHandleSourceLogs_RendersReplayControlAndBanner proves the action
|
||||
// reaches the page it belongs on: a finished delivery renders a POST
|
||||
// form carrying a CSRF token, and the outcome code a refusal redirects
|
||||
|
||||
Reference in New Issue
Block a user