Unit tests & Adjustments for 3.7.0

This commit is contained in:
James Ives 2020-10-17 11:47:44 -04:00
parent dc667b3217
commit 4d005d444f
6 changed files with 143 additions and 19 deletions

View File

@ -96,7 +96,7 @@ npm install @jamesives/github-pages-deploy-action
It can then be imported into your project like so. It can then be imported into your project like so.
```javascript ```javascript
import run, {ActionInterface} from "github-pages-deploy-action"; import run from "github-pages-deploy-action";
``` ```
Calling the functions directly will require you to pass in an object containing the variables found in the configuration section, you'll also need to provide a `workspace` with a path to your project. Calling the functions directly will require you to pass in an object containing the variables found in the configuration section, you'll also need to provide a `workspace` with a path to your project.
@ -109,6 +109,7 @@ run({
branch: "gh-pages", branch: "gh-pages",
folder: "build", folder: "build",
repositoryName: "JamesIves/github-pages-deploy-action", repositoryName: "JamesIves/github-pages-deploy-action",
silent: true,
workspace: "src/project/location", workspace: "src/project/location",
}); });
``` ```
@ -335,8 +336,4 @@ If you'd like to enable action debugging you can set the `ACTIONS_STEP_DEBUG` en
This project would not be possible without all of our fantastic [contributors](https://github.com/JamesIves/github-pages-deploy-action/graphs/contributors). This project would not be possible without all of our fantastic [contributors](https://github.com/JamesIves/github-pages-deploy-action/graphs/contributors).
<a href="https://github.com/JamesIves/github-pages-deploy-action/graphs/contributors">
<img src="https://contributors-img.web.app/image?repo=JamesIves/github-pages-deploy-action" />
</a>
If you'd like to support the maintenance and upkeep of this project you can [donate via GitHub Sponsors](https://github.com/sponsors/JamesIves). This project is distributed under the [MIT](https://github.com/JamesIves/github-pages-deploy-action/blob/dev/LICENSE) license. If you'd like to support the maintenance and upkeep of this project you can [donate via GitHub Sponsors](https://github.com/sponsors/JamesIves). This project is distributed under the [MIT](https://github.com/JamesIves/github-pages-deploy-action/blob/dev/LICENSE) license.

View File

@ -23,7 +23,8 @@ jest.mock('@actions/io', () => ({
})) }))
jest.mock('../src/execute', () => ({ jest.mock('../src/execute', () => ({
execute: jest.fn() __esModule: true,
execute: jest.fn(),
})) }))
describe('git', () => { describe('git', () => {
@ -50,6 +51,33 @@ describe('git', () => {
await init(action) await init(action)
expect(execute).toBeCalledTimes(7) expect(execute).toBeCalledTimes(7)
}) })
it('should catch when a function throws an error', async () => {
(execute as jest.Mock).mockImplementationOnce(() => {
throw new Error('Mocked throw');
});
Object.assign(action, {
silent: false,
repositoryPath: 'JamesIves/github-pages-deploy-action',
accessToken: '123',
branch: 'branch',
folder: '.',
preserve: true,
isTest: true,
pusher: {
name: 'asd',
email: 'as@cat'
}
})
try {
await init(action)
} catch (error) {
expect(error.message).toBe('There was an error initializing the repository: Mocked throw ❌');
}
})
}) })
describe('generateBranch', () => { describe('generateBranch', () => {
@ -68,6 +96,30 @@ describe('git', () => {
await generateBranch(action) await generateBranch(action)
expect(execute).toBeCalledTimes(6) expect(execute).toBeCalledTimes(6)
}) })
it('should catch when a function throws an error', async () => {
(execute as jest.Mock).mockImplementationOnce(() => {
throw new Error('Mocked throw');
});
Object.assign(action, {
silent: false,
accessToken: '123',
branch: 'branch',
folder: '.',
pusher: {
name: 'asd',
email: 'as@cat'
}
})
try {
await generateBranch(action)
} catch (error) {
expect(error.message).toBe('There was an error creating the deployment branch: There was an error switching to the base branch: Mocked throw ❌ ❌');
}
})
}) })
describe('switchToBaseBranch', () => { describe('switchToBaseBranch', () => {
@ -103,6 +155,32 @@ describe('git', () => {
await switchToBaseBranch(action) await switchToBaseBranch(action)
expect(execute).toBeCalledTimes(1) expect(execute).toBeCalledTimes(1)
}) })
it('should catch when a function throws an error', async () => {
(execute as jest.Mock).mockImplementationOnce(() => {
throw new Error('Mocked throw');
});
Object.assign(action, {
silent: false,
baseBranch: '123',
accessToken: '123',
branch: 'branch',
folder: '.',
pusher: {
name: 'asd',
email: 'as@cat'
}
})
try {
await switchToBaseBranch(action)
} catch (error) {
expect(error.message).toBe('There was an error switching to the base branch: Mocked throw ❌');
}
})
}) })
describe('deploy', () => { describe('deploy', () => {
@ -276,5 +354,30 @@ describe('git', () => {
expect(rmRF).toBeCalledTimes(1) expect(rmRF).toBeCalledTimes(1)
expect(response).toBe(Status.SKIPPED) expect(response).toBe(Status.SKIPPED)
}) })
it('should catch when a function throws an error', async () => {
(execute as jest.Mock).mockImplementationOnce(() => {
throw new Error('Mocked throw');
});
Object.assign(action, {
silent: false,
folder: 'assets',
branch: 'branch',
gitHubToken: '123',
lfs: true,
pusher: {
name: 'asd',
email: 'as@cat'
}
})
try {
await deploy(action)
} catch (error) {
expect(error.message).toBe('The deploy step encountered an error: Mocked throw ❌');
}
})
}) })
}) })

