1// SPDX-License-Identifier: AGPL-3.0-or-later
2
3package app
4
5import (
6 "bytes"
7 "errors"
8 "os/exec"
9 "testing"
10
11 "github.com/stretchr/testify/assert"
12 "github.com/stretchr/testify/require"
13
14 "bnema.dev/ermite-api/gen/ermite"
15)
16
17// runBinary runs the built ermite with only the given variables.
18func runBinary(t *testing.T, vars []string, args ...string) (stdout, stderr string, code int) {
19 t.Helper()
20 cmd := exec.Command(binary(t), args...)
21 cmd.Env = append(baseEnv(), vars...)
22 var out, errb bytes.Buffer
23 cmd.Stdout, cmd.Stderr = &out, &errb
24 err := cmd.Run()
25 var exit *exec.ExitError
26 if errors.As(err, &exit) {
27 code = exit.ExitCode()
28 } else {
29 require.NoError(t, err)
30 }
31 return out.String(), errb.String(), code
32}
33
34func TestBinaryRemoteCommandErrorIsOneLineAndExitsOne(t *testing.T) {
35 _, stderr, code := runBinary(t, nil, "repo", "list")
36 assert.Equal(t, 1, code)
37 assert.Regexp(t, `^ermite: ERMITE_URL is not set[^\n]*\n$`, stderr)
38}
39
40func TestBinaryAgainstStubServer(t *testing.T) {
41 f := &fakeAPI{listRepos: func(*ermite.ListReposRequest) (*ermite.ListReposResponse, error) {
42 return &ermite.ListReposResponse{Repos: []*ermite.Repo{repoAlpha}}, nil
43 }}
44 url := f.serve(t)
45 stdout, stderr, code := runBinary(t, []string{"ERMITE_URL=" + url, "ERMITE_TOKEN=ermite_t"}, "repo", "list", "--json")
46 assert.Equal(t, 0, code, stderr)
47 assert.Contains(t, stdout, `"name": "alpha"`)
48 assert.Contains(t, f.header[0].Get("User-Agent"), "ermite/")
49 assert.Contains(t, f.header[0].Get("User-Agent"), "(cli)")
50
51 _, stderr, code = runBinary(t, []string{"ERMITE_URL=" + url}, "repo", "delete", "alpha")
52 assert.Equal(t, 1, code)
53 assert.Contains(t, stderr, "ermite: aborted")
54}