首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用jest模拟Auth0 MangementClient?

如何使用jest模拟Auth0 MangementClient?
EN

Stack Overflow用户
提问于 2021-10-27 20:20:05
回答 2查看 280关注 0票数 0

这也是Auth0 node-auth0 library上的一个问题。用例是,我通过Terraform使用Auth0 create Actions API,并希望能够针对这些操作编写测试。

在本例中,我希望能够在不使用实际值的情况下测试onExecutePostLogin

代码语言:javascript
复制
// auth0-post-login.js

exports.onExecutePostLogin = async (event, api) => {
  const userId = event.user.user_id

  const ManagementClient = require('auth0').ManagementClient
  const management = new ManagementClient({
    domain: event.secrets.domain,
    clientId: event.secrets.clientId,
    clientSecret: event.secrets.clientSecret,
    audience: `https://${event.secrets.domain}/api/v2/`,
    scope: 'read:users',
  })

  const params = { id: userId, page: 0, per_page: 50, include_totals: false }
  let userPermissions = await management.getUserPermissions(params)
  const map = require('array-map')
  const permissions = map(userPermissions, function(permission) {
    return permission.permission_name
  })

  api.accessToken.setCustomClaim('https://example.com/access', permissions.join(' '))
}

其中一个主要问题是,像getUserPermissions这样的函数是通过它们的实用程序包装器创建的:

代码语言:javascript
复制
utils.wrapPropertyMethod(ManagementClient, 'getUserPermissions', 'users.getPermissions');

这会导致jest在查找函数时出现问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-10-27 20:20:05

为了实现像getUserPermissions这样的函数,我需要覆盖ManagementClient的实现。这使我能够将getUserPermissions定义为模拟函数。

代码语言:javascript
复制
import { onExecutePostLogin } from './auth0-post-login'

const mockManagementClient = jest.fn()
const mockGetUserPermissions = jest.fn()

jest.mock('auth0', () => {
  return {
    ManagementClient: (opts) => {
      mockManagementClient(opts)
      return {
        getUserPermissions: (params) => {
          return mockGetUserPermissions(params)
        },
      }
    },
  }
})

describe('onExecutePostLogin', () => {
  const mockSetCustomClaim = jest.fn()

  beforeEach(() => {
    mockSetCustomClaim.mockClear()
    mockManagementClient.mockClear()
    mockGetUserPermissions.mockClear()
    mockGetUserPermissions.mockReturnValue([
      {
        permission_name: 'read:foo',
      },
      {
        permission_name: 'update:bar',
      },
    ])
  })

  const event = {
    user: {
      user_id: 'abcd123',
    },
    secrets: {
      domain: 'test-example.us.auth0.com',
      clientId: 'a-client-id',
      clientSecret: 'a-client-secret',
    },
  }

  const api = {
    accessToken: {
      setCustomClaim: mockSetCustomClaim,
    },
  }

  it('initializes a ManagementClient', async () => {
    await onExecutePostLogin(event, api)

    expect(mockManagementClient).toHaveBeenCalledWith({
      domain: event.secrets.domain,
      clientId: event.secrets.clientId,
      clientSecret: event.secrets.clientSecret,
      audience: `https://${event.secrets.domain}/api/v2/`,
      scope: 'read:users',
    })
  })

  it('gets users permissions', async () => {
    await onExecutePostLogin(event, api)

    expect(mockGetUserPermissions).toHaveBeenCalledWith(
      { id: event.user.user_id, page: 0, per_page: 50, include_totals: false },
    )
  })

  it('sets custom claims', async () => {
    await onExecutePostLogin(event, api)

    const expectedPermissions = 'read:foo update:bar'
    expect(mockSetCustomClaim).toHaveBeenCalledWith(
      'https://example.com/access', expectedPermissions,
    )
  })
})
票数 0
EN

Stack Overflow用户

发布于 2021-11-11 05:57:38

我做了一些类似于stsmurf的事情来模拟Auth0方法的响应。

我有一个文件,其中存储了我的帮助器方法,比如“按名称查找角色”

代码语言:javascript
复制
// helper.ts

import { ManagementClient } from 'auth0';

export const getRoleByName = async (roleName: string) => {
  const api = new ManagementClient({
    clientId: clientId,
    clientSecret: clientSecret,
    domain: domain,
  });

  const roles = await api.getRoles();
  const role = roles.find((r) => r.name == roleName);
  if (!role) throw new Error('Role not found');

  return role;
};
代码语言:javascript
复制
// helper.test.ts

import { Role } from 'auth0';

import { getRoleByName } from './helpers';

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

describe('Get role', () => {
  beforeAll(() => {
    const dummyRoles: Role[] = [
      { id: 'fake_id_1', description: 'Fake role nr 1', name: 'Fake Role 1' },
      { id: 'fake_id_2', description: 'Fake role nr 2', name: 'Fake Role 2' },
    ];
    mockGetRoles.mockImplementation(() => dummyRoles);
  });

  it('can return a role if it exists', async () => {
    const expectedResult: Role = {
      id: 'fake_id_1',
      description: 'Fake role nr 1',
      name: 'Fake Role 1',
    };
    const result = await getRoleByName('Fake Role 1');

    expect(expectedResult).toEqual(result);
  });

  it('will throw an error when a role is not found', async () => {
    await expect(getRoleByName('Fake Role 3')).rejects.toThrowError();
  });
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69744990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档