💡

Auth0のMangementClientをmockする

2022/02/27に公開

Auth0のManagementAPIを使っている関数をjestでテストしようとした場合に少し手間取ったのでメモがてら書きます。

以下はnest.jsでAuth0のManagementAPIを使ってユーザー情報を取得している関数です。
この部分はAuth0の公式ドキュメントを参考にほとんどそのまま書いてます。

import { Injectable } from '@nestjs/common';
import { ManagementClient } from 'auth0';
import { Auth0User } from './auth0-management.dto';

@Injectable()
export class Auth0ManagementService {
  private createManagementClient = () => {
    return new ManagementClient({
      domain: AUTH0_DOMAIN,
      clientId: AUTH0_APP_CLIENT_ID,
      clientSecret: AUTH0_APP_CLIENT_SECRET,
      scope: "read:users",
    });
  };

  async getUsers(email: string): Promise<Auth0User[]> {
    const auth0 = this.createManagementClient();
    return await auth0.getUsers({
      search_engine: 'v3',
      q: `email: "${email}"`,
    });
  }
}

そしてテストコードを書いたら以下のエラーがでました。
どうやらManagementClientをmockしてなかったからのようです。

    ArgumentError: Must provide a domain
       9 |     const createManagementClient = (token: string) => {
    > 10 |       return new ManagementClient({
         |              ^
      11 |         domain: AUTH0_DOMAIN,
      12 |         clientId: AUTH0_APP_CLIENT_ID,

なので以下のようにmockします。

const mockGetUsers = jest.fn();
jest.mock('auth0', () => {
  return {
    ManagementClient: jest.fn().mockImplementation(() => {
      return {
        getUsers: mockGetUsers,
      };
    }),
  };
});

全体のjestのコードは以下です。


describe('Auth0Management', () => {
  let service: Auth0ManagementService;
  const user = UserFactory.build();
  const token = lorem.word(20);
  const dummyUser = mockDeep<Auth0User[]>([
    {
      identities: [
        {
          connection: 'Initial-Connection',
          user_id: '5457edea1b8f22891a000004',
          provider: 'auth0',
          isSocial: false,
        },
      ],
      app_metadata: {
        tenantId: user.tenantId,
      },
    },
  ]);
  beforeEach(async () => {
    mockGetUsers.mockReturnValue(dummyUser);
    const module: TestingModule = await Test.createTestingModule({
      providers: [
        Auth0ManagementService,
        Auth0ManagementResolver,
      ],
    })
      .compile();
    service = module.get<Auth0ManagementService>(Auth0ManagementService);
  });

  it('should be defined', () => expect(service).toBeDefined());

  it('get users', async () => {
    const result = await service.getUsers(user, token);
    expect(result).toEqual(dummyUser);
  });
});

これで無事にテスト関数が書けました。

参考
https://dev.classmethod.jp/articles/notes-when-mocking-modules-that-connect-to-external-services-in-jest/

Discussion