Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 4 additions & 9 deletions internal/server/templates/settings.html
Original file line number Diff line number Diff line change
Expand Up @@ -209,15 +209,10 @@ <h3 id="passkey-password-title" class="text-base font-semibold text-slate-950 da
{{end}}
</section>

<section aria-labelledby="settings-legal-title" class="rounded-lg border border-slate-200 bg-white p-4 dark:border-slate-800 dark:bg-slate-900 lg:col-span-2">
<div class="flex flex-wrap items-center justify-between gap-4">
<div>
<h2 id="settings-legal-title" class="text-sm font-semibold uppercase text-slate-500 dark:text-slate-400">Legal</h2>
<p class="mt-1 text-sm text-slate-500 dark:text-slate-400">Review the terms, privacy notice, and security policy for trackslash.</p>
</div>
{{template "legal-links"}}
</div>
</section>
</section>

<footer data-settings-footer class="border-t border-slate-200 py-4 dark:border-slate-800">
{{template "legal-links"}}
</footer>
</section>
{{end}}
21 changes: 20 additions & 1 deletion internal/server/ui_account_integration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -216,14 +216,33 @@ func TestUISettingsPageUpdatesProfileAndPassword(t *testing.T) {
}

body := e.uiGet(t, "/settings", token.RawToken)
for _, want := range []string{"Settings", "Display name", "Email", "Password login", "On", "Current password", "New password", "Passkeys", "Saved passkeys", "Add a passkey", "Passkey label", "Enter current password", "Required before changing passkeys.", "Continue", "Add passkey", "No passkeys added.", `data-modal-open="passkey-create"`, `id="passkey-create" data-client-modal class="fixed inset-0 z-50 hidden`, `role="dialog" aria-modal="true" aria-labelledby="passkey-create-title"`, "Legal", "Review the terms, privacy notice, and security policy for trackslash.", `aria-label="Legal"`, `href="/terms"`, `href="/privacy"`, `href="/security"`} {
for _, want := range []string{"Settings", "Display name", "Email", "Password login", "On", "Current password", "New password", "Passkeys", "Saved passkeys", "Add a passkey", "Passkey label", "Enter current password", "Required before changing passkeys.", "Continue", "Add passkey", "No passkeys added.", `data-modal-open="passkey-create"`, `id="passkey-create" data-client-modal class="fixed inset-0 z-50 hidden`, `role="dialog" aria-modal="true" aria-labelledby="passkey-create-title"`, `<footer data-settings-footer class="border-t border-slate-200 py-4 dark:border-slate-800">`, `aria-label="Legal"`, `href="/terms"`, `href="/privacy"`, `href="/security"`} {
if !strings.Contains(body, want) {
t.Fatalf("settings body missing %q: %s", want, body)
}
}
if got := strings.Count(body, `aria-label="Legal"`); got != 1 {
t.Fatalf("settings legal navigation count = %d, want 1: %s", got, body)
}
footerStart := strings.Index(body, `<footer data-settings-footer`)
if footerStart < 0 {
t.Fatalf("settings body missing legal footer: %s", body)
}
footerEnd := strings.Index(body[footerStart:], `</footer>`)
if footerEnd < 0 {
t.Fatalf("settings body has unterminated legal footer: %s", body)
}
footer := body[footerStart : footerStart+footerEnd]
for _, want := range []string{`aria-label="Legal"`, `href="/terms"`, `href="/privacy"`, `href="/security"`} {
if !strings.Contains(footer, want) {
t.Fatalf("settings legal footer missing %q: %s", want, footer)
}
}
for _, notWant := range []string{`rounded-lg`, `bg-white`, `dark:bg-slate-900`, `settings-legal-title`, "Review the terms"} {
if strings.Contains(footer, notWant) {
t.Fatalf("settings legal footer still has boxed treatment %q: %s", notWant, footer)
}
}
sidebarStart := strings.Index(body, `<aside id="app-sidebar"`)
if sidebarStart < 0 {
t.Fatalf("settings body missing sidebar: %s", body)
Expand Down
Loading