Big News: Socket raises $60M Series C at a $1B valuation to secure software supply chains for AI-driven development.Announcement
Sign In

bqb-msal-react-tester

Package Overview
Dependencies
Maintainers
1
Versions
3
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

bqb-msal-react-tester

A npm package to simplify testing react application using msal-react

latest
Source
npmnpm
Version
0.0.6
Version published
Maintainers
1
Created
Source

bqb-msal-react-tester. A tester package when using msal-react in your application

About

The MSAL React Tester is a NPM package to allows you creating unit tests for any of your components that need to be authenticated (or not) using the msal-react package and Azure AD.

The MSAL React Tester package allows you to test your components in any of these scenario:

  • Testing a react component when a user "is not" authenticated.
  • Testing a react component when a user "is" authenticated.
  • Testing a react component when a user "tries" to log in.
  • Testing a react component when a user "tries" to log out.
  • Testing a react component when a user authentication request has "failed".

Prerequisites

  • You are building a react application using Create React Application.
  • You are using @azure/msal-react to authenticate your users on Azure AD
  • You are using the built in @testing-library/react package to create and run your tests (you are basically using the built in "test": "react-scripts test" script to execute your tests).
  • You want to create unit tests without having to depends on a connection to Azure AD.
  • You want to run your tests in your CI/CD.

Installation

The MSAL React Tester package is available on NPM.

npm install --save-dev bqb-msal-react-tester

Usage

Creates a [component].test.tsx and import the bqb-msal-react-tester package:

import { MsalReactTester } from 'bqb-msal-react-tester';

Initialization:

  • Create a new instance of MsalReactTester before each test.
    • Depending on your setup, you can create your instance to mock a Redirect authentication or a Popup authentication.
  • Call the spyMsal() method to mock all the MSAL React required methods & events.
  • Don not forget to call resetSpyMsal after each test.
let msalTester: MsalReactTester;

beforeEach(() => {
  // new instance of msal tester for each test:
  msalTester = new MsalReactTester(); 
  // or new MsalReactTester("Redirect") / new MsalReactTester("Popup")

  // Ask bqb-msal-react-tester to handle and mock all msal-react processes:
  msalTester.spyMsal();
});

afterEach(() => {
  // reset bqb-msal-react-tester
  msalTester.resetSpyMsal();
});

Testing a component without any interaction with the authentication process:

In each of your test, you can now:

  • Mock an unauthenticated user, calling msalTester.isNotLogged().
  • Mock an authenticated user, calling msalTester.isLogged().
  • Creates a <MsalProvider /> using the msalTester.client as the IPublicClientApplication instance.
  • Call msalTester.waitForRedirect() to let MSAL React Tester handling MSAL React processes
  • Then makes any tests or assertions.

Here is an example where we are testing a <HomePage /> component during a first visit by an authenticated user:

test('Home page render correctly when user is not logged', async () => {

  // Mock a guest user, not yet authenticated:
  msalTester.isNotLogged();

  // Render the <HomePage /> component using a <MsalProvider /> 
  // with the mock IPublicClientApplication instance:
  render(
    <MsalProvider instance={msalTester.client}>
      <MemoryRouter>
        <Layout>
          <HomePage />
        </Layout>
      </MemoryRouter>
    </MsalProvider>,
  );
  
  // Wait for bqb-msal-react-tester to handle events from msal-react:
  await msalTester.waitForRedirect();

  // Test your <HomePage /> component:
  expect(screen.getByText(/Please sign-in/)).toBeInTheDocument();
});

On the other side, you can test the same component assuming your user is "already logged", using msalTester.isLogged().

Testing a component during an authentication process:

If you want to test a component during the authentication process, you can use msalTester.waitForLogin():

test('Home page render correctly when user logs in', async () => {

  // Mock a guest user, not yet authenticated:
  msalTester.isNotLogged();

  // Render the <HomePage /> component using a <MsalProvider /> 
  // with the mock IPublicClientApplication instance:
  render(
    <MsalProvider instance={msalTester.client}>
      <MemoryRouter>
        <Layout>
          <HomePage />
        </Layout>
      </MemoryRouter>
    </MsalProvider>,
  );

  // Wait for bqb-msal-react-tester to handle events from msal-react:
  await msalTester.waitForRedirect();

  // Getting the log in button.
  // Mock a user click to launch the log in process:
  const signin = screen.getByRole('button', { name: 'Sign In' });
  userEvent.click(signin);

  // Wait for bqb-msal-react-tester to handle the login process from msal-react:
  await msalTester.waitForLogin();

  // From here, your user is supposed to be logged in the component:
  expect(screen.getByRole('button', 
    { name: msalTester.activeAccount.name })).toBeInTheDocument();
});

On the other side, if you want to test component during a log out process, use msalTester.waitForLogout()

Example

You will find a full example in the ../example folder.

Take a look on the pages tests:

root
├── example
├──── src
├────── pages
├──────── HomePage.test.tsx
├──────── SearchPage.test.tsx

License

Licensed under the MIT License.

Contact

Feel free to contact me through twitter : @sebpertus

Keywords

react

FAQs

Package last updated on 20 Jul 2022

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts