131 lines
3.8 KiB
Go
131 lines
3.8 KiB
Go
package main
|
|
|
|
import (
|
|
"net/http/httptest"
|
|
"os"
|
|
"strings"
|
|
"path/filepath"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestFitnessWeights(t *testing.T) {
|
|
withBerlin(t)
|
|
dir := t.TempDir()
|
|
prev := calendarsDir
|
|
calendarsDir = dir
|
|
t.Cleanup(func() { calendarsDir = prev })
|
|
|
|
if err := os.WriteFile(filepath.Join(dir, ".page-settings"),
|
|
[]byte("type = calendars\nweight = Gewicht\n"), 0644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
writeCal(t, dir, "Gewicht",
|
|
`UID:1
|
|
SUMMARY:96 kg
|
|
DTSTART;VALUE=DATE:20261001`,
|
|
`UID:2
|
|
SUMMARY:95,6kg
|
|
DTSTART;VALUE=DATE:20261003`,
|
|
`UID:3
|
|
SUMMARY:not a weight
|
|
DTSTART;VALUE=DATE:20261004`,
|
|
`UID:4
|
|
SUMMARY:90 kg
|
|
DTSTART;VALUE=DATE:20261010`,
|
|
)
|
|
|
|
today := time.Date(2026, 10, 5, 0, 0, 0, 0, time.UTC)
|
|
got := fitnessWeights(today)
|
|
want := []weightPoint{
|
|
{date: time.Date(2026, 10, 1, 0, 0, 0, 0, time.UTC), value: 96},
|
|
{date: time.Date(2026, 10, 3, 0, 0, 0, 0, time.UTC), value: 95.6},
|
|
}
|
|
if len(got) != len(want) {
|
|
t.Fatalf("got %+v, want %+v", got, want)
|
|
}
|
|
for i := range want {
|
|
if !got[i].date.Equal(want[i].date) || got[i].value != want[i].value {
|
|
t.Fatalf("point %d: got %+v, want %+v", i, got[i], want[i])
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestTimeXTicks(t *testing.T) {
|
|
d := func(y int, m time.Month, day int) time.Time { return time.Date(y, m, day, 0, 0, 0, 0, time.UTC) }
|
|
for _, c := range []struct {
|
|
from, to time.Time
|
|
want string
|
|
}{
|
|
{d(2022, 11, 28), d(2026, 9, 21), "2023 2024 2025 2026"},
|
|
{d(2025, 9, 27), d(2026, 9, 27), "Oct 2025|Jan 2026|Apr|Jul"},
|
|
{d(2026, 6, 27), d(2026, 9, 27), "Jul 2026|Aug|Sep"},
|
|
{d(2026, 8, 27), d(2026, 9, 27), "31 Aug|7 Sep|14 Sep|21 Sep"},
|
|
} {
|
|
var got []string
|
|
for _, tk := range timeXTicks(chartScale{x0: c.from, x1: c.to}) {
|
|
got = append(got, tk.Label)
|
|
}
|
|
sep := " "
|
|
if strings.Contains(c.want, "|") {
|
|
sep = "|"
|
|
}
|
|
if g := strings.Join(got, sep); g != c.want {
|
|
t.Errorf("%s..%s: got %q, want %q", c.from.Format("2006-01-02"), c.to.Format("2006-01-02"), g, c.want)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestFitnessChartFragment(t *testing.T) {
|
|
withBerlin(t)
|
|
root := t.TempDir()
|
|
cals := filepath.Join(root, "Calendars")
|
|
fit := filepath.Join(root, "My Fitness")
|
|
for _, d := range []string{cals, fit} {
|
|
if err := os.MkdirAll(d, 0755); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
prev := calendarsDir
|
|
calendarsDir = cals
|
|
t.Cleanup(func() { calendarsDir = prev })
|
|
if err := os.WriteFile(filepath.Join(cals, ".page-settings"), []byte("type = calendars\nweight = Gewicht\n"), 0644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := os.WriteFile(filepath.Join(fit, ".page-settings"), []byte("type = fitness\n"), 0644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
writeCal(t, cals, "Gewicht", `UID:1
|
|
SUMMARY:96 kg
|
|
DTSTART;VALUE=DATE:20200101`)
|
|
|
|
h := &handler{root: root}
|
|
get := func(query string, hx bool) *httptest.ResponseRecorder {
|
|
r := httptest.NewRequest("GET", "/My%20Fitness/?"+query, nil)
|
|
if hx {
|
|
r.Header.Set("HX-Request", "true")
|
|
}
|
|
w := httptest.NewRecorder()
|
|
h.serveDir(w, r, "/My Fitness", fit)
|
|
return w
|
|
}
|
|
|
|
w := get("chart=weekly&weight=3m&weekly=all&weekly-absolute=1", true)
|
|
body := w.Body.String()
|
|
if w.Code != 200 || strings.Contains(body, "<html") || strings.Count(body, `class="fitness-chart panel"`) != 1 ||
|
|
!strings.Contains(body, `name="weekly"`) || !strings.Contains(body, `value="all" selected`) {
|
|
t.Errorf("weekly fragment: %d\n%s", w.Code, body)
|
|
}
|
|
if got, want := w.Header().Get("HX-Replace-Url"), "/My%20Fitness/?weekly=all&weekly-absolute=1"; got != want {
|
|
t.Errorf("HX-Replace-Url = %q, want %q", got, want)
|
|
}
|
|
|
|
if w := get("chart=bogus", true); w.Code != 404 {
|
|
t.Errorf("unknown chart: got %d, want 404", w.Code)
|
|
}
|
|
// Without htmx the parameter is ignored and the full page renders.
|
|
if body := get("chart=weekly", false).Body.String(); strings.Count(body, `class="fitness-chart panel"`) != 2 {
|
|
t.Errorf("non-htmx request did not render the dashboard:\n%s", body)
|
|
}
|
|
}
|