package archive import ( "archive/zip" "io/ioutil" "testing" ) func TestZipArchiver_Content(t *testing.T) { zipfilepath := "archive-content.zip" archiver := NewZipArchiver(zipfilepath) if err := archiver.ArchiveContent([]byte("This is some content"), "content.txt"); err != nil { t.Fatalf("unexpected error: %s", err) } ensureContents(t, zipfilepath, map[string][]byte{ "content.txt": []byte("This is some content"), }) } func TestZipArchiver_File(t *testing.T) { zipfilepath := "archive-file.zip" archiver := NewZipArchiver(zipfilepath) if err := archiver.ArchiveFile("./test-fixtures/test-file.txt"); err != nil { t.Fatalf("unexpected error: %s", err) } ensureContents(t, zipfilepath, map[string][]byte{ "test-file.txt": []byte("This is test content"), }) } func TestZipArchiver_Dir(t *testing.T) { zipfilepath := "archive-dir.zip" archiver := NewZipArchiver(zipfilepath) if err := archiver.ArchiveDir("./test-fixtures/test-dir"); err != nil { t.Fatalf("unexpected error: %s", err) } ensureContents(t, zipfilepath, map[string][]byte{ "file1.txt": []byte("This is file 1"), "file2.txt": []byte("This is file 2"), "file3.txt": []byte("This is file 3"), }) } func ensureContents(t *testing.T, zipfilepath string, wants map[string][]byte) { r, err := zip.OpenReader(zipfilepath) if err != nil { t.Fatalf("could not open zip file: %s", err) } defer r.Close() if len(r.File) != len(wants) { t.Errorf("mismatched file count, got %d, want %d", len(r.File), len(wants)) } for _, cf := range r.File { ensureContent(t, wants, cf) } } func ensureContent(t *testing.T, wants map[string][]byte, got *zip.File) { want, ok := wants[got.Name] if !ok { t.Errorf("additional file in zip: %s", got.Name) return } r, err := got.Open() if err != nil { t.Errorf("could not open file: %s", err) } defer r.Close() gotContentBytes, err := ioutil.ReadAll(r) if err != nil { t.Errorf("could not read file: %s", err) } wantContent := string(want) gotContent := string(gotContentBytes) if gotContent != wantContent { t.Errorf("mismatched content\ngot\n%s\nwant\n%s", gotContent, wantContent) } }