Skip to content

Commit ccc6a70

Browse files
committed
🧪 Add tests for #158 and #160 fixes, remove unnecessary bind
- Add tests for _upsertComparison() method verifying deduplication - Add test for daemon mode stale result prevention - Add test verifying minClusterSize is passed from config to runOptions - Remove unnecessary this._upsertComparison.bind() call
1 parent 53c7b71 commit ccc6a70

File tree

3 files changed

+130
-3
lines changed

3 files changed

+130
-3
lines changed

src/tdd/tdd-service.js

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -259,9 +259,6 @@ export class TddService {
259259
// Track whether results have been printed (to avoid duplicate output)
260260
this._resultsPrinted = false;
261261

262-
// Bind the helper method
263-
this._upsertComparison = this._upsertComparison.bind(this);
264-
265262
if (this.setBaseline) {
266263
output.info(
267264
'[vizzly] Baseline update mode - will overwrite existing baselines with new ones'

tests/commands/run.test.js

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -435,6 +435,49 @@ describe('commands/run', () => {
435435
assert.strictEqual(exitCode, 1);
436436
});
437437

438+
it('passes minClusterSize from config to runOptions', async () => {
439+
// This test verifies the fix for issue #160
440+
let output = createMockOutput();
441+
let capturedRunOptions = null;
442+
443+
await runCommand(
444+
'npm test',
445+
{},
446+
{},
447+
{
448+
loadConfig: async () =>
449+
createMockConfig({
450+
comparison: { threshold: 2.0, minClusterSize: 5 },
451+
}),
452+
createServerManager: () => ({
453+
start: async () => {},
454+
stop: async () => {},
455+
}),
456+
createUploader: () => ({}),
457+
runTests: async ({ runOptions }) => {
458+
capturedRunOptions = runOptions;
459+
return { buildId: null, screenshotsCaptured: 0 };
460+
},
461+
detectBranch: async () => 'main',
462+
detectCommit: async () => 'abc123',
463+
detectCommitMessage: async () => 'test',
464+
detectPullRequestNumber: () => null,
465+
generateBuildNameWithGit: async () => 'test-build',
466+
output,
467+
exit: () => {},
468+
processOn: () => {},
469+
processRemoveListener: () => {},
470+
}
471+
);
472+
473+
assert.strictEqual(
474+
capturedRunOptions.minClusterSize,
475+
5,
476+
'minClusterSize should be passed from config to runOptions'
477+
);
478+
assert.strictEqual(capturedRunOptions.threshold, 2.0);
479+
});
480+
438481
it('uses provided git metadata options', async () => {
439482
let output = createMockOutput();
440483
let capturedRunOptions = null;

tests/tdd/tdd-service.test.js

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,93 @@ describe('tdd/tdd-service', () => {
346346
});
347347
});
348348

349+
describe('_upsertComparison', () => {
350+
it('replaces existing comparison when ID matches', () => {
351+
let mockDeps = createMockDeps();
352+
let service = new TddService({}, '/test', false, null, mockDeps);
353+
354+
// Add initial comparison
355+
service.comparisons = [
356+
{ id: 'comp-1', name: 'homepage', status: 'failed', diffPercentage: 5.0 },
357+
{ id: 'comp-2', name: 'button', status: 'passed' },
358+
];
359+
360+
// Upsert with same ID but different status
361+
service._upsertComparison({
362+
id: 'comp-1',
363+
name: 'homepage',
364+
status: 'passed',
365+
diffPercentage: 0,
366+
});
367+
368+
assert.strictEqual(service.comparisons.length, 2);
369+
assert.strictEqual(service.comparisons[0].status, 'passed');
370+
assert.strictEqual(service.comparisons[0].diffPercentage, 0);
371+
});
372+
373+
it('appends new comparison when ID does not exist', () => {
374+
let mockDeps = createMockDeps();
375+
let service = new TddService({}, '/test', false, null, mockDeps);
376+
377+
service.comparisons = [
378+
{ id: 'comp-1', name: 'homepage', status: 'passed' },
379+
];
380+
381+
service._upsertComparison({
382+
id: 'comp-2',
383+
name: 'button',
384+
status: 'new',
385+
});
386+
387+
assert.strictEqual(service.comparisons.length, 2);
388+
assert.strictEqual(service.comparisons[1].id, 'comp-2');
389+
});
390+
391+
it('prevents stale results from accumulating in daemon mode', async () => {
392+
// This test verifies the fix for issue #158
393+
// In daemon mode, re-running tests should replace old results, not accumulate them
394+
let mockDeps = createMockDeps({
395+
baseline: { baselineExists: () => true },
396+
comparison: {
397+
compareImages: async () => ({
398+
isDifferent: true,
399+
diffPercentage: 5.5,
400+
diffPixels: 1000,
401+
diffClusters: [],
402+
}),
403+
buildFailedComparison: params => ({
404+
id: params.signature ? `comp-${params.signature}` : 'test-id',
405+
status: 'failed',
406+
...params,
407+
}),
408+
},
409+
signature: {
410+
generateScreenshotSignature: () => 'homepage|1920|chrome',
411+
generateBaselineFilename: () => 'homepage_hash.png',
412+
generateComparisonId: sig => `comp-${sig}`,
413+
sanitizeScreenshotName: name => name,
414+
validateScreenshotProperties: props => props,
415+
safePath: (...parts) => parts.join('/'),
416+
},
417+
});
418+
let service = new TddService({}, '/test', false, null, mockDeps);
419+
420+
// First run - screenshot fails
421+
await service.compareScreenshot('homepage', Buffer.from('test1'), {});
422+
assert.strictEqual(service.comparisons.length, 1);
423+
assert.strictEqual(service.comparisons[0].status, 'failed');
424+
425+
// Second run - same screenshot, still fails (simulating daemon mode re-run)
426+
// Without the fix, this would add a second comparison
427+
await service.compareScreenshot('homepage', Buffer.from('test2'), {});
428+
assert.strictEqual(
429+
service.comparisons.length,
430+
1,
431+
'Should still have only 1 comparison, not 2'
432+
);
433+
});
434+
});
435+
349436
describe('compareScreenshot', () => {
350437
it('creates new baseline when none exists', async () => {
351438
let savedBaseline = null;

0 commit comments

Comments
 (0)