diff --git a/myteamwallet_frontend_modern/src/app/features/team/overview/overview.spec.ts b/myteamwallet_frontend_modern/src/app/features/team/overview/overview.spec.ts index 9a1e7c5..cc28a55 100644 --- a/myteamwallet_frontend_modern/src/app/features/team/overview/overview.spec.ts +++ b/myteamwallet_frontend_modern/src/app/features/team/overview/overview.spec.ts @@ -11,28 +11,11 @@ import { TeamStore } from '../../../core/team/team-store'; import { environment } from '../../../../environments/environment'; import { TeamOverviewStats } from '../../../models/team-stats.model'; -const { MockChart } = vi.hoisted(() => { - class MockChart { - static register = vi.fn(); - static instances: MockChart[] = []; - data: unknown; - options: unknown; - config: { type: unknown; data: unknown; options: unknown }; - destroy = vi.fn(); - update = vi.fn(); - - constructor( - public ctx: unknown, - config: { type: unknown; data: unknown; options: unknown }, - ) { - this.config = config; - this.data = config.data; - this.options = config.options; - MockChart.instances.push(this); - } - } - return { MockChart }; -}); +// `vi.mock`'s factory is hoisted above regular imports, so the shared mock class is +// loaded via a dynamic import inside `vi.hoisted` rather than a plain top-level import. +const { MockChart } = await vi.hoisted( + async () => import('../../../shared/chart-canvas/testing/mock-chart'), +); vi.mock('chart.js', () => ({ Chart: MockChart, registerables: [] })); diff --git a/myteamwallet_frontend_modern/src/app/shared/chart-canvas/chart-canvas.spec.ts b/myteamwallet_frontend_modern/src/app/shared/chart-canvas/chart-canvas.spec.ts index b1b6d1d..e0d9d2e 100644 --- a/myteamwallet_frontend_modern/src/app/shared/chart-canvas/chart-canvas.spec.ts +++ b/myteamwallet_frontend_modern/src/app/shared/chart-canvas/chart-canvas.spec.ts @@ -1,28 +1,9 @@ import { TestBed } from '@angular/core/testing'; import { ChartCanvas } from './chart-canvas'; -const { MockChart } = vi.hoisted(() => { - class MockChart { - static register = vi.fn(); - static instances: MockChart[] = []; - data: unknown; - options: unknown; - config: { type: unknown; data: unknown; options: unknown }; - destroy = vi.fn(); - update = vi.fn(); - - constructor( - public ctx: unknown, - config: { type: unknown; data: unknown; options: unknown }, - ) { - this.config = config; - this.data = config.data; - this.options = config.options; - MockChart.instances.push(this); - } - } - return { MockChart }; -}); +// `vi.mock`'s factory is hoisted above regular imports, so the shared mock class is +// loaded via a dynamic import inside `vi.hoisted` rather than a plain top-level import. +const { MockChart } = await vi.hoisted(async () => import('./testing/mock-chart')); vi.mock('chart.js', () => ({ Chart: MockChart, registerables: [] })); diff --git a/myteamwallet_frontend_modern/src/app/shared/chart-canvas/testing/mock-chart.ts b/myteamwallet_frontend_modern/src/app/shared/chart-canvas/testing/mock-chart.ts new file mode 100644 index 0000000..2210a22 --- /dev/null +++ b/myteamwallet_frontend_modern/src/app/shared/chart-canvas/testing/mock-chart.ts @@ -0,0 +1,32 @@ +import { vi } from 'vitest'; + +/** + * Test double for Chart.js's `Chart` class, shared by `chart-canvas.spec.ts` and + * `overview.spec.ts`. jsdom has no canvas 2D context, so real Chart.js cannot render + * in this project's test environment — specs mock the whole `chart.js` module via + * `vi.mock('chart.js', () => ({ Chart: MockChart, registerables: [] }))` and assert + * on the Chart.js lifecycle contract (constructor args, update(), destroy()) instead. + * + * Not a `*.spec.ts` file on purpose: it exports a class rather than defining tests, + * so it must not be picked up by the test runner's `**\/*.spec.ts` include glob. + */ +export class MockChart { + static register = vi.fn(); + static instances: MockChart[] = []; + + data: unknown; + options: unknown; + config: { type: unknown; data: unknown; options: unknown }; + destroy = vi.fn(); + update = vi.fn(); + + constructor( + public ctx: unknown, + config: { type: unknown; data: unknown; options: unknown }, + ) { + this.config = config; + this.data = config.data; + this.options = config.options; + MockChart.instances.push(this); + } +}