package store import ( "archive/tar" "archive/zip" "bytes" "strings" "testing" ) func makeZip(t *testing.T) []byte { t.Helper() var buf bytes.Buffer w := zip.NewWriter(&buf) fw, err := w.Create("docs/nota.txt") if err != nil { t.Fatal(err) } fw.Write([]byte("ola")) w.Create("vazia/") if err := w.Close(); err != nil { t.Fatal(err) } return buf.Bytes() } func makeTar(t *testing.T) []byte { t.Helper() var buf bytes.Buffer w := tar.NewWriter(&buf) body := []byte("abc") w.WriteHeader(&tar.Header{Name: "a.txt", Mode: 0o600, Size: int64(len(body))}) w.Write(body) w.WriteHeader(&tar.Header{Name: "dir", Typeflag: tar.TypeDir, Mode: 0o755}) if err := w.Close(); err != nil { t.Fatal(err) } return buf.Bytes() } func TestListArchiveZip(t *testing.T) { s := newTestStore(t) m, err := s.AddFile("backup.zip", "", "", bytes.NewReader(makeZip(t))) if err != nil { t.Fatalf("AddFile: %v", err) } entries, total, trunc, err := s.ListArchive(m.ID) if err != nil { t.Fatalf("ListArchive: %v", err) } if total != 2 || trunc || len(entries) != 2 { t.Fatalf("inesperado: total=%d trunc=%v entries=%v", total, trunc, entries) } if entries[0].Name != "docs/nota.txt" || entries[0].Dir || entries[0].Size != 3 { t.Errorf("entry0: %+v", entries[0]) } if entries[1].Name != "vazia/" || !entries[1].Dir { t.Errorf("entry1: %+v", entries[1]) } } func TestListArchiveTarAndRejectsOthers(t *testing.T) { s := newTestStore(t) m, err := s.AddFile("dados.tar", "", "", bytes.NewReader(makeTar(t))) if err != nil { t.Fatalf("AddFile: %v", err) } entries, total, _, err := s.ListArchive(m.ID) if err != nil { t.Fatalf("ListArchive: %v", err) } if total != 2 || len(entries) != 2 || entries[0].Name != "a.txt" { t.Fatalf("inesperado: total=%d entries=%v", total, entries) } txt, err := s.AddFile("nota.txt", "", "", strings.NewReader("oi")) if err != nil { t.Fatalf("AddFile: %v", err) } if _, _, _, err := s.ListArchive(txt.ID); err == nil { t.Fatalf("esperava erro para .txt") } if _, _, _, err := s.ListArchive("inexistente01"); err == nil { t.Fatalf("esperava erro para id inexistente") } }