v2.31.0 e02f654

controlplane_remote_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
18var _ ControlPlane = (*remoteControlPlane)(nil)
19
20func TestRemoteControlPlane_ImplementsInterface(t *testing.T) {
21	client := remote.NewClient("https://gordon.example.com")
22	if NewRemoteControlPlane(client) == nil {
23		t.Fatal("expected non-nil remote control-plane")
24	}
25}
26
27func TestRemoteControlPlane_RunVolumeBackupsPreservesPartialResult(t *testing.T) {
28	server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
29		w.Header().Set("Content-Type", "application/json")
30		w.WriteHeader(http.StatusPartialContent)
31		require.NoError(t, json.NewEncoder(w).Encode(dto.VolumeBackupRunResponse{
32			Status:  "partial",
33			Backups: []dto.VolumeBackupJob{{ID: "v1", Domain: "app.example.com", VolumeName: "gordon-app-data"}},
34			Error:   "one volume failed",
35		}))
36	}))
37	t.Cleanup(server.Close)
38
39	cp := NewRemoteControlPlane(remote.NewClient(server.URL))
40	result, err := cp.RunVolumeBackups(context.Background(), "app.example.com", "")
41
42	require.Error(t, err)
43	assert.Contains(t, err.Error(), "run volume backups")
44	require.NotNil(t, result)
45	assert.Equal(t, "partial", result.Status)
46	require.Len(t, result.Backups, 1)
47	assert.Equal(t, "v1", result.Backups[0].ID)
48}
49
50func TestRemoteControlPlane_VolumeBackupErrorsAreWrapped(t *testing.T) {
51	server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
52		http.Error(w, "boom", http.StatusBadGateway)
53	}))
54	t.Cleanup(server.Close)
55
56	cp := NewRemoteControlPlane(remote.NewClient(server.URL))
57	_, err := cp.VolumeBackupStatus(context.Background())
58
59	require.Error(t, err)
60	assert.Contains(t, err.Error(), "get volume backup status")
61	var httpErr *remote.HTTPError
62	require.True(t, errors.As(err, &httpErr))
63	assert.Equal(t, http.StatusBadGateway, httpErr.StatusCode)
64}

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