diff --git a/CHANGELOG.md b/CHANGELOG.md index 4a1aa4a4..bee2869c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -45,6 +45,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Prevents timeout errors in Firefox/WebKit caused by strict label matching ### Fixed +- **TCP Monitor Creation**: Fixed misleading form UX that caused silent HTTP 500 errors when creating TCP monitors + - Corrected URL placeholder to show `host:port` format instead of the incorrect `tcp://host:port` prefix + - Added dynamic per-type placeholder and helper text (HTTP monitors show a full URL example; TCP monitors show `host:port`) + - Added client-side validation that blocks form submission when a scheme prefix (e.g. `tcp://`) is detected, with an inline error message + - Reordered form fields so the monitor type selector appears above the URL input, making the dynamic helper text immediately relevant + - i18n: Added 5 new translation keys across en, de, fr, es, and zh locales - **CI: Rate Limit Integration Tests**: Hardened test script reliability — login now validates HTTP status, Caddy admin API readiness gated on `/config/` poll, security config failures are fatal with full diagnostics, and poll interval increased to 5s - **CI: Rate Limit Integration Tests**: Removed stale GeoIP database SHA256 checksum from Dockerfile non-CI path (hash was perpetually stale due to weekly upstream updates) - **CI: Rate Limit Integration Tests**: Fixed Caddy admin API debug dump URL to use canonical trailing slash in workflow diff --git a/docs/issues/pr5-tcp-monitor-ux-manual-test.md b/docs/issues/pr5-tcp-monitor-ux-manual-test.md new file mode 100644 index 00000000..4422dd63 --- /dev/null +++ b/docs/issues/pr5-tcp-monitor-ux-manual-test.md @@ -0,0 +1,161 @@ +--- +title: "Manual Test Plan - PR-5 TCP Monitor UX Fix" +labels: + - testing + - frontend + - bug +priority: high +--- + +# Manual Test Plan - PR-5 TCP Monitor UX Fix + +## Scope + +PR-5 only. + +This plan covers manual verification of the five UX fixes applied to the TCP monitor creation form: + +1. Corrected URL placeholder (removed misleading `tcp://` prefix) +2. Dynamic per-type placeholder (HTTP vs TCP) +3. Per-type helper text below the URL input +4. Client-side TCP scheme validation with inline error +5. Form field reorder: type selector now appears before URL input + +Out of scope: +- Backend monitor logic or storage +- Any other monitor type beyond HTTP and TCP +- Notification provider changes + +## Preconditions + +- [ ] Environment is running (Docker E2E or local dev). +- [ ] Tester can access the Monitors page and open the Create Monitor modal. +- [ ] Browser DevTools Network tab is available for TC-PR5-007. + +--- + +## Track A — Smoke Tests (Existing HTTP Behaviour) + +### TC-PR5-001 HTTP monitor creation still works + +- [ ] Open the Create Monitor modal. +- [ ] Select type **HTTP**. +- [ ] Enter a valid URL: `https://example.com`. +- [ ] Fill in remaining required fields and click **Create**. +- Expected result: monitor is created successfully; no errors shown. +- Status: [ ] Not run [ ] Pass [ ] Fail +- Notes: + +### TC-PR5-009 Existing HTTP monitors display correctly in the list + +- [ ] Navigate to the Monitors list. +- [ ] Confirm any pre-existing HTTP monitors are still shown with correct URLs. +- Expected result: no regressions in list display. +- Status: [ ] Not run [ ] Pass [ ] Fail +- Notes: + +### TC-PR5-010 Existing TCP monitors display correctly in the list + +- [ ] Navigate to the Monitors list. +- [ ] Confirm any pre-existing TCP monitors are still shown with correct host:port values. +- Expected result: no regressions in list display. +- Status: [ ] Not run [ ] Pass [ ] Fail +- Notes: + +--- + +## Track B — Core Fix (TCP Scheme Validation) + +### TC-PR5-002 TCP monitor with `tcp://` prefix shows inline error and blocks submission + +- [ ] Open the Create Monitor modal. +- [ ] Select type **TCP**. +- [ ] Enter URL: `tcp://192.168.1.1:8080`. +- [ ] Click **Create** (or attempt to submit). +- Expected result: an inline error appears on the URL field; the form is not submitted; no new monitor appears in the list. +- Status: [ ] Not run [ ] Pass [ ] Fail +- Notes: + +### TC-PR5-003 TCP monitor with valid `host:port` format succeeds + +- [ ] Open the Create Monitor modal. +- [ ] Select type **TCP**. +- [ ] Enter URL: `192.168.1.1:8080`. +- [ ] Fill in remaining required fields and click **Create**. +- Expected result: monitor is created successfully; no errors shown. +- Status: [ ] Not run [ ] Pass [ ] Fail +- Notes: + +--- + +## Track C — Dynamic Placeholder & Helper Text + +### TC-PR5-005 Form field order: Type selector appears above URL input + +- [ ] Open the Create Monitor modal. +- [ ] Inspect the visual layout of the form. +- Expected result: the monitor **Type** selector is positioned above the **URL** input field. +- Status: [ ] Not run [ ] Pass [ ] Fail +- Notes: + +### TC-PR5-006 Helper text updates when switching between HTTP and TCP + +- [ ] Open the Create Monitor modal. +- [ ] Select type **HTTP** and note the helper text shown beneath the URL input. +- [ ] Switch type to **TCP** and note the helper text again. +- Expected result: helper text differs between HTTP and TCP types, giving format guidance appropriate to each. +- Status: [ ] Not run [ ] Pass [ ] Fail +- Notes: + +### TC-PR5-006b Placeholder updates when switching between HTTP and TCP + +- [ ] Open the Create Monitor modal. +- [ ] Select type **HTTP** and note the URL input placeholder. +- [ ] Switch type to **TCP** and note the placeholder again. +- Expected result: HTTP placeholder shows a full URL (e.g. `https://example.com`); TCP placeholder shows `host:port` format (no scheme). +- Status: [ ] Not run [ ] Pass [ ] Fail +- Notes: + +--- + +## Track D — Interaction Edge Cases + +### TC-PR5-004 Switching type from TCP (with error) to HTTP clears the inline error + +- [ ] Open the Create Monitor modal. +- [ ] Select type **TCP** and enter `tcp://192.168.1.1:8080` to trigger the inline error. +- [ ] Switch type to **HTTP**. +- Expected result: the scheme-prefix inline error disappears immediately after the type change. +- Status: [ ] Not run [ ] Pass [ ] Fail +- Notes: + +### TC-PR5-007 Submit guard: no API call fires when scheme prefix error is present + +- [ ] Open browser DevTools and go to the **Network** tab. +- [ ] Open the Create Monitor modal. +- [ ] Select type **TCP** and enter `tcp://192.168.1.1:8080`. +- [ ] Click **Create**. +- Expected result: the inline error is shown and no outbound POST/PUT request to the monitors API endpoint appears in the Network tab. +- Status: [ ] Not run [ ] Pass [ ] Fail +- Notes: + +--- + +## Track E — Localisation (Optional) + +### TC-PR5-008 New translation keys appear correctly in non-English locales + +- [ ] Switch the application language to **German**, **French**, **Spanish**, or **Chinese**. +- [ ] Open the Create Monitor modal and select type **TCP**. +- [ ] Observe the URL placeholder, helper text, and inline error message (trigger it with `tcp://host:port`). +- Expected result: all three UI strings appear in the selected language without showing raw translation key strings (e.g. no `urlPlaceholder.tcp` visible to the user). +- Status: [ ] Not run [ ] Pass [ ] Fail +- Notes: + +--- + +## Sign-off + +| Tester | Date | Environment | Result | +|--------|------|-------------|--------| +| | | | | diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 1f5e9062..7c137fc6 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -10554,9 +10554,9 @@ } }, "node_modules/undici": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.4.tgz", - "integrity": "sha512-BM/JzwwaRXxrLdElV2Uo6cTLEjhSb3WXboncJamZ15NgUURmvlXvxa6xkwIOILIjPNo9i8ku136ZvWV0Uly8+w==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.5.tgz", + "integrity": "sha512-3IWdCpjgxp15CbJnsi/Y9TCDE7HWVN19j1hmzVhoAkY/+CJx449tVxT5wZc1Gwg8J+P0LWvzlBzxYRnHJ+1i7Q==", "dev": true, "license": "MIT", "engines": { diff --git a/package-lock.json b/package-lock.json index dda2e129..681a0a62 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3589,9 +3589,9 @@ } }, "node_modules/tar": { - "version": "7.5.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.11.tgz", - "integrity": "sha512-ChjMH33/KetonMTAtpYdgUFr0tbz69Fp2v7zWxQfYZX4g5ZN2nOBXm1R2xyA+lMIKrLKIoKAwFj93jE/avX9cQ==", + "version": "7.5.12", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.12.tgz", + "integrity": "sha512-9TsuLcdhOn4XztcQqhNyq1KOwOOED/3k58JAvtULiYqbO8B/0IBAAIE1hj0Svmm58k27TmcigyDI0deMlgG3uw==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": {