// SPDX-License-Identifier: AGPL-3.0-or-later package app import ( "context" "encoding/json" "io" "net/http" "strconv" "strings" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "bnema.dev/ermite/internal/domain" "bnema.dev/ermite/internal/ports" "bnema.dev/ermite/internal/usecase" ) // Releases and web use the production forge wiring. func TestWebRelease(t *testing.T) { h := newHarness(t, harnessOpts{}) h.webRepo("demo") blobs, releases := h.forge.Blobs, h.forge.Releases repo := h.name("demo") rel, err := releases.CreateRelease(h.ctx, domain.Root(), repo, ports.CreateReleaseParams{Tag: "v0.2.0", Title: "Demo release", Notes: "## Install\n\n**Download** the binary. "}) require.NoError(t, err) payload := "binary release data\x00\xff\n" asset, err := releases.UploadAsset(h.ctx, domain.Root(), repo, ports.UploadAssetParams{ReleaseID: rel.ID, Name: "demo.bin", ContentType: "application/octet-stream", Size: int64(len(payload))}, strings.NewReader(payload)) require.NoError(t, err) draft, err := releases.CreateRelease(h.ctx, domain.Root(), repo, ports.CreateReleaseParams{Tag: "draft", Title: "Hidden draft", Draft: true}) require.NoError(t, err) draftAsset, err := releases.UploadAsset(h.ctx, domain.Root(), repo, ports.UploadAssetParams{ReleaseID: draft.ID, Name: "hidden.bin", Size: 1}, strings.NewReader("x")) require.NoError(t, err) ts := h.srv get := func(method, path, byteRange string) (int, http.Header, string) { t.Helper() req, err := http.NewRequestWithContext(t.Context(), method, ts.URL+path, nil) require.NoError(t, err) if byteRange != "" { req.Header.Set("Range", byteRange) } res, err := ts.Client().Do(req) require.NoError(t, err) defer func() { _ = res.Body.Close() }() body, err := io.ReadAll(res.Body) require.NoError(t, err) return res.StatusCode, res.Header, string(body) } status, _, body := get("GET", "/demo/releases", "") require.Equal(t, 200, status) assert.Contains(t, body, "Demo release") assert.NotContains(t, body, "Hidden draft") status, _, body = get("GET", "/demo/releases/tag/v0.2.0", "") require.Equal(t, 200, status) assert.Contains(t, body, "Download") assert.NotContains(t, body, "