v3.3.1 31f1eec

controlplane_client_test.go RawHistoryFolder

1package cli
2
3import (
4	"context"
5	"encoding/json"
6	"errors"
7	"net/http"
8	"net/http/httptest"
9	"testing"
10
11	"github.com/stretchr/testify/assert"
12	"github.com/stretchr/testify/require"
13
14	"github.com/bnema/gordon/internal/adapters/dto"
15	"github.com/bnema/gordon/internal/adapters/in/cli/remote"
16)
17
18func TestRemoteControlPlane_RunVolumeBackupsPreservesPartialResult(t *testing.T) {
19	server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
20		w.Header().Set("Content-Type", "application/json")
21		w.WriteHeader(http.StatusPartialContent)
22		require.NoError(t, json.NewEncoder(w).Encode(dto.VolumeBackupRunResponse{
23			Status:  "partial",
24			Backups: []dto.VolumeBackupJob{{ID: "v1", App: "shop", Service: "api", VolumeName: "data"}},
25			Error:   "one volume failed",
26		}))
27	}))
28	t.Cleanup(server.Close)
29
30	cp := remote.NewClient(server.URL)
31	result, err := cp.RunVolumeBackups(context.Background(), "shop", "api", "data")
32
33	require.Error(t, err)
34	assert.Contains(t, err.Error(), "one volume failed")
35	require.NotNil(t, result)
36	assert.Equal(t, "partial", result.Status)
37	require.Len(t, result.Backups, 1)
38	assert.Equal(t, "v1", result.Backups[0].ID)
39}
40
41func TestRemoteControlPlane_VolumeBackupErrorsKeepHTTPStatus(t *testing.T) {
42	server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
43		http.Error(w, "boom", http.StatusBadGateway)
44	}))
45	t.Cleanup(server.Close)
46
47	cp := remote.NewClient(server.URL)
48	_, err := cp.VolumeBackupStatus(context.Background())
49
50	require.Error(t, err)
51	var httpErr *remote.HTTPError
52	require.True(t, errors.As(err, &httpErr))
53	assert.Equal(t, http.StatusBadGateway, httpErr.StatusCode)
54}

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 7

Tags 106

↑↓ moveenter openesc close