UNPKG

@sanity/sdk

Version:
337 lines (325 loc) 9.88 kB
import {describe, expect, it} from 'vitest' import {type ReleaseDocument} from '../releasesStore' import {sortReleases} from './sortReleases' // Mock function to create a release document function createReleaseMock( value: Partial< Omit<ReleaseDocument, 'metadata'> & { metadata: Partial<ReleaseDocument['metadata']> } >, ): ReleaseDocument { const id: string = typeof value['_id'] === 'string' ? value['_id'] : 'mockId' return { _id: id, _rev: 'rev', _type: 'release', _createdAt: new Date().toISOString(), _updatedAt: new Date().toISOString(), state: 'active', ...value, metadata: { title: `Release ${id}`, releaseType: 'asap', ...value.metadata, }, name: `Release ${id}`, } } describe('sortReleases()', () => { it('should return the asap releases ordered by createdAt', () => { const releases: ReleaseDocument[] = [ createReleaseMock({ _id: '_.releases.rasap1', _createdAt: '2024-10-24T00:00:00Z', metadata: { releaseType: 'asap', }, }), createReleaseMock({ _id: '_.releases.rasap2', _createdAt: '2024-10-25T00:00:00Z', metadata: { releaseType: 'asap', }, }), ] const sorted = sortReleases(releases) const expectedOrder = ['rasap2', 'rasap1'] expectedOrder.forEach((expectedName, idx) => { expect(sorted[idx]['_id']).toContain(expectedName) }) }) it('should return the scheduled releases ordered by intendedPublishAt or publishAt', () => { const releases: ReleaseDocument[] = [ createReleaseMock({ _id: '_.releases.rfuture2', metadata: { releaseType: 'scheduled', intendedPublishAt: '2024-11-25T00:00:00Z', }, }), createReleaseMock({ _id: '_.releases.rfuture1', metadata: { releaseType: 'scheduled', intendedPublishAt: '2024-11-23T00:00:00Z', }, }), createReleaseMock({ _id: '_.releases.rfuture4', state: 'scheduled', publishAt: '2024-11-31T00:00:00Z', metadata: { releaseType: 'scheduled', intendedPublishAt: '2024-10-20T00:00:00Z', }, }), createReleaseMock({ _id: '_.releases.rfuture3', state: 'scheduled', publishAt: '2024-11-26T00:00:00Z', metadata: { releaseType: 'scheduled', }, }), createReleaseMock({ _id: '_.releases.rfuture5', metadata: { releaseType: 'scheduled', }, }), createReleaseMock({ _id: '_.releases.rfuture6', metadata: { releaseType: 'scheduled', }, }), ] const sorted = sortReleases(releases) const expectedOrder = ['rfuture4', 'rfuture3', 'rfuture2', 'rfuture1', 'rfuture5', 'rfuture6'] expectedOrder.forEach((expectedName, idx) => { expect(sorted[idx]['_id']).toContain(expectedName) }) }) it('should return the scheduled releases ordered by intendedPublishAt or publishAt, with missing dates at the end', () => { const releases: ReleaseDocument[] = [ createReleaseMock({ _id: '_.releases.rfuture2', metadata: { releaseType: 'scheduled', intendedPublishAt: '2024-11-25T00:00:00Z', }, }), createReleaseMock({ _id: '_.releases.rfuture1', metadata: { releaseType: 'scheduled', intendedPublishAt: '2024-11-23T00:00:00Z', }, }), createReleaseMock({ _id: '_.releases.rfuture4', state: 'scheduled', publishAt: '2024-11-31T00:00:00Z', metadata: { releaseType: 'scheduled', intendedPublishAt: '2024-10-20T00:00:00Z', }, }), createReleaseMock({ _id: '_.releases.rfuture3', state: 'scheduled', publishAt: '2024-11-26T00:00:00Z', metadata: { releaseType: 'scheduled', }, }), createReleaseMock({ _id: '_.releases.rfuture5', state: 'scheduled', publishAt: '2024-11-27T00:00:00Z', metadata: { releaseType: 'scheduled', }, }), createReleaseMock({ _id: '_.releases.rfuture6', metadata: { releaseType: 'scheduled', }, }), createReleaseMock({ _id: '_.releases.rfuture7', metadata: { releaseType: 'scheduled', }, }), createReleaseMock({ _id: '_.releases.rfuture8', state: 'scheduled', publishAt: '2024-11-28T00:00:00Z', metadata: { releaseType: 'scheduled', }, }), ] const sorted = sortReleases(releases) const expectedOrder = [ 'rfuture4', 'rfuture8', 'rfuture5', 'rfuture3', 'rfuture2', 'rfuture1', 'rfuture6', 'rfuture7', ] expectedOrder.forEach((expectedName, idx) => { expect(sorted[idx]['_id']).toContain(expectedName) }) }) it('should correctly handle scheduled releases with and without dates in both comparison directions', () => { const specificCase = [ createReleaseMock({ _id: '_.releases.rwithdate', metadata: { releaseType: 'scheduled', intendedPublishAt: '2024-11-29T00:00:00Z', }, }), createReleaseMock({ _id: '_.releases.rnodate', metadata: { releaseType: 'scheduled', }, }), ] const sortedSpecific = sortReleases(specificCase) expect(sortedSpecific[0]._id).toContain('rwithdate') expect(sortedSpecific[1]._id).toContain('rnodate') // Test the reverse order to ensure we hit both comparison branches const reversedSpecific = [...specificCase].reverse() const sortedReversedSpecific = sortReleases(reversedSpecific) expect(sortedReversedSpecific[0]._id).toContain('rwithdate') expect(sortedReversedSpecific[1]._id).toContain('rnodate') }) it('should return the undecided releases ordered by createdAt', () => { const releases: ReleaseDocument[] = [ createReleaseMock({ _id: '_.releases.rundecided1', _createdAt: '2024-10-25T00:00:00Z', metadata: { releaseType: 'undecided', }, }), createReleaseMock({ _id: '_.releases.rundecided2', _createdAt: '2024-10-26T00:00:00Z', metadata: { releaseType: 'undecided', }, }), ] const sorted = sortReleases(releases) const expectedOrder = ['rundecided2', 'rundecided1'] expectedOrder.forEach((expectedName, idx) => { expect(sorted[idx]['_id']).toContain(expectedName) }) }) it('should correctly sort asap vs non-asap releases in both directions', () => { const releases: ReleaseDocument[] = [ createReleaseMock({ _id: '_.releases.rasap1', _createdAt: '2024-10-24T00:00:00Z', metadata: { releaseType: 'asap', }, }), createReleaseMock({ _id: '_.releases.rscheduled1', metadata: { releaseType: 'scheduled', intendedPublishAt: '2024-11-23T00:00:00Z', }, }), createReleaseMock({ _id: '_.releases.runknown1', metadata: { releaseType: 'unknown' as unknown as 'asap' | 'scheduled' | 'undecided', }, }), createReleaseMock({ _id: '_.releases.rasap2', _createdAt: '2024-10-25T00:00:00Z', metadata: { releaseType: 'asap', }, }), ] const sorted = sortReleases(releases) const expectedOrder = ['rscheduled1', 'runknown1', 'rasap2', 'rasap1'] expectedOrder.forEach((expectedName, idx) => { expect(sorted[idx]['_id']).toContain(expectedName) }) // Test with releases in reverse order to ensure both comparison directions are covered const reversedReleases = [...releases].reverse() const sortedReversed = sortReleases(reversedReleases) const expectedReversedOrder = ['runknown1', 'rscheduled1', 'rasap2', 'rasap1'] expectedReversedOrder.forEach((expectedName, idx) => { expect(sortedReversed[idx]['_id']).toContain(expectedName) }) }) it("should gracefully combine all release types, and sort them by 'undecided', 'scheduled', 'asap'", () => { const releases = [ createReleaseMock({ _id: '_.releases.rasap2', _createdAt: '2024-10-25T00:00:00Z', metadata: { releaseType: 'asap', }, }), createReleaseMock({ _id: '_.releases.rasap1', _createdAt: '2024-10-24T00:00:00Z', metadata: { releaseType: 'asap', }, }), createReleaseMock({ _id: '_.releases.rundecided2', _createdAt: '2024-10-26T00:00:00Z', metadata: { releaseType: 'undecided', }, }), createReleaseMock({ _id: '_.releases.rfuture4', state: 'scheduled', publishAt: '2024-11-31T00:00:00Z', metadata: { releaseType: 'scheduled', intendedPublishAt: '2024-10-20T00:00:00Z', }, }), createReleaseMock({ _id: '_.releases.rfuture1', metadata: { releaseType: 'scheduled', intendedPublishAt: '2024-11-23T00:00:00Z', }, }), createReleaseMock({ _id: '_.releases.runknown1', metadata: { releaseType: 'unknown' as unknown as 'asap' | 'scheduled' | 'undecided', }, }), ] const sorted = sortReleases(releases) const expectedOrder = ['rundecided2', 'rfuture4', 'rfuture1', 'runknown1', 'rasap2', 'rasap1'] expectedOrder.forEach((expectedName, idx) => { expect(sorted[idx]['_id']).toContain(expectedName) }) }) })