Fixes #12 Artifacts will now be replaced

This commit is contained in:
Nick Cipollo
2020-03-02 17:52:44 -05:00
parent 767a5edcf4
commit d57d57cad2
15 changed files with 265 additions and 45 deletions

View File

@@ -5,7 +5,9 @@ import { Releases } from "../src/Releases";
import { ArtifactUploader } from "../src/ArtifactUploader";
const createMock = jest.fn()
const deleteMock = jest.fn()
const getMock = jest.fn()
const listArtifactsMock = jest.fn()
const listMock = jest.fn()
const updateMock = jest.fn()
const uploadMock = jest.fn()
@@ -21,6 +23,8 @@ const draft = true
const id = 100
const name = 'name'
const prerelease = true
const releaseId = 101
const replacesArtifacts = true
const tag = 'tag'
const token = 'token'
const url = 'http://api.example.com'
@@ -51,7 +55,7 @@ describe("Action", () => {
await action.perform()
expect(createMock).toBeCalledWith(tag, body, commit, draft, name, prerelease)
expect(uploadMock).toBeCalledWith(artifacts, url)
expect(uploadMock).toBeCalledWith(artifacts, releaseId, url)
})
it('creates release if no draft releases', async () => {
@@ -67,7 +71,7 @@ describe("Action", () => {
await action.perform()
expect(createMock).toBeCalledWith(tag, body, commit, draft, name, prerelease)
expect(uploadMock).toBeCalledWith(artifacts, url)
expect(uploadMock).toBeCalledWith(artifacts, releaseId, url)
})
@@ -77,7 +81,7 @@ describe("Action", () => {
await action.perform()
expect(createMock).toBeCalledWith(tag, body, commit, draft, name, prerelease)
expect(uploadMock).toBeCalledWith(artifacts, url)
expect(uploadMock).toBeCalledWith(artifacts, releaseId, url)
})
it('throws error when create fails', async () => {
@@ -148,7 +152,7 @@ describe("Action", () => {
}
expect(createMock).toBeCalledWith(tag, body, commit, draft, name, prerelease)
expect(uploadMock).toBeCalledWith(artifacts, url)
expect(uploadMock).toBeCalledWith(artifacts, releaseId, url)
})
it('updates draft release', async () => {
@@ -165,7 +169,7 @@ describe("Action", () => {
await action.perform()
expect(updateMock).toBeCalledWith(id, tag, body, commit, draft, name, prerelease)
expect(uploadMock).toBeCalledWith(artifacts, url)
expect(uploadMock).toBeCalledWith(artifacts, releaseId, url)
})
@@ -185,7 +189,7 @@ describe("Action", () => {
await action.perform()
expect(updateMock).toBeCalledWith(id, tag, body, commit, draft, name, prerelease)
expect(uploadMock).toBeCalledWith(artifacts, url)
expect(uploadMock).toBeCalledWith(artifacts, releaseId, url)
})
@@ -199,15 +203,18 @@ describe("Action", () => {
const MockReleases = jest.fn<Releases, any>(() => {
return {
create: createMock,
deleteArtifact: deleteMock,
getByTag: getMock,
listArtifactsForRelease: listArtifactsMock,
listReleases: listMock,
update: updateMock,
uploadArtifact: uploadMock
uploadArtifact: jest.fn()
}
})
createMock.mockResolvedValue({
data: {
id: releaseId,
upload_url: url
}
})
@@ -221,6 +228,7 @@ describe("Action", () => {
})
updateMock.mockResolvedValue({
data: {
id: releaseId,
upload_url: url
}
})
@@ -235,6 +243,7 @@ describe("Action", () => {
draft: draft,
name: name,
prerelease: prerelease,
replacesArtifacts: replacesArtifacts,
tag: tag,
token: token,
readArtifact: () => artifactData

View File

@@ -8,9 +8,13 @@ const artifacts = [
]
const fileContents = Buffer.from('artful facts', 'utf-8')
const contentLength = 42
const uploadMock = jest.fn()
const releaseId = 100
const url = 'http://api.example.com'
const deleteMock = jest.fn()
const listArtifactsMock = jest.fn()
const uploadMock = jest.fn()
jest.mock('fs', () => {
return {
readFileSync: () => fileContents,
@@ -19,28 +23,115 @@ jest.mock('fs', () => {
})
describe('ArtifactUploader', () => {
it('uploads artifacts', () => {
const uploader = createUploader()
uploader.uploadArtifacts(artifacts, url)
beforeEach(() => {
deleteMock.mockClear()
listArtifactsMock.mockClear()
uploadMock.mockClear()
})
it('replaces all artifacts', async () => {
mockDeleteSuccess()
mockListWithAssets()
const uploader = createUploader(true)
await uploader.uploadArtifacts(artifacts, releaseId, url)
expect(uploadMock).toBeCalledTimes(2)
expect(uploadMock)
.toBeCalledWith(url, contentLength, 'raw', fileContents, 'art1')
expect(uploadMock)
.toBeCalledWith(url, contentLength, 'raw', fileContents, 'art2')
expect(deleteMock).toBeCalledTimes(2)
expect(deleteMock).toBeCalledWith(1)
expect(deleteMock).toBeCalledWith(2)
})
it('replaces no artifacts when previous asset list empty', async () => {
mockDeleteSuccess()
mockListWithoutAssets()
const uploader = createUploader(true)
await uploader.uploadArtifacts(artifacts, releaseId, url)
expect(uploadMock).toBeCalledTimes(2)
expect(uploadMock)
.toBeCalledWith(url, contentLength, 'raw', fileContents, 'art1')
expect(uploadMock)
.toBeCalledWith(url, contentLength, 'raw', fileContents, 'art2')
expect(deleteMock).toBeCalledTimes(0)
})
function createUploader(): GithubArtifactUploader {
it('throws error from replace', async () => {
mockDeleteError()
mockListWithAssets()
const uploader = createUploader(true)
expect.hasAssertions()
try {
await uploader.uploadArtifacts(artifacts, releaseId, url)
} catch (error) {
expect(error).toEqual("error")
}
})
it('updates all artifacts, delete none', async () => {
mockDeleteError()
mockListWithAssets()
const uploader = createUploader(false)
await uploader.uploadArtifacts(artifacts, releaseId, url)
expect(uploadMock).toBeCalledTimes(2)
expect(uploadMock)
.toBeCalledWith(url, contentLength, 'raw', fileContents, 'art1')
expect(uploadMock)
.toBeCalledWith(url, contentLength, 'raw', fileContents, 'art2')
expect(deleteMock).toBeCalledTimes(0)
})
function createUploader(replaces: boolean): GithubArtifactUploader {
uploadMock.mockResolvedValue({})
const MockReleases = jest.fn<Releases, any>(() => {
return {
getByTag: jest.fn(),
create: jest.fn(),
deleteArtifact: deleteMock,
getByTag: jest.fn(),
listArtifactsForRelease: listArtifactsMock,
listReleases: jest.fn(),
update: jest.fn(),
uploadArtifact: uploadMock
}
})
return new GithubArtifactUploader(new MockReleases())
return new GithubArtifactUploader(new MockReleases(), replaces)
}
function mockDeleteError(): any {
deleteMock.mockRejectedValue("error")
}
function mockDeleteSuccess(): any {
deleteMock.mockResolvedValue({})
}
function mockListWithAssets() {
listArtifactsMock.mockResolvedValue({
data: [
{
name: "art1",
id: 1
},
{
name: "art2",
id: 2
}
]
})
}
function mockListWithoutAssets() {
listArtifactsMock.mockResolvedValue({ data: [] })
}
});

View File

@@ -144,6 +144,17 @@ describe('Inputs', () => {
})
})
describe('replacesArtifacts', () => {
it('returns false', () => {
expect(inputs.replacesArtifacts).toBe(false)
})
it('returns true', () => {
mockGetInput.mockReturnValue('true')
expect(inputs.replacesArtifacts).toBe(true)
})
})
describe('tag', () => {
it('returns input tag', () => {
mockGetInput.mockReturnValue('tag')