1// SPDX-License-Identifier: AGPL-3.0-or-later
2
3package web
4
5import (
6 "encoding/json"
7 "testing"
8
9 "github.com/stretchr/testify/assert"
10 "github.com/stretchr/testify/require"
11)
12
13// The speculation rules prefetch the light pages and leave the heavy ones
14// (several Git reads each) to a click.
15func TestSpeculationRulesSkipHeavyPages(t *testing.T) {
16 t.Parallel()
17 raw, err := staticFS.ReadFile("static/rules.json")
18 require.NoError(t, err)
19 var rules struct {
20 Prefetch []struct {
21 Where struct {
22 And []struct {
23 Href string `json:"href_matches"`
24 Not *struct {
25 Href string `json:"href_matches"`
26 } `json:"not"`
27 } `json:"and"`
28 } `json:"where"`
29 Eagerness string `json:"eagerness"`
30 } `json:"prefetch"`
31 }
32 require.NoError(t, json.Unmarshal(raw, &rules))
33 require.Len(t, rules.Prefetch, 1)
34 assert.Equal(t, "moderate", rules.Prefetch[0].Eagerness)
35
36 var allowed string
37 excluded := map[string]bool{}
38 for _, c := range rules.Prefetch[0].Where.And {
39 if c.Href != "" {
40 allowed = c.Href
41 }
42 if c.Not != nil && c.Not.Href != "" {
43 excluded[c.Not.Href] = true
44 }
45 }
46 assert.Equal(t, "/*", allowed)
47 for _, p := range []string{
48 "/-/*", "/*/raw/*", "/*/tree", "/*/tree/*", "/*/blob/*", "/*/commit/*",
49 "/*/commits", "/*/commits/*", "/*/compare/*", "/*/refs", "/*/merge-requests/*/since",
50 } {
51 assert.True(t, excluded[p], "%s is not prefetched", p)
52 }
53 for _, p := range []string{"/", "/*", "/*/merge-requests", "/*/merge-requests/*"} {
54 assert.False(t, excluded[p], "%s stays prefetched", p)
55 }
56}