1// SPDX-License-Identifier: AGPL-3.0-or-later
2
3package web
4
5import (
6 "strings"
7 "testing"
8 "time"
9
10 "github.com/stretchr/testify/assert"
11 "github.com/stretchr/testify/mock"
12 "github.com/stretchr/testify/require"
13
14 "bnema.dev/ermite/internal/domain"
15 "bnema.dev/ermite/internal/ports"
16 "bnema.dev/ermite/internal/ports/mocks"
17)
18
19func TestSummaryRelease(t *testing.T) {
20 repo := repoName(t, "proj")
21 for _, tc := range []struct {
22 name string
23 release domain.Release
24 err error
25 visible bool
26 }{
27 {name: "published", release: domain.Release{Tag: "v0.9.1", PublishedAt: fixedNow.Add(-6 * time.Minute)}, visible: true},
28 {name: "none", err: domain.ErrNotFound},
29 {name: "draft", release: domain.Release{Tag: "secret", Draft: true, PublishedAt: fixedNow}},
30 } {
31 t.Run(tc.name, func(t *testing.T) {
32 svc := mocks.NewReleaseService(t)
33 svc.EXPECT().GetRelease(mock.Anything, mock.Anything, repo, ports.ReleaseRef{Latest: true}).Return(tc.release, tc.err).Once()
34 srv := newTestServer(t, Config{Repos: reposServing(t, publicRepo(t, "proj")), Browse: mocks.NewBrowseService(t), Releases: svc})
35 rel := srv.summaryRelease(t.Context(), repo, fixedNow)
36 out := strings.Join(strings.Fields(renderRail(t, SummaryPage{Latest: &LatestTag{Name: "v1", Count: 1}, Release: rel})), " ")
37 if !tc.visible {
38 assert.Nil(t, rel)
39 assert.NotContains(t, out, "<dt>release</dt>")
40 return
41 }
42 require.NotNil(t, rel)
43 assert.Contains(t, out, `<a href="/proj/releases/tag/v0.9.1">v0.9.1</a> · <time`)
44 assert.Contains(t, out, `datetime="`+rfc3339(tc.release.PublishedAt)+`"`)
45 assert.Contains(t, out, `>`+ago(fixedNow, tc.release.PublishedAt)+`</time> · <a href="/proj/releases">all releases</a>`)
46 assert.Regexp(t, `(?s)<dt>latest tag</dt>.*<dt>release</dt>`, out)
47 })
48 }
49}