From e48334fee64445283be8c5f3dddb44e09f7b3669 Mon Sep 17 00:00:00 2001 From: Robert DeLuca Date: Mon, 16 Feb 2026 04:58:37 -0600 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20Handle=20TDD=20dimension=20misma?= =?UTF-8?q?tches=20as=20failed=20comparisons?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Avoid overwriting baselines when honeydiff reports a width mismatch in local TDD. Keep baseline/current reviewable and mark comparison as failed with a dimension-mismatch reason. --- src/tdd/tdd-service.js | 61 ++++++++++++++--------------------- tests/tdd/tdd-service.test.js | 22 +++++++++++-- 2 files changed, 43 insertions(+), 40 deletions(-) diff --git a/src/tdd/tdd-service.js b/src/tdd/tdd-service.js index dba9fe6..0b6a0d5 100644 --- a/src/tdd/tdd-service.js +++ b/src/tdd/tdd-service.js @@ -1349,19 +1349,19 @@ export class TddService { } // Baseline exists - compare - try { - let effectiveThreshold = - typeof validatedProperties.threshold === 'number' && - validatedProperties.threshold >= 0 - ? validatedProperties.threshold - : this.threshold; - - let effectiveMinClusterSize = - Number.isInteger(validatedProperties.minClusterSize) && - validatedProperties.minClusterSize >= 1 - ? validatedProperties.minClusterSize - : this.minClusterSize; + let effectiveThreshold = + typeof validatedProperties.threshold === 'number' && + validatedProperties.threshold >= 0 + ? validatedProperties.threshold + : this.threshold; + + let effectiveMinClusterSize = + Number.isInteger(validatedProperties.minClusterSize) && + validatedProperties.minClusterSize >= 1 + ? validatedProperties.minClusterSize + : this.minClusterSize; + try { let honeydiffResult = await compareImages( baselineImagePath, currentImagePath, @@ -1420,39 +1420,26 @@ export class TddService { if (isDimensionMismatchError(error)) { output.debug( 'comparison', - `${sanitizedName}: dimension mismatch, creating new baseline` + `${sanitizedName}: dimension mismatch, marking comparison as failed`, + { error: error.message } ); - saveBaseline(this.baselinePath, filename, imageBuffer); - - if (!this.baselineData) { - this.baselineData = createEmptyBaselineMetadata({ - threshold: this.threshold, - signatureProperties: this.signatureProperties, - }); - } - - let screenshotEntry = { - name: sanitizedName, - properties: validatedProperties, - path: baselineImagePath, - signature, - }; - - upsertScreenshotInMetadata( - this.baselineData, - screenshotEntry, - signature - ); - saveBaselineMetadata(this.baselinePath, this.baselineData); - - let result = buildNewComparison({ + let result = buildFailedComparison({ name: sanitizedName, signature, baselinePath: baselineImagePath, currentPath: currentImagePath, + diffPath: null, properties: validatedProperties, + threshold: effectiveThreshold, + minClusterSize: effectiveMinClusterSize, + honeydiffResult: { + isDifferent: true, + diffClusters: [], + }, }); + result.reason = 'dimension-mismatch'; + result.error = error.message; this._upsertComparison(result); return result; diff --git a/tests/tdd/tdd-service.test.js b/tests/tdd/tdd-service.test.js index 7698986..f845f1b 100644 --- a/tests/tdd/tdd-service.test.js +++ b/tests/tdd/tdd-service.test.js @@ -516,9 +516,21 @@ describe('tdd/tdd-service', () => { assert.strictEqual(service.comparisons.length, 1); }); - it('handles dimension mismatch by creating new baseline', async () => { + it('handles dimension mismatch as a failed comparison', async () => { + let baselineSaved = false; + let metadataSaved = false; let mockDeps = createMockDeps({ - baseline: { baselineExists: () => true }, + baseline: { + baselineExists: () => true, + saveBaseline: () => { + baselineSaved = true; + }, + }, + metadata: { + saveBaselineMetadata: () => { + metadataSaved = true; + }, + }, comparison: { compareImages: async () => { throw new Error("Image dimensions don't match"); @@ -535,7 +547,11 @@ describe('tdd/tdd-service', () => { {} ); - assert.strictEqual(result.status, 'new'); + assert.strictEqual(result.status, 'failed'); + assert.strictEqual(result.reason, 'dimension-mismatch'); + assert.strictEqual(result.error, "Image dimensions don't match"); + assert.strictEqual(baselineSaved, false); + assert.strictEqual(metadataSaved, false); // Dimension mismatch now logs at debug level (shown with --verbose) let debugCall = mockDeps.output.calls.find( c => c.method === 'debug' && c.args[1]?.includes('dimension mismatch')