Skip to content

Commit 01f3626

Browse files
committed
test: add missing tests
1 parent 7f54ea5 commit 01f3626

File tree

5 files changed

+224
-0
lines changed

5 files changed

+224
-0
lines changed

packages/image-comparison-core/src/helpers/__snapshots__/afterScreenshot.test.ts.snap

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,16 @@ exports[`afterScreenshot > should handle only removeElements with length > 0 1`]
8787
}
8888
`;
8989

90+
exports[`afterScreenshot > should return base64 when alwaysSaveActualImage is false 1`] = `
91+
{
92+
"base64Image": "string",
93+
"devicePixelRatio": 2,
94+
"fileName": "mocked-file-name.png",
95+
"isLandscape": false,
96+
"path": "/mocked/path",
97+
}
98+
`;
99+
90100
exports[`afterScreenshot > should skip hide/remove elements when both are empty arrays 1`] = `
91101
{
92102
"devicePixelRatio": 2,

packages/image-comparison-core/src/helpers/afterScreenshot.test.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,19 @@ describe('afterScreenshot', () => {
102102
expect(result).toMatchSnapshot()
103103
})
104104

105+
it('should return base64 when alwaysSaveActualImage is false', async () => {
106+
const mockBrowserInstance = createMockBrowserInstance()
107+
const options = createBaseOptions({
108+
alwaysSaveActualImage: false,
109+
})
110+
111+
const result = await afterScreenshot(mockBrowserInstance, options)
112+
113+
expect(vi.mocked(saveBase64Image)).not.toHaveBeenCalled()
114+
expect(result.base64Image).toBe(options.base64Image)
115+
expect(result).toMatchSnapshot()
116+
})
117+
105118
it('should handle native context and skip browser operations', async () => {
106119
const mockBrowserInstance = createMockBrowserInstance()
107120
const options = createBaseOptions({

packages/image-comparison-core/src/methods/__snapshots__/images.test.ts.snap

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,20 @@ exports[`checkBaselineImageExists > should update baseline when updateBaseline i
2828
]
2929
`;
3030

31+
exports[`checkBaselineImageExists > should use provided base64 when auto-saving baseline 1`] = `
32+
[
33+
[
34+
"%s",
35+
"
36+
#####################################################################################
37+
INFO:
38+
Autosaved the image to
39+
/path/to/baseline.png
40+
#####################################################################################",
41+
],
42+
]
43+
`;
44+
3145
exports[`checkIfImageExists > should return false when file does not exist 1`] = `false`;
3246

3347
exports[`checkIfImageExists > should return true when file exists 1`] = `true`;

packages/image-comparison-core/src/methods/images.executeImageCompare.test.ts

Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -588,6 +588,162 @@ describe('executeImageCompare', () => {
588588
expect(result).toMatchSnapshot()
589589
})
590590

591+
it('should compare from base64 when not saving actuals', async () => {
592+
const base64Image = Buffer.from('base64-image').toString('base64')
593+
const optionsWithBase64 = {
594+
...mockOptions,
595+
folderOptions: {
596+
...mockOptions.folderOptions,
597+
alwaysSaveActualImage: false,
598+
autoSaveBaseline: false,
599+
}
600+
}
601+
vi.mocked(compareImages.default).mockResolvedValue({
602+
rawMisMatchPercentage: 0,
603+
misMatchPercentage: 0,
604+
getBuffer: vi.fn().mockResolvedValue(Buffer.from('diff-image-data')),
605+
diffBounds: { left: 0, top: 0, right: 0, bottom: 0 },
606+
analysisTime: 10,
607+
diffPixels: []
608+
})
609+
610+
await executeImageCompare({
611+
isViewPortScreenshot: true,
612+
isNativeContext: false,
613+
options: optionsWithBase64,
614+
testContext: mockTestContext,
615+
actualBase64Image: base64Image,
616+
})
617+
618+
expect(images.saveBase64Image).not.toHaveBeenCalled()
619+
expect(compareImages.default).toHaveBeenCalledWith(
620+
expect.any(Buffer),
621+
Buffer.from(base64Image, 'base64'),
622+
expect.any(Object),
623+
)
624+
expect(fsPromises.writeFile).not.toHaveBeenCalled()
625+
})
626+
627+
it('should disable JSON reports when actuals are not saved', async () => {
628+
const optionsWithJsonButNoSave = {
629+
...mockOptions,
630+
folderOptions: {
631+
...mockOptions.folderOptions,
632+
alwaysSaveActualImage: false,
633+
},
634+
compareOptions: {
635+
...mockOptions.compareOptions,
636+
wic: {
637+
...mockOptions.compareOptions.wic,
638+
createJsonReportFiles: true,
639+
saveAboveTolerance: 0.1,
640+
},
641+
},
642+
}
643+
644+
await executeImageCompare({
645+
isViewPortScreenshot: true,
646+
isNativeContext: false,
647+
options: optionsWithJsonButNoSave,
648+
testContext: mockTestContext,
649+
actualBase64Image: Buffer.from('base64-image').toString('base64'),
650+
})
651+
652+
expect(logWarnSpy).toHaveBeenCalled()
653+
expect(createCompareReport.createJsonReportIfNeeded).toHaveBeenCalledWith(expect.objectContaining({
654+
imageCompareOptions: expect.objectContaining({ createJsonReportFiles: false }),
655+
}))
656+
})
657+
658+
it('should save base64 actual for auto-saved baseline', async () => {
659+
const base64Image = Buffer.from('base64-image').toString('base64')
660+
const optionsWithAutoSave = {
661+
...mockOptions,
662+
folderOptions: {
663+
...mockOptions.folderOptions,
664+
alwaysSaveActualImage: false,
665+
autoSaveBaseline: true,
666+
}
667+
}
668+
vi.mocked(compareImages.default).mockResolvedValue({
669+
rawMisMatchPercentage: 0,
670+
misMatchPercentage: 0,
671+
getBuffer: vi.fn().mockResolvedValue(Buffer.from('diff-image-data')),
672+
diffBounds: { left: 0, top: 0, right: 0, bottom: 0 },
673+
analysisTime: 10,
674+
diffPixels: []
675+
})
676+
677+
await executeImageCompare({
678+
isViewPortScreenshot: true,
679+
isNativeContext: false,
680+
options: optionsWithAutoSave,
681+
testContext: mockTestContext,
682+
actualBase64Image: base64Image,
683+
})
684+
685+
expect(fsPromises.writeFile).toHaveBeenCalledWith('/mock/actual/test.png', Buffer.from(base64Image, 'base64'))
686+
})
687+
688+
it('should save base64 actual on diff when not always saving', async () => {
689+
const base64Image = Buffer.from('base64-image').toString('base64')
690+
const optionsWithDiff = {
691+
...mockOptions,
692+
folderOptions: {
693+
...mockOptions.folderOptions,
694+
alwaysSaveActualImage: false,
695+
}
696+
}
697+
vi.mocked(compareImages.default).mockResolvedValue({
698+
rawMisMatchPercentage: 0.5,
699+
misMatchPercentage: 0.5,
700+
getBuffer: vi.fn().mockResolvedValue(Buffer.from('diff-image-data')),
701+
diffBounds: { left: 0, top: 0, right: 0, bottom: 0 },
702+
analysisTime: 10,
703+
diffPixels: []
704+
})
705+
706+
await executeImageCompare({
707+
isViewPortScreenshot: true,
708+
isNativeContext: false,
709+
options: optionsWithDiff,
710+
testContext: mockTestContext,
711+
actualBase64Image: base64Image,
712+
})
713+
714+
expect(fsPromises.writeFile).toHaveBeenCalledWith('/mock/actual/test.png', Buffer.from(base64Image, 'base64'))
715+
})
716+
717+
it('should update baseline using base64 when visual baseline is updated', async () => {
718+
const base64Image = Buffer.from('base64-image').toString('base64')
719+
vi.mocked(utils.updateVisualBaseline).mockReturnValueOnce(true)
720+
const optionsWithUpdate = {
721+
...mockOptions,
722+
folderOptions: {
723+
...mockOptions.folderOptions,
724+
alwaysSaveActualImage: false,
725+
}
726+
}
727+
vi.mocked(compareImages.default).mockResolvedValue({
728+
rawMisMatchPercentage: 0,
729+
misMatchPercentage: 0,
730+
getBuffer: vi.fn().mockResolvedValue(Buffer.from('diff-image-data')),
731+
diffBounds: { left: 0, top: 0, right: 0, bottom: 0 },
732+
analysisTime: 10,
733+
diffPixels: []
734+
})
735+
736+
await executeImageCompare({
737+
isViewPortScreenshot: true,
738+
isNativeContext: false,
739+
options: optionsWithUpdate,
740+
testContext: mockTestContext,
741+
actualBase64Image: base64Image,
742+
})
743+
744+
expect(writeFileSync).toHaveBeenCalledWith('/mock/baseline/test.png', Buffer.from(base64Image, 'base64'))
745+
})
746+
591747
it('should handle Android device pixel ratio correctly', async () => {
592748
const androidOptions = {
593749
...mockOptions,

packages/image-comparison-core/src/methods/images.test.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,23 @@ describe('checkBaselineImageExists', () => {
222222
expect(logInfoSpy.mock.calls).toMatchSnapshot()
223223
})
224224

225+
it('should use provided base64 when auto-saving baseline', async () => {
226+
accessSpy.mockRejectedValue(new Error('File not found'))
227+
const base64Actual = Buffer.from('image data').toString('base64')
228+
vi.mocked(writeFileSync).mockImplementation(() => {})
229+
230+
await checkBaselineImageExists({
231+
actualFilePath: '/path/to/actual.png',
232+
baselineFilePath: '/path/to/baseline.png',
233+
autoSaveBaseline: true,
234+
actualBase64Image: base64Actual,
235+
})
236+
237+
expect(vi.mocked(readFileSync)).not.toHaveBeenCalled()
238+
expect(vi.mocked(writeFileSync)).toHaveBeenCalledWith('/path/to/baseline.png', Buffer.from(base64Actual, 'base64'))
239+
expect(logInfoSpy.mock.calls).toMatchSnapshot()
240+
})
241+
225242
it('should throw error when file does not exist and autoSaveBaseline is false', async () => {
226243
accessSpy.mockRejectedValue(new Error('File not found'))
227244

@@ -253,6 +270,20 @@ describe('checkBaselineImageExists', () => {
253270
expect(vi.mocked(writeFileSync)).not.toHaveBeenCalled()
254271
expect(logInfoSpy).not.toHaveBeenCalled()
255272
})
273+
274+
it('should mention missing actual file in error when not saved to disk', async () => {
275+
accessSpy.mockRejectedValue(new Error('File not found'))
276+
vi.mocked(fsPromises.access).mockRejectedValue(new Error('File not found'))
277+
278+
await expect(checkBaselineImageExists({
279+
actualFilePath: '/path/to/actual.png',
280+
baselineFilePath: '/path/to/baseline.png',
281+
autoSaveBaseline: false
282+
})).rejects.toThrow(/actual image was not saved to disk/)
283+
284+
expect(vi.mocked(readFileSync)).not.toHaveBeenCalled()
285+
expect(vi.mocked(writeFileSync)).not.toHaveBeenCalled()
286+
})
256287
})
257288

258289
describe('rotateBase64Image', () => {

0 commit comments

Comments
 (0)