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}