diff --git a/__tests__/lhisp-oauth-client.test.ts b/__tests__/lhisp-oauth-client.test.ts new file mode 100644 index 0000000..d0fbf7d --- /dev/null +++ b/__tests__/lhisp-oauth-client.test.ts @@ -0,0 +1,80 @@ +import axios from 'axios'; +import LhispOauthClient from "../src/lhisp-oauth-client"; +import { LhispOauthClientConstructorParams } from '../src/lhisp-oauth-client.t'; + +// Mock jest and set the type +jest.mock('axios'); +const mockedAxios = axios as jest.Mocked; + +const apiUrl = "https://myapi.com"; +const authUrl = "https://auth.myapi.com/oauth/token"; +const clientId = "testClientdId"; +const clientSecret = "testClientSecret"; +const baseClientParams = { apiUrl, authUrl, clientId, clientSecret }; +const basicAuth = `Basic ${Buffer.from(`${clientId}:${clientSecret}`).toString('base64')}`; + +describe("lhisp-oauth-client", ()=>{ + it("Shout Get Access Token with Standard Config", async ()=>{ + const cli = getOauthClient(); + mockedAxios.request.mockReset(); + mockedAxios.request.mockResolvedValueOnce({ + data: mockedAccessToken + }); + + const now = Date.now(); + const accessToken = await cli.getAccessToken(); + expect(accessToken).toBeDefined(); + expect(accessToken.token_type).toBe(mockedAccessToken.token_type); + expect(accessToken.access_token).toBe(mockedAccessToken.access_token); + expect(accessToken.expires_in).toBe(mockedAccessToken.expires_in); + expect(accessToken.scope).toBe(mockedAccessToken.scope); + expect(accessToken.created_at).toBeGreaterThanOrEqual(now); + expect(mockedAxios.request).toBeCalledWith(expect.objectContaining({ + url: authUrl, + method: "POST", + headers: { + Authorization: basicAuth, + 'Content-Type': "application/json", + } + })); + }); + + it("Shout Get Access Token with Custom Auth Header", async ()=>{ + const cli = getOauthClient({ + ...baseClientParams, + authHeaderName: "CustomAuthorizationHeader" + }); + mockedAxios.request.mockReset(); + mockedAxios.request.mockResolvedValueOnce({ + data: mockedAccessToken + }); + + const now = Date.now(); + const accessToken = await cli.getAccessToken(); + expect(accessToken).toBeDefined(); + expect(accessToken.token_type).toBe(mockedAccessToken.token_type); + expect(accessToken.access_token).toBe(mockedAccessToken.access_token); + expect(accessToken.expires_in).toBe(mockedAccessToken.expires_in); + expect(accessToken.scope).toBe(mockedAccessToken.scope); + expect(accessToken.created_at).toBeGreaterThanOrEqual(now); + expect(mockedAxios.request).toBeCalledWith(expect.objectContaining({ + url: authUrl, + method: "POST", + headers: { + CustomAuthorizationHeader: basicAuth, + 'Content-Type': "application/json", + } + })); + }); +}); + +function getOauthClient(opt:LhispOauthClientConstructorParams=baseClientParams){ + return new LhispOauthClient(opt); +} + +const mockedAccessToken = { + token_type: "Bearer", + access_token: "SomeAccessToken", + expires_in: 600, + scope: "cobrancas.boletos-requisicao cobrancas.boletos-info", +} \ No newline at end of file