diff --git a/app/pages/package/[[org]]/[name]/versions.vue b/app/pages/package/[[org]]/[name]/versions.vue index 8687ccec18..fdbe0a0172 100644 --- a/app/pages/package/[[org]]/[name]/versions.vue +++ b/app/pages/package/[[org]]/[name]/versions.vue @@ -554,6 +554,14 @@ const flatItems = computed(() => { v{{ item.versions[0] }} + ({ version, time: meta.time, - hasProvenance: meta.provenance, - hasTrustedPublisher: meta.trustedPublisher, + trustStatus: { + provenance: meta.provenance ?? false, + trustedPublisher: meta.trustedPublisher ?? false, + stagedPublish: meta.staged ?? false, + }, deprecated: meta.deprecated, })) .sort((a, b) => compare(b.version, a.version)) diff --git a/test/nuxt/pages/PackageVersionsPage.spec.ts b/test/nuxt/pages/PackageVersionsPage.spec.ts index 071f5ad692..c404017d4f 100644 --- a/test/nuxt/pages/PackageVersionsPage.spec.ts +++ b/test/nuxt/pages/PackageVersionsPage.spec.ts @@ -109,6 +109,32 @@ describe('package versions page', () => { expect(component.text()).toContain('beta') }) }) + + it('renders provenance badges for versions with provenance metadata', async () => { + nextFetchResponse = makeVersionData(['2.0.0', '1.0.0'], { latest: '2.0.0' }) + mockFetchAllPackageVersions.mockResolvedValue([ + { + version: '2.0.0', + time: '2024-01-15T00:00:00.000Z', + trustStatus: { provenance: true, trustedPublisher: true, stagedPublish: false }, + }, + { + version: '1.0.0', + time: '2024-01-10T00:00:00.000Z', + trustStatus: { provenance: false, trustedPublisher: false, stagedPublish: false }, + }, + ]) + const component = await mountPage() + + await vi.waitFor(() => { + const groupHeader = component + .findAll('button[aria-expanded]') + .find(button => button.text().includes('2.x')) + + expect(groupHeader).toBeDefined() + expect(groupHeader!.findComponent({ name: 'ProvenanceBadge' }).exists()).toBe(true) + }) + }) }) describe('version history groups', () => { @@ -135,8 +161,16 @@ describe('package versions page', () => { it('expands a group and shows version rows on click', async () => { nextFetchResponse = makeVersionData(['1.1.0', '1.0.0'], { latest: '1.1.0' }) mockFetchAllPackageVersions.mockResolvedValue([ - { version: '1.1.0', time: '2024-01-15T00:00:00.000Z', hasProvenance: false }, - { version: '1.0.0', time: '2024-01-10T00:00:00.000Z', hasProvenance: false }, + { + version: '1.1.0', + time: '2024-01-15T00:00:00.000Z', + trustStatus: { provenance: false, trustedPublisher: false, stagedPublish: false }, + }, + { + version: '1.0.0', + time: '2024-01-10T00:00:00.000Z', + trustStatus: { provenance: false, trustedPublisher: false, stagedPublish: false }, + }, ]) const component = await mountPage() await vi.waitFor(() => expect(component.text()).toContain('1.x')) @@ -152,8 +186,16 @@ describe('package versions page', () => { it('fetches full metadata automatically after phase 1 completes, exactly once', async () => { nextFetchResponse = makeVersionData(['2.0.0', '1.0.0'], { latest: '2.0.0' }) mockFetchAllPackageVersions.mockResolvedValue([ - { version: '2.0.0', time: '2024-01-15T00:00:00.000Z', hasProvenance: false }, - { version: '1.0.0', time: '2024-01-10T00:00:00.000Z', hasProvenance: false }, + { + version: '2.0.0', + time: '2024-01-15T00:00:00.000Z', + trustStatus: { provenance: false, trustedPublisher: false, stagedPublish: false }, + }, + { + version: '1.0.0', + time: '2024-01-10T00:00:00.000Z', + trustStatus: { provenance: false, trustedPublisher: false, stagedPublish: false }, + }, ]) await mountPage()