github.com/noqcks/syft@v0.0.0-20230920222752-a9e2c4e288e5/cmd/syft/cli/ui/handle_pull_docker_image_test.go (about) 1 package ui 2 3 import ( 4 "testing" 5 6 "github.com/gkampitakis/go-snaps/snaps" 7 "github.com/wagoodman/go-progress" 8 9 "github.com/anchore/stereoscope/pkg/image/docker" 10 ) 11 12 var _ dockerPullStatus = (*mockDockerPullStatus)(nil) 13 14 type mockDockerPullStatus struct { 15 complete bool 16 layers []docker.LayerID 17 current map[docker.LayerID]docker.LayerState 18 } 19 20 func (m mockDockerPullStatus) Complete() bool { 21 return m.complete 22 } 23 24 func (m mockDockerPullStatus) Layers() []docker.LayerID { 25 return m.layers 26 } 27 28 func (m mockDockerPullStatus) Current(id docker.LayerID) docker.LayerState { 29 return m.current[id] 30 } 31 32 func Test_dockerPullStatusFormatter_Render(t *testing.T) { 33 34 tests := []struct { 35 name string 36 status dockerPullStatus 37 }{ 38 { 39 name: "pulling", 40 status: func() dockerPullStatus { 41 complete := progress.NewManual(10) 42 complete.Set(10) 43 complete.SetCompleted() 44 45 quarter := progress.NewManual(10) 46 quarter.Set(2) 47 48 half := progress.NewManual(10) 49 half.Set(6) 50 51 empty := progress.NewManual(10) 52 53 return mockDockerPullStatus{ 54 complete: false, 55 layers: []docker.LayerID{ 56 "sha256:1", 57 "sha256:2", 58 "sha256:3", 59 }, 60 current: map[docker.LayerID]docker.LayerState{ 61 "sha256:1": { 62 Phase: docker.ExtractingPhase, 63 PhaseProgress: half, 64 DownloadProgress: complete, 65 }, 66 "sha256:2": { 67 Phase: docker.DownloadingPhase, 68 PhaseProgress: quarter, 69 DownloadProgress: quarter, 70 }, 71 "sha256:3": { 72 Phase: docker.WaitingPhase, 73 PhaseProgress: empty, 74 DownloadProgress: empty, 75 }, 76 }, 77 } 78 }(), 79 }, 80 { 81 name: "download complete", 82 status: func() dockerPullStatus { 83 complete := progress.NewManual(10) 84 complete.Set(10) 85 complete.SetCompleted() 86 87 quarter := progress.NewManual(10) 88 quarter.Set(2) 89 90 half := progress.NewManual(10) 91 half.Set(6) 92 93 empty := progress.NewManual(10) 94 95 return mockDockerPullStatus{ 96 complete: false, 97 layers: []docker.LayerID{ 98 "sha256:1", 99 "sha256:2", 100 "sha256:3", 101 }, 102 current: map[docker.LayerID]docker.LayerState{ 103 "sha256:1": { 104 Phase: docker.ExtractingPhase, 105 PhaseProgress: complete, 106 DownloadProgress: complete, 107 }, 108 "sha256:2": { 109 Phase: docker.ExtractingPhase, 110 PhaseProgress: quarter, 111 DownloadProgress: complete, 112 }, 113 "sha256:3": { 114 Phase: docker.ExtractingPhase, 115 PhaseProgress: empty, 116 DownloadProgress: complete, 117 }, 118 }, 119 } 120 }(), 121 }, 122 { 123 name: "complete", 124 status: func() dockerPullStatus { 125 complete := progress.NewManual(10) 126 complete.Set(10) 127 complete.SetCompleted() 128 129 return mockDockerPullStatus{ 130 complete: true, 131 layers: []docker.LayerID{ 132 "sha256:1", 133 "sha256:2", 134 "sha256:3", 135 }, 136 current: map[docker.LayerID]docker.LayerState{ 137 "sha256:1": { 138 Phase: docker.PullCompletePhase, 139 PhaseProgress: complete, 140 DownloadProgress: complete, 141 }, 142 "sha256:2": { 143 Phase: docker.PullCompletePhase, 144 PhaseProgress: complete, 145 DownloadProgress: complete, 146 }, 147 "sha256:3": { 148 Phase: docker.PullCompletePhase, 149 PhaseProgress: complete, 150 DownloadProgress: complete, 151 }, 152 }, 153 } 154 }(), 155 }, 156 } 157 for _, tt := range tests { 158 t.Run(tt.name, func(t *testing.T) { 159 f := newDockerPullStatusFormatter() 160 snaps.MatchSnapshot(t, f.Render(tt.status)) 161 }) 162 } 163 }