Skip to content

Commit e4e5b5c

Browse files
Fix: autoSaveBaseline collides with the new alwaysSaveActualImage flag (#1096)
* chore: update deps * fix: fix issue 1085 - added tests * chore: add changeset
1 parent ddf68fe commit e4e5b5c

9 files changed

Lines changed: 692 additions & 534 deletions

File tree

.changeset/swift-terms-jump.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
---
2+
"@wdio/image-comparison-core": patch
3+
"@wdio/visual-reporter": patch
4+
"@wdio/visual-service": patch
5+
"@wdio/ocr-service": patch
6+
---
7+
8+
# 🐛 Bugfixes
9+
10+
## #1085 autoSaveBaseline collides with the new alwaysSaveActualImage flag
11+
12+
When `autoSaveBaseline` is `true` and `alwaysSaveActualImage` is `false`, actual images were still saved. This patch should fix that
13+
14+
# Committers: 1
15+
16+
- Wim Selles ([@wswebcreation](https://github.com/wswebcreation))

package.json

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -52,43 +52,43 @@
5252
"watch": "pnpm run -r --parallel watch"
5353
},
5454
"devDependencies": {
55-
"@changesets/cli": "^2.29.7",
55+
"@changesets/cli": "^2.29.8",
5656
"@tsconfig/node20": "^20.1.8",
5757
"@types/eslint": "^9.6.1",
5858
"@types/inquirer": "^9.0.9",
5959
"@types/jsdom": "~21.1.7",
6060
"@types/node": "^24",
6161
"@types/xml2js": "~0.4.14",
62-
"@typescript-eslint/eslint-plugin": "^8.47.0",
63-
"@wdio/globals": "^9.17.0",
64-
"@wdio/mocha-framework": "^9.20.1",
65-
"@typescript-eslint/parser": "^8.47.0",
66-
"@typescript-eslint/utils": "^8.47.0",
62+
"@typescript-eslint/eslint-plugin": "^8.53.0",
63+
"@wdio/globals": "^9.23.0",
64+
"@wdio/mocha-framework": "^9.23.0",
65+
"@typescript-eslint/parser": "^8.53.0",
66+
"@typescript-eslint/utils": "^8.53.0",
6767
"@vitest/coverage-v8": "^3.2.4",
6868
"@vitest/ui": "^3.2.4",
69-
"@wdio/appium-service": "^9.20.1",
70-
"@wdio/browserstack-service": "^9.20.1",
71-
"@wdio/cli": "^9.20.1",
72-
"@wdio/local-runner": "^9.20.1",
73-
"@wdio/sauce-service": "^9.20.1",
74-
"@wdio/shared-store-service": "^9.20.1",
69+
"@wdio/appium-service": "^9.23.0",
70+
"@wdio/browserstack-service": "^9.23.0",
71+
"@wdio/cli": "^9.23.0",
72+
"@wdio/local-runner": "^9.23.0",
73+
"@wdio/sauce-service": "^9.23.0",
74+
"@wdio/shared-store-service": "^9.23.0",
7575
"@wdio/spec-reporter": "^9.20.0",
7676
"@wdio/types": "^9.20.0",
7777
"cross-env": "^7.0.3",
78-
"eslint": "^9.39.1",
78+
"eslint": "^9.39.2",
7979
"eslint-plugin-import": "^2.32.0",
8080
"eslint-plugin-unicorn": "^56.0.1",
81-
"eslint-plugin-wdio": "^9.16.2",
81+
"eslint-plugin-wdio": "^9.23.0",
8282
"husky": "^9.1.7",
8383
"jsdom": "^26.1.0",
8484
"npm-run-all2": "^8.0.4",
85-
"release-it": "^19.0.6",
85+
"release-it": "^19.2.3",
8686
"rimraf": "^6.1.2",
8787
"saucelabs": "^9.0.2",
8888
"ts-node": "^10.9.2",
8989
"typescript": "^5.9.3",
9090
"vitest": "^3.2.4",
91-
"webdriverio": "^9.20.1",
91+
"webdriverio": "^9.23.0",
9292
"wdio-lambdatest-service": "^4.0.1"
9393
},
9494
"packageManager": "pnpm@9.15.9+sha256.cf86a7ad764406395d4286a6d09d730711720acc6d93e9dce9ac7ac4dc4a28a7"

packages/image-comparison-core/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
"@wdio/types": "^9.20.0"
4040
},
4141
"devDependencies": {
42-
"webdriverio": "^9.20.1"
42+
"webdriverio": "^9.23.0"
4343
},
4444
"publishConfig": {
4545
"access": "public"

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

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -665,6 +665,14 @@ describe('executeImageCompare', () => {
665665
autoSaveBaseline: true,
666666
}
667667
}
668+
669+
vi.mocked(fsPromises.access).mockImplementation(async (path: any) => {
670+
if (path === '/mock/baseline/test.png') {
671+
throw new Error('File not found')
672+
}
673+
return undefined
674+
})
675+
668676
vi.mocked(compareImages.default).mockResolvedValue({
669677
rawMisMatchPercentage: 0,
670678
misMatchPercentage: 0,
@@ -1043,4 +1051,44 @@ describe('executeImageCompare', () => {
10431051
expect(images.saveBase64Image).not.toHaveBeenCalled()
10441052
expect(log.warn).not.toHaveBeenCalled()
10451053
})
1054+
1055+
it('should not save actual image when autoSaveBaseline is true, alwaysSaveActualImage is false, baseline exists, and comparison passes', async () => {
1056+
// This test covers issue #1085: autoSaveBaseline collides with alwaysSaveActualImage
1057+
// When baseline exists and comparison passes, actual image should NOT be saved
1058+
const base64Image = Buffer.from('base64-image').toString('base64')
1059+
const optionsWithAutoSave = {
1060+
...mockOptions,
1061+
folderOptions: {
1062+
...mockOptions.folderOptions,
1063+
alwaysSaveActualImage: false,
1064+
autoSaveBaseline: true,
1065+
}
1066+
}
1067+
1068+
vi.mocked(fsPromises.access).mockResolvedValue(undefined)
1069+
1070+
vi.mocked(images.checkBaselineImageExists).mockImplementation(async () => {
1071+
return Promise.resolve()
1072+
})
1073+
1074+
vi.mocked(compareImages.default).mockResolvedValue({
1075+
rawMisMatchPercentage: 0,
1076+
misMatchPercentage: 0,
1077+
getBuffer: vi.fn().mockResolvedValue(Buffer.from('diff-image-data')),
1078+
diffBounds: { left: 0, top: 0, right: 0, bottom: 0 },
1079+
analysisTime: 10,
1080+
diffPixels: []
1081+
})
1082+
1083+
await executeImageCompare({
1084+
isViewPortScreenshot: true,
1085+
isNativeContext: false,
1086+
options: optionsWithAutoSave,
1087+
testContext: mockTestContext,
1088+
actualBase64Image: base64Image,
1089+
})
1090+
1091+
expect(images.saveBase64Image).not.toHaveBeenCalled()
1092+
expect(fsPromises.writeFile).not.toHaveBeenCalledWith('/mock/actual/test.png', expect.anything())
1093+
})
10461094
})

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -384,8 +384,8 @@ export async function executeImageCompare(
384384
if (useBase64Image) {
385385
// Convert base64 to buffer for comparison
386386
actualImageBuffer = Buffer.from(actualBase64Image, 'base64')
387-
// Only save if autoSaveBaseline is true (needed to copy to baseline)
388-
if (autoSaveBaseline) {
387+
// Only save actual image if baseline doesn't exist and autoSaveBaseline is true
388+
if (autoSaveBaseline && !(await checkIfImageExists(baselineFilePath))) {
389389
await saveBase64Image(actualBase64Image, actualFilePath)
390390
}
391391
} else {

packages/ocr-service/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
"watch": "pnpm run build:tsc -w"
2929
},
3030
"dependencies": {
31-
"@wdio/globals": "^9.17.0",
31+
"@wdio/globals": "^9.23.0",
3232
"@wdio/logger": "^9.18.0",
3333
"@wdio/types": "^9.20.0",
3434
"fuse.js": "^7.1.0",

packages/visual-reporter/package.json

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35,16 +35,16 @@
3535
"sharp": "^0.34.5"
3636
},
3737
"devDependencies": {
38-
"@remix-run/node": "^2.17.2",
39-
"@remix-run/react": "^2.17.2",
40-
"@remix-run/serve": "^2.17.2",
41-
"@remix-run/dev": "^2.17.2",
38+
"@remix-run/node": "^2.17.4",
39+
"@remix-run/react": "^2.17.4",
40+
"@remix-run/serve": "^2.17.4",
41+
"@remix-run/dev": "^2.17.4",
4242
"@types/react": "^18.3.27",
4343
"@types/react-dom": "^18.3.7",
44-
"@typescript-eslint/eslint-plugin": "^8.47.0",
45-
"@typescript-eslint/parser": "^8.47.0",
46-
"autoprefixer": "^10.4.22",
47-
"eslint": "^9.39.1",
44+
"@typescript-eslint/eslint-plugin": "^8.53.0",
45+
"@typescript-eslint/parser": "^8.53.0",
46+
"autoprefixer": "^10.4.23",
47+
"eslint": "^9.39.2",
4848
"eslint-import-resolver-typescript": "^3.10.1",
4949
"eslint-plugin-import": "^2.32.0",
5050
"eslint-plugin-jsx-a11y": "^6.10.2",
@@ -56,7 +56,7 @@
5656
"react-dom": "^18.3.1",
5757
"react-icons": "^5.5.0",
5858
"react-select": "^5.10.2",
59-
"tailwindcss": "^3.4.18",
59+
"tailwindcss": "^3.4.19",
6060
"typescript": "^5.9.3",
6161
"vite": "^5.4.21",
6262
"vite-tsconfig-paths": "^5.1.4"

packages/visual-service/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@
2626
"watch": "pnpm run build:tsc -w"
2727
},
2828
"dependencies": {
29-
"@wdio/globals": "^9.17.0",
29+
"@wdio/globals": "^9.23.0",
3030
"@wdio/logger": "^9.18.0",
3131
"@wdio/types": "^9.20.0",
32-
"expect-webdriverio": "^5.5.0",
32+
"expect-webdriverio": "^5.6.1",
3333
"@wdio/image-comparison-core": "workspace:*"
3434
}
3535
}

0 commit comments

Comments
 (0)