mirror of
https://github.com/Belphemur/CBZOptimizer.git
synced 2025-10-14 04:28:51 +02:00
test: add test for page type
This commit is contained in:
@@ -10,53 +10,39 @@ import (
|
|||||||
|
|
||||||
"github.com/belphemur/CBZOptimizer/v2/internal/manga"
|
"github.com/belphemur/CBZOptimizer/v2/internal/manga"
|
||||||
"github.com/belphemur/CBZOptimizer/v2/internal/utils/errs"
|
"github.com/belphemur/CBZOptimizer/v2/internal/utils/errs"
|
||||||
"github.com/belphemur/CBZOptimizer/v2/pkg/converter/constant"
|
|
||||||
"golang.org/x/exp/slices"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestConvertChapter(t *testing.T) {
|
func TestConvertChapter(t *testing.T) {
|
||||||
|
|
||||||
testCases := []struct {
|
testCases := []struct {
|
||||||
name string
|
name string
|
||||||
genTestChapter func(path string) (*manga.Chapter, error)
|
genTestChapter func(path string, isSplit bool) (*manga.Chapter, []string, error)
|
||||||
split bool
|
split bool
|
||||||
expectFailure []constant.ConversionFormat
|
|
||||||
expectPartialSuccess []constant.ConversionFormat
|
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "All split pages",
|
name: "All split pages",
|
||||||
genTestChapter: genHugePage,
|
genTestChapter: genHugePage,
|
||||||
split: true,
|
split: true,
|
||||||
expectFailure: []constant.ConversionFormat{},
|
|
||||||
expectPartialSuccess: []constant.ConversionFormat{},
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Big Pages, no split",
|
name: "Big Pages, no split",
|
||||||
genTestChapter: genHugePage,
|
genTestChapter: genHugePage,
|
||||||
split: false,
|
split: false,
|
||||||
expectFailure: []constant.ConversionFormat{constant.WebP},
|
|
||||||
expectPartialSuccess: []constant.ConversionFormat{},
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "No split pages",
|
name: "No split pages",
|
||||||
genTestChapter: genSmallPages,
|
genTestChapter: genSmallPages,
|
||||||
split: false,
|
split: false,
|
||||||
expectFailure: []constant.ConversionFormat{},
|
|
||||||
expectPartialSuccess: []constant.ConversionFormat{},
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Mix of split and no split pages",
|
name: "Mix of split and no split pages",
|
||||||
genTestChapter: genMixSmallBig,
|
genTestChapter: genMixSmallBig,
|
||||||
split: true,
|
split: true,
|
||||||
expectFailure: []constant.ConversionFormat{},
|
|
||||||
expectPartialSuccess: []constant.ConversionFormat{},
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Mix of Huge and small page",
|
name: "Mix of Huge and small page",
|
||||||
genTestChapter: genMixSmallHuge,
|
genTestChapter: genMixSmallHuge,
|
||||||
split: false,
|
split: false,
|
||||||
expectFailure: []constant.ConversionFormat{},
|
|
||||||
expectPartialSuccess: []constant.ConversionFormat{constant.WebP},
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
// Load test genTestChapter from testdata
|
// Load test genTestChapter from testdata
|
||||||
@@ -74,7 +60,7 @@ func TestConvertChapter(t *testing.T) {
|
|||||||
t.Run(converter.Format().String(), func(t *testing.T) {
|
t.Run(converter.Format().String(), func(t *testing.T) {
|
||||||
for _, tc := range testCases {
|
for _, tc := range testCases {
|
||||||
t.Run(tc.name, func(t *testing.T) {
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
chapter, err := tc.genTestChapter(temp.Name())
|
chapter, expectedExtensions, err := tc.genTestChapter(temp.Name(), tc.split)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("failed to load test genTestChapter: %v", err)
|
t.Fatalf("failed to load test genTestChapter: %v", err)
|
||||||
}
|
}
|
||||||
@@ -87,30 +73,22 @@ func TestConvertChapter(t *testing.T) {
|
|||||||
|
|
||||||
convertedChapter, err := converter.ConvertChapter(context.Background(), chapter, quality, tc.split, progress)
|
convertedChapter, err := converter.ConvertChapter(context.Background(), chapter, quality, tc.split, progress)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if convertedChapter != nil && slices.Contains(tc.expectPartialSuccess, converter.Format()) {
|
|
||||||
t.Logf("Partial success to convert genTestChapter: %v", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if slices.Contains(tc.expectFailure, converter.Format()) {
|
|
||||||
t.Logf("Expected failure to convert genTestChapter: %v", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
t.Fatalf("failed to convert genTestChapter: %v", err)
|
t.Fatalf("failed to convert genTestChapter: %v", err)
|
||||||
} else if slices.Contains(tc.expectFailure, converter.Format()) {
|
|
||||||
t.Fatalf("expected failure to convert genTestChapter didn't happen")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(convertedChapter.Pages) == 0 {
|
if len(convertedChapter.Pages) == 0 {
|
||||||
t.Fatalf("no pages were converted")
|
t.Fatalf("no pages were converted")
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(convertedChapter.Pages) != len(chapter.Pages) {
|
if len(convertedChapter.Pages) != len(expectedExtensions) {
|
||||||
t.Fatalf("converted chapter has different number of pages")
|
t.Fatalf("converted chapter has %d pages but expected %d", len(convertedChapter.Pages), len(expectedExtensions))
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, page := range convertedChapter.Pages {
|
// Check each page's extension against the expected array
|
||||||
if page.Extension != ".webp" {
|
for i, page := range convertedChapter.Pages {
|
||||||
t.Errorf("page %d was not converted to webp format", page.Index)
|
expectedExt := expectedExtensions[i]
|
||||||
|
if page.Extension != expectedExt {
|
||||||
|
t.Errorf("page %d has extension %s but expected %s", page.Index, page.Extension, expectedExt)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -119,39 +97,43 @@ func TestConvertChapter(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func genHugePage(path string) (*manga.Chapter, error) {
|
func genHugePage(path string, isSplit bool) (*manga.Chapter, []string, error) {
|
||||||
file, err := os.Open(path)
|
file, err := os.Open(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
defer errs.Capture(&err, file.Close, "failed to close file")
|
defer errs.Capture(&err, file.Close, "failed to close file")
|
||||||
|
|
||||||
var pages []*manga.Page
|
var pages []*manga.Page
|
||||||
for i := 0; i < 1; i++ { // Assuming there are 5 pages for the test
|
expectedExtensions := []string{".jpg"} // One image that's generated as JPEG
|
||||||
img := image.NewRGBA(image.Rect(0, 0, 1, 17000))
|
if isSplit {
|
||||||
buf := new(bytes.Buffer)
|
expectedExtensions = []string{".webp", ".webp", ".webp", ".webp", ".webp", ".webp", ".webp", ".webp", ".webp"}
|
||||||
err := jpeg.Encode(buf, img, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
page := &manga.Page{
|
|
||||||
Index: uint16(i),
|
|
||||||
Contents: buf,
|
|
||||||
Extension: ".jpg",
|
|
||||||
}
|
|
||||||
pages = append(pages, page)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Create one tall page
|
||||||
|
img := image.NewRGBA(image.Rect(0, 0, 1, 17000))
|
||||||
|
buf := new(bytes.Buffer)
|
||||||
|
err = jpeg.Encode(buf, img, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
page := &manga.Page{
|
||||||
|
Index: 0,
|
||||||
|
Contents: buf,
|
||||||
|
Extension: ".jpg",
|
||||||
|
}
|
||||||
|
pages = append(pages, page)
|
||||||
|
|
||||||
return &manga.Chapter{
|
return &manga.Chapter{
|
||||||
FilePath: path,
|
FilePath: path,
|
||||||
Pages: pages,
|
Pages: pages,
|
||||||
}, nil
|
}, expectedExtensions, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func genSmallPages(path string) (*manga.Chapter, error) {
|
func genSmallPages(path string, isSplit bool) (*manga.Chapter, []string, error) {
|
||||||
file, err := os.Open(path)
|
file, err := os.Open(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
defer errs.Capture(&err, file.Close, "failed to close file")
|
defer errs.Capture(&err, file.Close, "failed to close file")
|
||||||
|
|
||||||
@@ -159,9 +141,9 @@ func genSmallPages(path string) (*manga.Chapter, error) {
|
|||||||
for i := 0; i < 5; i++ { // Assuming there are 5 pages for the test
|
for i := 0; i < 5; i++ { // Assuming there are 5 pages for the test
|
||||||
img := image.NewRGBA(image.Rect(0, 0, 300, 1000))
|
img := image.NewRGBA(image.Rect(0, 0, 300, 1000))
|
||||||
buf := new(bytes.Buffer)
|
buf := new(bytes.Buffer)
|
||||||
err := jpeg.Encode(buf, img, nil)
|
err = jpeg.Encode(buf, img, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
page := &manga.Page{
|
page := &manga.Page{
|
||||||
Index: uint16(i),
|
Index: uint16(i),
|
||||||
@@ -174,13 +156,13 @@ func genSmallPages(path string) (*manga.Chapter, error) {
|
|||||||
return &manga.Chapter{
|
return &manga.Chapter{
|
||||||
FilePath: path,
|
FilePath: path,
|
||||||
Pages: pages,
|
Pages: pages,
|
||||||
}, nil
|
}, []string{".webp", ".webp", ".webp", ".webp", ".webp"}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func genMixSmallBig(path string) (*manga.Chapter, error) {
|
func genMixSmallBig(path string, isSplit bool) (*manga.Chapter, []string, error) {
|
||||||
file, err := os.Open(path)
|
file, err := os.Open(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
defer errs.Capture(&err, file.Close, "failed to close file")
|
defer errs.Capture(&err, file.Close, "failed to close file")
|
||||||
|
|
||||||
@@ -190,7 +172,7 @@ func genMixSmallBig(path string) (*manga.Chapter, error) {
|
|||||||
buf := new(bytes.Buffer)
|
buf := new(bytes.Buffer)
|
||||||
err := jpeg.Encode(buf, img, nil)
|
err := jpeg.Encode(buf, img, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
page := &manga.Page{
|
page := &manga.Page{
|
||||||
Index: uint16(i),
|
Index: uint16(i),
|
||||||
@@ -199,17 +181,21 @@ func genMixSmallBig(path string) (*manga.Chapter, error) {
|
|||||||
}
|
}
|
||||||
pages = append(pages, page)
|
pages = append(pages, page)
|
||||||
}
|
}
|
||||||
|
expectedExtensions := []string{".webp", ".webp", ".webp", ".webp", ".webp"}
|
||||||
|
if isSplit {
|
||||||
|
expectedExtensions = []string{".webp", ".webp", ".webp", ".webp", ".webp", ".webp", ".webp", ".webp"}
|
||||||
|
}
|
||||||
|
|
||||||
return &manga.Chapter{
|
return &manga.Chapter{
|
||||||
FilePath: path,
|
FilePath: path,
|
||||||
Pages: pages,
|
Pages: pages,
|
||||||
}, nil
|
}, expectedExtensions, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func genMixSmallHuge(path string) (*manga.Chapter, error) {
|
func genMixSmallHuge(path string, isSplit bool) (*manga.Chapter, []string, error) {
|
||||||
file, err := os.Open(path)
|
file, err := os.Open(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
defer errs.Capture(&err, file.Close, "failed to close file")
|
defer errs.Capture(&err, file.Close, "failed to close file")
|
||||||
|
|
||||||
@@ -219,7 +205,7 @@ func genMixSmallHuge(path string) (*manga.Chapter, error) {
|
|||||||
buf := new(bytes.Buffer)
|
buf := new(bytes.Buffer)
|
||||||
err := jpeg.Encode(buf, img, nil)
|
err := jpeg.Encode(buf, img, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
page := &manga.Page{
|
page := &manga.Page{
|
||||||
Index: uint16(i),
|
Index: uint16(i),
|
||||||
@@ -232,5 +218,5 @@ func genMixSmallHuge(path string) (*manga.Chapter, error) {
|
|||||||
return &manga.Chapter{
|
return &manga.Chapter{
|
||||||
FilePath: path,
|
FilePath: path,
|
||||||
Pages: pages,
|
Pages: pages,
|
||||||
}, nil
|
}, []string{".webp", ".webp", ".webp", ".webp", ".webp", ".webp", ".webp", ".webp", ".jpg", ".jpg"}, nil
|
||||||
}
|
}
|
||||||
|
@@ -236,30 +236,35 @@ func TestConverter_convertPage(t *testing.T) {
|
|||||||
format string
|
format string
|
||||||
isToBeConverted bool
|
isToBeConverted bool
|
||||||
expectWebP bool
|
expectWebP bool
|
||||||
|
expectError bool
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "Convert PNG to WebP",
|
name: "Convert PNG to WebP",
|
||||||
format: "png",
|
format: "png",
|
||||||
isToBeConverted: true,
|
isToBeConverted: true,
|
||||||
expectWebP: true,
|
expectWebP: true,
|
||||||
|
expectError: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Convert GIF to WebP",
|
name: "Convert GIF to WebP",
|
||||||
format: "gif",
|
format: "gif",
|
||||||
isToBeConverted: true,
|
isToBeConverted: true,
|
||||||
expectWebP: true,
|
expectWebP: true,
|
||||||
|
expectError: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Already WebP",
|
name: "Already WebP",
|
||||||
format: "webp",
|
format: "webp",
|
||||||
isToBeConverted: true,
|
isToBeConverted: true,
|
||||||
expectWebP: true,
|
expectWebP: true,
|
||||||
|
expectError: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Skip conversion",
|
name: "Skip conversion",
|
||||||
format: "png",
|
format: "png",
|
||||||
isToBeConverted: false,
|
isToBeConverted: false,
|
||||||
expectWebP: false,
|
expectWebP: false,
|
||||||
|
expectError: false,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -271,19 +276,47 @@ func TestConverter_convertPage(t *testing.T) {
|
|||||||
container := manga.NewContainer(page, img, tt.format, tt.isToBeConverted)
|
container := manga.NewContainer(page, img, tt.format, tt.isToBeConverted)
|
||||||
|
|
||||||
converted, err := converter.convertPage(container, 80)
|
converted, err := converter.convertPage(container, 80)
|
||||||
require.NoError(t, err)
|
|
||||||
assert.NotNil(t, converted)
|
|
||||||
|
|
||||||
if tt.expectWebP {
|
if tt.expectError {
|
||||||
assert.Equal(t, ".webp", converted.Page.Extension)
|
assert.Error(t, err)
|
||||||
validateConvertedImage(t, converted.Page)
|
assert.Nil(t, converted)
|
||||||
} else {
|
} else {
|
||||||
assert.NotEqual(t, ".webp", converted.Page.Extension)
|
require.NoError(t, err)
|
||||||
|
assert.NotNil(t, converted)
|
||||||
|
|
||||||
|
if tt.expectWebP {
|
||||||
|
assert.Equal(t, ".webp", converted.Page.Extension)
|
||||||
|
validateConvertedImage(t, converted.Page)
|
||||||
|
} else {
|
||||||
|
assert.NotEqual(t, ".webp", converted.Page.Extension)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestConverter_convertPage_WithCorruptedImage(t *testing.T) {
|
||||||
|
converter := New()
|
||||||
|
err := converter.PrepareConverter()
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
// Create a corrupted PNG image by creating a page with invalid data
|
||||||
|
corruptedPage := &manga.Page{
|
||||||
|
Index: 1,
|
||||||
|
Contents: &bytes.Buffer{}, // Empty buffer - should cause decode error
|
||||||
|
Extension: ".png",
|
||||||
|
Size: 0,
|
||||||
|
}
|
||||||
|
|
||||||
|
container := manga.NewContainer(corruptedPage, nil, "png", true)
|
||||||
|
|
||||||
|
converted, err := converter.convertPage(container, 80)
|
||||||
|
|
||||||
|
// This should return nil container and error because decode will fail with "image: unknown format"
|
||||||
|
assert.Error(t, err)
|
||||||
|
assert.Nil(t, converted)
|
||||||
|
}
|
||||||
|
|
||||||
func TestConverter_checkPageNeedsSplit(t *testing.T) {
|
func TestConverter_checkPageNeedsSplit(t *testing.T) {
|
||||||
converter := New()
|
converter := New()
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user