From 3f19d5ec3217a3f21e6f74a94bef2eb563d46703 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Mon, 9 Feb 2026 14:20:57 +0100 Subject: [PATCH] frontend-test-utils: review fixes for readonly fields and config constructor Signed-off-by: Patrik Oldsberg Co-authored-by: Cursor --- .../vale/config/vocabularies/Backstage/accept.txt | 2 ++ .../src/apis/AlertApi/MockAlertApi.ts | 6 +++--- .../src/apis/ConfigApi/MockConfigApi.test.ts | 12 +++++++----- .../src/apis/ConfigApi/MockConfigApi.ts | 4 ++-- .../src/apis/FeatureFlagsApi/MockFeatureFlagsApi.ts | 9 ++++++--- .../src/apis/TranslationApi/MockTranslationApi.ts | 6 +++--- packages/frontend-test-utils/src/apis/mockApis.ts | 2 +- 7 files changed, 24 insertions(+), 17 deletions(-) diff --git a/.github/vale/config/vocabularies/Backstage/accept.txt b/.github/vale/config/vocabularies/Backstage/accept.txt index cb569f01b7..66ed469f0d 100644 --- a/.github/vale/config/vocabularies/Backstage/accept.txt +++ b/.github/vale/config/vocabularies/Backstage/accept.txt @@ -584,3 +584,5 @@ zsh resizable enums LLMs +Passthrough +passthrough diff --git a/packages/frontend-test-utils/src/apis/AlertApi/MockAlertApi.ts b/packages/frontend-test-utils/src/apis/AlertApi/MockAlertApi.ts index d07d9602b2..305a527b87 100644 --- a/packages/frontend-test-utils/src/apis/AlertApi/MockAlertApi.ts +++ b/packages/frontend-test-utils/src/apis/AlertApi/MockAlertApi.ts @@ -31,8 +31,8 @@ import ObservableImpl from 'zen-observable'; * ``` */ export class MockAlertApi implements AlertApi { - private alerts: AlertMessage[] = []; - private observers = new Set<(alert: AlertMessage) => void>(); + private readonly alerts: AlertMessage[] = []; + private readonly observers = new Set<(alert: AlertMessage) => void>(); post(alert: AlertMessage) { this.alerts.push(alert); @@ -62,7 +62,7 @@ export class MockAlertApi implements AlertApi { * Clear all collected alerts. */ clearAlerts(): void { - this.alerts = []; + this.alerts.length = 0; } /** diff --git a/packages/frontend-test-utils/src/apis/ConfigApi/MockConfigApi.test.ts b/packages/frontend-test-utils/src/apis/ConfigApi/MockConfigApi.test.ts index 972733d44d..c3157a8aff 100644 --- a/packages/frontend-test-utils/src/apis/ConfigApi/MockConfigApi.test.ts +++ b/packages/frontend-test-utils/src/apis/ConfigApi/MockConfigApi.test.ts @@ -19,12 +19,14 @@ import { MockConfigApi } from './MockConfigApi'; describe('MockConfigApi', () => { it('is able to read some basic config', () => { const mock = new MockConfigApi({ - app: { - title: 'Hello', + data: { + app: { + title: 'Hello', + }, + x: 1, + y: false, + z: [{ a: 3 }], }, - x: 1, - y: false, - z: [{ a: 3 }], }); expect(mock.getString('app.title')).toEqual('Hello'); diff --git a/packages/frontend-test-utils/src/apis/ConfigApi/MockConfigApi.ts b/packages/frontend-test-utils/src/apis/ConfigApi/MockConfigApi.ts index 372c295c02..349eee0d3a 100644 --- a/packages/frontend-test-utils/src/apis/ConfigApi/MockConfigApi.ts +++ b/packages/frontend-test-utils/src/apis/ConfigApi/MockConfigApi.ts @@ -26,7 +26,7 @@ import { ConfigApi } from '@backstage/core-plugin-api'; * @example * ```tsx * const mockConfig = new MockConfigApi({ - * app: { baseUrl: 'https://example.com' }, + * data: { app: { baseUrl: 'https://example.com' } }, * }); * * const rendered = await renderInTestApp( @@ -40,7 +40,7 @@ export class MockConfigApi implements ConfigApi { private readonly config: ConfigReader; // NOTE: not extending in order to avoid inheriting the static `.fromConfigs` - constructor(data: JsonObject) { + constructor({ data }: { data: JsonObject }) { this.config = new ConfigReader(data); } diff --git a/packages/frontend-test-utils/src/apis/FeatureFlagsApi/MockFeatureFlagsApi.ts b/packages/frontend-test-utils/src/apis/FeatureFlagsApi/MockFeatureFlagsApi.ts index ef0eef3159..5421687c65 100644 --- a/packages/frontend-test-utils/src/apis/FeatureFlagsApi/MockFeatureFlagsApi.ts +++ b/packages/frontend-test-utils/src/apis/FeatureFlagsApi/MockFeatureFlagsApi.ts @@ -46,8 +46,8 @@ export interface MockFeatureFlagsApiOptions { * ``` */ export class MockFeatureFlagsApi implements FeatureFlagsApi { - private registeredFlags: FeatureFlag[] = []; - private states: Map; + private readonly registeredFlags: FeatureFlag[] = []; + private readonly states: Map; constructor(options?: MockFeatureFlagsApiOptions) { this.states = new Map(Object.entries(options?.initialStates ?? {})); @@ -73,7 +73,10 @@ export class MockFeatureFlagsApi implements FeatureFlagsApi { this.states.set(name, state); } } else { - this.states = new Map(Object.entries(options.states)); + this.states.clear(); + for (const [name, state] of Object.entries(options.states)) { + this.states.set(name, state); + } } } diff --git a/packages/frontend-test-utils/src/apis/TranslationApi/MockTranslationApi.ts b/packages/frontend-test-utils/src/apis/TranslationApi/MockTranslationApi.ts index bce96dd50b..d5fa29ea73 100644 --- a/packages/frontend-test-utils/src/apis/TranslationApi/MockTranslationApi.ts +++ b/packages/frontend-test-utils/src/apis/TranslationApi/MockTranslationApi.ts @@ -64,9 +64,9 @@ export class MockTranslationApi implements TranslationApi { return new MockTranslationApi(i18n, interpolator); } - #i18n: I18n; - #interpolator: JsxInterpolator; - #registeredRefs = new Set(); + readonly #i18n: I18n; + readonly #interpolator: JsxInterpolator; + readonly #registeredRefs = new Set(); private constructor(i18n: I18n, interpolator: JsxInterpolator) { this.#i18n = i18n; diff --git a/packages/frontend-test-utils/src/apis/mockApis.ts b/packages/frontend-test-utils/src/apis/mockApis.ts index 0b0bf18cf4..03d4ed32e0 100644 --- a/packages/frontend-test-utils/src/apis/mockApis.ts +++ b/packages/frontend-test-utils/src/apis/mockApis.ts @@ -287,7 +287,7 @@ export namespace mockApis { export function config(options?: { data?: JsonObject; }): MockConfigApi & MockWithApiFactory { - const instance = new MockConfigApi(options?.data ?? {}); + const instance = new MockConfigApi({ data: options?.data ?? {} }); return mockWithApiFactory(configApiRef, instance) as MockConfigApi & MockWithApiFactory; }