1package cli
2
3import (
4 "bytes"
5 "context"
6 "testing"
7
8 "github.com/stretchr/testify/assert"
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
16func TestRunVolumesList_ShowsVolumes(t *testing.T) {
17 clientMock := climocks.NewMockvolumesClient(t)
18 clientMock.EXPECT().ListVolumes(context.Background()).Return([]dto.Volume{
19 {Name: "db-data", InUse: true, Containers: []string{"postgres"}, Size: 1024 * 1024},
20 {Name: "orphaned-vol", InUse: false, Size: 512},
21 }, nil).Once()
22
23 var out bytes.Buffer
24 err := runVolumesList(context.Background(), clientMock, &out, false)
25 require.NoError(t, err)
26 assert.Contains(t, out.String(), "db-data")
27 assert.Contains(t, out.String(), "orphaned-vol")
28}
29
30func TestRunVolumesList_JSON(t *testing.T) {
31 clientMock := climocks.NewMockvolumesClient(t)
32 clientMock.EXPECT().ListVolumes(context.Background()).Return([]dto.Volume{
33 {Name: "vol1", InUse: true},
34 }, nil).Once()
35
36 var out bytes.Buffer
37 err := runVolumesList(context.Background(), clientMock, &out, true)
38 require.NoError(t, err)
39 assert.Contains(t, out.String(), `"name"`)
40}
41
42func TestRunVolumesPrune_JSONExecutesActualPrune(t *testing.T) {
43 clientMock := climocks.NewMockvolumesClient(t)
44 resp := &dto.VolumePruneResponse{
45 VolumesRemoved: 1,
46 SpaceReclaimed: 1024,
47 Volumes: []dto.Volume{{Name: "orphan1", Size: 1024}},
48 }
49 previewCall := clientMock.EXPECT().PruneVolumes(context.Background(), dto.VolumePruneRequest{DryRun: true}).Return(resp, nil).Once()
50 pruneCall := clientMock.EXPECT().PruneVolumes(context.Background(), dto.VolumePruneRequest{DryRun: false}).Return(resp, nil).Once()
51 mock.InOrder(previewCall, pruneCall)
52
53 var out bytes.Buffer
54 err := runVolumesPrune(context.Background(), clientMock, volumesPruneOptions{Json: true}, &out)
55 require.NoError(t, err)
56 assert.Contains(t, out.String(), `"volumes_removed"`)
57}
58
59func TestRunVolumesPrune_DryRun(t *testing.T) {
60 clientMock := climocks.NewMockvolumesClient(t)
61 clientMock.EXPECT().PruneVolumes(context.Background(), dto.VolumePruneRequest{DryRun: true}).Return(&dto.VolumePruneResponse{
62 VolumesRemoved: 2,
63 SpaceReclaimed: 4096,
64 Volumes: []dto.Volume{
65 {Name: "orphan1", Size: 2048},
66 {Name: "orphan2", Size: 2048},
67 },
68 }, nil).Once()
69
70 var out bytes.Buffer
71 err := runVolumesPrune(context.Background(), clientMock, volumesPruneOptions{DryRun: true}, &out)
72 require.NoError(t, err)
73 assert.Contains(t, out.String(), "orphan1")
74}