github.com/cozy/cozy-stack@v0.0.0-20240603063001-31110fa4cae1/worker/archive/unzip_test.go (about) 1 package archive 2 3 import ( 4 "io" 5 "os" 6 "testing" 7 "time" 8 9 "github.com/cozy/cozy-stack/model/vfs" 10 "github.com/cozy/cozy-stack/pkg/config/config" 11 "github.com/cozy/cozy-stack/pkg/consts" 12 "github.com/cozy/cozy-stack/tests/testutils" 13 "github.com/stretchr/testify/assert" 14 ) 15 16 func Test_archive(t *testing.T) { 17 if testing.Short() { 18 t.Skip("an instance is required for this test: test skipped due to the use of --short flag") 19 } 20 21 config.UseTestFile(t) 22 setup := testutils.NewSetup(t, t.Name()) 23 24 inst := setup.GetTestInstance() 25 26 t.Run("test unzip", func(t *testing.T) { 27 fs := inst.VFS() 28 dst, err := vfs.Mkdir(fs, "/destination", nil) 29 assert.NoError(t, err) 30 _, err = vfs.Mkdir(fs, "/destination/foo", nil) 31 assert.NoError(t, err) 32 33 fd, err := os.Open("../../tests/fixtures/logos.zip") 34 assert.NoError(t, err) 35 defer fd.Close() 36 zip, err := vfs.NewFileDoc("logos.zip", consts.RootDirID, -1, nil, "application/zip", "application", time.Now(), false, false, false, nil) 37 assert.NoError(t, err) 38 file, err := fs.CreateFile(zip, nil) 39 assert.NoError(t, err) 40 _, err = io.Copy(file, fd) 41 assert.NoError(t, err) 42 assert.NoError(t, file.Close()) 43 44 _, err = fs.OpenFile(zip) 45 assert.NoError(t, err) 46 47 err = unzip(fs, zip.ID(), dst.ID()) 48 assert.NoError(t, err) 49 50 blue, err := fs.FileByPath("/destination/blue.svg") 51 assert.NoError(t, err) 52 assert.Equal(t, int64(2029), blue.ByteSize) 53 54 white, err := fs.FileByPath("/destination/white.svg") 55 assert.NoError(t, err) 56 assert.Equal(t, int64(2030), white.ByteSize) 57 58 baz, err := fs.FileByPath("/destination/foo/bar/baz") 59 assert.NoError(t, err) 60 assert.Equal(t, int64(4), baz.ByteSize) 61 }) 62 63 t.Run("test zip", func(t *testing.T) { 64 fs := inst.VFS() 65 src, err := vfs.Mkdir(fs, "/src", nil) 66 assert.NoError(t, err) 67 dst, err := vfs.Mkdir(fs, "/dst", nil) 68 assert.NoError(t, err) 69 70 fd, err := os.Open("../../tests/fixtures/wet-cozy_20160910__M4Dz.jpg") 71 assert.NoError(t, err) 72 defer fd.Close() 73 one, err := vfs.NewFileDoc("wet-cozy.jpg", src.ID(), -1, nil, "image/jpeg", "image", time.Now(), false, false, false, nil) 74 assert.NoError(t, err) 75 file, err := fs.CreateFile(one, nil) 76 assert.NoError(t, err) 77 _, err = io.Copy(file, fd) 78 assert.NoError(t, err) 79 assert.NoError(t, file.Close()) 80 81 at := time.Date(2019, 6, 15, 1, 2, 3, 4, time.UTC) 82 two, err := vfs.NewFileDoc("hello.txt", src.ID(), -1, nil, "text/plain", "text", at, false, false, false, nil) 83 assert.NoError(t, err) 84 file, err = fs.CreateFile(two, nil) 85 assert.NoError(t, err) 86 _, err = file.Write([]byte("world")) 87 assert.NoError(t, err) 88 assert.NoError(t, file.Close()) 89 90 files := map[string]string{ 91 "wet-cozy.jpg": one.ID(), 92 "hello.txt": two.ID(), 93 } 94 95 err = createZip(fs, files, src.ID(), "archive.zip") 96 assert.NoError(t, err) 97 98 zipDoc, err := fs.FileByPath("/src/archive.zip") 99 assert.NoError(t, err) 100 101 err = unzip(fs, zipDoc.ID(), dst.ID()) 102 assert.NoError(t, err) 103 104 f, err := fs.FileByPath("/dst/wet-cozy.jpg") 105 assert.NoError(t, err) 106 assert.Equal(t, one.ByteSize, f.ByteSize) 107 assert.Equal(t, one.MD5Sum, f.MD5Sum) 108 // The zip archive has only a precision of a second for the modified field 109 assert.Equal(t, one.UpdatedAt.Unix(), f.UpdatedAt.Unix()) 110 111 f, err = fs.FileByPath("/dst/hello.txt") 112 assert.NoError(t, err) 113 assert.Equal(t, two.ByteSize, f.ByteSize) 114 assert.Equal(t, two.MD5Sum, f.MD5Sum) 115 // The zip archive has only a precision of a second for the modified field 116 assert.Equal(t, two.UpdatedAt.Unix(), f.UpdatedAt.Unix()) 117 }) 118 }