Add biome and initial format rules
This commit is contained in:
@@ -1,11 +1,11 @@
|
||||
import {Action} from "../src/Action";
|
||||
import {Artifact} from "../src/Artifact";
|
||||
import {Inputs} from "../src/Inputs";
|
||||
import {Releases} from "../src/Releases";
|
||||
import {ArtifactUploader} from "../src/ArtifactUploader";
|
||||
import {Outputs} from "../src/Outputs";
|
||||
import {ArtifactDestroyer} from "../src/ArtifactDestroyer";
|
||||
import {ActionSkipper} from "../src/ActionSkipper";
|
||||
import { Action } from "../src/Action"
|
||||
import { Artifact } from "../src/Artifact"
|
||||
import { Inputs } from "../src/Inputs"
|
||||
import { Releases } from "../src/Releases"
|
||||
import { ArtifactUploader } from "../src/ArtifactUploader"
|
||||
import { Outputs } from "../src/Outputs"
|
||||
import { ArtifactDestroyer } from "../src/ArtifactDestroyer"
|
||||
import { ActionSkipper } from "../src/ActionSkipper"
|
||||
|
||||
const applyReleaseDataMock = jest.fn()
|
||||
const artifactDestroyMock = jest.fn()
|
||||
@@ -18,30 +18,27 @@ const shouldSkipMock = jest.fn()
|
||||
const updateMock = jest.fn()
|
||||
const uploadMock = jest.fn()
|
||||
|
||||
const artifacts = [
|
||||
new Artifact('a/art1'),
|
||||
new Artifact('b/art2')
|
||||
]
|
||||
const artifacts = [new Artifact("a/art1"), new Artifact("b/art2")]
|
||||
|
||||
const createBody = 'createBody'
|
||||
const createBody = "createBody"
|
||||
const createDraft = true
|
||||
const createName = 'createName'
|
||||
const commit = 'commit'
|
||||
const discussionCategory = 'discussionCategory'
|
||||
const createName = "createName"
|
||||
const commit = "commit"
|
||||
const discussionCategory = "discussionCategory"
|
||||
const generateReleaseNotes = true
|
||||
const id = 100
|
||||
const createPrerelease = true
|
||||
const releaseId = 101
|
||||
const replacesArtifacts = true
|
||||
const tag = 'tag'
|
||||
const token = 'token'
|
||||
const updateBody = 'updateBody'
|
||||
const tag = "tag"
|
||||
const token = "token"
|
||||
const updateBody = "updateBody"
|
||||
const updateDraft = false
|
||||
const updateName = 'updateName'
|
||||
const updateName = "updateName"
|
||||
const updatePrerelease = false
|
||||
const updateOnlyUnreleased = false
|
||||
const url = 'http://api.example.com'
|
||||
const makeLatest = 'legacy'
|
||||
const url = "http://api.example.com"
|
||||
const makeLatest = "legacy"
|
||||
|
||||
describe("Action", () => {
|
||||
beforeEach(() => {
|
||||
@@ -53,12 +50,13 @@ describe("Action", () => {
|
||||
uploadMock.mockClear()
|
||||
})
|
||||
|
||||
it('creates release but does not upload if no artifact', async () => {
|
||||
it("creates release but does not upload if no artifact", async () => {
|
||||
const action = createAction(false, false)
|
||||
|
||||
await action.perform()
|
||||
|
||||
expect(createMock).toBeCalledWith(tag,
|
||||
expect(createMock).toBeCalledWith(
|
||||
tag,
|
||||
createBody,
|
||||
commit,
|
||||
discussionCategory,
|
||||
@@ -66,14 +64,15 @@ describe("Action", () => {
|
||||
generateReleaseNotes,
|
||||
makeLatest,
|
||||
createName,
|
||||
createPrerelease)
|
||||
createPrerelease
|
||||
)
|
||||
expect(uploadMock).not.toBeCalled()
|
||||
assertOutputApplied()
|
||||
})
|
||||
|
||||
it('creates release if no release exists to update', async () => {
|
||||
it("creates release if no release exists to update", async () => {
|
||||
const action = createAction(true, true)
|
||||
const error = {status: 404}
|
||||
const error = { status: 404 }
|
||||
getMock.mockRejectedValue(error)
|
||||
|
||||
await action.perform()
|
||||
@@ -87,19 +86,18 @@ describe("Action", () => {
|
||||
generateReleaseNotes,
|
||||
makeLatest,
|
||||
createName,
|
||||
createPrerelease)
|
||||
createPrerelease
|
||||
)
|
||||
expect(uploadMock).toBeCalledWith(artifacts, releaseId, url)
|
||||
assertOutputApplied()
|
||||
})
|
||||
|
||||
it('creates release if no draft releases', async () => {
|
||||
it("creates release if no draft releases", async () => {
|
||||
const action = createAction(true, true)
|
||||
const error = {status: 404}
|
||||
const error = { status: 404 }
|
||||
getMock.mockRejectedValue(error)
|
||||
listMock.mockResolvedValue({
|
||||
data: [
|
||||
{id: id, draft: false, tag_name: tag}
|
||||
]
|
||||
data: [{ id: id, draft: false, tag_name: tag }],
|
||||
})
|
||||
|
||||
await action.perform()
|
||||
@@ -117,10 +115,9 @@ describe("Action", () => {
|
||||
)
|
||||
expect(uploadMock).toBeCalledWith(artifacts, releaseId, url)
|
||||
assertOutputApplied()
|
||||
|
||||
})
|
||||
|
||||
it('creates release then uploads artifact', async () => {
|
||||
it("creates release then uploads artifact", async () => {
|
||||
const action = createAction(false, true)
|
||||
|
||||
await action.perform()
|
||||
@@ -140,7 +137,7 @@ describe("Action", () => {
|
||||
assertOutputApplied()
|
||||
})
|
||||
|
||||
it('removes all artifacts when artifact destroyer is enabled', async () => {
|
||||
it("removes all artifacts when artifact destroyer is enabled", async () => {
|
||||
const action = createAction(false, true, true)
|
||||
|
||||
await action.perform()
|
||||
@@ -149,7 +146,7 @@ describe("Action", () => {
|
||||
assertOutputApplied()
|
||||
})
|
||||
|
||||
it('removes no artifacts when artifact destroyer is disabled', async () => {
|
||||
it("removes no artifacts when artifact destroyer is disabled", async () => {
|
||||
const action = createAction(false, true)
|
||||
|
||||
await action.perform()
|
||||
@@ -158,7 +155,7 @@ describe("Action", () => {
|
||||
assertOutputApplied()
|
||||
})
|
||||
|
||||
it('skips action', async () => {
|
||||
it("skips action", async () => {
|
||||
const action = createAction(false, false, false)
|
||||
shouldSkipMock.mockResolvedValue(true)
|
||||
|
||||
@@ -168,7 +165,7 @@ describe("Action", () => {
|
||||
expect(updateMock).not.toBeCalled()
|
||||
})
|
||||
|
||||
it('throws error when create fails', async () => {
|
||||
it("throws error when create fails", async () => {
|
||||
const action = createAction(false, true)
|
||||
createMock.mockRejectedValue("error")
|
||||
|
||||
@@ -193,14 +190,14 @@ describe("Action", () => {
|
||||
expect(uploadMock).not.toBeCalled()
|
||||
})
|
||||
|
||||
it('throws error when get fails', async () => {
|
||||
it("throws error when get fails", async () => {
|
||||
const action = createAction(true, true)
|
||||
const error = {
|
||||
errors: [
|
||||
{
|
||||
code: 'already_exists'
|
||||
}
|
||||
]
|
||||
code: "already_exists",
|
||||
},
|
||||
],
|
||||
}
|
||||
|
||||
createMock.mockRejectedValue(error)
|
||||
@@ -215,19 +212,17 @@ describe("Action", () => {
|
||||
expect(getMock).toBeCalledWith(tag)
|
||||
expect(updateMock).not.toBeCalled()
|
||||
expect(uploadMock).not.toBeCalled()
|
||||
|
||||
})
|
||||
|
||||
it('throws error when list has no data', async () => {
|
||||
|
||||
it("throws error when list has no data", async () => {
|
||||
const action = createAction(true, true)
|
||||
getMock.mockRejectedValue({status: 404})
|
||||
getMock.mockRejectedValue({ status: 404 })
|
||||
const error = {
|
||||
errors: [
|
||||
{
|
||||
code: 'already_exists'
|
||||
}
|
||||
]
|
||||
code: "already_exists",
|
||||
},
|
||||
],
|
||||
}
|
||||
|
||||
createMock.mockRejectedValue(error)
|
||||
@@ -244,7 +239,7 @@ describe("Action", () => {
|
||||
expect(updateMock).not.toBeCalled()
|
||||
})
|
||||
|
||||
it('throws error when update fails', async () => {
|
||||
it("throws error when update fails", async () => {
|
||||
const action = createAction(true, true)
|
||||
|
||||
updateMock.mockRejectedValue("error")
|
||||
@@ -270,9 +265,9 @@ describe("Action", () => {
|
||||
expect(uploadMock).not.toBeCalled()
|
||||
})
|
||||
|
||||
it('throws error when upload fails', async () => {
|
||||
it("throws error when upload fails", async () => {
|
||||
const action = createAction(false, true)
|
||||
const expectedError = {status: 404}
|
||||
const expectedError = { status: 404 }
|
||||
uploadMock.mockRejectedValue(expectedError)
|
||||
|
||||
expect.hasAssertions()
|
||||
@@ -296,15 +291,15 @@ describe("Action", () => {
|
||||
expect(uploadMock).toBeCalledWith(artifacts, releaseId, url)
|
||||
})
|
||||
|
||||
it('updates draft release', async () => {
|
||||
it("updates draft release", async () => {
|
||||
const action = createAction(true, true)
|
||||
const error = {status: 404}
|
||||
const error = { status: 404 }
|
||||
getMock.mockRejectedValue(error)
|
||||
listMock.mockResolvedValue({
|
||||
data: [
|
||||
{id: 123, draft: false, tag_name: tag},
|
||||
{id: id, draft: true, tag_name: tag}
|
||||
]
|
||||
{ id: 123, draft: false, tag_name: tag },
|
||||
{ id: id, draft: true, tag_name: tag },
|
||||
],
|
||||
})
|
||||
|
||||
await action.perform()
|
||||
@@ -324,7 +319,7 @@ describe("Action", () => {
|
||||
assertOutputApplied()
|
||||
})
|
||||
|
||||
it('updates release but does not upload if no artifact', async () => {
|
||||
it("updates release but does not upload if no artifact", async () => {
|
||||
const action = createAction(true, false)
|
||||
|
||||
await action.perform()
|
||||
@@ -344,7 +339,7 @@ describe("Action", () => {
|
||||
assertOutputApplied()
|
||||
})
|
||||
|
||||
it('updates release then uploads artifact', async () => {
|
||||
it("updates release then uploads artifact", async () => {
|
||||
const action = createAction(true, true)
|
||||
|
||||
await action.perform()
|
||||
@@ -365,12 +360,10 @@ describe("Action", () => {
|
||||
})
|
||||
|
||||
function assertOutputApplied() {
|
||||
expect(applyReleaseDataMock).toBeCalledWith({id: releaseId, upload_url: url})
|
||||
expect(applyReleaseDataMock).toBeCalledWith({ id: releaseId, upload_url: url })
|
||||
}
|
||||
|
||||
function createAction(allowUpdates: boolean,
|
||||
hasArtifact: boolean,
|
||||
removeArtifacts: boolean = false): Action {
|
||||
function createAction(allowUpdates: boolean, hasArtifact: boolean, removeArtifacts: boolean = false): Action {
|
||||
let inputArtifact: Artifact[]
|
||||
if (hasArtifact) {
|
||||
inputArtifact = artifacts
|
||||
@@ -385,30 +378,30 @@ describe("Action", () => {
|
||||
listArtifactsForRelease: listArtifactsMock,
|
||||
listReleases: listMock,
|
||||
update: updateMock,
|
||||
uploadArtifact: jest.fn()
|
||||
uploadArtifact: jest.fn(),
|
||||
}
|
||||
})
|
||||
|
||||
createMock.mockResolvedValue({
|
||||
data: {
|
||||
id: releaseId,
|
||||
upload_url: url
|
||||
}
|
||||
upload_url: url,
|
||||
},
|
||||
})
|
||||
getMock.mockResolvedValue({
|
||||
data: {
|
||||
id: id
|
||||
}
|
||||
id: id,
|
||||
},
|
||||
})
|
||||
listMock.mockResolvedValue({
|
||||
data: []
|
||||
data: [],
|
||||
})
|
||||
shouldSkipMock.mockResolvedValue(false)
|
||||
updateMock.mockResolvedValue({
|
||||
data: {
|
||||
id: releaseId,
|
||||
upload_url: url
|
||||
}
|
||||
upload_url: url,
|
||||
},
|
||||
})
|
||||
uploadMock.mockResolvedValue({})
|
||||
|
||||
@@ -436,28 +429,28 @@ describe("Action", () => {
|
||||
updatedReleaseBody: updateBody,
|
||||
updatedReleaseName: updateName,
|
||||
updatedPrerelease: updatePrerelease,
|
||||
updateOnlyUnreleased: updateOnlyUnreleased
|
||||
updateOnlyUnreleased: updateOnlyUnreleased,
|
||||
}
|
||||
})
|
||||
const MockOutputs = jest.fn<Outputs, any>(() => {
|
||||
return {
|
||||
applyReleaseData: applyReleaseDataMock
|
||||
applyReleaseData: applyReleaseDataMock,
|
||||
}
|
||||
})
|
||||
const MockUploader = jest.fn<ArtifactUploader, any>(() => {
|
||||
return {
|
||||
uploadArtifacts: uploadMock
|
||||
uploadArtifacts: uploadMock,
|
||||
}
|
||||
})
|
||||
const MockArtifactDestroyer = jest.fn<ArtifactDestroyer, any>(() => {
|
||||
return {
|
||||
destroyArtifacts: artifactDestroyMock
|
||||
destroyArtifacts: artifactDestroyMock,
|
||||
}
|
||||
})
|
||||
|
||||
const MockActionSkipper = jest.fn<ActionSkipper, any>(() => {
|
||||
return {
|
||||
shouldSkip: shouldSkipMock
|
||||
shouldSkip: shouldSkipMock,
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import {ActionSkipper, ReleaseActionSkipper} from "../src/ActionSkipper";
|
||||
import {Releases} from "../src/Releases";
|
||||
import { ActionSkipper, ReleaseActionSkipper } from "../src/ActionSkipper"
|
||||
import { Releases } from "../src/Releases"
|
||||
|
||||
describe("shouldSkip", () => {
|
||||
const getMock = jest.fn()
|
||||
@@ -12,33 +12,33 @@ describe("shouldSkip", () => {
|
||||
listArtifactsForRelease: jest.fn(),
|
||||
listReleases: jest.fn(),
|
||||
update: jest.fn(),
|
||||
uploadArtifact: jest.fn()
|
||||
uploadArtifact: jest.fn(),
|
||||
}
|
||||
})
|
||||
|
||||
it('should return false when skipIfReleaseExists is false', async () => {
|
||||
it("should return false when skipIfReleaseExists is false", async () => {
|
||||
const actionSkipper = new ReleaseActionSkipper(false, MockReleases(), tag)
|
||||
expect(await actionSkipper.shouldSkip()).toBe(false)
|
||||
})
|
||||
|
||||
it('should return false when error occurs', async () => {
|
||||
it("should return false when error occurs", async () => {
|
||||
getMock.mockRejectedValue(new Error())
|
||||
|
||||
const actionSkipper = new ReleaseActionSkipper(true, MockReleases(), tag)
|
||||
expect(await actionSkipper.shouldSkip()).toBe(false)
|
||||
})
|
||||
|
||||
it('should return false when release does not exist', async () => {
|
||||
it("should return false when release does not exist", async () => {
|
||||
getMock.mockResolvedValue({})
|
||||
|
||||
|
||||
const actionSkipper = new ReleaseActionSkipper(true, MockReleases(), tag)
|
||||
expect(await actionSkipper.shouldSkip()).toBe(false)
|
||||
})
|
||||
|
||||
it('should return true when release does exist', async () => {
|
||||
getMock.mockResolvedValue({data: {}})
|
||||
it("should return true when release does exist", async () => {
|
||||
getMock.mockResolvedValue({ data: {} })
|
||||
|
||||
const actionSkipper = new ReleaseActionSkipper(true, MockReleases(), tag)
|
||||
expect(await actionSkipper.shouldSkip()).toBe(true)
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
@@ -1,40 +1,40 @@
|
||||
import {Artifact} from "../src/Artifact";
|
||||
import { Artifact } from "../src/Artifact"
|
||||
|
||||
const contentLength = 42
|
||||
const fakeReadStream = {}
|
||||
|
||||
jest.mock('fs', () => {
|
||||
jest.mock("fs", () => {
|
||||
return {
|
||||
createReadStream: () => fakeReadStream,
|
||||
statSync: () => {
|
||||
return {size: contentLength}
|
||||
}
|
||||
};
|
||||
return { size: contentLength }
|
||||
},
|
||||
}
|
||||
})
|
||||
|
||||
describe("Artifact", () => {
|
||||
it('defaults contentType to raw', () => {
|
||||
const artifact = new Artifact('')
|
||||
expect(artifact.contentType).toBe('raw')
|
||||
it("defaults contentType to raw", () => {
|
||||
const artifact = new Artifact("")
|
||||
expect(artifact.contentType).toBe("raw")
|
||||
})
|
||||
|
||||
it('generates name from path', () => {
|
||||
const artifact = new Artifact('some/artifact')
|
||||
expect(artifact.name).toBe('artifact')
|
||||
it("generates name from path", () => {
|
||||
const artifact = new Artifact("some/artifact")
|
||||
expect(artifact.name).toBe("artifact")
|
||||
})
|
||||
|
||||
it('provides contentLength', () => {
|
||||
const artifact = new Artifact('some/artifact')
|
||||
it("provides contentLength", () => {
|
||||
const artifact = new Artifact("some/artifact")
|
||||
expect(artifact.contentLength).toBe(contentLength)
|
||||
})
|
||||
|
||||
it('provides path', () => {
|
||||
const artifact = new Artifact('some/artifact')
|
||||
expect(artifact.path).toBe('some/artifact')
|
||||
it("provides path", () => {
|
||||
const artifact = new Artifact("some/artifact")
|
||||
expect(artifact.path).toBe("some/artifact")
|
||||
})
|
||||
|
||||
it('reads artifact', () => {
|
||||
const artifact = new Artifact('some/artifact')
|
||||
it("reads artifact", () => {
|
||||
const artifact = new Artifact("some/artifact")
|
||||
expect(artifact.readFile()).toBe(fakeReadStream)
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
@@ -1,22 +1,21 @@
|
||||
import {Artifact} from "../src/Artifact"
|
||||
import {GithubArtifactUploader} from "../src/ArtifactUploader"
|
||||
import {Releases} from "../src/Releases";
|
||||
import {RequestError} from '@octokit/request-error'
|
||||
import {GithubArtifactDestroyer} from "../src/ArtifactDestroyer";
|
||||
import { Artifact } from "../src/Artifact"
|
||||
import { GithubArtifactUploader } from "../src/ArtifactUploader"
|
||||
import { Releases } from "../src/Releases"
|
||||
import { RequestError } from "@octokit/request-error"
|
||||
import { GithubArtifactDestroyer } from "../src/ArtifactDestroyer"
|
||||
|
||||
const releaseId = 100
|
||||
|
||||
const deleteMock = jest.fn()
|
||||
const listArtifactsMock = jest.fn()
|
||||
|
||||
|
||||
describe('ArtifactDestroyer', () => {
|
||||
describe("ArtifactDestroyer", () => {
|
||||
beforeEach(() => {
|
||||
deleteMock.mockClear()
|
||||
listArtifactsMock.mockClear()
|
||||
})
|
||||
|
||||
it('destroys all artifacts', async () => {
|
||||
it("destroys all artifacts", async () => {
|
||||
mockListWithAssets()
|
||||
mockDeleteSuccess()
|
||||
const destroyer = createDestroyer()
|
||||
@@ -26,7 +25,7 @@ describe('ArtifactDestroyer', () => {
|
||||
expect(deleteMock).toBeCalledTimes(2)
|
||||
})
|
||||
|
||||
it('destroys nothing when no artifacts found', async () => {
|
||||
it("destroys nothing when no artifacts found", async () => {
|
||||
mockListWithoutAssets()
|
||||
const destroyer = createDestroyer()
|
||||
|
||||
@@ -35,11 +34,11 @@ describe('ArtifactDestroyer', () => {
|
||||
expect(deleteMock).toBeCalledTimes(0)
|
||||
})
|
||||
|
||||
it('throws when delete call fails', async () => {
|
||||
it("throws when delete call fails", async () => {
|
||||
mockListWithAssets()
|
||||
mockDeleteError()
|
||||
const destroyer = createDestroyer()
|
||||
|
||||
|
||||
expect.hasAssertions()
|
||||
try {
|
||||
await destroyer.destroyArtifacts(releaseId)
|
||||
@@ -57,7 +56,7 @@ describe('ArtifactDestroyer', () => {
|
||||
listArtifactsForRelease: listArtifactsMock,
|
||||
listReleases: jest.fn(),
|
||||
update: jest.fn(),
|
||||
uploadArtifact: jest.fn()
|
||||
uploadArtifact: jest.fn(),
|
||||
}
|
||||
})
|
||||
return new GithubArtifactDestroyer(new MockReleases())
|
||||
@@ -75,16 +74,16 @@ describe('ArtifactDestroyer', () => {
|
||||
listArtifactsMock.mockResolvedValue([
|
||||
{
|
||||
name: "art1",
|
||||
id: 1
|
||||
id: 1,
|
||||
},
|
||||
{
|
||||
name: "art2",
|
||||
id: 2
|
||||
}
|
||||
id: 2,
|
||||
},
|
||||
])
|
||||
}
|
||||
|
||||
function mockListWithoutAssets() {
|
||||
listArtifactsMock.mockResolvedValue([])
|
||||
}
|
||||
});
|
||||
})
|
||||
|
||||
@@ -1,31 +1,31 @@
|
||||
const warnMock = jest.fn()
|
||||
|
||||
import {FileArtifactGlobber} from "../src/ArtifactGlobber"
|
||||
import {Globber} from "../src/Globber";
|
||||
import {Artifact} from "../src/Artifact";
|
||||
import untildify = require("untildify");
|
||||
import { FileArtifactGlobber } from "../src/ArtifactGlobber"
|
||||
import { Globber } from "../src/Globber"
|
||||
import { Artifact } from "../src/Artifact"
|
||||
import untildify = require("untildify")
|
||||
|
||||
const contentType = "raw"
|
||||
const globMock = jest.fn()
|
||||
const globResults = ["file1", "file2"]
|
||||
|
||||
jest.mock('@actions/core', () => {
|
||||
return {warning: warnMock};
|
||||
jest.mock("@actions/core", () => {
|
||||
return { warning: warnMock }
|
||||
})
|
||||
|
||||
jest.mock('fs', () => {
|
||||
jest.mock("fs", () => {
|
||||
return {
|
||||
statSync: () => {
|
||||
return {
|
||||
isDirectory(): boolean {
|
||||
return false
|
||||
}
|
||||
},
|
||||
}
|
||||
},
|
||||
realpathSync: () => {
|
||||
return false
|
||||
}
|
||||
};
|
||||
},
|
||||
}
|
||||
})
|
||||
|
||||
describe("ArtifactGlobber", () => {
|
||||
@@ -36,79 +36,66 @@ describe("ArtifactGlobber", () => {
|
||||
it("expands paths in which start with a ~", () => {
|
||||
const globber = createArtifactGlobber()
|
||||
|
||||
const expectedArtifacts =
|
||||
globResults.map((path) => new Artifact(path, contentType))
|
||||
const expectedArtifacts = globResults.map((path) => new Artifact(path, contentType))
|
||||
|
||||
expect(globber.globArtifactString('~/path', 'raw', false))
|
||||
.toEqual(expectedArtifacts)
|
||||
expect(globMock).toBeCalledWith(untildify('~/path'))
|
||||
expect(globber.globArtifactString("~/path", "raw", false)).toEqual(expectedArtifacts)
|
||||
expect(globMock).toBeCalledWith(untildify("~/path"))
|
||||
expect(warnMock).not.toBeCalled()
|
||||
})
|
||||
|
||||
it("globs simple path", () => {
|
||||
const globber = createArtifactGlobber()
|
||||
|
||||
const expectedArtifacts =
|
||||
globResults.map((path) => new Artifact(path, contentType))
|
||||
const expectedArtifacts = globResults.map((path) => new Artifact(path, contentType))
|
||||
|
||||
expect(globber.globArtifactString('path', 'raw', false))
|
||||
.toEqual(expectedArtifacts)
|
||||
expect(globMock).toBeCalledWith('path')
|
||||
expect(globber.globArtifactString("path", "raw", false)).toEqual(expectedArtifacts)
|
||||
expect(globMock).toBeCalledWith("path")
|
||||
expect(warnMock).not.toBeCalled()
|
||||
})
|
||||
|
||||
it("splits multiple paths with comma separator", () => {
|
||||
const globber = createArtifactGlobber()
|
||||
|
||||
const expectedArtifacts =
|
||||
globResults
|
||||
.concat(globResults)
|
||||
.map((path) => new Artifact(path, contentType))
|
||||
const expectedArtifacts = globResults.concat(globResults).map((path) => new Artifact(path, contentType))
|
||||
|
||||
expect(globber.globArtifactString('path1,path2', 'raw', false))
|
||||
.toEqual(expectedArtifacts)
|
||||
expect(globMock).toBeCalledWith('path1')
|
||||
expect(globMock).toBeCalledWith('path2')
|
||||
expect(globber.globArtifactString("path1,path2", "raw", false)).toEqual(expectedArtifacts)
|
||||
expect(globMock).toBeCalledWith("path1")
|
||||
expect(globMock).toBeCalledWith("path2")
|
||||
expect(warnMock).not.toBeCalled()
|
||||
})
|
||||
|
||||
it("splits multiple paths with new line separator and trims start", () => {
|
||||
const globber = createArtifactGlobber()
|
||||
|
||||
const expectedArtifacts =
|
||||
globResults
|
||||
.concat(globResults)
|
||||
.map((path) => new Artifact(path, contentType))
|
||||
const expectedArtifacts = globResults.concat(globResults).map((path) => new Artifact(path, contentType))
|
||||
|
||||
expect(globber.globArtifactString('path1\n path2', 'raw', false))
|
||||
.toEqual(expectedArtifacts)
|
||||
expect(globMock).toBeCalledWith('path1')
|
||||
expect(globMock).toBeCalledWith('path2')
|
||||
expect(globber.globArtifactString("path1\n path2", "raw", false)).toEqual(expectedArtifacts)
|
||||
expect(globMock).toBeCalledWith("path1")
|
||||
expect(globMock).toBeCalledWith("path2")
|
||||
expect(warnMock).not.toBeCalled()
|
||||
})
|
||||
|
||||
it("warns when no glob results are produced and empty results shouldn't throw", () => {
|
||||
const globber = createArtifactGlobber([])
|
||||
|
||||
expect(globber.globArtifactString('path', 'raw', false))
|
||||
.toEqual([])
|
||||
expect(globber.globArtifactString("path", "raw", false)).toEqual([])
|
||||
expect(warnMock).toBeCalled()
|
||||
})
|
||||
|
||||
it("throws when no glob results are produced and empty results shouild throw", () => {
|
||||
const globber = createArtifactGlobber([])
|
||||
expect(() => {
|
||||
globber.globArtifactString('path', 'raw', true)
|
||||
globber.globArtifactString("path", "raw", true)
|
||||
}).toThrow()
|
||||
})
|
||||
|
||||
function createArtifactGlobber(results: string[] = globResults): FileArtifactGlobber {
|
||||
const MockGlobber = jest.fn<Globber, any>(() => {
|
||||
return {
|
||||
glob: globMock
|
||||
glob: globMock,
|
||||
}
|
||||
})
|
||||
globMock.mockReturnValue(results)
|
||||
return new FileArtifactGlobber(new MockGlobber())
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
@@ -1,20 +1,20 @@
|
||||
const directoryMock = jest.fn()
|
||||
const warnMock = jest.fn()
|
||||
|
||||
import {ArtifactPathValidator} from "../src/ArtifactPathValidator";
|
||||
import { ArtifactPathValidator } from "../src/ArtifactPathValidator"
|
||||
|
||||
const pattern = 'pattern'
|
||||
const pattern = "pattern"
|
||||
|
||||
jest.mock('@actions/core', () => {
|
||||
return {warning: warnMock};
|
||||
jest.mock("@actions/core", () => {
|
||||
return { warning: warnMock }
|
||||
})
|
||||
|
||||
jest.mock('fs', () => {
|
||||
jest.mock("fs", () => {
|
||||
return {
|
||||
statSync: () => {
|
||||
return {isDirectory: directoryMock}
|
||||
}
|
||||
};
|
||||
return { isDirectory: directoryMock }
|
||||
},
|
||||
}
|
||||
})
|
||||
|
||||
describe("ArtifactPathValidator", () => {
|
||||
@@ -24,14 +24,14 @@ describe("ArtifactPathValidator", () => {
|
||||
})
|
||||
|
||||
it("warns and filters out path which points to a directory", () => {
|
||||
const paths = ['path1', 'path2']
|
||||
const paths = ["path1", "path2"]
|
||||
directoryMock.mockReturnValueOnce(true).mockReturnValueOnce(false)
|
||||
|
||||
const validator = new ArtifactPathValidator(false, paths, pattern)
|
||||
|
||||
const result = validator.validate()
|
||||
expect(warnMock).toBeCalled()
|
||||
expect(result).toEqual(['path2'])
|
||||
expect(result).toEqual(["path2"])
|
||||
})
|
||||
|
||||
it("warns when no glob results are produced and empty results shouldn't throw", () => {
|
||||
@@ -48,7 +48,7 @@ describe("ArtifactPathValidator", () => {
|
||||
})
|
||||
|
||||
it("throws when path points to directory", () => {
|
||||
const paths = ['path1', 'path2']
|
||||
const paths = ["path1", "path2"]
|
||||
directoryMock.mockReturnValueOnce(true).mockReturnValueOnce(false)
|
||||
|
||||
const validator = new ArtifactPathValidator(true, paths, pattern)
|
||||
@@ -57,4 +57,4 @@ describe("ArtifactPathValidator", () => {
|
||||
validator.validate()
|
||||
}).toThrow()
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
@@ -1,41 +1,38 @@
|
||||
import {Artifact} from "../src/Artifact"
|
||||
import {GithubArtifactUploader} from "../src/ArtifactUploader"
|
||||
import {Releases} from "../src/Releases";
|
||||
import {RequestError} from '@octokit/request-error'
|
||||
import { Artifact } from "../src/Artifact"
|
||||
import { GithubArtifactUploader } from "../src/ArtifactUploader"
|
||||
import { Releases } from "../src/Releases"
|
||||
import { RequestError } from "@octokit/request-error"
|
||||
|
||||
const artifacts = [
|
||||
new Artifact('a/art1'),
|
||||
new Artifact('b/art2')
|
||||
]
|
||||
const artifacts = [new Artifact("a/art1"), new Artifact("b/art2")]
|
||||
const fakeReadStream = {}
|
||||
const contentLength = 42
|
||||
const releaseId = 100
|
||||
const url = 'http://api.example.com'
|
||||
const url = "http://api.example.com"
|
||||
|
||||
const deleteMock = jest.fn()
|
||||
const listArtifactsMock = jest.fn()
|
||||
const uploadMock = jest.fn()
|
||||
|
||||
jest.mock('fs', () => {
|
||||
const originalFs = jest.requireActual('fs');
|
||||
jest.mock("fs", () => {
|
||||
const originalFs = jest.requireActual("fs")
|
||||
return {
|
||||
...originalFs,
|
||||
promises: {},
|
||||
createReadStream: () => fakeReadStream,
|
||||
statSync: () => {
|
||||
return {size: contentLength};
|
||||
}
|
||||
};
|
||||
});
|
||||
return { size: contentLength }
|
||||
},
|
||||
}
|
||||
})
|
||||
|
||||
describe('ArtifactUploader', () => {
|
||||
describe("ArtifactUploader", () => {
|
||||
beforeEach(() => {
|
||||
deleteMock.mockClear()
|
||||
listArtifactsMock.mockClear()
|
||||
uploadMock.mockClear()
|
||||
})
|
||||
|
||||
it('abort when upload failed with non-5xx response', async () => {
|
||||
it("abort when upload failed with non-5xx response", async () => {
|
||||
mockListWithoutAssets()
|
||||
mockUploadArtifact(401, 2)
|
||||
const uploader = createUploader(true)
|
||||
@@ -43,15 +40,13 @@ describe('ArtifactUploader', () => {
|
||||
await uploader.uploadArtifacts(artifacts, releaseId, url)
|
||||
|
||||
expect(uploadMock).toBeCalledTimes(2)
|
||||
expect(uploadMock)
|
||||
.toBeCalledWith(url, contentLength, 'raw', fakeReadStream, 'art1', releaseId)
|
||||
expect(uploadMock)
|
||||
.toBeCalledWith(url, contentLength, 'raw', fakeReadStream, 'art2', releaseId)
|
||||
expect(uploadMock).toBeCalledWith(url, contentLength, "raw", fakeReadStream, "art1", releaseId)
|
||||
expect(uploadMock).toBeCalledWith(url, contentLength, "raw", fakeReadStream, "art2", releaseId)
|
||||
|
||||
expect(deleteMock).toBeCalledTimes(0)
|
||||
})
|
||||
|
||||
it('abort when upload failed with 5xx response after 3 attempts', async () => {
|
||||
it("abort when upload failed with 5xx response after 3 attempts", async () => {
|
||||
mockListWithoutAssets()
|
||||
mockUploadArtifact(500, 4)
|
||||
const uploader = createUploader(true)
|
||||
@@ -59,21 +54,16 @@ describe('ArtifactUploader', () => {
|
||||
await uploader.uploadArtifacts(artifacts, releaseId, url)
|
||||
|
||||
expect(uploadMock).toBeCalledTimes(5)
|
||||
expect(uploadMock)
|
||||
.toBeCalledWith(url, contentLength, 'raw', fakeReadStream, 'art1', releaseId)
|
||||
expect(uploadMock)
|
||||
.toBeCalledWith(url, contentLength, 'raw', fakeReadStream, 'art1', releaseId)
|
||||
expect(uploadMock)
|
||||
.toBeCalledWith(url, contentLength, 'raw', fakeReadStream, 'art1', releaseId)
|
||||
expect(uploadMock)
|
||||
.toBeCalledWith(url, contentLength, 'raw', fakeReadStream, 'art2', releaseId)
|
||||
expect(uploadMock)
|
||||
.toBeCalledWith(url, contentLength, 'raw', fakeReadStream, 'art2', releaseId)
|
||||
expect(uploadMock).toBeCalledWith(url, contentLength, "raw", fakeReadStream, "art1", releaseId)
|
||||
expect(uploadMock).toBeCalledWith(url, contentLength, "raw", fakeReadStream, "art1", releaseId)
|
||||
expect(uploadMock).toBeCalledWith(url, contentLength, "raw", fakeReadStream, "art1", releaseId)
|
||||
expect(uploadMock).toBeCalledWith(url, contentLength, "raw", fakeReadStream, "art2", releaseId)
|
||||
expect(uploadMock).toBeCalledWith(url, contentLength, "raw", fakeReadStream, "art2", releaseId)
|
||||
|
||||
expect(deleteMock).toBeCalledTimes(0)
|
||||
})
|
||||
|
||||
it('replaces all artifacts', async () => {
|
||||
it("replaces all artifacts", async () => {
|
||||
mockDeleteSuccess()
|
||||
mockListWithAssets()
|
||||
mockUploadArtifact()
|
||||
@@ -82,17 +72,15 @@ describe('ArtifactUploader', () => {
|
||||
await uploader.uploadArtifacts(artifacts, releaseId, url)
|
||||
|
||||
expect(uploadMock).toBeCalledTimes(2)
|
||||
expect(uploadMock)
|
||||
.toBeCalledWith(url, contentLength, 'raw', fakeReadStream, 'art1', releaseId)
|
||||
expect(uploadMock)
|
||||
.toBeCalledWith(url, contentLength, 'raw', fakeReadStream, 'art2', releaseId)
|
||||
expect(uploadMock).toBeCalledWith(url, contentLength, "raw", fakeReadStream, "art1", releaseId)
|
||||
expect(uploadMock).toBeCalledWith(url, contentLength, "raw", fakeReadStream, "art2", releaseId)
|
||||
|
||||
expect(deleteMock).toBeCalledTimes(2)
|
||||
expect(deleteMock).toBeCalledWith(1)
|
||||
expect(deleteMock).toBeCalledWith(2)
|
||||
})
|
||||
|
||||
it('replaces no artifacts when previous asset list empty', async () => {
|
||||
it("replaces no artifacts when previous asset list empty", async () => {
|
||||
mockDeleteSuccess()
|
||||
mockListWithoutAssets()
|
||||
mockUploadArtifact()
|
||||
@@ -101,15 +89,13 @@ describe('ArtifactUploader', () => {
|
||||
await uploader.uploadArtifacts(artifacts, releaseId, url)
|
||||
|
||||
expect(uploadMock).toBeCalledTimes(2)
|
||||
expect(uploadMock)
|
||||
.toBeCalledWith(url, contentLength, 'raw', fakeReadStream, 'art1', releaseId)
|
||||
expect(uploadMock)
|
||||
.toBeCalledWith(url, contentLength, 'raw', fakeReadStream, 'art2', releaseId)
|
||||
expect(uploadMock).toBeCalledWith(url, contentLength, "raw", fakeReadStream, "art1", releaseId)
|
||||
expect(uploadMock).toBeCalledWith(url, contentLength, "raw", fakeReadStream, "art2", releaseId)
|
||||
|
||||
expect(deleteMock).toBeCalledTimes(0)
|
||||
})
|
||||
|
||||
it('retry when upload failed with 5xx response', async () => {
|
||||
it("retry when upload failed with 5xx response", async () => {
|
||||
mockListWithoutAssets()
|
||||
mockUploadArtifact(500, 2)
|
||||
const uploader = createUploader(true)
|
||||
@@ -117,19 +103,15 @@ describe('ArtifactUploader', () => {
|
||||
await uploader.uploadArtifacts(artifacts, releaseId, url)
|
||||
|
||||
expect(uploadMock).toBeCalledTimes(4)
|
||||
expect(uploadMock)
|
||||
.toBeCalledWith(url, contentLength, 'raw', fakeReadStream, 'art1', releaseId)
|
||||
expect(uploadMock)
|
||||
.toBeCalledWith(url, contentLength, 'raw', fakeReadStream, 'art1', releaseId)
|
||||
expect(uploadMock)
|
||||
.toBeCalledWith(url, contentLength, 'raw', fakeReadStream, 'art1', releaseId)
|
||||
expect(uploadMock)
|
||||
.toBeCalledWith(url, contentLength, 'raw', fakeReadStream, 'art2', releaseId)
|
||||
expect(uploadMock).toBeCalledWith(url, contentLength, "raw", fakeReadStream, "art1", releaseId)
|
||||
expect(uploadMock).toBeCalledWith(url, contentLength, "raw", fakeReadStream, "art1", releaseId)
|
||||
expect(uploadMock).toBeCalledWith(url, contentLength, "raw", fakeReadStream, "art1", releaseId)
|
||||
expect(uploadMock).toBeCalledWith(url, contentLength, "raw", fakeReadStream, "art2", releaseId)
|
||||
|
||||
expect(deleteMock).toBeCalledTimes(0)
|
||||
})
|
||||
|
||||
it('throws upload error when replacesExistingArtifacts is true', async () => {
|
||||
it("throws upload error when replacesExistingArtifacts is true", async () => {
|
||||
mockListWithoutAssets()
|
||||
mockUploadError()
|
||||
const uploader = createUploader(true, true)
|
||||
@@ -142,7 +124,7 @@ describe('ArtifactUploader', () => {
|
||||
}
|
||||
})
|
||||
|
||||
it('throws error from replace', async () => {
|
||||
it("throws error from replace", async () => {
|
||||
mockDeleteError()
|
||||
mockListWithAssets()
|
||||
mockUploadArtifact()
|
||||
@@ -156,7 +138,7 @@ describe('ArtifactUploader', () => {
|
||||
}
|
||||
})
|
||||
|
||||
it('updates all artifacts, delete none', async () => {
|
||||
it("updates all artifacts, delete none", async () => {
|
||||
mockDeleteError()
|
||||
mockListWithAssets()
|
||||
mockUploadArtifact()
|
||||
@@ -165,10 +147,8 @@ describe('ArtifactUploader', () => {
|
||||
await uploader.uploadArtifacts(artifacts, releaseId, url)
|
||||
|
||||
expect(uploadMock).toBeCalledTimes(2)
|
||||
expect(uploadMock)
|
||||
.toBeCalledWith(url, contentLength, 'raw', fakeReadStream, 'art1', releaseId)
|
||||
expect(uploadMock)
|
||||
.toBeCalledWith(url, contentLength, 'raw', fakeReadStream, 'art2', releaseId)
|
||||
expect(uploadMock).toBeCalledWith(url, contentLength, "raw", fakeReadStream, "art1", releaseId)
|
||||
expect(uploadMock).toBeCalledWith(url, contentLength, "raw", fakeReadStream, "art2", releaseId)
|
||||
|
||||
expect(deleteMock).toBeCalledTimes(0)
|
||||
})
|
||||
@@ -182,7 +162,7 @@ describe('ArtifactUploader', () => {
|
||||
listArtifactsForRelease: listArtifactsMock,
|
||||
listReleases: jest.fn(),
|
||||
update: jest.fn(),
|
||||
uploadArtifact: uploadMock
|
||||
uploadArtifact: uploadMock,
|
||||
}
|
||||
})
|
||||
return new GithubArtifactUploader(new MockReleases(), replaces, throws)
|
||||
@@ -200,12 +180,12 @@ describe('ArtifactUploader', () => {
|
||||
listArtifactsMock.mockResolvedValue([
|
||||
{
|
||||
name: "art1",
|
||||
id: 1
|
||||
id: 1,
|
||||
},
|
||||
{
|
||||
name: "art2",
|
||||
id: 2
|
||||
}
|
||||
id: 2,
|
||||
},
|
||||
])
|
||||
}
|
||||
|
||||
@@ -216,7 +196,7 @@ describe('ArtifactUploader', () => {
|
||||
function mockUploadArtifact(status: number = 200, failures: number = 0) {
|
||||
const error = new RequestError(`HTTP ${status}`, status, {
|
||||
headers: {},
|
||||
request: {method: 'GET', url: '', headers: {}}
|
||||
request: { method: "GET", url: "", headers: {} },
|
||||
})
|
||||
for (let index = 0; index < failures; index++) {
|
||||
uploadMock.mockRejectedValueOnce(error)
|
||||
@@ -227,7 +207,7 @@ describe('ArtifactUploader', () => {
|
||||
function mockUploadError() {
|
||||
uploadMock.mockRejectedValue({
|
||||
message: "error",
|
||||
status: 502
|
||||
status: 502,
|
||||
})
|
||||
}
|
||||
});
|
||||
})
|
||||
|
||||
@@ -1,93 +1,95 @@
|
||||
import { GithubError } from "../src/GithubError"
|
||||
|
||||
describe('ErrorMessage', () => {
|
||||
|
||||
describe('has error with code', () => {
|
||||
describe("ErrorMessage", () => {
|
||||
describe("has error with code", () => {
|
||||
const error = {
|
||||
message: 'something bad happened',
|
||||
message: "something bad happened",
|
||||
errors: [
|
||||
{
|
||||
code: 'missing',
|
||||
resource: 'release'
|
||||
code: "missing",
|
||||
resource: "release",
|
||||
},
|
||||
{
|
||||
code: 'already_exists',
|
||||
resource: 'release'
|
||||
}
|
||||
code: "already_exists",
|
||||
resource: "release",
|
||||
},
|
||||
],
|
||||
status: 422
|
||||
status: 422,
|
||||
}
|
||||
|
||||
it('does not have error', () => {
|
||||
it("does not have error", () => {
|
||||
const githubError = new GithubError(error)
|
||||
expect(githubError.hasErrorWithCode('missing_field')).toBeFalsy()
|
||||
expect(githubError.hasErrorWithCode("missing_field")).toBeFalsy()
|
||||
})
|
||||
|
||||
it('has error', () => {
|
||||
it("has error", () => {
|
||||
const githubError = new GithubError(error)
|
||||
expect(githubError.hasErrorWithCode('missing')).toBeTruthy()
|
||||
expect(githubError.hasErrorWithCode("missing")).toBeTruthy()
|
||||
})
|
||||
})
|
||||
|
||||
describe('has error with remediation', () => {
|
||||
it('provides remediation with 404 without errors', () => {
|
||||
describe("has error with remediation", () => {
|
||||
it("provides remediation with 404 without errors", () => {
|
||||
const error = { status: 404, message: "message" }
|
||||
const githubError = new GithubError(error)
|
||||
expect(githubError.toString())
|
||||
.toBe('Error 404: message\nMake sure your github token has access to the repo and has permission to author releases')
|
||||
expect(githubError.toString()).toBe(
|
||||
"Error 404: message\nMake sure your github token has access to the repo and has permission to author releases"
|
||||
)
|
||||
})
|
||||
|
||||
it('provides remediation with 404 with errors', () => {
|
||||
it("provides remediation with 404 with errors", () => {
|
||||
const error = {
|
||||
message: 'message',
|
||||
message: "message",
|
||||
errors: [
|
||||
{
|
||||
code: 'missing',
|
||||
resource: 'release'
|
||||
}
|
||||
code: "missing",
|
||||
resource: "release",
|
||||
},
|
||||
],
|
||||
status: 404
|
||||
status: 404,
|
||||
}
|
||||
const githubError = new GithubError(error)
|
||||
expect(githubError.toString())
|
||||
.toBe('Error 404: message\nErrors:\n- release does not exist.\nMake sure your github token has access to the repo and has permission to author releases')
|
||||
expect(githubError.toString()).toBe(
|
||||
"Error 404: message\nErrors:\n- release does not exist.\nMake sure your github token has access to the repo and has permission to author releases"
|
||||
)
|
||||
})
|
||||
})
|
||||
|
||||
it('generates message with errors', () => {
|
||||
|
||||
it("generates message with errors", () => {
|
||||
const error = {
|
||||
message: 'something bad happened',
|
||||
message: "something bad happened",
|
||||
errors: [
|
||||
{
|
||||
code: 'missing',
|
||||
resource: 'release'
|
||||
code: "missing",
|
||||
resource: "release",
|
||||
},
|
||||
{
|
||||
code: 'already_exists',
|
||||
resource: 'release'
|
||||
}
|
||||
code: "already_exists",
|
||||
resource: "release",
|
||||
},
|
||||
],
|
||||
status: 422
|
||||
status: 422,
|
||||
}
|
||||
|
||||
const githubError = new GithubError(error)
|
||||
|
||||
const expectedString = "Error 422: something bad happened\nErrors:\n- release does not exist.\n- release already exists."
|
||||
const expectedString =
|
||||
"Error 422: something bad happened\nErrors:\n- release does not exist.\n- release already exists."
|
||||
expect(githubError.toString()).toBe(expectedString)
|
||||
})
|
||||
|
||||
it('generates message without errors', () => {
|
||||
it("generates message without errors", () => {
|
||||
const error = {
|
||||
message: 'something bad happened',
|
||||
status: 422
|
||||
message: "something bad happened",
|
||||
status: 422,
|
||||
}
|
||||
|
||||
const githubError = new GithubError(error)
|
||||
|
||||
expect(githubError.toString()).toBe('Error 422: something bad happened')
|
||||
expect(githubError.toString()).toBe("Error 422: something bad happened")
|
||||
})
|
||||
|
||||
it('provides error status', () => {
|
||||
it("provides error status", () => {
|
||||
const error = { status: 404 }
|
||||
const githubError = new GithubError(error)
|
||||
expect(githubError.status).toBe(404)
|
||||
|
||||
@@ -1,22 +1,21 @@
|
||||
import { GithubErrorDetail } from "../src/GithubErrorDetail"
|
||||
|
||||
describe('GithubErrorDetail', () => {
|
||||
|
||||
it('provides error code', () => {
|
||||
describe("GithubErrorDetail", () => {
|
||||
it("provides error code", () => {
|
||||
const error = {
|
||||
code: "missing"
|
||||
code: "missing",
|
||||
}
|
||||
|
||||
const detail = new GithubErrorDetail(error)
|
||||
|
||||
expect(detail.code).toBe('missing')
|
||||
expect(detail.code).toBe("missing")
|
||||
})
|
||||
|
||||
it('generates missing resource error message', () => {
|
||||
it("generates missing resource error message", () => {
|
||||
const resource = "release"
|
||||
const error = {
|
||||
code: "missing",
|
||||
resource: resource
|
||||
resource: resource,
|
||||
}
|
||||
|
||||
const detail = new GithubErrorDetail(error)
|
||||
@@ -25,13 +24,13 @@ describe('GithubErrorDetail', () => {
|
||||
expect(message).toBe(`${resource} does not exist.`)
|
||||
})
|
||||
|
||||
it('generates missing field error message', () => {
|
||||
it("generates missing field error message", () => {
|
||||
const resource = "release"
|
||||
const field = "body"
|
||||
const error = {
|
||||
code: "missing_field",
|
||||
field: field,
|
||||
resource: resource
|
||||
resource: resource,
|
||||
}
|
||||
|
||||
const detail = new GithubErrorDetail(error)
|
||||
@@ -40,13 +39,13 @@ describe('GithubErrorDetail', () => {
|
||||
expect(message).toBe(`The ${field} field on ${resource} is missing.`)
|
||||
})
|
||||
|
||||
it('generates invalid field error message', () => {
|
||||
it("generates invalid field error message", () => {
|
||||
const resource = "release"
|
||||
const field = "body"
|
||||
const error = {
|
||||
code: "invalid",
|
||||
field: field,
|
||||
resource: resource
|
||||
resource: resource,
|
||||
}
|
||||
|
||||
const detail = new GithubErrorDetail(error)
|
||||
@@ -55,11 +54,11 @@ describe('GithubErrorDetail', () => {
|
||||
expect(message).toBe(`The ${field} field on ${resource} is an invalid format.`)
|
||||
})
|
||||
|
||||
it('generates resource already exists error message', () => {
|
||||
it("generates resource already exists error message", () => {
|
||||
const resource = "release"
|
||||
const error = {
|
||||
code: "already_exists",
|
||||
resource: resource
|
||||
resource: resource,
|
||||
}
|
||||
|
||||
const detail = new GithubErrorDetail(error)
|
||||
@@ -68,13 +67,13 @@ describe('GithubErrorDetail', () => {
|
||||
expect(message).toBe(`${resource} already exists.`)
|
||||
})
|
||||
|
||||
describe('generates custom error message', () => {
|
||||
it('with documentation url', () => {
|
||||
describe("generates custom error message", () => {
|
||||
it("with documentation url", () => {
|
||||
const url = "https://api.example.com"
|
||||
const error = {
|
||||
code: "custom",
|
||||
message: "foo",
|
||||
documentation_url: url
|
||||
documentation_url: url,
|
||||
}
|
||||
|
||||
const detail = new GithubErrorDetail(error)
|
||||
@@ -83,16 +82,16 @@ describe('GithubErrorDetail', () => {
|
||||
expect(message).toBe(`foo\nPlease see ${url}.`)
|
||||
})
|
||||
|
||||
it('without documentation url', () => {
|
||||
it("without documentation url", () => {
|
||||
const error = {
|
||||
code: "custom",
|
||||
message: "foo"
|
||||
message: "foo",
|
||||
}
|
||||
|
||||
const detail = new GithubErrorDetail(error)
|
||||
const message = detail.toString()
|
||||
|
||||
expect(message).toBe('foo')
|
||||
expect(message).toBe("foo")
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
@@ -1,27 +1,24 @@
|
||||
const mockGetInput = jest.fn();
|
||||
const mockGetBooleanInput = jest.fn();
|
||||
const mockGetInput = jest.fn()
|
||||
const mockGetBooleanInput = jest.fn()
|
||||
const mockGlob = jest.fn()
|
||||
const mockReadFileSync = jest.fn();
|
||||
const mockStatSync = jest.fn();
|
||||
const mockReadFileSync = jest.fn()
|
||||
const mockStatSync = jest.fn()
|
||||
|
||||
import {Artifact} from "../src/Artifact";
|
||||
import {ArtifactGlobber} from "../src/ArtifactGlobber";
|
||||
import {Context} from "@actions/github/lib/context";
|
||||
import {Inputs, CoreInputs} from "../src/Inputs";
|
||||
import { Artifact } from "../src/Artifact"
|
||||
import { ArtifactGlobber } from "../src/ArtifactGlobber"
|
||||
import { Context } from "@actions/github/lib/context"
|
||||
import { Inputs, CoreInputs } from "../src/Inputs"
|
||||
|
||||
const artifacts = [
|
||||
new Artifact('a/art1'),
|
||||
new Artifact('b/art2')
|
||||
]
|
||||
const artifacts = [new Artifact("a/art1"), new Artifact("b/art2")]
|
||||
|
||||
jest.mock('@actions/core', () => {
|
||||
jest.mock("@actions/core", () => {
|
||||
return {
|
||||
getInput: mockGetInput,
|
||||
getBooleanInput: mockGetBooleanInput
|
||||
};
|
||||
getBooleanInput: mockGetBooleanInput,
|
||||
}
|
||||
})
|
||||
|
||||
jest.mock('fs', () => {
|
||||
jest.mock("fs", () => {
|
||||
// existsSync is used by Context's constructor
|
||||
// noinspection JSUnusedGlobalSymbols
|
||||
return {
|
||||
@@ -29,452 +26,397 @@ jest.mock('fs', () => {
|
||||
return false
|
||||
},
|
||||
readFileSync: mockReadFileSync,
|
||||
statSync: mockStatSync
|
||||
};
|
||||
statSync: mockStatSync,
|
||||
}
|
||||
})
|
||||
|
||||
describe('Inputs', () => {
|
||||
let context: Context;
|
||||
let inputs: Inputs;
|
||||
describe("Inputs", () => {
|
||||
let context: Context
|
||||
let inputs: Inputs
|
||||
beforeEach(() => {
|
||||
mockGetInput.mockReset()
|
||||
context = new Context()
|
||||
inputs = new CoreInputs(createGlobber(), context)
|
||||
})
|
||||
|
||||
describe('commit', () => {
|
||||
it('returns commit', () => {
|
||||
mockGetInput.mockReturnValueOnce('commit')
|
||||
expect(inputs.commit).toBe('commit')
|
||||
describe("commit", () => {
|
||||
it("returns commit", () => {
|
||||
mockGetInput.mockReturnValueOnce("commit")
|
||||
expect(inputs.commit).toBe("commit")
|
||||
})
|
||||
|
||||
it('returns undefined when omitted', () => {
|
||||
mockGetInput.mockReturnValueOnce('')
|
||||
it("returns undefined when omitted", () => {
|
||||
mockGetInput.mockReturnValueOnce("")
|
||||
expect(inputs.commit).toBeUndefined()
|
||||
})
|
||||
})
|
||||
|
||||
it('returns token', () => {
|
||||
mockGetInput.mockReturnValue('42')
|
||||
expect(inputs.token).toBe('42')
|
||||
it("returns token", () => {
|
||||
mockGetInput.mockReturnValue("42")
|
||||
expect(inputs.token).toBe("42")
|
||||
})
|
||||
|
||||
describe('allowsUpdates', () => {
|
||||
it('returns false', () => {
|
||||
describe("allowsUpdates", () => {
|
||||
it("returns false", () => {
|
||||
expect(inputs.allowUpdates).toBe(false)
|
||||
})
|
||||
|
||||
it('returns true', () => {
|
||||
mockGetInput.mockReturnValue('true')
|
||||
it("returns true", () => {
|
||||
mockGetInput.mockReturnValue("true")
|
||||
expect(inputs.allowUpdates).toBe(true)
|
||||
})
|
||||
})
|
||||
|
||||
describe('artifactErrorsFailBuild', () => {
|
||||
it('returns false', () => {
|
||||
describe("artifactErrorsFailBuild", () => {
|
||||
it("returns false", () => {
|
||||
expect(inputs.artifactErrorsFailBuild).toBe(false)
|
||||
})
|
||||
|
||||
it('returns true', () => {
|
||||
mockGetInput.mockReturnValue('true')
|
||||
it("returns true", () => {
|
||||
mockGetInput.mockReturnValue("true")
|
||||
expect(inputs.artifactErrorsFailBuild).toBe(true)
|
||||
})
|
||||
})
|
||||
|
||||
describe('artifacts', () => {
|
||||
it('globber told to throw errors', () => {
|
||||
mockGetInput.mockReturnValueOnce('art1')
|
||||
.mockReturnValueOnce('contentType')
|
||||
.mockReturnValueOnce('true')
|
||||
describe("artifacts", () => {
|
||||
it("globber told to throw errors", () => {
|
||||
mockGetInput.mockReturnValueOnce("art1").mockReturnValueOnce("contentType").mockReturnValueOnce("true")
|
||||
|
||||
expect(inputs.artifacts).toEqual(artifacts)
|
||||
expect(mockGlob).toBeCalledTimes(1)
|
||||
expect(mockGlob).toBeCalledWith('art1', 'contentType', true)
|
||||
expect(mockGlob).toBeCalledWith("art1", "contentType", true)
|
||||
})
|
||||
|
||||
it('returns empty artifacts', () => {
|
||||
mockGetInput.mockReturnValueOnce('')
|
||||
.mockReturnValueOnce('')
|
||||
it("returns empty artifacts", () => {
|
||||
mockGetInput.mockReturnValueOnce("").mockReturnValueOnce("")
|
||||
|
||||
expect(inputs.artifacts).toEqual([])
|
||||
expect(mockGlob).toBeCalledTimes(0)
|
||||
})
|
||||
|
||||
it('returns input.artifacts', () => {
|
||||
mockGetInput.mockReturnValueOnce('art1')
|
||||
.mockReturnValueOnce('contentType')
|
||||
.mockReturnValueOnce('false')
|
||||
it("returns input.artifacts", () => {
|
||||
mockGetInput.mockReturnValueOnce("art1").mockReturnValueOnce("contentType").mockReturnValueOnce("false")
|
||||
|
||||
expect(inputs.artifacts).toEqual(artifacts)
|
||||
expect(mockGlob).toBeCalledTimes(1)
|
||||
expect(mockGlob).toBeCalledWith('art1', 'contentType', false)
|
||||
expect(mockGlob).toBeCalledWith("art1", "contentType", false)
|
||||
})
|
||||
|
||||
it('returns input.artifacts with default contentType', () => {
|
||||
mockGetInput.mockReturnValueOnce('art1')
|
||||
.mockReturnValueOnce('')
|
||||
.mockReturnValueOnce('false')
|
||||
it("returns input.artifacts with default contentType", () => {
|
||||
mockGetInput.mockReturnValueOnce("art1").mockReturnValueOnce("").mockReturnValueOnce("false")
|
||||
|
||||
expect(inputs.artifacts).toEqual(artifacts)
|
||||
expect(mockGlob).toBeCalledTimes(1)
|
||||
expect(mockGlob).toBeCalledWith('art1', 'raw', false)
|
||||
expect(mockGlob).toBeCalledWith("art1", "raw", false)
|
||||
})
|
||||
|
||||
it('returns input.artifact', () => {
|
||||
mockGetInput.mockReturnValueOnce('')
|
||||
.mockReturnValueOnce('art2')
|
||||
.mockReturnValueOnce('contentType')
|
||||
.mockReturnValueOnce('false')
|
||||
it("returns input.artifact", () => {
|
||||
mockGetInput
|
||||
.mockReturnValueOnce("")
|
||||
.mockReturnValueOnce("art2")
|
||||
.mockReturnValueOnce("contentType")
|
||||
.mockReturnValueOnce("false")
|
||||
|
||||
expect(inputs.artifacts).toEqual(artifacts)
|
||||
expect(mockGlob).toBeCalledTimes(1)
|
||||
expect(mockGlob).toBeCalledWith('art2', 'contentType', false)
|
||||
expect(mockGlob).toBeCalledWith("art2", "contentType", false)
|
||||
})
|
||||
})
|
||||
|
||||
describe('createdDraft', () => {
|
||||
it('returns false', () => {
|
||||
describe("createdDraft", () => {
|
||||
it("returns false", () => {
|
||||
expect(inputs.createdDraft).toBe(false)
|
||||
})
|
||||
|
||||
it('returns true', () => {
|
||||
mockGetInput.mockReturnValue('true')
|
||||
it("returns true", () => {
|
||||
mockGetInput.mockReturnValue("true")
|
||||
expect(inputs.createdDraft).toBe(true)
|
||||
})
|
||||
})
|
||||
|
||||
describe('createdReleaseBody', () => {
|
||||
it('returns input body', () => {
|
||||
mockGetInput
|
||||
.mockReturnValueOnce('false')
|
||||
.mockReturnValueOnce('body')
|
||||
expect(inputs.createdReleaseBody).toBe('body')
|
||||
describe("createdReleaseBody", () => {
|
||||
it("returns input body", () => {
|
||||
mockGetInput.mockReturnValueOnce("false").mockReturnValueOnce("body")
|
||||
expect(inputs.createdReleaseBody).toBe("body")
|
||||
})
|
||||
|
||||
it('returns body file contents', () => {
|
||||
mockGetInput
|
||||
.mockReturnValueOnce('false')
|
||||
.mockReturnValueOnce('')
|
||||
.mockReturnValueOnce('a/path')
|
||||
mockReadFileSync.mockReturnValue('file')
|
||||
it("returns body file contents", () => {
|
||||
mockGetInput.mockReturnValueOnce("false").mockReturnValueOnce("").mockReturnValueOnce("a/path")
|
||||
mockReadFileSync.mockReturnValue("file")
|
||||
|
||||
expect(inputs.createdReleaseBody).toBe('file')
|
||||
expect(inputs.createdReleaseBody).toBe("file")
|
||||
})
|
||||
|
||||
it('returns empty', () => {
|
||||
mockGetInput
|
||||
.mockReturnValueOnce('false')
|
||||
.mockReturnValueOnce('')
|
||||
.mockReturnValueOnce('')
|
||||
expect(inputs.createdReleaseBody).toBe('')
|
||||
it("returns empty", () => {
|
||||
mockGetInput.mockReturnValueOnce("false").mockReturnValueOnce("").mockReturnValueOnce("")
|
||||
expect(inputs.createdReleaseBody).toBe("")
|
||||
})
|
||||
|
||||
it('returns undefined when omitted', () => {
|
||||
mockGetInput
|
||||
.mockReturnValueOnce('true')
|
||||
.mockReturnValueOnce('body')
|
||||
it("returns undefined when omitted", () => {
|
||||
mockGetInput.mockReturnValueOnce("true").mockReturnValueOnce("body")
|
||||
expect(inputs.createdReleaseBody).toBeUndefined()
|
||||
})
|
||||
})
|
||||
|
||||
describe('createdReleaseName', () => {
|
||||
it('returns input name', () => {
|
||||
mockGetInput
|
||||
.mockReturnValueOnce('false')
|
||||
.mockReturnValueOnce('name')
|
||||
expect(inputs.createdReleaseName).toBe('name')
|
||||
describe("createdReleaseName", () => {
|
||||
it("returns input name", () => {
|
||||
mockGetInput.mockReturnValueOnce("false").mockReturnValueOnce("name")
|
||||
expect(inputs.createdReleaseName).toBe("name")
|
||||
})
|
||||
|
||||
it('returns undefined when omitted', () => {
|
||||
mockGetInput
|
||||
.mockReturnValueOnce('true')
|
||||
.mockReturnValueOnce('name')
|
||||
it("returns undefined when omitted", () => {
|
||||
mockGetInput.mockReturnValueOnce("true").mockReturnValueOnce("name")
|
||||
expect(inputs.createdReleaseName).toBeUndefined()
|
||||
})
|
||||
|
||||
it('returns tag', () => {
|
||||
mockGetInput
|
||||
.mockReturnValueOnce('false')
|
||||
.mockReturnValueOnce('')
|
||||
context.ref = 'refs/tags/sha-tag'
|
||||
expect(inputs.createdReleaseName).toBe('sha-tag')
|
||||
it("returns tag", () => {
|
||||
mockGetInput.mockReturnValueOnce("false").mockReturnValueOnce("")
|
||||
context.ref = "refs/tags/sha-tag"
|
||||
expect(inputs.createdReleaseName).toBe("sha-tag")
|
||||
})
|
||||
})
|
||||
|
||||
describe('discussionCategory', () => {
|
||||
it('returns category', () => {
|
||||
mockGetInput.mockReturnValue('Release')
|
||||
expect(inputs.discussionCategory).toBe('Release')
|
||||
describe("discussionCategory", () => {
|
||||
it("returns category", () => {
|
||||
mockGetInput.mockReturnValue("Release")
|
||||
expect(inputs.discussionCategory).toBe("Release")
|
||||
})
|
||||
|
||||
it('returns undefined', () => {
|
||||
mockGetInput.mockReturnValue('')
|
||||
it("returns undefined", () => {
|
||||
mockGetInput.mockReturnValue("")
|
||||
expect(inputs.discussionCategory).toBe(undefined)
|
||||
})
|
||||
})
|
||||
|
||||
describe('generateReleaseNotes', () => {
|
||||
it('returns returns true', function () {
|
||||
describe("generateReleaseNotes", () => {
|
||||
it("returns returns true", function () {
|
||||
mockGetInput.mockReturnValue("true")
|
||||
expect(inputs.generateReleaseNotes).toBe(true)
|
||||
});
|
||||
})
|
||||
|
||||
it('returns false when omitted', function () {
|
||||
it("returns false when omitted", function () {
|
||||
mockGetInput.mockReturnValue("")
|
||||
expect(inputs.generateReleaseNotes).toBe(false)
|
||||
});
|
||||
})
|
||||
})
|
||||
|
||||
describe('makeLatest', () => {
|
||||
it('returns legacy', () => {
|
||||
mockGetInput.mockReturnValueOnce('legacy')
|
||||
expect(inputs.makeLatest).toBe('legacy')
|
||||
describe("makeLatest", () => {
|
||||
it("returns legacy", () => {
|
||||
mockGetInput.mockReturnValueOnce("legacy")
|
||||
expect(inputs.makeLatest).toBe("legacy")
|
||||
})
|
||||
|
||||
it('returns false', () => {
|
||||
mockGetInput.mockReturnValueOnce('false')
|
||||
expect(inputs.makeLatest).toBe('false')
|
||||
it("returns false", () => {
|
||||
mockGetInput.mockReturnValueOnce("false")
|
||||
expect(inputs.makeLatest).toBe("false")
|
||||
})
|
||||
|
||||
it('returns true', () => {
|
||||
mockGetInput.mockReturnValueOnce('true')
|
||||
expect(inputs.makeLatest).toBe('true')
|
||||
it("returns true", () => {
|
||||
mockGetInput.mockReturnValueOnce("true")
|
||||
expect(inputs.makeLatest).toBe("true")
|
||||
})
|
||||
|
||||
it('returns undefined', () => {
|
||||
mockGetInput.mockReturnValueOnce('something_else')
|
||||
it("returns undefined", () => {
|
||||
mockGetInput.mockReturnValueOnce("something_else")
|
||||
expect(inputs.makeLatest).toBe(undefined)
|
||||
})
|
||||
})
|
||||
|
||||
describe('owner', () => {
|
||||
it('returns owner from context', function () {
|
||||
describe("owner", () => {
|
||||
it("returns owner from context", function () {
|
||||
process.env.GITHUB_REPOSITORY = "owner/repo"
|
||||
mockGetInput.mockReturnValue("")
|
||||
expect(inputs.owner).toBe("owner")
|
||||
});
|
||||
it('returns owner from inputs', function () {
|
||||
})
|
||||
it("returns owner from inputs", function () {
|
||||
mockGetInput.mockReturnValue("owner")
|
||||
expect(inputs.owner).toBe("owner")
|
||||
});
|
||||
})
|
||||
})
|
||||
|
||||
describe('createdPrerelase', () => {
|
||||
it('returns false', () => {
|
||||
describe("createdPrerelase", () => {
|
||||
it("returns false", () => {
|
||||
expect(inputs.createdPrerelease).toBe(false)
|
||||
})
|
||||
|
||||
it('returns true', () => {
|
||||
mockGetInput.mockReturnValue('true')
|
||||
it("returns true", () => {
|
||||
mockGetInput.mockReturnValue("true")
|
||||
expect(inputs.createdPrerelease).toBe(true)
|
||||
})
|
||||
})
|
||||
|
||||
describe('replacesArtifacts', () => {
|
||||
it('returns false', () => {
|
||||
describe("replacesArtifacts", () => {
|
||||
it("returns false", () => {
|
||||
expect(inputs.replacesArtifacts).toBe(false)
|
||||
})
|
||||
|
||||
it('returns true', () => {
|
||||
mockGetInput.mockReturnValue('true')
|
||||
it("returns true", () => {
|
||||
mockGetInput.mockReturnValue("true")
|
||||
expect(inputs.replacesArtifacts).toBe(true)
|
||||
})
|
||||
})
|
||||
|
||||
describe('removeArtifacts', () => {
|
||||
it('returns false', () => {
|
||||
describe("removeArtifacts", () => {
|
||||
it("returns false", () => {
|
||||
expect(inputs.removeArtifacts).toBe(false)
|
||||
})
|
||||
|
||||
it('returns true', () => {
|
||||
mockGetInput.mockReturnValue('true')
|
||||
it("returns true", () => {
|
||||
mockGetInput.mockReturnValue("true")
|
||||
expect(inputs.removeArtifacts).toBe(true)
|
||||
})
|
||||
})
|
||||
|
||||
describe('repo', () => {
|
||||
it('returns repo from context', function () {
|
||||
describe("repo", () => {
|
||||
it("returns repo from context", function () {
|
||||
process.env.GITHUB_REPOSITORY = "owner/repo"
|
||||
mockGetInput.mockReturnValue("")
|
||||
expect(inputs.repo).toBe("repo")
|
||||
});
|
||||
it('returns repo from inputs', function () {
|
||||
})
|
||||
it("returns repo from inputs", function () {
|
||||
mockGetInput.mockReturnValue("repo")
|
||||
expect(inputs.repo).toBe("repo")
|
||||
});
|
||||
})
|
||||
})
|
||||
|
||||
describe('skipIfReleaseExists', () => {
|
||||
it('returns false', () => {
|
||||
describe("skipIfReleaseExists", () => {
|
||||
it("returns false", () => {
|
||||
mockGetBooleanInput.mockReturnValue(false)
|
||||
expect(inputs.skipIfReleaseExists).toBe(false)
|
||||
})
|
||||
|
||||
it('returns true', () => {
|
||||
it("returns true", () => {
|
||||
mockGetBooleanInput.mockReturnValue(true)
|
||||
expect(inputs.skipIfReleaseExists).toBe(true)
|
||||
})
|
||||
})
|
||||
|
||||
describe('tag', () => {
|
||||
it('returns input tag', () => {
|
||||
mockGetInput.mockReturnValue('tag')
|
||||
expect(inputs.tag).toBe('tag')
|
||||
describe("tag", () => {
|
||||
it("returns input tag", () => {
|
||||
mockGetInput.mockReturnValue("tag")
|
||||
expect(inputs.tag).toBe("tag")
|
||||
})
|
||||
it('returns context sha when input is empty', () => {
|
||||
mockGetInput.mockReturnValue('')
|
||||
context.ref = 'refs/tags/sha-tag'
|
||||
expect(inputs.tag).toBe('sha-tag')
|
||||
it("returns context sha when input is empty", () => {
|
||||
mockGetInput.mockReturnValue("")
|
||||
context.ref = "refs/tags/sha-tag"
|
||||
expect(inputs.tag).toBe("sha-tag")
|
||||
})
|
||||
it('returns context sha when input is null', () => {
|
||||
it("returns context sha when input is null", () => {
|
||||
mockGetInput.mockReturnValue(null)
|
||||
context.ref = 'refs/tags/sha-tag'
|
||||
expect(inputs.tag).toBe('sha-tag')
|
||||
context.ref = "refs/tags/sha-tag"
|
||||
expect(inputs.tag).toBe("sha-tag")
|
||||
})
|
||||
it('throws if no tag', () => {
|
||||
it("throws if no tag", () => {
|
||||
context.ref = ""
|
||||
expect(() => inputs.tag).toThrow()
|
||||
})
|
||||
})
|
||||
|
||||
describe('updatedDraft', () => {
|
||||
it('returns false', () => {
|
||||
describe("updatedDraft", () => {
|
||||
it("returns false", () => {
|
||||
expect(inputs.updatedDraft).toBe(false)
|
||||
})
|
||||
|
||||
it('returns true', () => {
|
||||
mockGetInput
|
||||
.mockReturnValueOnce('false')
|
||||
.mockReturnValue('true')
|
||||
it("returns true", () => {
|
||||
mockGetInput.mockReturnValueOnce("false").mockReturnValue("true")
|
||||
expect(inputs.updatedDraft).toBe(true)
|
||||
})
|
||||
|
||||
it('returns true when omitted is blank', () => {
|
||||
mockGetInput
|
||||
.mockReturnValueOnce('')
|
||||
.mockReturnValue('true')
|
||||
it("returns true when omitted is blank", () => {
|
||||
mockGetInput.mockReturnValueOnce("").mockReturnValue("true")
|
||||
expect(inputs.updatedDraft).toBe(true)
|
||||
})
|
||||
|
||||
it('returns undefined when omitted for update', () => {
|
||||
mockGetInput
|
||||
.mockReturnValueOnce('true')
|
||||
.mockReturnValueOnce('true')
|
||||
it("returns undefined when omitted for update", () => {
|
||||
mockGetInput.mockReturnValueOnce("true").mockReturnValueOnce("true")
|
||||
expect(inputs.updatedDraft).toBeUndefined()
|
||||
})
|
||||
})
|
||||
|
||||
describe('updatedReleaseBody', () => {
|
||||
it('returns input body', () => {
|
||||
mockGetInput
|
||||
.mockReturnValueOnce('false')
|
||||
.mockReturnValueOnce('false')
|
||||
.mockReturnValueOnce('body')
|
||||
expect(inputs.updatedReleaseBody).toBe('body')
|
||||
describe("updatedReleaseBody", () => {
|
||||
it("returns input body", () => {
|
||||
mockGetInput.mockReturnValueOnce("false").mockReturnValueOnce("false").mockReturnValueOnce("body")
|
||||
expect(inputs.updatedReleaseBody).toBe("body")
|
||||
})
|
||||
|
||||
it('returns body file contents', () => {
|
||||
it("returns body file contents", () => {
|
||||
mockGetInput
|
||||
.mockReturnValueOnce('false')
|
||||
.mockReturnValueOnce('false')
|
||||
.mockReturnValueOnce('')
|
||||
.mockReturnValueOnce('a/path')
|
||||
mockReadFileSync.mockReturnValue('file')
|
||||
.mockReturnValueOnce("false")
|
||||
.mockReturnValueOnce("false")
|
||||
.mockReturnValueOnce("")
|
||||
.mockReturnValueOnce("a/path")
|
||||
mockReadFileSync.mockReturnValue("file")
|
||||
|
||||
expect(inputs.updatedReleaseBody).toBe('file')
|
||||
expect(inputs.updatedReleaseBody).toBe("file")
|
||||
})
|
||||
|
||||
it('returns empty', () => {
|
||||
it("returns empty", () => {
|
||||
mockGetInput
|
||||
.mockReturnValueOnce('false')
|
||||
.mockReturnValueOnce('false')
|
||||
.mockReturnValueOnce('')
|
||||
.mockReturnValueOnce('')
|
||||
expect(inputs.updatedReleaseBody).toBe('')
|
||||
.mockReturnValueOnce("false")
|
||||
.mockReturnValueOnce("false")
|
||||
.mockReturnValueOnce("")
|
||||
.mockReturnValueOnce("")
|
||||
expect(inputs.updatedReleaseBody).toBe("")
|
||||
})
|
||||
|
||||
it('returns undefined when omitted', () => {
|
||||
mockGetInput
|
||||
.mockReturnValueOnce('true')
|
||||
.mockReturnValueOnce('false')
|
||||
.mockReturnValueOnce('body')
|
||||
it("returns undefined when omitted", () => {
|
||||
mockGetInput.mockReturnValueOnce("true").mockReturnValueOnce("false").mockReturnValueOnce("body")
|
||||
expect(inputs.updatedReleaseBody).toBeUndefined()
|
||||
})
|
||||
|
||||
it('returns undefined when omitted for update', () => {
|
||||
mockGetInput
|
||||
.mockReturnValueOnce('false')
|
||||
.mockReturnValueOnce('true')
|
||||
.mockReturnValueOnce('body')
|
||||
it("returns undefined when omitted for update", () => {
|
||||
mockGetInput.mockReturnValueOnce("false").mockReturnValueOnce("true").mockReturnValueOnce("body")
|
||||
expect(inputs.updatedReleaseBody).toBeUndefined()
|
||||
})
|
||||
})
|
||||
|
||||
describe('updatedReleaseName', () => {
|
||||
it('returns input name', () => {
|
||||
mockGetInput
|
||||
.mockReturnValueOnce('false')
|
||||
.mockReturnValueOnce('false')
|
||||
.mockReturnValueOnce('name')
|
||||
expect(inputs.updatedReleaseName).toBe('name')
|
||||
describe("updatedReleaseName", () => {
|
||||
it("returns input name", () => {
|
||||
mockGetInput.mockReturnValueOnce("false").mockReturnValueOnce("false").mockReturnValueOnce("name")
|
||||
expect(inputs.updatedReleaseName).toBe("name")
|
||||
})
|
||||
|
||||
it('returns undefined when omitted', () => {
|
||||
mockGetInput
|
||||
.mockReturnValueOnce('true')
|
||||
.mockReturnValueOnce('false')
|
||||
.mockReturnValueOnce('name')
|
||||
it("returns undefined when omitted", () => {
|
||||
mockGetInput.mockReturnValueOnce("true").mockReturnValueOnce("false").mockReturnValueOnce("name")
|
||||
expect(inputs.updatedReleaseName).toBeUndefined()
|
||||
})
|
||||
|
||||
it('returns undefined when omitted for update', () => {
|
||||
mockGetInput
|
||||
.mockReturnValueOnce('false')
|
||||
.mockReturnValueOnce('true')
|
||||
.mockReturnValueOnce('name')
|
||||
it("returns undefined when omitted for update", () => {
|
||||
mockGetInput.mockReturnValueOnce("false").mockReturnValueOnce("true").mockReturnValueOnce("name")
|
||||
expect(inputs.updatedReleaseName).toBeUndefined()
|
||||
})
|
||||
|
||||
it('returns tag', () => {
|
||||
mockGetInput
|
||||
.mockReturnValueOnce('false')
|
||||
.mockReturnValueOnce('false')
|
||||
.mockReturnValueOnce('')
|
||||
context.ref = 'refs/tags/sha-tag'
|
||||
expect(inputs.updatedReleaseName).toBe('sha-tag')
|
||||
it("returns tag", () => {
|
||||
mockGetInput.mockReturnValueOnce("false").mockReturnValueOnce("false").mockReturnValueOnce("")
|
||||
context.ref = "refs/tags/sha-tag"
|
||||
expect(inputs.updatedReleaseName).toBe("sha-tag")
|
||||
})
|
||||
})
|
||||
|
||||
describe('updatedPrerelease', () => {
|
||||
it('returns false', () => {
|
||||
mockGetInput
|
||||
.mockReturnValueOnce('false')
|
||||
.mockReturnValueOnce('false')
|
||||
describe("updatedPrerelease", () => {
|
||||
it("returns false", () => {
|
||||
mockGetInput.mockReturnValueOnce("false").mockReturnValueOnce("false")
|
||||
expect(inputs.updatedPrerelease).toBe(false)
|
||||
})
|
||||
|
||||
it('returns true', () => {
|
||||
mockGetInput
|
||||
.mockReturnValueOnce('false')
|
||||
.mockReturnValueOnce('true')
|
||||
it("returns true", () => {
|
||||
mockGetInput.mockReturnValueOnce("false").mockReturnValueOnce("true")
|
||||
expect(inputs.updatedPrerelease).toBe(true)
|
||||
})
|
||||
|
||||
it('returns undefined when omitted for update', () => {
|
||||
mockGetInput
|
||||
.mockReturnValueOnce('true')
|
||||
.mockReturnValueOnce('false')
|
||||
it("returns undefined when omitted for update", () => {
|
||||
mockGetInput.mockReturnValueOnce("true").mockReturnValueOnce("false")
|
||||
expect(inputs.updatedPrerelease).toBeUndefined()
|
||||
})
|
||||
})
|
||||
|
||||
describe('updateOnlyUnreleased', () => {
|
||||
it('returns false', () => {
|
||||
describe("updateOnlyUnreleased", () => {
|
||||
it("returns false", () => {
|
||||
expect(inputs.updateOnlyUnreleased).toBe(false)
|
||||
})
|
||||
|
||||
it('returns true', () => {
|
||||
mockGetInput.mockReturnValueOnce('true')
|
||||
it("returns true", () => {
|
||||
mockGetInput.mockReturnValueOnce("true")
|
||||
expect(inputs.updateOnlyUnreleased).toBe(true)
|
||||
})
|
||||
})
|
||||
@@ -482,7 +424,7 @@ describe('Inputs', () => {
|
||||
function createGlobber(): ArtifactGlobber {
|
||||
const MockGlobber = jest.fn<ArtifactGlobber, any>(() => {
|
||||
return {
|
||||
globArtifactString: mockGlob
|
||||
globArtifactString: mockGlob,
|
||||
}
|
||||
})
|
||||
mockGlob.mockImplementation(() => artifacts)
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
import {Action} from "../src/Action";
|
||||
import * as github from "@actions/github";
|
||||
import {Inputs} from "../src/Inputs";
|
||||
import {GithubReleases, ReleaseData} from "../src/Releases";
|
||||
import {GithubArtifactUploader} from "../src/ArtifactUploader";
|
||||
import * as path from "path";
|
||||
import {FileArtifactGlobber} from "../src/ArtifactGlobber";
|
||||
import {Outputs} from "../src/Outputs";
|
||||
import {GithubArtifactDestroyer} from "../src/ArtifactDestroyer";
|
||||
import {ReleaseActionSkipper} from "../src/ActionSkipper";
|
||||
import { Action } from "../src/Action"
|
||||
import * as github from "@actions/github"
|
||||
import { Inputs } from "../src/Inputs"
|
||||
import { GithubReleases, ReleaseData } from "../src/Releases"
|
||||
import { GithubArtifactUploader } from "../src/ArtifactUploader"
|
||||
import * as path from "path"
|
||||
import { FileArtifactGlobber } from "../src/ArtifactGlobber"
|
||||
import { Outputs } from "../src/Outputs"
|
||||
import { GithubArtifactDestroyer } from "../src/ArtifactDestroyer"
|
||||
import { ReleaseActionSkipper } from "../src/ActionSkipper"
|
||||
|
||||
// This test is currently intended to be manually run during development. To run:
|
||||
// - Make sure you have an environment variable named GITHUB_TOKEN assigned to your token
|
||||
// - Remove skip from the test below
|
||||
describe.skip('Integration Test', () => {
|
||||
describe.skip("Integration Test", () => {
|
||||
let action: Action
|
||||
|
||||
beforeEach(() => {
|
||||
@@ -22,18 +22,14 @@ describe.skip('Integration Test', () => {
|
||||
const inputs = getInputs()
|
||||
const outputs = getOutputs()
|
||||
const releases = new GithubReleases(inputs, git)
|
||||
const uploader = new GithubArtifactUploader(
|
||||
releases,
|
||||
inputs.replacesArtifacts,
|
||||
inputs.artifactErrorsFailBuild,
|
||||
)
|
||||
const uploader = new GithubArtifactUploader(releases, inputs.replacesArtifacts, inputs.artifactErrorsFailBuild)
|
||||
const artifactDestroyer = new GithubArtifactDestroyer(releases)
|
||||
const actionSkipper = new ReleaseActionSkipper(inputs.skipIfReleaseExists, releases, inputs.tag)
|
||||
|
||||
|
||||
action = new Action(inputs, outputs, releases, uploader, artifactDestroyer, actionSkipper)
|
||||
})
|
||||
|
||||
it('Performs action', async () => {
|
||||
it("Performs action", async () => {
|
||||
await action.perform()
|
||||
})
|
||||
|
||||
@@ -47,7 +43,7 @@ describe.skip('Integration Test', () => {
|
||||
createdReleaseBody: "This release was generated by release-action's integration test",
|
||||
createdReleaseName: "Releases Action Integration Test",
|
||||
commit: undefined,
|
||||
discussionCategory: 'Release',
|
||||
discussionCategory: "Release",
|
||||
generateReleaseNotes: true,
|
||||
owner: "ncipollo",
|
||||
createdPrerelease: false,
|
||||
@@ -61,10 +57,10 @@ describe.skip('Integration Test', () => {
|
||||
updatedReleaseBody: "This release was updated by release-action's integration test",
|
||||
updatedReleaseName: "Releases Action Integration Test",
|
||||
updatedPrerelease: false,
|
||||
updateOnlyUnreleased: false
|
||||
updateOnlyUnreleased: false,
|
||||
}
|
||||
})
|
||||
return new MockInputs();
|
||||
return new MockInputs()
|
||||
}
|
||||
|
||||
function getOutputs(): Outputs {
|
||||
@@ -72,7 +68,7 @@ describe.skip('Integration Test', () => {
|
||||
return {
|
||||
applyReleaseData(releaseData: ReleaseData) {
|
||||
console.log(`Release Data: ${releaseData}`)
|
||||
}
|
||||
},
|
||||
}
|
||||
})
|
||||
return new MockOutputs()
|
||||
@@ -80,7 +76,7 @@ describe.skip('Integration Test', () => {
|
||||
|
||||
function artifacts() {
|
||||
const globber = new FileArtifactGlobber()
|
||||
const artifactPath = path.join(__dirname, 'Integration.test.ts')
|
||||
const artifactPath = path.join(__dirname, "Integration.test.ts")
|
||||
const artifactString = `~/Desktop,~/Desktop/test.txt,blarg.tx, ${artifactPath}`
|
||||
return globber.globArtifactString(artifactString, "raw", false)
|
||||
}
|
||||
@@ -88,5 +84,4 @@ describe.skip('Integration Test', () => {
|
||||
function getToken(): string {
|
||||
return process.env.GITHUB_TOKEN ?? ""
|
||||
}
|
||||
|
||||
})
|
||||
|
||||
@@ -1,29 +1,29 @@
|
||||
const mockSetOutput = jest.fn();
|
||||
const mockSetOutput = jest.fn()
|
||||
|
||||
import {CoreOutputs, Outputs} from "../src/Outputs";
|
||||
import {ReleaseData} from "../src/Releases";
|
||||
import { CoreOutputs, Outputs } from "../src/Outputs"
|
||||
import { ReleaseData } from "../src/Releases"
|
||||
|
||||
jest.mock('@actions/core', () => {
|
||||
return {setOutput: mockSetOutput};
|
||||
jest.mock("@actions/core", () => {
|
||||
return { setOutput: mockSetOutput }
|
||||
})
|
||||
|
||||
describe('Outputs', () => {
|
||||
let outputs: Outputs;
|
||||
describe("Outputs", () => {
|
||||
let outputs: Outputs
|
||||
let releaseData: ReleaseData
|
||||
|
||||
beforeEach(() => {
|
||||
outputs = new CoreOutputs()
|
||||
releaseData = {
|
||||
id: 1,
|
||||
html_url: 'https://api.example.com/assets',
|
||||
upload_url: 'https://api.example.com'
|
||||
html_url: "https://api.example.com/assets",
|
||||
upload_url: "https://api.example.com",
|
||||
}
|
||||
})
|
||||
|
||||
it('Applies the release data to the action output', () => {
|
||||
it("Applies the release data to the action output", () => {
|
||||
outputs.applyReleaseData(releaseData)
|
||||
expect(mockSetOutput).toBeCalledWith('id', releaseData.id)
|
||||
expect(mockSetOutput).toBeCalledWith('html_url', releaseData.html_url)
|
||||
expect(mockSetOutput).toBeCalledWith('upload_url', releaseData.upload_url)
|
||||
expect(mockSetOutput).toBeCalledWith("id", releaseData.id)
|
||||
expect(mockSetOutput).toBeCalledWith("html_url", releaseData.html_url)
|
||||
expect(mockSetOutput).toBeCalledWith("upload_url", releaseData.upload_url)
|
||||
})
|
||||
})
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
import {ReleaseValidator} from "../src/ReleaseValidator";
|
||||
import { ReleaseValidator } from "../src/ReleaseValidator"
|
||||
|
||||
describe("validateReleaseUpdate", () => {
|
||||
describe("updateOnlyUnreleased is disabled", () => {
|
||||
const validator = new ReleaseValidator(false)
|
||||
it('should not throw', () => {
|
||||
it("should not throw", () => {
|
||||
const releaseResponse = {
|
||||
draft: false,
|
||||
prerelease: false,
|
||||
name: "Name"
|
||||
name: "Name",
|
||||
}
|
||||
expect(() => {
|
||||
validator.validateReleaseUpdate(releaseResponse)
|
||||
@@ -16,59 +16,59 @@ describe("validateReleaseUpdate", () => {
|
||||
})
|
||||
describe("updateOnlyUnreleased is enabled", () => {
|
||||
const validator = new ReleaseValidator(true)
|
||||
it('should throw if neither draft or prerelease are enabled', () => {
|
||||
it("should throw if neither draft or prerelease are enabled", () => {
|
||||
const releaseResponse = {
|
||||
draft: false,
|
||||
prerelease: false,
|
||||
name: "Name"
|
||||
name: "Name",
|
||||
}
|
||||
expect(() => {
|
||||
validator.validateReleaseUpdate(releaseResponse)
|
||||
}).toThrow()
|
||||
})
|
||||
|
||||
it('should not throw if draft is enabled', () => {
|
||||
|
||||
it("should not throw if draft is enabled", () => {
|
||||
const releaseResponse = {
|
||||
draft: true,
|
||||
prerelease: false,
|
||||
name: "Name"
|
||||
name: "Name",
|
||||
}
|
||||
expect(() => {
|
||||
validator.validateReleaseUpdate(releaseResponse)
|
||||
}).not.toThrow()
|
||||
})
|
||||
|
||||
it('should not throw if prerelease is enabled', () => {
|
||||
it("should not throw if prerelease is enabled", () => {
|
||||
const releaseResponse = {
|
||||
draft: false,
|
||||
prerelease: true,
|
||||
name: "Name"
|
||||
name: "Name",
|
||||
}
|
||||
expect(() => {
|
||||
validator.validateReleaseUpdate(releaseResponse)
|
||||
}).not.toThrow()
|
||||
})
|
||||
|
||||
it('should not throw if draft & prerelease is enabled', () => {
|
||||
it("should not throw if draft & prerelease is enabled", () => {
|
||||
const releaseResponse = {
|
||||
draft: true,
|
||||
prerelease: true,
|
||||
name: "Name"
|
||||
name: "Name",
|
||||
}
|
||||
expect(() => {
|
||||
validator.validateReleaseUpdate(releaseResponse)
|
||||
}).not.toThrow()
|
||||
})
|
||||
|
||||
it('should default error message release name to release', () => {
|
||||
it("should default error message release name to release", () => {
|
||||
const releaseResponse = {
|
||||
draft: false,
|
||||
prerelease: false,
|
||||
name: null
|
||||
name: null,
|
||||
}
|
||||
expect(() => {
|
||||
validator.validateReleaseUpdate(releaseResponse)
|
||||
}).toThrow(`Tried to update "release" which is neither a draft or prerelease. (updateOnlyUnreleased is on)`)
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user