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(); + }); });