1// SPDX-License-Identifier: AGPL-3.0-or-later
2
3package web
4
5import (
6 "testing"
7
8 "github.com/stretchr/testify/assert"
9 "github.com/stretchr/testify/mock"
10
11 "bnema.dev/ermite/internal/domain"
12 "bnema.dev/ermite/internal/ports/mocks"
13)
14
15func TestMirrorBadge(t *testing.T) {
16 repo := repoName(t, "proj")
17 admin := domain.TokenPrincipal(domain.Token{ID: "admin", Scopes: []domain.Scope{domain.ScopeRepoAdmin}, Repos: []domain.RepoName{repo}})
18 reader := domain.TokenPrincipal(domain.Token{ID: "reader", Scopes: []domain.Scope{domain.ScopeRepoRead}})
19 for _, tc := range []struct {
20 name string
21 p domain.Principal
22 state domain.MirrorState
23 shown bool
24 lookup bool
25 }{
26 {"owner failing", domain.Owner(), domain.MirrorFailing, true, true},
27 {"admin paused", admin, domain.MirrorPaused, true, true},
28 {"anonymous", domain.Anonymous(), domain.MirrorFailing, false, false},
29 {"reader", reader, domain.MirrorFailing, false, false},
30 {"ok", admin, domain.MirrorOK, false, true},
31 {"disabled", admin, domain.MirrorDisabled, false, true},
32 } {
33 t.Run(tc.name, func(t *testing.T) {
34 w := mocks.NewMirrorWarner(t)
35 if tc.lookup {
36 w.EXPECT().Badge(mock.Anything, tc.p, repo).Return(tc.state, "main diverged on remote")
37 }
38 s := &Server{cfg: Config{Mirrors: w}}
39 badge := s.mirrorBadge(domain.ContextWithPrincipal(t.Context(), tc.p), repo)
40 out := renderRail(t, SummaryPage{Mirror: badge})
41 if tc.shown {
42 assert.Contains(t, out, `aria-labelledby="r-mirror"`)
43 assert.Contains(t, out, "Mirror "+string(tc.state))
44 assert.Contains(t, out, "main diverged on remote")
45 assert.Contains(t, out, "ermite mirror status proj")
46 } else {
47 assert.Nil(t, badge)
48 assert.NotContains(t, out, `id="r-mirror"`)
49 }
50 })
51 }
52 assert.Nil(t, (&Server{}).mirrorBadge(domain.ContextWithPrincipal(t.Context(), domain.Owner()), repo))
53}