ui(relTime): tick relative timestamps client-side so long-open tabs don't freeze
CI / Test (rest) (pull_request) Successful in 9s
CI / Test (store) (pull_request) Successful in 6s
CI / Build (windows/amd64) (pull_request) Successful in 8s
CI / Build (linux/amd64) (pull_request) Successful in 7s
CI / Lint (pull_request) Successful in 19s
CI / Build (linux/arm64) (pull_request) Successful in 7s
e2e / Playwright vs docker-compose (pull_request) Successful in 1m26s
CI / Test (server-http) (pull_request) Successful in 2m34s
CI / Test (rest) (pull_request) Successful in 9s
CI / Test (store) (pull_request) Successful in 6s
CI / Build (windows/amd64) (pull_request) Successful in 8s
CI / Build (linux/amd64) (pull_request) Successful in 7s
CI / Lint (pull_request) Successful in 19s
CI / Build (linux/arm64) (pull_request) Successful in 7s
e2e / Playwright vs docker-compose (pull_request) Successful in 1m26s
CI / Test (server-http) (pull_request) Successful in 2m34s
formatRelTime now wraps its label in <time data-rel-ts=...>, and both layouts include a small ticker that re-renders every 30s. Without this, a job-detail page rendered an hour ago kept showing '2h ago' when the wall-clock truth was '3h ago'.
This commit is contained in:
@@ -0,0 +1,49 @@
|
||||
package ui
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
func TestFormatRelTimeWrapsInTickableTimeElement(t *testing.T) {
|
||||
// A long-open tab needs a stable anchor so the JS ticker can
|
||||
// refresh the label — see base.html.
|
||||
when := time.Now().Add(-3 * time.Hour)
|
||||
got := string(formatRelTime(when))
|
||||
if !strings.Contains(got, `<time data-rel-ts="`) {
|
||||
t.Errorf("missing data-rel-ts anchor in %q", got)
|
||||
}
|
||||
if !strings.Contains(got, "3h ago</time>") {
|
||||
t.Errorf("expected '3h ago' label, got %q", got)
|
||||
}
|
||||
}
|
||||
|
||||
func TestFormatRelTimeNilReturnsDash(t *testing.T) {
|
||||
var p *time.Time
|
||||
if string(formatRelTime(p)) != "—" {
|
||||
t.Errorf("nil should render as em-dash, got %q", formatRelTime(p))
|
||||
}
|
||||
if string(formatRelTime(time.Time{})) != "—" {
|
||||
t.Errorf("zero should render as em-dash")
|
||||
}
|
||||
}
|
||||
|
||||
func TestRelTimeLabelBuckets(t *testing.T) {
|
||||
cases := []struct {
|
||||
d time.Duration
|
||||
want string
|
||||
}{
|
||||
{30 * time.Second, "30s ago"},
|
||||
{5 * time.Minute, "5m ago"},
|
||||
{2 * time.Hour, "2h ago"},
|
||||
{3 * 24 * time.Hour, "3d ago"},
|
||||
{2 * 7 * 24 * time.Hour, "2w ago"},
|
||||
{-5 * time.Minute, "5m from now"},
|
||||
}
|
||||
for _, c := range cases {
|
||||
if got := relTimeLabel(c.d); got != c.want {
|
||||
t.Errorf("relTimeLabel(%v) = %q, want %q", c.d, got, c.want)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user