Skip to content

Commit 0a2b6d0

Browse files
committed
fix: alwaysSaveActualImage: false does not respect comparison threshold larger than 0
Fixes #1111 When `alwaysSaveActualImage` is `false`, the actual image is no longer written to disk if the mismatch is below the configured tolerance, avoiding extra actuals when the comparison still passes.
1 parent 3f86c24 commit 0a2b6d0

3 files changed

Lines changed: 85 additions & 1 deletion

File tree

.changeset/smooth-berries-fix.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
---
2+
"@wdio/image-comparison-core": patch
3+
"@wdio/visual-service": patch
4+
---
5+
6+
## #1111 Respect saveAboveTolerance when deciding to save actual images when alwaysSaveActualImage is false.
7+
8+
When `alwaysSaveActualImage` is `false`, the actual image is no longer written to disk if the mismatch is below the configured tolerance, avoiding extra actuals when the comparison still passes.
9+
10+
# Committers: 1
11+
12+
- Wim Selles ([@wswebcreation](https://github.com/wswebcreation))

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

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -722,6 +722,78 @@ describe('executeImageCompare', () => {
722722
expect(fsPromises.writeFile).toHaveBeenCalledWith('/mock/actual/test.png', Buffer.from(base64Image, 'base64'))
723723
})
724724

725+
it('should not save base64 actual when diff is below saveAboveTolerance', async () => {
726+
const base64Image = Buffer.from('base64-image').toString('base64')
727+
const optionsWithTolerance = {
728+
...mockOptions,
729+
folderOptions: {
730+
...mockOptions.folderOptions,
731+
alwaysSaveActualImage: false,
732+
},
733+
compareOptions: {
734+
...mockOptions.compareOptions,
735+
wic: {
736+
...mockOptions.compareOptions.wic,
737+
saveAboveTolerance: 0.1,
738+
},
739+
},
740+
}
741+
vi.mocked(compareImages.default).mockResolvedValue({
742+
rawMisMatchPercentage: 0.05,
743+
misMatchPercentage: 0.05,
744+
getBuffer: vi.fn().mockResolvedValue(Buffer.from('diff-image-data')),
745+
diffBounds: { left: 0, top: 0, right: 0, bottom: 0 },
746+
analysisTime: 10,
747+
diffPixels: []
748+
})
749+
750+
await executeImageCompare({
751+
isViewPortScreenshot: true,
752+
isNativeContext: false,
753+
options: optionsWithTolerance,
754+
testContext: mockTestContext,
755+
actualBase64Image: base64Image,
756+
})
757+
758+
expect(fsPromises.writeFile).not.toHaveBeenCalled()
759+
})
760+
761+
it('should save base64 actual when diff exceeds saveAboveTolerance', async () => {
762+
const base64Image = Buffer.from('base64-image').toString('base64')
763+
const optionsWithTolerance = {
764+
...mockOptions,
765+
folderOptions: {
766+
...mockOptions.folderOptions,
767+
alwaysSaveActualImage: false,
768+
},
769+
compareOptions: {
770+
...mockOptions.compareOptions,
771+
wic: {
772+
...mockOptions.compareOptions.wic,
773+
saveAboveTolerance: 0.1,
774+
},
775+
},
776+
}
777+
vi.mocked(compareImages.default).mockResolvedValue({
778+
rawMisMatchPercentage: 0.2,
779+
misMatchPercentage: 0.2,
780+
getBuffer: vi.fn().mockResolvedValue(Buffer.from('diff-image-data')),
781+
diffBounds: { left: 0, top: 0, right: 0, bottom: 0 },
782+
analysisTime: 10,
783+
diffPixels: []
784+
})
785+
786+
await executeImageCompare({
787+
isViewPortScreenshot: true,
788+
isNativeContext: false,
789+
options: optionsWithTolerance,
790+
testContext: mockTestContext,
791+
actualBase64Image: base64Image,
792+
})
793+
794+
expect(fsPromises.writeFile).toHaveBeenCalledWith('/mock/actual/test.png', Buffer.from(base64Image, 'base64'))
795+
})
796+
725797
it('should update baseline using base64 when visual baseline is updated', async () => {
726798
const base64Image = Buffer.from('base64-image').toString('base64')
727799
vi.mocked(utils.updateVisualBaseline).mockReturnValueOnce(true)

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -451,7 +451,7 @@ export async function executeImageCompare(
451451

452452
// 6a. Save actual image on failure if alwaysSaveActualImage is false
453453
const saveAboveTolerance = imageCompareOptions.saveAboveTolerance ?? 0
454-
const hasFailure = rawMisMatchPercentage > 0 || rawMisMatchPercentage > saveAboveTolerance
454+
const hasFailure = rawMisMatchPercentage > saveAboveTolerance
455455
if (useBase64Image && hasFailure && actualBase64Image) {
456456
// Save the actual image only when comparison fails
457457
await saveBase64Image(actualBase64Image, actualFilePath)

0 commit comments

Comments
 (0)