hub: merge the customer edit page into the Edit tab (v0.48.0 edit-a, part 2)
- Settings tab renamed Edit; embeds config_form_body (.ConfigForm via the
builder) + Controller Update + Geo + a new Danger zone card holding the
relocated Block/Unblock/Delete forms (endpoints + confirm() unchanged).
All cards are SIBLINGS after </form> — never nested in the config form.
- Customer Info header loses the Edit link and Block/Delete forms; only the
config-less Create Config action stays.
- GET /configs/{id}/edit is a 302 to /customers/{id}#tab=edit; tabs JS gains
the settings→edit legacy-hash alias.
- Post-action redirects land back on their tab: update/block/unblock/
offsite-reissue/offsite-freeze/pbsdr-reissue → #tab=edit, regen-password
→ #tab=setup; delete unchanged (/configs).
- handleConfigUpdate gains the server-side twin of the form's required
fields; the error path re-renders the STANDALONE page with the SUBMITTED
overrides (B3 red-proof: nil overrides → typed values reset → test FAILS;
header red-proof: restored header buttons → count=2 → test FAILS; both run).
- Tests: Group A (panel surface, sibling forms, header cleaned by COUNT),
Group B (B1 302, B2 create unchanged, B3 typed-values, B4/B5 anchor table).
Amended pins: customer_tabs_test settings→edit; pbsdr_test postUpdate now
supplies the required fields + FormRendersState asserts the embedded render.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TZc5w5jDhFLv6qDC32KN5v
This commit is contained in:
@@ -90,6 +90,14 @@ func newPBSDRServer(t *testing.T, fake *fakeTenancy) (*Server, *store.Store, *by
|
||||
// postUpdate drives the REAL handler pipeline (handleConfigUpdate → applyPBSDR → save).
|
||||
func postUpdate(t *testing.T, s *Server, form url.Values) *httptest.ResponseRecorder {
|
||||
t.Helper()
|
||||
// v0.48.0 edit-a: the update handler now enforces the form's required fields server-side —
|
||||
// supply them like every real submission does (the browser form marks both `required`).
|
||||
if form.Get("customer_name") == "" {
|
||||
form.Set("customer_name", "Peti")
|
||||
}
|
||||
if form.Get("domain") == "" {
|
||||
form.Set("domain", "peti.example")
|
||||
}
|
||||
req := httptest.NewRequest("POST", "/configs/peti", strings.NewReader(form.Encode()))
|
||||
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
|
||||
rr := httptest.NewRecorder()
|
||||
@@ -347,9 +355,11 @@ func TestPBSDR_FormRendersState(t *testing.T) {
|
||||
s, _, _ := newPBSDRServer(t, fake)
|
||||
postUpdate(t, s, url.Values{"pbsdr_enabled": {"on"}})
|
||||
|
||||
req := httptest.NewRequest("GET", "/configs/peti/edit", nil)
|
||||
// v0.48.0 edit-a: the standalone GET edit page is a redirect now — the form renders embedded
|
||||
// in the customer page's Edit tab (the same config_form_body sub-template), so assert there.
|
||||
req := httptest.NewRequest("GET", "/customers/peti", nil)
|
||||
rr := httptest.NewRecorder()
|
||||
s.handleConfigEditForm(rr, req, "peti")
|
||||
s.handleCustomerUnified(rr, req, "peti")
|
||||
out := rr.Body.String()
|
||||
if !strings.Contains(out, `name="pbsdr_enabled" checked`) {
|
||||
t.Error("enabled checkbox not checked after provisioning")
|
||||
|
||||
Reference in New Issue
Block a user