fix: fetch correct asset URL after finalization; test; some refactoring (#738)

This commit is contained in:
Mozi
2026-03-14 19:49:25 -04:00
committed by GitHub
parent d015dc32db
commit 3074e62a34
5 changed files with 239 additions and 62 deletions

View File

@@ -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);