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 preview := &dto.VolumePruneResponse{Plan: dto.PruneSummary{
45 Eligible: 1,
46 Candidates: []dto.PruneCandidate{{
47 Kind: "volume", Ref: "orphan1", Verdict: "eligible",
48 }},
49 }}
50 result := &dto.VolumePruneResponse{
51 VolumesRemoved: 1,
52 SpaceReclaimed: 1024,
53 Volumes: []dto.Volume{{Name: "orphan1", Size: 1024}},
54 Plan: dto.PruneSummary{
55 Applied: true,
56 Eligible: 1,
57 Candidates: []dto.PruneCandidate{{
58 Kind: "volume", Ref: "orphan1", Verdict: "eligible",
59 }},
60 Deleted: []dto.PruneCandidate{{
61 Kind: "volume", Ref: "orphan1", Verdict: "eligible",
62 }},
63 },
64 }
65 previewCall := clientMock.EXPECT().PruneVolumes(context.Background(), dto.VolumePruneRequest{DryRun: true}).Return(preview, nil).Once()
66 pruneCall := clientMock.EXPECT().PruneVolumes(context.Background(), dto.VolumePruneRequest{DryRun: false}).Return(result, nil).Once()
67 mock.InOrder(previewCall, pruneCall)
68
69 var out bytes.Buffer
70 err := runVolumesPrune(context.Background(), clientMock, volumesPruneOptions{Json: true}, &out)
71 require.NoError(t, err)
72 assert.Contains(t, out.String(), `"volumes_removed"`)
73}
74
75func TestRunVolumesPrune_DryRun(t *testing.T) {
76 clientMock := climocks.NewMockvolumesClient(t)
77 clientMock.EXPECT().PruneVolumes(context.Background(), dto.VolumePruneRequest{DryRun: true}).Return(&dto.VolumePruneResponse{
78 Plan: dto.PruneSummary{
79 Eligible: 2,
80 Candidates: []dto.PruneCandidate{
81 {Kind: "volume", Ref: "orphan1", Verdict: "eligible"},
82 {Kind: "volume", Ref: "orphan2", Verdict: "eligible"},
83 },
84 },
85 }, nil).Once()
86
87 var out bytes.Buffer
88 err := runVolumesPrune(context.Background(), clientMock, volumesPruneOptions{DryRun: true}, &out)
89 require.NoError(t, err)
90 assert.Contains(t, out.String(), "Would delete: 2")
91}