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
|
||
|
|
}
|