mirror of
https://github.com/softprops/action-gh-release.git
synced 2026-03-17 02:28:55 +08:00
fix: fetch correct asset URL after finalization; test; some refactoring (#738)
This commit is contained in:
@@ -1,15 +1,37 @@
|
||||
import {
|
||||
asset,
|
||||
findTagFromReleases,
|
||||
finalizeRelease,
|
||||
mimeOrDefault,
|
||||
release,
|
||||
Release,
|
||||
Releaser,
|
||||
} from '../src/github';
|
||||
|
||||
import { assert, describe, it } from 'vitest';
|
||||
import { assert, describe, expect, it, vi } from 'vitest';
|
||||
|
||||
describe('github', () => {
|
||||
const config = {
|
||||
github_token: 'test-token',
|
||||
github_ref: 'refs/tags/v1.0.0',
|
||||
github_repository: 'owner/repo',
|
||||
input_tag_name: undefined,
|
||||
input_name: undefined,
|
||||
input_body: undefined,
|
||||
input_body_path: undefined,
|
||||
input_files: [],
|
||||
input_draft: undefined,
|
||||
input_prerelease: undefined,
|
||||
input_preserve_order: undefined,
|
||||
input_overwrite_files: undefined,
|
||||
input_fail_on_unmatched_files: false,
|
||||
input_target_commitish: undefined,
|
||||
input_discussion_category_name: undefined,
|
||||
input_generate_release_notes: false,
|
||||
input_append_body: false,
|
||||
input_make_latest: undefined,
|
||||
};
|
||||
|
||||
describe('mimeOrDefault', () => {
|
||||
it('returns a specific mime for common path', async () => {
|
||||
assert.equal(mimeOrDefault('foo.tar.gz'), 'application/gzip');
|
||||
@@ -53,6 +75,9 @@ describe('github', () => {
|
||||
allReleases: async function* () {
|
||||
yield { data: [mockRelease] };
|
||||
},
|
||||
listReleaseAssets: () => Promise.reject('Not implemented'),
|
||||
deleteReleaseAsset: () => Promise.reject('Not implemented'),
|
||||
uploadReleaseAsset: () => Promise.reject('Not implemented'),
|
||||
} as const;
|
||||
|
||||
describe('when the tag_name is not an empty string', () => {
|
||||
@@ -236,6 +261,76 @@ describe('github', () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe('finalizeRelease input_draft behavior', () => {
|
||||
const draftRelease: Release = {
|
||||
id: 1,
|
||||
upload_url: 'test',
|
||||
html_url: 'test',
|
||||
tag_name: 'v1.0.0',
|
||||
name: 'test',
|
||||
body: 'test',
|
||||
target_commitish: 'main',
|
||||
draft: true,
|
||||
prerelease: false,
|
||||
assets: [],
|
||||
};
|
||||
|
||||
const finalizedRelease: Release = {
|
||||
...draftRelease,
|
||||
draft: false,
|
||||
};
|
||||
|
||||
it.each([
|
||||
{
|
||||
name: 'returns early when input_draft is true',
|
||||
input_draft: true,
|
||||
expectedCalls: 0,
|
||||
expectedResult: draftRelease,
|
||||
},
|
||||
{
|
||||
name: 'finalizes release when input_draft is false',
|
||||
input_draft: false,
|
||||
expectedCalls: 1,
|
||||
expectedResult: finalizedRelease,
|
||||
},
|
||||
])('$name', async ({ input_draft, expectedCalls, expectedResult }) => {
|
||||
const finalizeReleaseSpy = vi.fn(async () => ({ data: finalizedRelease }));
|
||||
|
||||
const releaser: Releaser = {
|
||||
getReleaseByTag: () => Promise.reject('Not implemented'),
|
||||
createRelease: () => Promise.reject('Not implemented'),
|
||||
updateRelease: () => Promise.reject('Not implemented'),
|
||||
finalizeRelease: finalizeReleaseSpy,
|
||||
allReleases: async function* () {
|
||||
throw new Error('Not implemented');
|
||||
},
|
||||
listReleaseAssets: () => Promise.reject('Not implemented'),
|
||||
deleteReleaseAsset: () => Promise.reject('Not implemented'),
|
||||
uploadReleaseAsset: () => Promise.reject('Not implemented'),
|
||||
};
|
||||
|
||||
const result = await finalizeRelease(
|
||||
{
|
||||
...config,
|
||||
input_draft,
|
||||
},
|
||||
releaser,
|
||||
draftRelease,
|
||||
);
|
||||
|
||||
expect(finalizeReleaseSpy).toHaveBeenCalledTimes(expectedCalls);
|
||||
assert.strictEqual(result, expectedResult);
|
||||
|
||||
if (expectedCalls === 1) {
|
||||
expect(finalizeReleaseSpy).toHaveBeenCalledWith({
|
||||
owner: 'owner',
|
||||
repo: 'repo',
|
||||
release_id: draftRelease.id,
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
describe('error handling', () => {
|
||||
it('handles 422 already_exists error gracefully', async () => {
|
||||
const mockReleaser: Releaser = {
|
||||
@@ -260,7 +355,7 @@ describe('github', () => {
|
||||
assets: [],
|
||||
},
|
||||
}),
|
||||
finalizeRelease: async () => {},
|
||||
finalizeRelease: () => Promise.reject('Not implemented'),
|
||||
allReleases: async function* () {
|
||||
yield {
|
||||
data: [
|
||||
@@ -279,29 +374,11 @@ describe('github', () => {
|
||||
],
|
||||
};
|
||||
},
|
||||
listReleaseAssets: () => Promise.reject('Not implemented'),
|
||||
deleteReleaseAsset: () => Promise.reject('Not implemented'),
|
||||
uploadReleaseAsset: () => Promise.reject('Not implemented'),
|
||||
} as const;
|
||||
|
||||
const config = {
|
||||
github_token: 'test-token',
|
||||
github_ref: 'refs/tags/v1.0.0',
|
||||
github_repository: 'owner/repo',
|
||||
input_tag_name: undefined,
|
||||
input_name: undefined,
|
||||
input_body: undefined,
|
||||
input_body_path: undefined,
|
||||
input_files: [],
|
||||
input_draft: undefined,
|
||||
input_prerelease: undefined,
|
||||
input_preserve_order: undefined,
|
||||
input_overwrite_files: undefined,
|
||||
input_fail_on_unmatched_files: false,
|
||||
input_target_commitish: undefined,
|
||||
input_discussion_category_name: undefined,
|
||||
input_generate_release_notes: false,
|
||||
input_append_body: false,
|
||||
input_make_latest: undefined,
|
||||
};
|
||||
|
||||
const result = await release(config, mockReleaser, 1);
|
||||
assert.ok(result);
|
||||
assert.equal(result.id, 1);
|
||||
|
||||
Reference in New Issue
Block a user