github.com/saucelabs/saucectl@v0.175.1/internal/archive/zip/zip_test.go (about)

     1  package zip
     2  
     3  import (
     4  	"archive/zip"
     5  	"os"
     6  	"path/filepath"
     7  	"strings"
     8  	"testing"
     9  
    10  	"gotest.tools/v3/fs"
    11  
    12  	"github.com/saucelabs/saucectl/internal/sauceignore"
    13  )
    14  
    15  func TestZipper_Add(t *testing.T) {
    16  	dir := fs.NewDir(t, "tests",
    17  		fs.WithDir("screenshots", fs.WithFile("screenshot1.png", "foo", fs.WithMode(0755))),
    18  		fs.WithFile("some.foo.js", "foo", fs.WithMode(0755)),
    19  		fs.WithFile("some.other.bar.js", "bar", fs.WithMode(0755)))
    20  	defer dir.Remove()
    21  
    22  	dirBase := filepath.Base(dir.Path())
    23  
    24  	out, err := os.CreateTemp("", "add_test.*.zip")
    25  	if err != nil {
    26  		t.Errorf("failed to create temp file for storing the zip: %v", err)
    27  	}
    28  	defer os.Remove(out.Name())
    29  
    30  	sauceignoreOut, err := os.CreateTemp("", "add_test.*.zip")
    31  	if err != nil {
    32  		t.Errorf("failed to create temp file for storing the zip: %v", err)
    33  	}
    34  	defer os.Remove(sauceignoreOut.Name())
    35  
    36  	type fields struct {
    37  		W       *zip.Writer
    38  		M       sauceignore.Matcher
    39  		ZipFile *os.File
    40  	}
    41  	type args struct {
    42  		src     string
    43  		dst     string
    44  		outName string
    45  	}
    46  	tests := []struct {
    47  		name       string
    48  		fields     fields
    49  		args       args
    50  		wantErr    bool
    51  		wantFiles  []string
    52  		wantCount  int
    53  		wantLength int
    54  	}{
    55  		{
    56  			name:    "zip it up",
    57  			fields:  fields{W: zip.NewWriter(out), M: sauceignore.NewMatcher([]sauceignore.Pattern{}), ZipFile: out},
    58  			args:    args{dir.Path(), "", out.Name()},
    59  			wantErr: false,
    60  			wantFiles: []string{
    61  				dirBase,
    62  				filepath.Join(dirBase, "screenshots"),
    63  				filepath.Join(dirBase, "screenshots", "/screenshot1.png"),
    64  				filepath.Join(dirBase, "/some.foo.js"),
    65  				filepath.Join(dirBase, "/some.other.bar.js"),
    66  			},
    67  			wantCount:  5,
    68  			wantLength: len(dirBase) + len("/screenshots/screenshot1.png"),
    69  		},
    70  		{
    71  			name: "zip some.other.bar.js and skip some.foo.js file and screenshots folder",
    72  			fields: fields{
    73  				W: zip.NewWriter(sauceignoreOut),
    74  				M: sauceignore.NewMatcher([]sauceignore.Pattern{
    75  					sauceignore.NewPattern("some.foo.js"),
    76  					sauceignore.NewPattern("screenshots/"),
    77  				}),
    78  				ZipFile: sauceignoreOut,
    79  			},
    80  			args:    args{dir.Path(), "", sauceignoreOut.Name()},
    81  			wantErr: false,
    82  			wantFiles: []string{
    83  				dirBase,
    84  				filepath.Join(dirBase, "/some.other.bar.js"),
    85  			},
    86  			wantCount:  2,
    87  			wantLength: len(dirBase) + len("/some.other.bar.js"),
    88  		},
    89  	}
    90  	for _, tt := range tests {
    91  		t.Run(tt.name, func(t *testing.T) {
    92  			z := &Writer{
    93  				W:       tt.fields.W,
    94  				M:       tt.fields.M,
    95  				ZipFile: tt.fields.ZipFile,
    96  			}
    97  			fileCount, pathLength, err := z.Add(tt.args.src, tt.args.dst)
    98  			if (err != nil) != tt.wantErr {
    99  				t.Errorf("Add() error = %v, wantErr %v", err, tt.wantErr)
   100  			}
   101  			if err := z.Close(); err != nil {
   102  				t.Errorf("failed to close archive: %v", err)
   103  			}
   104  
   105  			r, err := zip.OpenReader(tt.args.outName)
   106  			if err != nil {
   107  				t.Errorf("failed to open %v: %v", tt.args.outName, err)
   108  			}
   109  
   110  			for i, f := range r.File {
   111  				if !strings.Contains(f.Name, tt.wantFiles[i]) {
   112  					t.Errorf("got %v, want %v", f.Name, tt.wantFiles[i])
   113  				}
   114  			}
   115  			if tt.wantCount != fileCount {
   116  				t.Errorf("got %v, want %v", fileCount, tt.wantCount)
   117  			}
   118  			if tt.wantLength != pathLength {
   119  				t.Errorf("got %v, want %v", pathLength, tt.wantLength)
   120  			}
   121  		})
   122  	}
   123  }