1// SPDX-License-Identifier: AGPL-3.0-or-later
2
3package githubraw_test
4
5import (
6 "context"
7 "net/http"
8 "net/http/httptest"
9 "strings"
10 "testing"
11
12 "github.com/stretchr/testify/assert"
13 "github.com/stretchr/testify/require"
14
15 "bnema.dev/ermite/internal/adapters/githubraw"
16 "bnema.dev/ermite/internal/domain"
17)
18
19// The server is local: the test never reaches github.com.
20func TestFetchWorkflow(t *testing.T) {
21 t.Parallel()
22 var got string
23 srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
24 got = r.URL.Path
25 switch {
26 case strings.HasSuffix(r.URL.Path, "/ok.yml"):
27 _, _ = w.Write([]byte("on: workflow_call\n"))
28 case strings.HasSuffix(r.URL.Path, "/big.yml"):
29 _, _ = w.Write([]byte(strings.Repeat("x", 100)))
30 case strings.HasSuffix(r.URL.Path, "/moved.yml"):
31 http.Redirect(w, r, "http://127.0.0.1:1/x", http.StatusFound)
32 case strings.HasSuffix(r.URL.Path, "/boom.yml"):
33 w.WriteHeader(http.StatusBadGateway)
34 default:
35 http.NotFound(w, r)
36 }
37 }))
38 t.Cleanup(srv.Close)
39 f := githubraw.New(githubraw.Config{BaseURL: srv.URL})
40 ctx := context.Background()
41
42 data, err := f.FetchWorkflow(ctx, "o", "r", "abc", ".github/workflows/ok.yml", 1024)
43 require.NoError(t, err)
44 assert.Equal(t, "on: workflow_call\n", string(data))
45 assert.Equal(t, "/o/r/abc/.github/workflows/ok.yml", got)
46
47 _, err = f.FetchWorkflow(ctx, "o", "r", "abc", ".github/workflows/none.yml", 1024)
48 assert.ErrorIs(t, err, domain.ErrNotFound)
49 _, err = f.FetchWorkflow(ctx, "o", "r", "abc", ".github/workflows/big.yml", 10)
50 assert.ErrorIs(t, err, domain.ErrResourceExhausted)
51 _, err = f.FetchWorkflow(ctx, "o", "r", "abc", ".github/workflows/boom.yml", 10)
52 assert.ErrorIs(t, err, domain.ErrUnavailable)
53 _, err = f.FetchWorkflow(ctx, "o", "r", "abc", ".github/workflows/moved.yml", 10)
54 assert.ErrorIs(t, err, domain.ErrUnavailable, "a redirect is not followed")
55 _, err = f.FetchWorkflow(ctx, "o", "..", "abc", ".github/workflows/ok.yml", 10)
56 assert.ErrorIs(t, err, domain.ErrInvalid)
57}