From 93cb55454f1d26b8da08a8ea62a672de3a62edd2 Mon Sep 17 00:00:00 2001 From: Christian Galo Date: Mon, 19 Oct 2026 22:26:22 -0400 Subject: [PATCH] Name the org type by its display name in the default change's toast The default change's success toast named the type by its key, as in "Default change committed for personal: 4 migrated.", while the org types page heads the same card "Personal" and the reorder's toast names the types it reaches by their display names (#187). CommitOrgTypeDefaultChange passes the display name from the type it already reads to render the card, and falls back to the key only if the name is empty. A handler test asserts the display name and the absence of the key. The 18 plan-act goldens that carry the toast change only in that line. The full suite passes. --- .../server/operator_org_type_change_test.go | 5 +++-- .../operator_org_type_default_request_test.go | 19 ++++++++++++++++++- internal/server/operator_org_types.go | 13 +++++++++---- .../server/plan_acts_concurrency_db_test.go | 2 +- .../plan_acts/default-already-at.json | 2 +- .../plan_acts/default-grandfather.json | 2 +- .../plan_acts/default-initiate-fails.json | 2 +- .../plan_acts/default-listing-fails.json | 2 +- .../default-migrate-restore-fails.json | 2 +- .../testdata/plan_acts/default-migrate.json | 2 +- .../plan_acts/default-none-migrate.json | 2 +- .../plan_acts/default-request-cap.json | 2 +- .../plan_acts/default-superseded.json | 2 +- .../plan_acts/default-untouched-outgoing.json | 2 +- .../the-default-change-queues-first.json | 2 +- .../the-default-change-runs-first.json | 2 +- .../the-removal-queues-first.json | 2 +- .../the-removal-runs-first.json | 2 +- .../a-reorder.json | 2 +- .../a-tier-add.json | 2 +- .../a-tier-delete.json | 2 +- .../a-tier-removal.json | 2 +- 22 files changed, 49 insertions(+), 26 deletions(-) diff --git a/internal/server/operator_org_type_change_test.go b/internal/server/operator_org_type_change_test.go index afe3da9a..ffadf5a6 100644 --- a/internal/server/operator_org_type_change_test.go +++ b/internal/server/operator_org_type_change_test.go @@ -166,6 +166,7 @@ func otcScalar(t *testing.T, database *sql.DB, query string, args ...any) int { // operator person, and two single-tier ladders A and B. type otcFixture struct { orgType string + displayName string operatorID string ladderA, prodA string ladderB, prodB string @@ -182,10 +183,10 @@ func newOtcFixture(t *testing.T, database *sql.DB) otcFixture { } defer tx.Rollback() - f := otcFixture{orgType: "otc-" + sfx} + f := otcFixture{orgType: "otc-" + sfx, displayName: "OTC " + sfx} if _, err := tx.ExecContext(ctx, `INSERT INTO core.org_types (org_type, display_name, is_active) VALUES ($1, $2, true)`, - f.orgType, "OTC "+sfx, + f.orgType, f.displayName, ); err != nil { t.Fatalf("org type: %v", err) } diff --git a/internal/server/operator_org_type_default_request_test.go b/internal/server/operator_org_type_default_request_test.go index 11f8dcce..7e9f2192 100644 --- a/internal/server/operator_org_type_default_request_test.go +++ b/internal/server/operator_org_type_default_request_test.go @@ -209,6 +209,23 @@ func TestOrgTypeDefaultChange_NoDrainForAnActTheRequestFinished(t *testing.T) { } } +// The success toast names the organization type by its display name, as the +// card's heading does, not by its key. +func TestOrgTypeDefaultChange_ToastNamesTheDisplayName(t *testing.T) { + database := dbtest.Open(t) + f := newOtcFixture(t, database) + h := newOtcHarnessWith(t, database, f.operatorID, otcOptions{}) + otcHolders(t, database, f, 2, false) + + toast := commitB(h, f, "migrate").Header().Get("HX-Trigger") + if want := "Default change committed for " + f.displayName + ": 2 migrated."; !strings.Contains(toast, want) { + t.Errorf("the toast %q, want %q", toast, want) + } + if strings.Contains(toast, f.orgType) { + t.Errorf("the toast %q names the key %q", toast, f.orgType) + } +} + // A read of the toast's counts that fails leaves the parts it could not read out // of the success toast, logs the failure with the act id, and starts the drain // only if work is left. @@ -248,7 +265,7 @@ func TestOrgTypeDefaultChange_UnreadPendingObligationsStopTheRequestAndStartTheD rec := commitB(h, f, "migrate") toast := rec.Header().Get("HX-Trigger") - if !strings.Contains(toast, "showSuccessToast") || !strings.Contains(toast, "Default change committed for "+f.orgType+".") { + if !strings.Contains(toast, "showSuccessToast") || !strings.Contains(toast, "Default change committed for "+f.displayName+".") { t.Errorf("the toast %q, want the success toast without counts", toast) } if n := otcScalar(t, database, `SELECT count(*) FROM core.plan_act_obligations WHERE org_type = $1 AND status = 'settled'`, f.orgType); n != 0 { diff --git a/internal/server/operator_org_types.go b/internal/server/operator_org_types.go index 80b581b2..5309bdcd 100644 --- a/internal/server/operator_org_types.go +++ b/internal/server/operator_org_types.go @@ -271,9 +271,10 @@ func (r *OrgTypeChangeResult) summaryParts() []string { return parts } -// DefaultChangeToast is the success toast of a default change that committed. -func (r *OrgTypeChangeResult) DefaultChangeToast(orgType string) string { - return r.toast(fmt.Sprintf("Default change committed for %s", orgType)) +// DefaultChangeToast is the success toast of a default change that committed, +// naming the organization type by its display name. +func (r *OrgTypeChangeResult) DefaultChangeToast(displayName string) string { + return r.toast(fmt.Sprintf("Default change committed for %s", displayName)) } // toast is head followed by the result's summary. A result whose counts could @@ -613,7 +614,11 @@ func (h *OperatorPartialsHandler) CommitOrgTypeDefaultChange(w http.ResponseWrit ot = fresh } result := planActToastResult(changed.PlanActShare) - fireSuccessToast(w, result.DefaultChangeToast(orgType)) + name := ot.DisplayName + if name == "" { + name = ot.OrgType + } + fireSuccessToast(w, result.DefaultChangeToast(name)) h.renderOrgTypeCard(w, r, ot, "", nil, "") if !changed.Pass.Done { h.startPlanActDrain(r.Context(), changed.ActID) diff --git a/internal/server/plan_acts_concurrency_db_test.go b/internal/server/plan_acts_concurrency_db_test.go index 3b3b7c32..833ee858 100644 --- a/internal/server/plan_acts_concurrency_db_test.go +++ b/internal/server/plan_acts_concurrency_db_test.go @@ -312,7 +312,7 @@ func TestDefaultChangeTwiceRefusesTheSecond(t *testing.T) { refused++ } } - if want := []string{"Default change committed for : 1 grandfathered."}; !slices.Equal(toasts, want) { + if want := []string{"Default change committed for T: 1 grandfathered."}; !slices.Equal(toasts, want) { t.Errorf("toasts = %q, want %q", toasts, want) } if refused != 1 { diff --git a/internal/server/testdata/plan_acts/default-already-at.json b/internal/server/testdata/plan_acts/default-already-at.json index f6f4f4ab..2f868b33 100644 --- a/internal/server/testdata/plan_acts/default-already-at.json +++ b/internal/server/testdata/plan_acts/default-already-at.json @@ -1,7 +1,7 @@ { "answer": [ "status 200", - "Hx-Trigger showSuccessToast: Default change committed for : 1 already at the default." + "Hx-Trigger showSuccessToast: Default change committed for T: 1 already at the default." ], "checked": [], "logs": [], diff --git a/internal/server/testdata/plan_acts/default-grandfather.json b/internal/server/testdata/plan_acts/default-grandfather.json index a47cabc0..6e583923 100644 --- a/internal/server/testdata/plan_acts/default-grandfather.json +++ b/internal/server/testdata/plan_acts/default-grandfather.json @@ -1,7 +1,7 @@ { "answer": [ "status 200", - "Hx-Trigger showSuccessToast: Default change committed for : 1 initiated, 1 grandfathered, 1 untouched, 1 without a default pool." + "Hx-Trigger showSuccessToast: Default change committed for T: 1 initiated, 1 grandfathered, 1 untouched, 1 without a default pool." ], "checked": [], "logs": [ diff --git a/internal/server/testdata/plan_acts/default-initiate-fails.json b/internal/server/testdata/plan_acts/default-initiate-fails.json index 4d98ef5c..4527fb4e 100644 --- a/internal/server/testdata/plan_acts/default-initiate-fails.json +++ b/internal/server/testdata/plan_acts/default-initiate-fails.json @@ -1,7 +1,7 @@ { "answer": [ "status 200", - "Hx-Trigger showSuccessToast: Default change committed for : 1 not yet reached.", + "Hx-Trigger showSuccessToast: Default change committed for T: 1 not yet reached.", "[id^=\"plan-act-\"]: 1 organization not yet reached." ], "checked": [], diff --git a/internal/server/testdata/plan_acts/default-listing-fails.json b/internal/server/testdata/plan_acts/default-listing-fails.json index 36b04640..6ab261cf 100644 --- a/internal/server/testdata/plan_acts/default-listing-fails.json +++ b/internal/server/testdata/plan_acts/default-listing-fails.json @@ -1,7 +1,7 @@ { "answer": [ "status 200", - "Hx-Trigger showSuccessToast: Default change committed for : 1 not yet reached.", + "Hx-Trigger showSuccessToast: Default change committed for T: 1 not yet reached.", "[id^=\"plan-act-\"]: 1 organization not yet reached." ], "checked": [], diff --git a/internal/server/testdata/plan_acts/default-migrate-restore-fails.json b/internal/server/testdata/plan_acts/default-migrate-restore-fails.json index ba7c401b..3837908c 100644 --- a/internal/server/testdata/plan_acts/default-migrate-restore-fails.json +++ b/internal/server/testdata/plan_acts/default-migrate-restore-fails.json @@ -1,7 +1,7 @@ { "answer": [ "status 200", - "Hx-Trigger showSuccessToast: Default change committed for : 1 not yet reached.", + "Hx-Trigger showSuccessToast: Default change committed for T: 1 not yet reached.", "[id^=\"plan-act-\"]: 1 organization not yet reached." ], "checked": [], diff --git a/internal/server/testdata/plan_acts/default-migrate.json b/internal/server/testdata/plan_acts/default-migrate.json index e8f34a08..24ac7b22 100644 --- a/internal/server/testdata/plan_acts/default-migrate.json +++ b/internal/server/testdata/plan_acts/default-migrate.json @@ -1,7 +1,7 @@ { "answer": [ "status 200", - "Hx-Trigger showSuccessToast: Default change committed for : 1 migrated." + "Hx-Trigger showSuccessToast: Default change committed for T: 1 migrated." ], "checked": [], "logs": [], diff --git a/internal/server/testdata/plan_acts/default-none-migrate.json b/internal/server/testdata/plan_acts/default-none-migrate.json index f5f8305c..35168a92 100644 --- a/internal/server/testdata/plan_acts/default-none-migrate.json +++ b/internal/server/testdata/plan_acts/default-none-migrate.json @@ -1,7 +1,7 @@ { "answer": [ "status 200", - "Hx-Trigger showSuccessToast: Default change committed for : 1 migrated, 1 left plan-less." + "Hx-Trigger showSuccessToast: Default change committed for T: 1 migrated, 1 left plan-less." ], "checked": [], "logs": [], diff --git a/internal/server/testdata/plan_acts/default-request-cap.json b/internal/server/testdata/plan_acts/default-request-cap.json index a68d8c50..548f1b11 100644 --- a/internal/server/testdata/plan_acts/default-request-cap.json +++ b/internal/server/testdata/plan_acts/default-request-cap.json @@ -1,7 +1,7 @@ { "answer": [ "status 200", - "Hx-Trigger showSuccessToast: Default change committed for : 1 migrated, 2 not yet reached.", + "Hx-Trigger showSuccessToast: Default change committed for T: 1 migrated, 2 not yet reached.", "[id^=\"plan-act-\"]: 2 organizations not yet reached." ], "checked": [], diff --git a/internal/server/testdata/plan_acts/default-superseded.json b/internal/server/testdata/plan_acts/default-superseded.json index e30dc0c9..8662fa05 100644 --- a/internal/server/testdata/plan_acts/default-superseded.json +++ b/internal/server/testdata/plan_acts/default-superseded.json @@ -1,7 +1,7 @@ { "answer": [ "status 200", - "Hx-Trigger showSuccessToast: Default change committed for : 2 migrated." + "Hx-Trigger showSuccessToast: Default change committed for T: 2 migrated." ], "checked": [], "logs": [ diff --git a/internal/server/testdata/plan_acts/default-untouched-outgoing.json b/internal/server/testdata/plan_acts/default-untouched-outgoing.json index 3c26843b..c03bcfb5 100644 --- a/internal/server/testdata/plan_acts/default-untouched-outgoing.json +++ b/internal/server/testdata/plan_acts/default-untouched-outgoing.json @@ -1,7 +1,7 @@ { "answer": [ "status 200", - "Hx-Trigger showSuccessToast: Default change committed for : 1 untouched." + "Hx-Trigger showSuccessToast: Default change committed for T: 1 untouched." ], "checked": [], "logs": [ diff --git a/internal/server/testdata/plan_acts/removal-against-default/the-default-change-queues-first.json b/internal/server/testdata/plan_acts/removal-against-default/the-default-change-queues-first.json index b4ca5ee5..eb77d6a2 100644 --- a/internal/server/testdata/plan_acts/removal-against-default/the-default-change-queues-first.json +++ b/internal/server/testdata/plan_acts/removal-against-default/the-default-change-queues-first.json @@ -2,7 +2,7 @@ "first": { "answer": [ "status 200", - "Hx-Trigger showSuccessToast: Default change committed for : 1 already at the default." + "Hx-Trigger showSuccessToast: Default change committed for T: 1 already at the default." ], "checked": [], "logs": [] diff --git a/internal/server/testdata/plan_acts/removal-against-default/the-default-change-runs-first.json b/internal/server/testdata/plan_acts/removal-against-default/the-default-change-runs-first.json index 207fcb3a..9a2f3010 100644 --- a/internal/server/testdata/plan_acts/removal-against-default/the-default-change-runs-first.json +++ b/internal/server/testdata/plan_acts/removal-against-default/the-default-change-runs-first.json @@ -2,7 +2,7 @@ "first": { "answer": [ "status 200", - "Hx-Trigger showSuccessToast: Default change committed for : 1 grandfathered." + "Hx-Trigger showSuccessToast: Default change committed for T: 1 grandfathered." ], "checked": [], "logs": [] diff --git a/internal/server/testdata/plan_acts/removal-against-default/the-removal-queues-first.json b/internal/server/testdata/plan_acts/removal-against-default/the-removal-queues-first.json index a2a897df..25e6d188 100644 --- a/internal/server/testdata/plan_acts/removal-against-default/the-removal-queues-first.json +++ b/internal/server/testdata/plan_acts/removal-against-default/the-removal-queues-first.json @@ -10,7 +10,7 @@ "second": { "answer": [ "status 200", - "Hx-Trigger showSuccessToast: Default change committed for : 1 grandfathered." + "Hx-Trigger showSuccessToast: Default change committed for T: 1 grandfathered." ], "checked": [], "logs": [] diff --git a/internal/server/testdata/plan_acts/removal-against-default/the-removal-runs-first.json b/internal/server/testdata/plan_acts/removal-against-default/the-removal-runs-first.json index a2a897df..25e6d188 100644 --- a/internal/server/testdata/plan_acts/removal-against-default/the-removal-runs-first.json +++ b/internal/server/testdata/plan_acts/removal-against-default/the-removal-runs-first.json @@ -10,7 +10,7 @@ "second": { "answer": [ "status 200", - "Hx-Trigger showSuccessToast: Default change committed for : 1 grandfathered." + "Hx-Trigger showSuccessToast: Default change committed for T: 1 grandfathered." ], "checked": [], "logs": [] diff --git a/internal/server/testdata/plan_acts/tier-change-during-conferral/a-reorder.json b/internal/server/testdata/plan_acts/tier-change-during-conferral/a-reorder.json index d7bdf95c..5444c00e 100644 --- a/internal/server/testdata/plan_acts/tier-change-during-conferral/a-reorder.json +++ b/internal/server/testdata/plan_acts/tier-change-during-conferral/a-reorder.json @@ -2,7 +2,7 @@ "first": { "answer": [ "status 200", - "Hx-Trigger showSuccessToast: Default change committed for : 1 grandfathered." + "Hx-Trigger showSuccessToast: Default change committed for T: 1 grandfathered." ], "checked": [], "logs": [] diff --git a/internal/server/testdata/plan_acts/tier-change-during-conferral/a-tier-add.json b/internal/server/testdata/plan_acts/tier-change-during-conferral/a-tier-add.json index 29f50f57..b5e3a64b 100644 --- a/internal/server/testdata/plan_acts/tier-change-during-conferral/a-tier-add.json +++ b/internal/server/testdata/plan_acts/tier-change-during-conferral/a-tier-add.json @@ -2,7 +2,7 @@ "first": { "answer": [ "status 200", - "Hx-Trigger showSuccessToast: Default change committed for : 1 grandfathered." + "Hx-Trigger showSuccessToast: Default change committed for T: 1 grandfathered." ], "checked": [], "logs": [] diff --git a/internal/server/testdata/plan_acts/tier-change-during-conferral/a-tier-delete.json b/internal/server/testdata/plan_acts/tier-change-during-conferral/a-tier-delete.json index 5cfc2762..bcae3b42 100644 --- a/internal/server/testdata/plan_acts/tier-change-during-conferral/a-tier-delete.json +++ b/internal/server/testdata/plan_acts/tier-change-during-conferral/a-tier-delete.json @@ -2,7 +2,7 @@ "first": { "answer": [ "status 200", - "Hx-Trigger showSuccessToast: Default change committed for : 1 grandfathered." + "Hx-Trigger showSuccessToast: Default change committed for T: 1 grandfathered." ], "checked": [], "logs": [] diff --git a/internal/server/testdata/plan_acts/tier-change-during-conferral/a-tier-removal.json b/internal/server/testdata/plan_acts/tier-change-during-conferral/a-tier-removal.json index 7b4cae33..9cf7ddb4 100644 --- a/internal/server/testdata/plan_acts/tier-change-during-conferral/a-tier-removal.json +++ b/internal/server/testdata/plan_acts/tier-change-during-conferral/a-tier-removal.json @@ -2,7 +2,7 @@ "first": { "answer": [ "status 200", - "Hx-Trigger showSuccessToast: Default change committed for : 1 grandfathered." + "Hx-Trigger showSuccessToast: Default change committed for T: 1 grandfathered." ], "checked": [], "logs": []