1// SPDX-License-Identifier: AGPL-3.0-or-later
2
3package web
4
5import (
6 "encoding/json"
7 "strings"
8 "testing"
9
10 "github.com/stretchr/testify/assert"
11 "github.com/stretchr/testify/require"
12)
13
14// The web app manifest makes the site installable: every page links it, and
15// its icons are served assets.
16func TestWebAppManifest(t *testing.T) {
17 t.Parallel()
18 srv := newBareServer(t)
19 u := srv.assets.urls
20 man, ok := srv.assets.byName[strings.TrimPrefix(u.Manifest, StaticPrefix)]
21 require.True(t, ok)
22 assert.Equal(t, "application/manifest+json", man.typ)
23
24 var m webManifest
25 require.NoError(t, json.Unmarshal(man.body, &m))
26 assert.Equal(t, "standalone", m.Display)
27 assert.Equal(t, "/", m.StartURL)
28 require.Len(t, m.Icons, len(appIcons))
29 for _, ic := range m.Icons {
30 a, ok := srv.assets.byName[strings.TrimPrefix(ic.Src, StaticPrefix)]
31 require.True(t, ok, ic.Src)
32 assert.Equal(t, "image/png", a.typ)
33 }
34 _, ok = srv.assets.byName[strings.TrimPrefix(u.AppleIcon, StaticPrefix)]
35 assert.True(t, ok)
36
37 page := renderToString(t, Shell(Layout{Assets: u}, nil))
38 assert.Contains(t, page, `<link rel="manifest" href="`+u.Manifest+`">`)
39 assert.Contains(t, page, `<link rel="apple-touch-icon" href="`+u.AppleIcon+`">`)
40}