Jest.js 具有自定义授权者的无服务器lambda单元测试处理程序

jxct1oxe  于 2023-01-03  发布在  Jest
关注(0)|答案(2)|浏览(142)

我的无服务器lambda应用程序具有自定义授权器

verify-token:
    handler: app/Middleware/VerifyToken.auth

  user:
    handler: app/Handlers/Users.user
    events:
      - http:
          path: user
          method: get
          cors: true
          authorizer: verify-token

我正在为用户处理程序编写jest单元测试,但由于在部署时自定义授权是在执行用户处理程序之前运行的,因此如何在jest单元测试中应用相同的功能,以便在运行用户处理程序测试之前应用授权?
这是我的考验

const  { user }  = require('../../app/Handlers/Users');

/**
 * Tests for get()
 */
describe('Get user', () => {

    it('Get user data', async done => {
        let userEvent = {
            headers: {
                'authorization': 'Bearer TOKEN'
            }
        }
        // user.authorizer();
        user(userEvent, null, (error, data) => {
            try {
                expect(data.statusCode).toBe(200);
                done();
            } catch (error) {
                done(error);
            }

        });
    });

});
avkwfej4

avkwfej41#

我尝试使用mock-jws library,它对我很有效。
这里我尝试通过模拟auth0 jsonwebtoken提供的jwks库来单独测试授权者。如果授权者测试成功,则您可以单独测试受保护端点或生成jwt令牌,并从我提供的代码生成策略,如果返回允许策略,则测试受保护端点

const createJWKSMock = require('mock-jwks');
const authorizer = require('../authorizer/authorizer');

describe('Auth Test', () => {
  const jwks = createJWKSMock.default('https://your domain here');

  beforeEach(() => {
    jwks.start();
  });

  afterEach(() => {
    jwks.stop();
  });
  test('should verify the token', async () => {
    const token = jwks.token({
      aud: 'https://your audience,
      iss: 'https://issuer of token',
    });
    console.log(token);
    const event = {
      authorizationToken: `Bearer ${token}`,
    };
    const policy = await authorizer.auth(event, 'context');
    console.log('jatin', policy);
    expect(policy.context).not.toBe(undefined);
  });
omtl5h9j

omtl5h9j2#

serverless.yml中的authorizer键基本上告诉API Gateway对于特定的API端点使用什么授权器函数,授权器在您通过API部署和调用lambda时使用,您不能真正在本地测试此流程,即通过单元测试。
您不必测试您的函数沿着授权者,如果您的授权者将操纵事件,比如提取JWT,您应该在测试中mock这些流程,并将处理后的事件传递给目标函数。
如果你想测试autoirzer,你应该为它写一个单独的测试。

相关问题