From 549319b80b0aa2522eec1dd9338a5dbd38484fb3 Mon Sep 17 00:00:00 2001 From: Jeremy Daley Date: Fri, 10 Feb 2023 03:11:16 -0500 Subject: [PATCH] fix tests --- src/api-client.js | 6 +-- src/api-client.test.js | 116 +++++++++++++++++------------------------ 2 files changed, 50 insertions(+), 72 deletions(-) diff --git a/src/api-client.js b/src/api-client.js index 92228d9..a819091 100644 --- a/src/api-client.js +++ b/src/api-client.js @@ -1,10 +1,6 @@ const core = require('@actions/core') const github = require('@actions/github') -function getApiBaseUrl() { - return process.env.GITHUB_API_URL || 'https://api.github.com' -} - async function enablePagesSite({ githubToken }) { const octokit = github.getOctokit(githubToken) @@ -75,4 +71,4 @@ async function findOrCreatePagesSite({ githubToken, enablement = true }) { return pageObject } -module.exports = { findOrCreatePagesSite, enablePagesSite, getPagesSite, getApiBaseUrl } +module.exports = { findOrCreatePagesSite, enablePagesSite, getPagesSite } diff --git a/src/api-client.test.js b/src/api-client.test.js index e0b3643..96d6129 100644 --- a/src/api-client.test.js +++ b/src/api-client.test.js @@ -1,15 +1,32 @@ const core = require('@actions/core') -const axios = require('axios') - const apiClient = require('./api-client') +const mockGetPages = jest.fn() +const mockCreatePagesSite = jest.fn() + +jest.mock('@actions/github', () => ({ + context: { + repo: { + owner: 'actions', + repo: 'is-awesome' + } + }, + getOctokit: () => ({ + rest: { repos: { + getPages: mockGetPages, + createPagesSite: mockCreatePagesSite + }} + }) +})) + describe('apiClient', () => { - const GITHUB_REPOSITORY = 'actions/is-awesome' const GITHUB_TOKEN = 'gha-token' const PAGE_OBJECT = { html_url: 'https://actions.github.io/is-awesome/' } beforeEach(() => { jest.restoreAllMocks() + jest.clearAllMocks() + jest.resetAllMocks() // Mock error/warning/info/debug jest.spyOn(core, 'error').mockImplementation(jest.fn()) @@ -18,46 +35,21 @@ describe('apiClient', () => { jest.spyOn(core, 'debug').mockImplementation(jest.fn()) }) - describe('getApiBaseUrl', () => { - it('returns GITHUB_API_URL environment variable when set', async () => { - const expectedBaseUrl = 'https://api.ghe.com' - process.env.GITHUB_API_URL = expectedBaseUrl - const result = apiClient.getApiBaseUrl() - delete process.env.GITHUB_API_URL - expect(result).toEqual(expectedBaseUrl) - }) - - it('defaults to GitHub API if GITHUB_API_URL environment variable is empty', async () => { - process.env.GITHUB_API_URL = '' - const result = apiClient.getApiBaseUrl() - delete process.env.GITHUB_API_URL - expect(result).toEqual('https://api.github.com') - }) - - it('defaults to GitHub API if GITHUB_API_URL environment variable is not set', async () => { - delete process.env.GITHUB_API_URL - const result = apiClient.getApiBaseUrl() - expect(result).toEqual('https://api.github.com') - }) - }) - describe('enablePagesSite', () => { it('makes a request to create a page', async () => { - jest.spyOn(axios, 'post').mockImplementationOnce(() => Promise.resolve({ status: 201, data: PAGE_OBJECT })) + mockCreatePagesSite.mockImplementationOnce(() => Promise.resolve({ status: 201, data: PAGE_OBJECT })) const result = await apiClient.enablePagesSite({ - repositoryNwo: GITHUB_REPOSITORY, githubToken: GITHUB_TOKEN }) expect(result).toEqual(PAGE_OBJECT) }) it('handles a 409 response when the page already exists', async () => { - jest.spyOn(axios, 'post').mockImplementationOnce(() => Promise.reject({ response: { status: 409 } })) + mockCreatePagesSite.mockImplementationOnce(() => Promise.reject({ response: { status: 409 } })) // Simply assert that no error is raised const result = await apiClient.enablePagesSite({ - repositoryNwo: GITHUB_REPOSITORY, githubToken: GITHUB_TOKEN }) @@ -65,12 +57,11 @@ describe('apiClient', () => { }) it('re-raises errors on failure status codes', async () => { - jest.spyOn(axios, 'post').mockImplementationOnce(() => Promise.reject({ response: { status: 404 } })) + mockCreatePagesSite.mockImplementationOnce(() => Promise.reject({ response: { status: 404 } })) let erred = false try { await apiClient.enablePagesSite({ - repositoryNwo: GITHUB_REPOSITORY, githubToken: GITHUB_TOKEN }) } catch (error) { @@ -84,22 +75,20 @@ describe('apiClient', () => { describe('getPagesSite', () => { it('makes a request to get a page', async () => { const PAGE_OBJECT = { html_url: 'https://actions.github.io/is-awesome/' } - jest.spyOn(axios, 'get').mockImplementationOnce(() => Promise.resolve({ status: 200, data: PAGE_OBJECT })) + mockGetPages.mockImplementationOnce(() => Promise.resolve({ status: 200, data: PAGE_OBJECT })) const result = await apiClient.getPagesSite({ - repositoryNwo: GITHUB_REPOSITORY, githubToken: GITHUB_TOKEN }) expect(result).toEqual(PAGE_OBJECT) }) it('re-raises errors on failure status codes', async () => { - jest.spyOn(axios, 'get').mockImplementationOnce(() => Promise.reject({ response: { status: 404 } })) + mockGetPages.mockImplementationOnce(() => Promise.reject({ response: { status: 404 } })) let erred = false try { await apiClient.getPagesSite({ - repositoryNwo: GITHUB_REPOSITORY, githubToken: GITHUB_TOKEN }) } catch (error) { @@ -113,55 +102,51 @@ describe('apiClient', () => { describe('findOrCreatePagesSite', () => { it('does not make a request to create a page if it already exists', async () => { const PAGE_OBJECT = { html_url: 'https://actions.github.io/is-awesome/' } - jest.spyOn(axios, 'get').mockImplementationOnce(() => Promise.resolve({ status: 200, data: PAGE_OBJECT })) - jest.spyOn(axios, 'post').mockImplementationOnce(() => Promise.reject({ response: { status: 404 } })) + mockGetPages.mockImplementationOnce(() => Promise.resolve({ status: 200, data: PAGE_OBJECT })) + mockCreatePagesSite.mockImplementationOnce(() => Promise.reject({ response: { status: 404 } })) const result = await apiClient.findOrCreatePagesSite({ - repositoryNwo: GITHUB_REPOSITORY, githubToken: GITHUB_TOKEN }) expect(result).toEqual(PAGE_OBJECT) - expect(axios.get).toHaveBeenCalledTimes(1) - expect(axios.post).toHaveBeenCalledTimes(0) + expect(mockGetPages).toHaveBeenCalledTimes(1) + expect(mockCreatePagesSite).toHaveBeenCalledTimes(0) }) it('makes request to create a page by default if it does not exist', async () => { const PAGE_OBJECT = { html_url: 'https://actions.github.io/is-awesome/' } - jest.spyOn(axios, 'get').mockImplementationOnce(() => Promise.reject({ response: { status: 404 } })) - jest.spyOn(axios, 'post').mockImplementationOnce(() => Promise.resolve({ status: 201, data: PAGE_OBJECT })) + mockGetPages.mockImplementationOnce(() => Promise.reject({ response: { status: 404 } })) + mockCreatePagesSite.mockImplementationOnce(() => Promise.resolve({ status: 201, data: PAGE_OBJECT })) const result = await apiClient.findOrCreatePagesSite({ - repositoryNwo: GITHUB_REPOSITORY, githubToken: GITHUB_TOKEN }) expect(result).toEqual(PAGE_OBJECT) - expect(axios.get).toHaveBeenCalledTimes(1) - expect(axios.post).toHaveBeenCalledTimes(1) + expect(mockGetPages).toHaveBeenCalledTimes(1) + expect(mockCreatePagesSite).toHaveBeenCalledTimes(1) }) it('makes a request to create a page when explicitly enabled if it does not exist', async () => { const PAGE_OBJECT = { html_url: 'https://actions.github.io/is-awesome/' } - jest.spyOn(axios, 'get').mockImplementationOnce(() => Promise.reject({ response: { status: 404 } })) - jest.spyOn(axios, 'post').mockImplementationOnce(() => Promise.resolve({ status: 201, data: PAGE_OBJECT })) + mockGetPages.mockImplementationOnce(() => Promise.reject({ response: { status: 404 } })) + mockCreatePagesSite.mockImplementationOnce(() => Promise.resolve({ status: 201, data: PAGE_OBJECT })) const result = await apiClient.findOrCreatePagesSite({ - repositoryNwo: GITHUB_REPOSITORY, githubToken: GITHUB_TOKEN, enablement: true }) expect(result).toEqual(PAGE_OBJECT) - expect(axios.get).toHaveBeenCalledTimes(1) - expect(axios.post).toHaveBeenCalledTimes(1) + expect(mockGetPages).toHaveBeenCalledTimes(1) + expect(mockCreatePagesSite).toHaveBeenCalledTimes(1) }) it('does not make a request to create a page when explicitly disabled even if it does not exist', async () => { - jest.spyOn(axios, 'get').mockImplementationOnce(() => Promise.reject({ response: { status: 404 } })) - jest.spyOn(axios, 'post').mockImplementationOnce(() => Promise.reject({ response: { status: 500 } })) // just so they both aren't 404 + mockGetPages.mockImplementationOnce(() => Promise.reject({ response: { status: 404 } })) + mockCreatePagesSite.mockImplementationOnce(() => Promise.reject({ response: { status: 500 } })) // just so they both aren't 404 let erred = false try { await apiClient.findOrCreatePagesSite({ - repositoryNwo: GITHUB_REPOSITORY, githubToken: GITHUB_TOKEN, enablement: false }) @@ -171,18 +156,17 @@ describe('apiClient', () => { expect(error.response.status).toEqual(404) } expect(erred).toBe(true) - expect(axios.get).toHaveBeenCalledTimes(1) - expect(axios.post).toHaveBeenCalledTimes(0) + expect(mockGetPages).toHaveBeenCalledTimes(1) + expect(mockCreatePagesSite).toHaveBeenCalledTimes(0) }) it('does not make a second request to get page if create fails for reason other than existence', async () => { - jest.spyOn(axios, 'get').mockImplementationOnce(() => Promise.reject({ response: { status: 404 } })) - jest.spyOn(axios, 'post').mockImplementationOnce(() => Promise.reject({ response: { status: 500 } })) // just so they both aren't 404 + mockGetPages.mockImplementationOnce(() => Promise.reject({ response: { status: 404 } })) + mockCreatePagesSite.mockImplementationOnce(() => Promise.reject({ response: { status: 500 } })) // just so they both aren't 404 let erred = false try { await apiClient.findOrCreatePagesSite({ - repositoryNwo: GITHUB_REPOSITORY, githubToken: GITHUB_TOKEN }) } catch (error) { @@ -191,25 +175,23 @@ describe('apiClient', () => { expect(error.response.status).toEqual(500) } expect(erred).toBe(true) - expect(axios.get).toHaveBeenCalledTimes(1) - expect(axios.post).toHaveBeenCalledTimes(1) + expect(mockGetPages).toHaveBeenCalledTimes(1) + expect(mockCreatePagesSite).toHaveBeenCalledTimes(1) }) it('makes second request to get page if create fails because of existence', async () => { const PAGE_OBJECT = { html_url: 'https://actions.github.io/is-awesome/' } - jest - .spyOn(axios, 'get') + mockGetPages .mockImplementationOnce(() => Promise.reject({ response: { status: 404 } })) .mockImplementationOnce(() => Promise.resolve({ status: 200, data: PAGE_OBJECT })) - jest.spyOn(axios, 'post').mockImplementationOnce(() => Promise.reject({ response: { status: 409 } })) + mockCreatePagesSite.mockImplementationOnce(() => Promise.reject({ response: { status: 409 } })) const result = await apiClient.findOrCreatePagesSite({ - repositoryNwo: GITHUB_REPOSITORY, githubToken: GITHUB_TOKEN }) expect(result).toEqual(PAGE_OBJECT) - expect(axios.get).toHaveBeenCalledTimes(2) - expect(axios.post).toHaveBeenCalledTimes(1) + expect(mockGetPages).toHaveBeenCalledTimes(2) + expect(mockCreatePagesSite).toHaveBeenCalledTimes(1) }) }) })