// 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, "