Skip to content

Commit

Permalink
Add release functions tests
Browse files Browse the repository at this point in the history
  • Loading branch information
lucacome committed Mar 24, 2023
1 parent 8bbfdcf commit 904a13d
Show file tree
Hide file tree
Showing 5 changed files with 381 additions and 8 deletions.
41 changes: 41 additions & 0 deletions __mocks__/@actions/github.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
const mockApi = {
rest: {
issues: {
addLabels: jest.fn(),
removeLabel: jest.fn(),
},
pulls: {
get: jest.fn().mockResolvedValue({}),
listFiles: {
endpoint: {
merge: jest.fn().mockReturnValue({}),
},
},
},
repos: {
getContent: jest.fn(),
listReleases: jest.fn(),
createRelease: jest.fn(),
updateRelease: jest.fn(),
generateReleaseNotes: jest.fn(),
},
},
paginate: jest.fn().mockImplementation(async (method, options) => {
const response = await method(options)
return response.data
}),
}
export const context = {
payload: {
pull_request: {
number: 123,
},
},
repo: {
owner: 'monalisa',
repo: 'helloworld',
},
ref: 'refs/heads/main',
}

export const getOctokit = jest.fn().mockImplementation(() => mockApi)
236 changes: 236 additions & 0 deletions __tests__/release.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,236 @@
import {getRelease, createOrUpdateRelease} from '../src/release'
import * as github from '@actions/github'
import {Inputs} from '../src/context'

const fs = jest.requireActual('fs')

jest.mock('@actions/core')
jest.mock('@actions/github')

let gh: ReturnType<typeof github.getOctokit>

describe('getRelease', () => {
beforeEach(() => {
jest.clearAllMocks()
gh = github.getOctokit('_')
})

it('should return the latest release when multiple releases exist', async () => {
const mockResponse: any = {
headers: {},
status: 200,
data: [
{
tag_name: 'v1.0.2',
target_commitish: 'main',
draft: false,
},
{
tag_name: 'v1.0.1',
target_commitish: 'main',
draft: false,
},
{
tag_name: 'v1.0.0',
target_commitish: 'main',
draft: false,
},
],
}

const mockReleases = jest.spyOn(gh.rest.repos, 'listReleases')
mockReleases.mockResolvedValue(mockResponse)

const [releases, latestRelease] = await getRelease(gh)

expect(releases).toHaveLength(3)
expect(latestRelease).toBe('v1.0.2')
})

it('should return the latest for the current branch', async () => {
const mockResponse: any = {
headers: {},
status: 200,
data: [
{
tag_name: 'v1.0.2',
target_commitish: 'dev',
draft: false,
},
{
tag_name: 'v1.0.1',
target_commitish: 'main',
draft: false,
},
{
tag_name: 'v1.0.0',
target_commitish: 'main',
draft: false,
},
],
}

const mockReleases = jest.spyOn(gh.rest.repos, 'listReleases')
mockReleases.mockResolvedValue(mockResponse)

const [releases, latestRelease] = await getRelease(gh)

expect(releases).toHaveLength(3)
expect(latestRelease).toBe('v1.0.1')
})

it('should return the latest non-draft release', async () => {
const mockResponse: any = {
headers: {},
status: 200,
data: [
{
tag_name: 'v1.0.2',
target_commitish: 'dev',
draft: false,
},
{
tag_name: 'v1.0.1',
target_commitish: 'main',
draft: true,
},
{
tag_name: 'v1.0.0',
target_commitish: 'main',
draft: false,
},
],
}

const mockReleases = jest.spyOn(gh.rest.repos, 'listReleases')
mockReleases.mockResolvedValue(mockResponse)

const [releases, latestRelease] = await getRelease(gh)

expect(releases).toHaveLength(3)
expect(latestRelease).toBe('v1.0.0')
})

it('should return v0.0.0 when no releases exist', async () => {
const mockResponse: any = {
headers: {},
status: 200,
data: [],
}

const mockReleases = jest.spyOn(gh.rest.repos, 'listReleases')
mockReleases.mockResolvedValue(mockResponse)

const [releases, latestRelease] = await getRelease(gh)

expect(releases).toHaveLength(0)
expect(latestRelease).toBe('v0.0.0')
})
})

describe('createOrUpdateRelease', () => {
let mockResponse: any
let mockNotes: any
const inputs: Inputs = {
githubToken: '_',
majorLabel: 'major',
minorLabel: 'minor',
header: 'header',
footer: 'footer',
}
beforeEach(() => {
jest.clearAllMocks()
gh = github.getOctokit('_')
mockResponse = {
headers: {},
status: 200,
data: [
{
id: 1,
tag_name: 'v1.0.0',
target_commitish: 'main',
draft: false,
body: 'header',
},
{
id: 2,
tag_name: 'v1.0.1',
target_commitish: 'main',
draft: true,
body: 'header',
},
],
}

mockNotes = {
headers: {},
status: 200,
data: {
body: 'header',
name: 'v1.0.1',
},
}
})

it('should create a new release draft', async () => {
const mockInputCreate: any = {
headers: {},
status: 200,
data: [
{
id: 1,
tag_name: 'v1.0.0',
target_commitish: 'main',
draft: false,
},
],
}

const mockReleases = jest.spyOn(gh.rest.repos, 'createRelease')
mockReleases.mockResolvedValue(mockResponse)

const mockRelease = jest.spyOn(gh.rest.repos, 'listReleases')
mockRelease.mockResolvedValue(mockInputCreate)

const mockReleaseNotes = jest.spyOn(gh.rest.repos, 'generateReleaseNotes')
mockReleaseNotes.mockResolvedValue(mockNotes)

const response = await createOrUpdateRelease(gh, inputs, mockInputCreate.data, 'v1.0.0', 'v1.0.1')

expect(mockReleases).toHaveBeenCalledTimes(1)
})

it('should update an existing release draft', async () => {
const mockInputUpdate: any = {
headers: {},
status: 200,
data: [
{
id: 1,
tag_name: 'v1.0.0',
target_commitish: 'main',
draft: false,
},
{
id: 2,
tag_name: 'v1.0.1',
target_commitish: 'main',
draft: true,
},
],
}

const mockReleases = jest.spyOn(gh.rest.repos, 'updateRelease')
mockReleases.mockResolvedValue(mockResponse)

const mockRelease = jest.spyOn(gh.rest.repos, 'listReleases')
mockRelease.mockResolvedValue(mockInputUpdate)

const mockReleaseNotes = jest.spyOn(gh.rest.repos, 'generateReleaseNotes')
mockReleaseNotes.mockResolvedValue(mockNotes)

const response = await createOrUpdateRelease(gh, inputs, mockInputUpdate.data, 'v1.0.0', 'v1.0.1')

expect(mockReleases).toHaveBeenCalledTimes(1)
})
})
91 changes: 91 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
"semver": "^7.3.8"
},
"devDependencies": {
"@types/jest": "^29.5.0",
"@types/js-yaml": "^4.0.5",
"@types/node": "^18.15.3",
"@typescript-eslint/parser": "^5.55.0",
Expand Down
Loading

0 comments on commit 904a13d

Please sign in to comment.