134 lines
3.2 KiB
Go
134 lines
3.2 KiB
Go
package zim
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/pkg/errors"
|
|
"gitlab.com/wpetit/goweb/logger"
|
|
)
|
|
|
|
type readerTestCase struct {
|
|
UUID string `json:"uuid"`
|
|
EntryCount uint32 `json:"entryCount"`
|
|
Entries []struct {
|
|
Namespace Namespace `json:"namespace"`
|
|
URL string `json:"url"`
|
|
Size int64 `json:"size"`
|
|
Compression int `json:"compression"`
|
|
MimeType string `json:"mimeType"`
|
|
Title string `json:"title"`
|
|
} `json:"entries"`
|
|
}
|
|
|
|
func TestReader(t *testing.T) {
|
|
if testing.Verbose() {
|
|
logger.SetLevel(logger.LevelDebug)
|
|
logger.SetFormat(logger.FormatHuman)
|
|
}
|
|
|
|
files, err := filepath.Glob("testdata/*.zim")
|
|
if err != nil {
|
|
t.Fatalf("%+v", errors.WithStack(err))
|
|
}
|
|
|
|
for _, zf := range files {
|
|
testName := filepath.Base(zf)
|
|
testCase, err := loadZimFileTestCase(zf)
|
|
if err != nil {
|
|
t.Fatalf("%+v", errors.WithStack(err))
|
|
}
|
|
|
|
t.Run(testName, func(t *testing.T) {
|
|
reader, err := Open(zf)
|
|
if err != nil {
|
|
t.Fatalf("%+v", errors.WithStack(err))
|
|
}
|
|
|
|
defer func() {
|
|
if err := reader.Close(); err != nil {
|
|
t.Errorf("%+v", errors.WithStack(err))
|
|
}
|
|
}()
|
|
|
|
if e, g := testCase.UUID, reader.UUID(); e != g {
|
|
t.Errorf("reader.UUID(): expected '%s', got '%s'", e, g)
|
|
}
|
|
|
|
if e, g := testCase.EntryCount, reader.EntryCount(); e != g {
|
|
t.Errorf("reader.EntryCount(): expected '%v', got '%v'", e, g)
|
|
}
|
|
|
|
if testCase.Entries == nil {
|
|
return
|
|
}
|
|
|
|
for _, entryTestCase := range testCase.Entries {
|
|
testName := fmt.Sprintf("Entry/%s/%s", entryTestCase.Namespace, entryTestCase.URL)
|
|
t.Run(testName, func(t *testing.T) {
|
|
entry, err := reader.EntryWithURL(entryTestCase.Namespace, entryTestCase.URL)
|
|
if err != nil {
|
|
t.Fatalf("%+v", errors.WithStack(err))
|
|
}
|
|
|
|
content, err := entry.Redirect()
|
|
if err != nil {
|
|
t.Errorf("%+v", errors.WithStack(err))
|
|
}
|
|
|
|
if e, g := entryTestCase.MimeType, content.MimeType(); e != g {
|
|
t.Errorf("content.MimeType(): expected '%v', got '%v'", e, g)
|
|
}
|
|
|
|
if e, g := entryTestCase.Title, content.Title(); e != g {
|
|
t.Errorf("content.Title(): expected '%v', got '%v'", e, g)
|
|
}
|
|
|
|
compression, err := content.Compression()
|
|
if err != nil {
|
|
t.Errorf("%+v", errors.WithStack(err))
|
|
}
|
|
|
|
if e, g := entryTestCase.Compression, compression; e != g {
|
|
t.Errorf("content.Compression(): expected '%v', got '%v'", e, g)
|
|
}
|
|
|
|
contentReader, err := content.Reader()
|
|
if err != nil {
|
|
t.Errorf("%+v", errors.WithStack(err))
|
|
}
|
|
|
|
size, err := contentReader.Size()
|
|
if err != nil {
|
|
t.Errorf("%+v", errors.WithStack(err))
|
|
}
|
|
|
|
if e, g := entryTestCase.Size, size; e != g {
|
|
t.Errorf("content.Size(): expected '%v', got '%v'", e, g)
|
|
}
|
|
})
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func loadZimFileTestCase(zimFile string) (*readerTestCase, error) {
|
|
testCaseFile, _ := strings.CutSuffix(zimFile, ".zim")
|
|
|
|
data, err := os.ReadFile(testCaseFile + ".json")
|
|
if err != nil {
|
|
return nil, errors.WithStack(err)
|
|
}
|
|
|
|
testCase := &readerTestCase{}
|
|
if err := json.Unmarshal(data, testCase); err != nil {
|
|
return nil, errors.WithStack(err)
|
|
}
|
|
|
|
return testCase, nil
|
|
}
|