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  }