fix tests

This commit is contained in:
Jeremy Daley
2023-02-10 03:11:16 -05:00
parent 7d88dd59cd
commit 549319b80b
2 changed files with 50 additions and 72 deletions

View File

@@ -1,10 +1,6 @@
const core = require('@actions/core') const core = require('@actions/core')
const github = require('@actions/github') const github = require('@actions/github')
function getApiBaseUrl() {
return process.env.GITHUB_API_URL || 'https://api.github.com'
}
async function enablePagesSite({ githubToken }) { async function enablePagesSite({ githubToken }) {
const octokit = github.getOctokit(githubToken) const octokit = github.getOctokit(githubToken)
@@ -75,4 +71,4 @@ async function findOrCreatePagesSite({ githubToken, enablement = true }) {
return pageObject return pageObject
} }
module.exports = { findOrCreatePagesSite, enablePagesSite, getPagesSite, getApiBaseUrl } module.exports = { findOrCreatePagesSite, enablePagesSite, getPagesSite }

View File

@@ -1,15 +1,32 @@
const core = require('@actions/core') const core = require('@actions/core')
const axios = require('axios')
const apiClient = require('./api-client') 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', () => { describe('apiClient', () => {
const GITHUB_REPOSITORY = 'actions/is-awesome'
const GITHUB_TOKEN = 'gha-token' const GITHUB_TOKEN = 'gha-token'
const PAGE_OBJECT = { html_url: 'https://actions.github.io/is-awesome/' } const PAGE_OBJECT = { html_url: 'https://actions.github.io/is-awesome/' }
beforeEach(() => { beforeEach(() => {
jest.restoreAllMocks() jest.restoreAllMocks()
jest.clearAllMocks()
jest.resetAllMocks()
// Mock error/warning/info/debug // Mock error/warning/info/debug
jest.spyOn(core, 'error').mockImplementation(jest.fn()) jest.spyOn(core, 'error').mockImplementation(jest.fn())
@@ -18,46 +35,21 @@ describe('apiClient', () => {
jest.spyOn(core, 'debug').mockImplementation(jest.fn()) 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', () => { describe('enablePagesSite', () => {
it('makes a request to create a page', async () => { 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({ const result = await apiClient.enablePagesSite({
repositoryNwo: GITHUB_REPOSITORY,
githubToken: GITHUB_TOKEN githubToken: GITHUB_TOKEN
}) })
expect(result).toEqual(PAGE_OBJECT) expect(result).toEqual(PAGE_OBJECT)
}) })
it('handles a 409 response when the page already exists', async () => { 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 // Simply assert that no error is raised
const result = await apiClient.enablePagesSite({ const result = await apiClient.enablePagesSite({
repositoryNwo: GITHUB_REPOSITORY,
githubToken: GITHUB_TOKEN githubToken: GITHUB_TOKEN
}) })
@@ -65,12 +57,11 @@ describe('apiClient', () => {
}) })
it('re-raises errors on failure status codes', async () => { 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 let erred = false
try { try {
await apiClient.enablePagesSite({ await apiClient.enablePagesSite({
repositoryNwo: GITHUB_REPOSITORY,
githubToken: GITHUB_TOKEN githubToken: GITHUB_TOKEN
}) })
} catch (error) { } catch (error) {
@@ -84,22 +75,20 @@ describe('apiClient', () => {
describe('getPagesSite', () => { describe('getPagesSite', () => {
it('makes a request to get a page', async () => { it('makes a request to get a page', async () => {
const PAGE_OBJECT = { html_url: 'https://actions.github.io/is-awesome/' } 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({ const result = await apiClient.getPagesSite({
repositoryNwo: GITHUB_REPOSITORY,
githubToken: GITHUB_TOKEN githubToken: GITHUB_TOKEN
}) })
expect(result).toEqual(PAGE_OBJECT) expect(result).toEqual(PAGE_OBJECT)
}) })
it('re-raises errors on failure status codes', async () => { 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 let erred = false
try { try {
await apiClient.getPagesSite({ await apiClient.getPagesSite({
repositoryNwo: GITHUB_REPOSITORY,
githubToken: GITHUB_TOKEN githubToken: GITHUB_TOKEN
}) })
} catch (error) { } catch (error) {
@@ -113,55 +102,51 @@ describe('apiClient', () => {
describe('findOrCreatePagesSite', () => { describe('findOrCreatePagesSite', () => {
it('does not make a request to create a page if it already exists', async () => { 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/' } 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 }))
jest.spyOn(axios, 'post').mockImplementationOnce(() => Promise.reject({ response: { status: 404 } })) mockCreatePagesSite.mockImplementationOnce(() => Promise.reject({ response: { status: 404 } }))
const result = await apiClient.findOrCreatePagesSite({ const result = await apiClient.findOrCreatePagesSite({
repositoryNwo: GITHUB_REPOSITORY,
githubToken: GITHUB_TOKEN githubToken: GITHUB_TOKEN
}) })
expect(result).toEqual(PAGE_OBJECT) expect(result).toEqual(PAGE_OBJECT)
expect(axios.get).toHaveBeenCalledTimes(1) expect(mockGetPages).toHaveBeenCalledTimes(1)
expect(axios.post).toHaveBeenCalledTimes(0) expect(mockCreatePagesSite).toHaveBeenCalledTimes(0)
}) })
it('makes request to create a page by default if it does not exist', async () => { 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/' } const PAGE_OBJECT = { html_url: 'https://actions.github.io/is-awesome/' }
jest.spyOn(axios, 'get').mockImplementationOnce(() => Promise.reject({ response: { status: 404 } })) mockGetPages.mockImplementationOnce(() => Promise.reject({ response: { status: 404 } }))
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.findOrCreatePagesSite({ const result = await apiClient.findOrCreatePagesSite({
repositoryNwo: GITHUB_REPOSITORY,
githubToken: GITHUB_TOKEN githubToken: GITHUB_TOKEN
}) })
expect(result).toEqual(PAGE_OBJECT) expect(result).toEqual(PAGE_OBJECT)
expect(axios.get).toHaveBeenCalledTimes(1) expect(mockGetPages).toHaveBeenCalledTimes(1)
expect(axios.post).toHaveBeenCalledTimes(1) expect(mockCreatePagesSite).toHaveBeenCalledTimes(1)
}) })
it('makes a request to create a page when explicitly enabled if it does not exist', async () => { 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/' } const PAGE_OBJECT = { html_url: 'https://actions.github.io/is-awesome/' }
jest.spyOn(axios, 'get').mockImplementationOnce(() => Promise.reject({ response: { status: 404 } })) mockGetPages.mockImplementationOnce(() => Promise.reject({ response: { status: 404 } }))
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.findOrCreatePagesSite({ const result = await apiClient.findOrCreatePagesSite({
repositoryNwo: GITHUB_REPOSITORY,
githubToken: GITHUB_TOKEN, githubToken: GITHUB_TOKEN,
enablement: true enablement: true
}) })
expect(result).toEqual(PAGE_OBJECT) expect(result).toEqual(PAGE_OBJECT)
expect(axios.get).toHaveBeenCalledTimes(1) expect(mockGetPages).toHaveBeenCalledTimes(1)
expect(axios.post).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 () => { 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 } })) mockGetPages.mockImplementationOnce(() => Promise.reject({ response: { status: 404 } }))
jest.spyOn(axios, 'post').mockImplementationOnce(() => Promise.reject({ response: { status: 500 } })) // just so they both aren't 404 mockCreatePagesSite.mockImplementationOnce(() => Promise.reject({ response: { status: 500 } })) // just so they both aren't 404
let erred = false let erred = false
try { try {
await apiClient.findOrCreatePagesSite({ await apiClient.findOrCreatePagesSite({
repositoryNwo: GITHUB_REPOSITORY,
githubToken: GITHUB_TOKEN, githubToken: GITHUB_TOKEN,
enablement: false enablement: false
}) })
@@ -171,18 +156,17 @@ describe('apiClient', () => {
expect(error.response.status).toEqual(404) expect(error.response.status).toEqual(404)
} }
expect(erred).toBe(true) expect(erred).toBe(true)
expect(axios.get).toHaveBeenCalledTimes(1) expect(mockGetPages).toHaveBeenCalledTimes(1)
expect(axios.post).toHaveBeenCalledTimes(0) expect(mockCreatePagesSite).toHaveBeenCalledTimes(0)
}) })
it('does not make a second request to get page if create fails for reason other than existence', async () => { 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 } })) mockGetPages.mockImplementationOnce(() => Promise.reject({ response: { status: 404 } }))
jest.spyOn(axios, 'post').mockImplementationOnce(() => Promise.reject({ response: { status: 500 } })) // just so they both aren't 404 mockCreatePagesSite.mockImplementationOnce(() => Promise.reject({ response: { status: 500 } })) // just so they both aren't 404
let erred = false let erred = false
try { try {
await apiClient.findOrCreatePagesSite({ await apiClient.findOrCreatePagesSite({
repositoryNwo: GITHUB_REPOSITORY,
githubToken: GITHUB_TOKEN githubToken: GITHUB_TOKEN
}) })
} catch (error) { } catch (error) {
@@ -191,25 +175,23 @@ describe('apiClient', () => {
expect(error.response.status).toEqual(500) expect(error.response.status).toEqual(500)
} }
expect(erred).toBe(true) expect(erred).toBe(true)
expect(axios.get).toHaveBeenCalledTimes(1) expect(mockGetPages).toHaveBeenCalledTimes(1)
expect(axios.post).toHaveBeenCalledTimes(1) expect(mockCreatePagesSite).toHaveBeenCalledTimes(1)
}) })
it('makes second request to get page if create fails because of existence', async () => { 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/' } const PAGE_OBJECT = { html_url: 'https://actions.github.io/is-awesome/' }
jest mockGetPages
.spyOn(axios, 'get')
.mockImplementationOnce(() => Promise.reject({ response: { status: 404 } })) .mockImplementationOnce(() => Promise.reject({ response: { status: 404 } }))
.mockImplementationOnce(() => Promise.resolve({ status: 200, data: PAGE_OBJECT })) .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({ const result = await apiClient.findOrCreatePagesSite({
repositoryNwo: GITHUB_REPOSITORY,
githubToken: GITHUB_TOKEN githubToken: GITHUB_TOKEN
}) })
expect(result).toEqual(PAGE_OBJECT) expect(result).toEqual(PAGE_OBJECT)
expect(axios.get).toHaveBeenCalledTimes(2) expect(mockGetPages).toHaveBeenCalledTimes(2)
expect(axios.post).toHaveBeenCalledTimes(1) expect(mockCreatePagesSite).toHaveBeenCalledTimes(1)
}) })
}) })
}) })