Empty the add target form on Cancel; encoding failures stay a 500

The form's reason and values now come from the targetForm component,
loaded from the section's data attributes after a refusal and emptied
by Cancel, which also resets the form. Each type's fields used to be
recreated with the refused values written into the markup, so they
came back after Cancel. The browser test checks this after a refusal.

A target configuration that cannot be encoded is again a logged 500
with the generic error page, on the add and the edit path; only
refusals of submitted values come back on the form.

The README paragraph on the browser test is re-wrapped at 80 columns
and names Cancel at the type step.

Model: opus-5-5
This commit is contained in:
2026-10-02 20:06:02 +00:00
parent 346374c923
commit f49f1fc9db
8 changed files with 165 additions and 70 deletions
+20 -2
View File
@@ -393,13 +393,16 @@ func chooseTargetType(ctx context.Context, t *testing.T, targetType string) {
// checkRefusedTarget submits an http target the server refuses, a
// loopback destination, and checks that the page comes back with the
// form open on the http fields, the values entered and the reason.
// form open on the http fields, the values entered and the reason, and
// that after Cancel the next Add starts with an empty form and no
// reason.
func checkRefusedTarget(ctx context.Context, t *testing.T, url string) {
t.Helper()
const (
refusedURL = "http://127.0.0.1/hook"
urlField = `form[action$="/targets"] input[name="url"]`
reason = `//div[@class="alert-error"]`
)
require.NoError(t, chromedp.Run(ctx, loadPage(url)))
@@ -413,7 +416,7 @@ func checkRefusedTarget(ctx context.Context, t *testing.T, url string) {
click(ctx, t, saveButton)
assert.True(t, shown(ctx, `//div[@class="alert-error"]`),
assert.True(t, shown(ctx, reason),
"a refused target does not show the reason")
var name, typed string
@@ -432,6 +435,21 @@ func checkRefusedTarget(ctx context.Context, t *testing.T, url string) {
"a refused target does not come back with the form open")
assert.True(t, hidden(ctx, typeSelect),
"a refused target comes back on the type choice")
click(ctx, t, cancelFields)
chooseTargetType(ctx, t, "http")
assert.True(t, hidden(ctx, reason),
"after Cancel, the next Add still shows the reason")
require.NoError(t, chromedp.Run(
ctx,
chromedp.Value(targetName, &name, chromedp.ByQuery),
chromedp.Value(urlField, &typed, chromedp.ByQuery),
))
assert.Empty(t, name, "after Cancel, the next Add keeps the name entered")
assert.Empty(t, typed, "after Cancel, the next Add keeps the url entered")
}
// checkCopy loads a webhook page and checks that the Copy control beside