From 38ba31768ad691784a61de52e27e938a585c5bb3 Mon Sep 17 00:00:00 2001 From: adlee-was-taken Date: Fri, 1 May 2026 14:14:21 -0400 Subject: [PATCH] refactor(ext/test): extract TYPED_FORMS shared list for it.each tests Code-review feedback on Task 7: the same Array<[name, renderForm]> of all 7 typed forms appeared in three test files (required-pill, popout-button, popout-button-fullscreen). A new typed form would have required updating all three. Now defined once in __tests__/_typed-forms.ts. Future typed-form additions get regression coverage automatically. Co-Authored-By: Claude Opus 4.7 --- .../types/__tests__/_typed-forms.ts | 23 +++++++++++++++++++ .../popout-button-fullscreen.test.ts | 20 ++-------------- .../types/__tests__/popout-button.test.ts | 20 ++-------------- .../types/__tests__/required-pill.test.ts | 22 +++--------------- 4 files changed, 30 insertions(+), 55 deletions(-) create mode 100644 extension/src/popup/components/types/__tests__/_typed-forms.ts diff --git a/extension/src/popup/components/types/__tests__/_typed-forms.ts b/extension/src/popup/components/types/__tests__/_typed-forms.ts new file mode 100644 index 0000000..09918f5 --- /dev/null +++ b/extension/src/popup/components/types/__tests__/_typed-forms.ts @@ -0,0 +1,23 @@ +/// Shared list of typed-form (`renderForm`) entries for it.each parameterization +/// across regression tests. Add a new typed form here ONCE — popup + fullscreen +/// suites pick it up automatically. + +import * as login from '../login'; +import * as secureNote from '../secure-note'; +import * as identity from '../identity'; +import * as card from '../card'; +import * as key from '../key'; +import * as totp from '../totp'; +import * as documentType from '../document'; + +type RenderFn = (app: HTMLElement, mode: 'add' | 'edit', existing: null) => void; + +export const TYPED_FORMS: Array<[string, RenderFn]> = [ + ['login', login.renderForm], + ['secure-note', secureNote.renderForm], + ['identity', identity.renderForm], + ['card', card.renderForm], + ['key', key.renderForm], + ['totp', totp.renderForm], + ['document', documentType.renderForm], +]; diff --git a/extension/src/popup/components/types/__tests__/popout-button-fullscreen.test.ts b/extension/src/popup/components/types/__tests__/popout-button-fullscreen.test.ts index b9ccfb3..e7a6773 100644 --- a/extension/src/popup/components/types/__tests__/popout-button-fullscreen.test.ts +++ b/extension/src/popup/components/types/__tests__/popout-button-fullscreen.test.ts @@ -18,28 +18,12 @@ vi.mock('../../generator-panel', () => ({ isGeneratorPanelOpen: () => false, })); -import * as login from '../login'; -import * as secureNote from '../secure-note'; -import * as identity from '../identity'; -import * as card from '../card'; -import * as key from '../key'; -import * as totp from '../totp'; -import * as documentType from '../document'; - -const forms: Array<[string, (app: HTMLElement, mode: 'add' | 'edit', existing: null) => void]> = [ - ['login', login.renderForm], - ['secure-note', secureNote.renderForm], - ['identity', identity.renderForm], - ['card', card.renderForm], - ['key', key.renderForm], - ['totp', totp.renderForm], - ['document', documentType.renderForm], -]; +import { TYPED_FORMS } from './_typed-forms'; describe('popout-to-tab button (fullscreen context)', () => { beforeEach(() => { document.body.innerHTML = '
'; }); - it.each(forms)('%s form does NOT render the popout button', (_name, render) => { + it.each(TYPED_FORMS)('%s form does NOT render the popout button', (_name, render) => { render(document.getElementById('app')!, 'add', null); expect(document.getElementById('popout-btn')).toBeNull(); }); diff --git a/extension/src/popup/components/types/__tests__/popout-button.test.ts b/extension/src/popup/components/types/__tests__/popout-button.test.ts index 3232f02..1ed8809 100644 --- a/extension/src/popup/components/types/__tests__/popout-button.test.ts +++ b/extension/src/popup/components/types/__tests__/popout-button.test.ts @@ -18,28 +18,12 @@ vi.mock('../../generator-panel', () => ({ isGeneratorPanelOpen: () => false, })); -import * as login from '../login'; -import * as secureNote from '../secure-note'; -import * as identity from '../identity'; -import * as card from '../card'; -import * as key from '../key'; -import * as totp from '../totp'; -import * as documentType from '../document'; - -const forms: Array<[string, (app: HTMLElement, mode: 'add' | 'edit', existing: null) => void]> = [ - ['login', login.renderForm], - ['secure-note', secureNote.renderForm], - ['identity', identity.renderForm], - ['card', card.renderForm], - ['key', key.renderForm], - ['totp', totp.renderForm], - ['document', documentType.renderForm], -]; +import { TYPED_FORMS } from './_typed-forms'; describe('popout-to-tab button (popup context)', () => { beforeEach(() => { document.body.innerHTML = '
'; }); - it.each(forms)('%s form renders the popout button', (_name, render) => { + it.each(TYPED_FORMS)('%s form renders the popout button', (_name, render) => { render(document.getElementById('app')!, 'add', null); expect(document.getElementById('popout-btn')).not.toBeNull(); }); diff --git a/extension/src/popup/components/types/__tests__/required-pill.test.ts b/extension/src/popup/components/types/__tests__/required-pill.test.ts index 3ad1027..70f0236 100644 --- a/extension/src/popup/components/types/__tests__/required-pill.test.ts +++ b/extension/src/popup/components/types/__tests__/required-pill.test.ts @@ -18,33 +18,17 @@ vi.mock('../../generator-panel', () => ({ isGeneratorPanelOpen: () => false, })); -import * as login from '../login'; -import * as secureNote from '../secure-note'; -import * as identity from '../identity'; -import * as card from '../card'; -import * as key from '../key'; -import * as totp from '../totp'; -import * as documentType from '../document'; - -const forms: Array<[string, (app: HTMLElement, mode: 'add' | 'edit', existing: null) => void]> = [ - ['login', login.renderForm], - ['secure-note', secureNote.renderForm], - ['identity', identity.renderForm], - ['card', card.renderForm], - ['key', key.renderForm], - ['totp', totp.renderForm], - ['document', documentType.renderForm], -]; +import { TYPED_FORMS } from './_typed-forms'; describe('required-pill migration', () => { beforeEach(() => { document.body.innerHTML = '
'; }); - it.each(forms)('%s form has no legacy markup', (_name, render) => { + it.each(TYPED_FORMS)('%s form has no legacy markup', (_name, render) => { render(document.getElementById('app')!, 'add', null); expect(document.body.innerHTML).not.toContain('class="req"'); }); - it.each(forms)('%s form contains the .req-pill markup on at least one label', (_name, render) => { + it.each(TYPED_FORMS)('%s form contains the .req-pill markup on at least one label', (_name, render) => { render(document.getElementById('app')!, 'add', null); expect(document.body.innerHTML).toContain('class="req-pill">required'); });