1package cli
2
3import (
4 "bytes"
5 "context"
6 "errors"
7 "testing"
8
9 "github.com/stretchr/testify/mock"
10 "github.com/stretchr/testify/require"
11
12 "github.com/bnema/gordon/internal/adapters/dto"
13 climocks "github.com/bnema/gordon/internal/adapters/in/cli/mocks"
14)
15
16// backupRunPlane builds the control plane double the runner functions
17// take directly: no resolver indirection is needed.
18func backupRunPlane(t *testing.T) *climocks.MockControlPlane {
19 t.Helper()
20 return climocks.NewMockControlPlane(t)
21}
22
23func TestVolumeBackupStatus_JSONFlag(t *testing.T) {
24 plane := backupRunPlane(t)
25
26 plane.EXPECT().VolumeBackupStatus(mock.Anything).Return([]dto.VolumeBackupJob{{App: "shop", Service: "api", VolumeName: "data", Status: "running"}}, nil)
27
28 var out bytes.Buffer
29 require.NoError(t, runVolumeBackupStatus(context.Background(), plane, &out, true))
30 require.JSONEq(t, `[{"id":"","app":"shop","service":"api","volume":"data","type":"","status":"running","size_bytes":0}]`, out.String())
31}
32
33func TestVolumeBackupRun_PrintsPartialJobsBeforeReturningError(t *testing.T) {
34 plane := backupRunPlane(t)
35
36 runErr := errors.New("one backup failed")
37 plane.EXPECT().RunVolumeBackups(mock.Anything, "shop", "api", "data").Return(&dto.VolumeBackupRunResponse{
38 Status: "partial",
39 Backups: []dto.VolumeBackupJob{{App: "shop", Service: "api", VolumeName: "data", Status: "completed"}},
40 Error: runErr.Error(),
41 }, runErr)
42
43 var out bytes.Buffer
44 err := runVolumeBackupRun(context.Background(), plane, "shop", "api", "data", &out, true)
45 require.Error(t, err)
46 require.ErrorIs(t, err, runErr)
47 require.JSONEq(t, `[{"id":"","app":"shop","service":"api","volume":"data","type":"","status":"completed","size_bytes":0}]`, out.String())
48}