diff --git a/packages/core-app-api/src/app/AppManager.test.tsx b/packages/core-app-api/src/app/AppManager.test.tsx
index 467145acfc..718a90dabe 100644
--- a/packages/core-app-api/src/app/AppManager.test.tsx
+++ b/packages/core-app-api/src/app/AppManager.test.tsx
@@ -34,6 +34,9 @@ import {
createSubRouteRef,
createRoutableExtension,
analyticsApiRef,
+ useApi,
+ identityApiRef,
+ fetchApiRef,
} from '@backstage/core-plugin-api';
import { AppManager } from './AppManager';
import { AppComponents, AppIcons } from './types';
@@ -569,4 +572,106 @@ describe('Integration Test', () => {
),
]);
});
+
+ it('explodes if identityApi is directly used in a given SignInPage', async () => {
+ // Sign-in page that uses APIs it oughtn't to directly!
+ const OffendingSignInPage = () => {
+ try {
+ useApi(identityApiRef);
+ return <>No problem.>;
+ } catch (e) {
+ return <>{(e as any).message}>;
+ }
+ };
+
+ const app = new AppManager({
+ themes: [
+ {
+ id: 'light',
+ title: 'Light Theme',
+ variant: 'light',
+ Provider: ({ children }) => <>{children}>,
+ },
+ ],
+ icons,
+ components: {
+ ...components,
+ SignInPage: OffendingSignInPage,
+ },
+ configLoader: async () => [],
+ });
+
+ const Provider = app.getProvider();
+ const Router = app.getRouter();
+ const { getByText } = await renderWithEffects(
+
+
+
+ } />
+
+
+ ,
+ );
+
+ expect(
+ getByText('No implementation available for apiRef{core.identity}'),
+ ).toBeInTheDocument();
+ });
+
+ it('explodes if identityApi is indirectly used in a given SignInPage', async () => {
+ // Set up fetchApi with a dependency on identityApi.
+ const apis = [
+ createApiFactory({
+ api: fetchApiRef,
+ deps: { identityApiRef },
+ factory: () => ({} as any),
+ }),
+ ];
+
+ // Sign-in page that uses APIs it oughtn't to, but indirectly!
+ const OffendingSignInPage = () => {
+ try {
+ useApi(fetchApiRef);
+ return <>No problem.>;
+ } catch (e) {
+ return <>{(e as any).message}>;
+ }
+ };
+
+ const app = new AppManager({
+ apis,
+ themes: [
+ {
+ id: 'light',
+ title: 'Light Theme',
+ variant: 'light',
+ Provider: ({ children }) => <>{children}>,
+ },
+ ],
+ icons,
+ components: {
+ ...components,
+ SignInPage: OffendingSignInPage,
+ },
+ configLoader: async () => [],
+ });
+
+ const Provider = app.getProvider();
+ const Router = app.getRouter();
+ const { getByText } = await renderWithEffects(
+
+
+
+ } />
+
+
+ ,
+ );
+
+ expect(
+ getByText(
+ 'No API factory available for dependency apiRef{core.identity} of dependent apiRef{core.fetch}',
+ ),
+ ).toBeInTheDocument();
+ });
});