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  }