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}