View File

@ -321,7 +321,7 @@ describe('util', () => {
checkParameters(action) checkParameters(action)
} catch (e) { } catch (e) {
expect(e.message).toMatch( expect(e.message).toMatch(
`The ${action.folderPath} directory you're trying to deploy doesn't exist.` `The directory you're trying to deploy named notARealFolder doesn't exist. Please double check the path and any prerequisite build scripts and try again. ❗`
) )
} }
}) })

View File

@ -24,6 +24,7 @@ export interface ActionInterface {
email?: string email?: string
/** The folder to deploy. */ /** The folder to deploy. */
folder: string folder: string
/** The auto generated folder path. */
folderPath?: string folderPath?: string
/** GitHub deployment token. */ /** GitHub deployment token. */
gitHubToken?: string | null gitHubToken?: string | null
@ -53,6 +54,26 @@ export interface ActionInterface {
workspace: string workspace: string
} }
/** The minimum required values to run the action as a node module. */
export interface NodeActionInterface {
/** Deployment access token. */
accessToken?: string | null
/** The branch that the action should deploy to. */
branch: string
/** The folder to deploy. */
folder: string
/** GitHub deployment token. */
gitHubToken?: string | null
/** The repository path, for example JamesIves/github-pages-deploy-action. */
repositoryName: string
/** Determines if the action should run in silent mode or not. */
silent: boolean
/** Set to true if you're using an ssh client in your build step. */
ssh?: boolean | null
/** The folder where your deployment project lives. */
workspace: string
}
/* Required action data that gets initialized when running within the GitHub Actions environment. */ /* Required action data that gets initialized when running within the GitHub Actions environment. */
export const action: ActionInterface = { export const action: ActionInterface = {
accessToken: getInput('ACCESS_TOKEN'), accessToken: getInput('ACCESS_TOKEN'),
@ -107,6 +128,7 @@ export const action: ActionInterface = {
workspace: process.env.GITHUB_WORKSPACE || '' workspace: process.env.GITHUB_WORKSPACE || ''
} }
/** */
export type RequiredActionParameters = Pick< export type RequiredActionParameters = Pick<
ActionInterface, ActionInterface,
'accessToken' | 'gitHubToken' | 'ssh' | 'branch' | 'folder' 'accessToken' | 'gitHubToken' | 'ssh' | 'branch' | 'folder'

View File

@ -1,5 +1,5 @@
import {exportVariable, info, setFailed} from '@actions/core' import {exportVariable, info, setFailed} from '@actions/core'
import {action, ActionInterface, Status} from './constants' import {ActionInterface, Status, NodeActionInterface} from './constants'
import {deploy, init} from './git' import {deploy, init} from './git'
import { import {
generateFolderPath, generateFolderPath,
@ -13,7 +13,7 @@ import {
* @param {object} configuration - The action configuration. * @param {object} configuration - The action configuration.
*/ */
export default async function run( export default async function run(
configuration: ActionInterface configuration: ActionInterface | NodeActionInterface
): Promise<void> { ): Promise<void> {
let status: Status = Status.RUNNING let status: Status = Status.RUNNING
@ -22,25 +22,25 @@ export default async function run(
GitHub Pages Deploy Action 🚀 GitHub Pages Deploy Action 🚀
🚀 Getting Started Guide: https://github.com/marketplace/actions/deploy-to-github-pages 🚀 Getting Started Guide: https://github.com/marketplace/actions/deploy-to-github-pages
FAQ/Wiki: https://github.com/JamesIves/github-pages-deploy-action/wiki Discussions / Q&A: https://github.com/JamesIves/github-pages-deploy-action/discussions
🔧 Support: https://github.com/JamesIves/github-pages-deploy-action/issues 🔧 Report a Bug: https://github.com/JamesIves/github-pages-deploy-action/issues
Contribute: https://github.com/JamesIves/github-pages-deploy-action/blob/dev/CONTRIBUTING.md Contribute: https://github.com/JamesIves/github-pages-deploy-action/blob/dev/CONTRIBUTING.md
📣 Maintained by James Ives (https://jamesiv.es)`) 📣 Maintained by James Ives (https://jamesiv.es)
Support: https://github.com/sponsors/JamesIves`)
info('Checking configuration and starting deployment… 🚦') info('Checking configuration and starting deployment… 🚦')
const settings = { const settings: ActionInterface = {
...action,
...configuration ...configuration
} }
// Defines the folder paths // Defines the repository/folder paths and token types.
// Also verifies that the action has all of the required parameters.
settings.folderPath = generateFolderPath(settings) settings.folderPath = generateFolderPath(settings)
checkParameters(settings) checkParameters(settings)
// Defines the repository paths and token types.
settings.repositoryPath = generateRepositoryPath(settings) settings.repositoryPath = generateRepositoryPath(settings)
settings.tokenType = generateTokenType(settings) settings.tokenType = generateTokenType(settings)

View File

@ -3,6 +3,7 @@ import path from 'path'
import {isDebug} from '@actions/core' import {isDebug} from '@actions/core'
import {ActionInterface, RequiredActionParameters} from './constants' import {ActionInterface, RequiredActionParameters} from './constants'
/* Replaces all instances of a match in a string. */
const replaceAll = (input: string, find: string, replace: string): string => const replaceAll = (input: string, find: string, replace: string): string =>
input.split(find).join(replace) input.split(find).join(replace)
@ -49,6 +50,7 @@ const hasRequiredParameters = <K extends keyof RequiredActionParameters>(
return Boolean(nonNullParams.length) return Boolean(nonNullParams.length)
} }
/* Verifies the action has the required parameters to run, otherwise throw an error. */
export const checkParameters = (action: ActionInterface): void => { export const checkParameters = (action: ActionInterface): void => {
if (!hasRequiredParameters(action, ['accessToken', 'gitHubToken', 'ssh'])) { if (!hasRequiredParameters(action, ['accessToken', 'gitHubToken', 'ssh'])) {
throw new Error( throw new Error(
@ -66,7 +68,7 @@ export const checkParameters = (action: ActionInterface): void => {
if (!existsSync(action.folderPath as string)) { if (!existsSync(action.folderPath as string)) {
throw new Error( throw new Error(
`The ${action.folderPath} directory you're trying to deploy doesn't exist. ❗` `The directory you're trying to deploy named ${action.folderPath} doesn't exist. Please double check the path and any prerequisite build scripts and try again. ❗`
) )
} }
} }