blive fundet Tjekket fandtes i forvejen, og svaret stod ét sted: nederst på indstillingssiden for beskeder. Det er en oplysning, man kun får, hvis man i forvejen havde mistanke om, at der var noget at se efter — og "der er kommet en rettelse af noget, du er ramt af" er ikke noget, man gætter sig til at kigge efter. Nu går den i klokken, i push og på mærket på ikonet, som alt andet, der er værd at vide. Og den fører hen, hvor knappen til at genstarte sidder, frem for ud af programmet. Én besked pr. version, ikke én pr. time. En påmindelse hver time om det samme er den slags besked, folk slår fra — og så er den næste, der betyder noget, også slået fra. Versionen, der er sagt til om, skrives først, når beskederne er sendt: den anden vej rundt ville en fejl midtvejs betyde, at halvdelen fik besked og resten aldrig gjorde. Kun administratorer, af samme grund som versionsfeltet allerede er det: en besked om, at serveren er bagud, er en besked om en andens arbejde, hvis man ikke selv kan gøre noget ved den. Og et tjek, operatøren har slået fra, bliver ikke til en besked ad bagvejen. VERDANDE_UPDATE_CHECK styrer det hele, som før. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
128 lines
3.9 KiB
Go
128 lines
3.9 KiB
Go
package httpapi
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/kristianwind/verdande/internal/update"
|
|
)
|
|
|
|
// En ny version siger til af sig selv. Uden det stod svaret nederst på en
|
|
// indstillingsside, som man kun åbner, hvis man i forvejen havde mistanke om, at
|
|
// der var noget at se efter.
|
|
func TestANewVersionTellsTheAdministrator(t *testing.T) {
|
|
ts := newTestServer(t)
|
|
ts.bootstrap(t)
|
|
|
|
status := update.Status{
|
|
Current: "v0.44.0", Latest: "v0.45.0", Available: true,
|
|
Notes: "Nyt:\n\n- noget godt", URL: "https://example.dk/v0.45.0",
|
|
}
|
|
if err := ts.api.notifyOfUpdate(t.Context(), status); err != nil {
|
|
t.Fatalf("besked om ny version: %v", err)
|
|
}
|
|
|
|
list, unread := notifications(t, ts)
|
|
if len(list) != 1 || unread != 1 {
|
|
t.Fatalf("beskeder = %d (%v ulæste), want 1", len(list), unread)
|
|
}
|
|
n := firstOf(t, list)
|
|
if n["kind"] != "update.available" {
|
|
t.Errorf("besked = %v", n)
|
|
}
|
|
// Titlen bærer versionen, fordi den også bliver til en push-besked, og push
|
|
// har ingen ordbog at slå sætningen op i.
|
|
if title, _ := n["title"].(string); title != "verdande v0.45.0 er klar" {
|
|
t.Errorf("titel = %q", title)
|
|
}
|
|
|
|
// Én besked pr. version, ikke én pr. time. En påmindelse hver time om det
|
|
// samme er den slags besked, folk slår fra — og så er den næste, der betyder
|
|
// noget, også slået fra.
|
|
if err := ts.api.notifyOfUpdate(t.Context(), status); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if list, _ := notifications(t, ts); len(list) != 1 {
|
|
t.Errorf("den samme version gav %d beskeder, want 1", len(list))
|
|
}
|
|
|
|
// Og den næste version er en ny ting at få at vide.
|
|
status.Latest = "v0.46.0"
|
|
if err := ts.api.notifyOfUpdate(t.Context(), status); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if list, _ := notifications(t, ts); len(list) != 2 {
|
|
t.Errorf("en ny version gav %d beskeder, want 2", len(list))
|
|
}
|
|
}
|
|
|
|
// Kun administratorer. En besked om, at serveren er bagud, er en besked om en
|
|
// andens arbejde, hvis man ikke selv kan gøre noget ved den.
|
|
func TestOnlyAdministratorsHearAboutANewVersion(t *testing.T) {
|
|
ts := newTestServer(t)
|
|
ts.bootstrap(t)
|
|
other := ts.newUser(t, "sofie@example.dk", "Sofie")
|
|
|
|
err := ts.api.notifyOfUpdate(t.Context(), update.Status{
|
|
Current: "v0.44.0", Latest: "v0.45.0", Available: true,
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if list, _ := notifications(t, other); len(list) != 0 {
|
|
t.Errorf("en almindelig bruger fik %d beskeder om en opdatering", len(list))
|
|
}
|
|
if list, _ := notifications(t, ts); len(list) != 1 {
|
|
t.Errorf("administratoren fik %d beskeder, want 1", len(list))
|
|
}
|
|
}
|
|
|
|
// Et tjek, operatøren har slået fra, må ikke blive til en besked ad bagvejen.
|
|
func TestNoUpdateNoticeWhenTheCheckIsOff(t *testing.T) {
|
|
ts := newTestServer(t)
|
|
ts.bootstrap(t)
|
|
|
|
for _, status := range []update.Status{
|
|
{Current: "v0.44.0", Disabled: true},
|
|
{Current: "v0.44.0", Available: false},
|
|
{Current: "v0.44.0", Available: true, Latest: ""},
|
|
} {
|
|
if err := ts.api.notifyOfUpdate(t.Context(), status); err != nil {
|
|
t.Fatalf("%v: %v", status, err)
|
|
}
|
|
}
|
|
if list, _ := notifications(t, ts); len(list) != 0 {
|
|
t.Errorf("der blev sagt til om en opdatering, der ikke var: %d beskeder", len(list))
|
|
}
|
|
}
|
|
|
|
// Beskeden fører hen, hvor knappen sidder — ikke ud af programmet. Prøvet på det,
|
|
// fladen læser: en besked uden note, opgave eller projekt skal stadig kunne
|
|
// klikkes.
|
|
func TestAnUpdateNoticeCarriesNoTarget(t *testing.T) {
|
|
ts := newTestServer(t)
|
|
ts.bootstrap(t)
|
|
|
|
err := ts.api.notifyOfUpdate(t.Context(), update.Status{
|
|
Current: "v0.44.0", Latest: "v0.45.0", Available: true,
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
n := firstOf(t, mustNotifications(t, ts))
|
|
for _, key := range []string{"note_id", "task_id", "project_id"} {
|
|
if v, ok := n[key]; ok && v != "" {
|
|
t.Errorf("%s = %v, want ingenting", key, v)
|
|
}
|
|
}
|
|
}
|
|
|
|
func mustNotifications(t *testing.T, ts *testServer) []any {
|
|
t.Helper()
|
|
list, _ := notifications(t, ts)
|
|
if len(list) == 0 {
|
|
t.Fatal("ingen beskeder")
|
|
}
|
|
return list
|
|
}
|