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 }