Files
stablyai--orca/config/scripts/latest-stable-release.test.mjs
2026-07-13 13:05:33 +08:00

89 lines
2.6 KiB
JavaScript

import { describe, expect, it, vi } from 'vitest'
import {
fetchReleases,
latestStableDesktopReleaseTag,
parseDesktopStableTag
} from './latest-stable-release.mjs'
function jsonResponse(body, init = {}) {
return {
ok: init.ok ?? true,
status: init.status ?? 200,
statusText: init.statusText ?? 'OK',
json: vi.fn(async () => body),
text: vi.fn(async () => (typeof body === 'string' ? body : JSON.stringify(body)))
}
}
describe('parseDesktopStableTag', () => {
it('accepts only desktop stable tags', () => {
expect(parseDesktopStableTag('v1.4.44')).toMatchObject({
tag: 'v1.4.44',
major: 1,
minor: 4,
patch: 44
})
expect(parseDesktopStableTag('v1.4.44-rc.0')).toBeNull()
expect(parseDesktopStableTag('mobile-v0.0.12')).toBeNull()
expect(parseDesktopStableTag('cli-v4.12.28')).toBeNull()
})
})
describe('latestStableDesktopReleaseTag', () => {
it('chooses the highest stable semver instead of release list order', () => {
const releases = [
{ tag_name: 'v1.4.43-rc.0', draft: false },
{ tag_name: 'v1.4.42', draft: false },
{ tag_name: 'v1.4.44', draft: false },
{ tag_name: 'mobile-v0.0.12', draft: false }
]
expect(latestStableDesktopReleaseTag(releases)).toBe('v1.4.44')
})
it('ignores draft stable releases', () => {
const releases = [
{ tag_name: 'v1.4.45', draft: true },
{ tag_name: 'v1.4.44', draft: false }
]
expect(latestStableDesktopReleaseTag(releases)).toBe('v1.4.44')
})
it('returns empty when no published stable desktop release exists', () => {
expect(
latestStableDesktopReleaseTag([
{ tag_name: 'v1.4.44-rc.0', draft: false },
{ tag_name: 'mobile-v0.0.12', draft: false }
])
).toBe('')
})
})
describe('fetchReleases', () => {
it('fetches all release pages', async () => {
const firstPage = Array.from({ length: 100 }, (_, index) => ({
tag_name: `v1.0.${index}`,
draft: false
}))
const fetchImpl = vi
.fn()
.mockResolvedValueOnce(jsonResponse(firstPage))
.mockResolvedValueOnce(jsonResponse([{ tag_name: 'v1.4.44', draft: false }]))
const releases = await fetchReleases('stablyai/orca', 'token', fetchImpl)
expect(releases).toHaveLength(101)
expect(fetchImpl).toHaveBeenNthCalledWith(
1,
'https://api.github.com/repos/stablyai/orca/releases?per_page=100&page=1',
expect.any(Object)
)
expect(fetchImpl).toHaveBeenNthCalledWith(
2,
'https://api.github.com/repos/stablyai/orca/releases?per_page=100&page=2',
expect.any(Object)
)
})
})