From 30ea3d45832f235982a72f656a7a6d4386abf47f Mon Sep 17 00:00:00 2001 From: Antoine Aflalo <197810+Belphemur@users.noreply.github.com> Date: Wed, 3 Sep 2025 21:34:39 -0400 Subject: [PATCH] test: add test for page type --- pkg/converter/converter_test.go | 140 ++++++++++------------ pkg/converter/webp/webp_converter_test.go | 45 ++++++- 2 files changed, 102 insertions(+), 83 deletions(-) diff --git a/pkg/converter/converter_test.go b/pkg/converter/converter_test.go index 6563f86..271f1aa 100644 --- a/pkg/converter/converter_test.go +++ b/pkg/converter/converter_test.go @@ -10,53 +10,39 @@ import ( "github.com/belphemur/CBZOptimizer/v2/internal/manga" "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) { testCases := []struct { - name string - genTestChapter func(path string) (*manga.Chapter, error) - split bool - expectFailure []constant.ConversionFormat - expectPartialSuccess []constant.ConversionFormat + name string + genTestChapter func(path string, isSplit bool) (*manga.Chapter, []string, error) + split bool }{ { - name: "All split pages", - genTestChapter: genHugePage, - split: true, - expectFailure: []constant.ConversionFormat{}, - expectPartialSuccess: []constant.ConversionFormat{}, + name: "All split pages", + genTestChapter: genHugePage, + split: true, }, { - name: "Big Pages, no split", - genTestChapter: genHugePage, - split: false, - expectFailure: []constant.ConversionFormat{constant.WebP}, - expectPartialSuccess: []constant.ConversionFormat{}, + name: "Big Pages, no split", + genTestChapter: genHugePage, + split: false, }, { - name: "No split pages", - genTestChapter: genSmallPages, - split: false, - expectFailure: []constant.ConversionFormat{}, - expectPartialSuccess: []constant.ConversionFormat{}, + name: "No split pages", + genTestChapter: genSmallPages, + split: false, }, { - name: "Mix of split and no split pages", - genTestChapter: genMixSmallBig, - split: true, - expectFailure: []constant.ConversionFormat{}, - expectPartialSuccess: []constant.ConversionFormat{}, + name: "Mix of split and no split pages", + genTestChapter: genMixSmallBig, + split: true, }, { - name: "Mix of Huge and small page", - genTestChapter: genMixSmallHuge, - split: false, - expectFailure: []constant.ConversionFormat{}, - expectPartialSuccess: []constant.ConversionFormat{constant.WebP}, + name: "Mix of Huge and small page", + genTestChapter: genMixSmallHuge, + split: false, }, } // Load test genTestChapter from testdata @@ -74,7 +60,7 @@ func TestConvertChapter(t *testing.T) { t.Run(converter.Format().String(), func(t *testing.T) { for _, tc := range testCases { 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 { 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) 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) - } else if slices.Contains(tc.expectFailure, converter.Format()) { - t.Fatalf("expected failure to convert genTestChapter didn't happen") } if len(convertedChapter.Pages) == 0 { t.Fatalf("no pages were converted") } - if len(convertedChapter.Pages) != len(chapter.Pages) { - t.Fatalf("converted chapter has different number of pages") + if len(convertedChapter.Pages) != len(expectedExtensions) { + t.Fatalf("converted chapter has %d pages but expected %d", len(convertedChapter.Pages), len(expectedExtensions)) } - for _, page := range convertedChapter.Pages { - if page.Extension != ".webp" { - t.Errorf("page %d was not converted to webp format", page.Index) + // Check each page's extension against the expected array + for i, page := range convertedChapter.Pages { + 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) if err != nil { - return nil, err + return nil, nil, err } defer errs.Capture(&err, file.Close, "failed to close file") var pages []*manga.Page - for i := 0; i < 1; i++ { // Assuming there are 5 pages for the test - img := image.NewRGBA(image.Rect(0, 0, 1, 17000)) - buf := new(bytes.Buffer) - 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) + expectedExtensions := []string{".jpg"} // One image that's generated as JPEG + if isSplit { + expectedExtensions = []string{".webp", ".webp", ".webp", ".webp", ".webp", ".webp", ".webp", ".webp", ".webp"} } + // 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{ FilePath: path, 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) if err != nil { - return nil, err + return nil, nil, err } 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 img := image.NewRGBA(image.Rect(0, 0, 300, 1000)) buf := new(bytes.Buffer) - err := jpeg.Encode(buf, img, nil) + err = jpeg.Encode(buf, img, nil) if err != nil { - return nil, err + return nil, nil, err } page := &manga.Page{ Index: uint16(i), @@ -174,13 +156,13 @@ func genSmallPages(path string) (*manga.Chapter, error) { return &manga.Chapter{ FilePath: path, 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) if err != nil { - return nil, err + return nil, nil, err } 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) err := jpeg.Encode(buf, img, nil) if err != nil { - return nil, err + return nil, nil, err } page := &manga.Page{ Index: uint16(i), @@ -199,17 +181,21 @@ func genMixSmallBig(path string) (*manga.Chapter, error) { } 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{ FilePath: path, 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) if err != nil { - return nil, err + return nil, nil, err } 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) err := jpeg.Encode(buf, img, nil) if err != nil { - return nil, err + return nil, nil, err } page := &manga.Page{ Index: uint16(i), @@ -232,5 +218,5 @@ func genMixSmallHuge(path string) (*manga.Chapter, error) { return &manga.Chapter{ FilePath: path, Pages: pages, - }, nil + }, []string{".webp", ".webp", ".webp", ".webp", ".webp", ".webp", ".webp", ".webp", ".jpg", ".jpg"}, nil } diff --git a/pkg/converter/webp/webp_converter_test.go b/pkg/converter/webp/webp_converter_test.go index bfce873..c421182 100644 --- a/pkg/converter/webp/webp_converter_test.go +++ b/pkg/converter/webp/webp_converter_test.go @@ -236,30 +236,35 @@ func TestConverter_convertPage(t *testing.T) { format string isToBeConverted bool expectWebP bool + expectError bool }{ { name: "Convert PNG to WebP", format: "png", isToBeConverted: true, expectWebP: true, + expectError: false, }, { name: "Convert GIF to WebP", format: "gif", isToBeConverted: true, expectWebP: true, + expectError: false, }, { name: "Already WebP", format: "webp", isToBeConverted: true, expectWebP: true, + expectError: false, }, { name: "Skip conversion", format: "png", isToBeConverted: false, expectWebP: false, + expectError: false, }, } @@ -271,19 +276,47 @@ func TestConverter_convertPage(t *testing.T) { container := manga.NewContainer(page, img, tt.format, tt.isToBeConverted) converted, err := converter.convertPage(container, 80) - require.NoError(t, err) - assert.NotNil(t, converted) - if tt.expectWebP { - assert.Equal(t, ".webp", converted.Page.Extension) - validateConvertedImage(t, converted.Page) + if tt.expectError { + assert.Error(t, err) + assert.Nil(t, converted) } 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) { converter := New()