@ 261107.5
current
'use strict'

const { rejects, strictEqual } = require('node:assert')
const { test } = require('node:test')
const { getPreviousRelease, release } = require('../scripts/release')

test('getPreviousRelease uses the latest release from the current major line', () => {
  const previousRelease = getPreviousRelease({
    versionTag: 'v8.0.1',
    releases: [
      { tag_name: 'v8.0.0' },
      { tag_name: 'v7.16.0' }
    ]
  })

  strictEqual(previousRelease?.tag_name, 'v8.0.0')
})

test('getPreviousRelease ignores the current version tag', () => {
  const previousRelease = getPreviousRelease({
    versionTag: 'v8.0.1',
    releases: [
      { tag_name: 'v8.0.1' },
      { tag_name: 'v8.0.0' },
      { tag_name: 'v7.16.0' }
    ]
  })

  strictEqual(previousRelease?.tag_name, 'v8.0.0')
})

test('getPreviousRelease returns undefined when the current major has no previous releases', () => {
  const previousRelease = getPreviousRelease({
    versionTag: 'v8.0.0',
    releases: [
      { tag_name: 'v7.16.0' }
    ]
  })

  strictEqual(previousRelease, undefined)
})

const createGithub = (deleteRef) => ({
  rest: {
    repos: {
      listReleases: async () => ({ data: [] }),
      generateReleaseNotes: async () => ({ data: { body: 'Release notes' } }),
      createRelease: async () => {}
    },
    git: { deleteRef }
  }
})

const releaseArgs = {
  github: null,
  context: { repo: { owner: 'nodejs', repo: 'undici' } },
  versionTag: 'v8.0.0',
  commitHash: 'abc123'
}

test('release treats a missing release PR ref as a no-op', async () => {
  const github = createGithub(async () => {
    const error = new Error('Reference does not exist')
    error.status = 422
    error.response = { data: { message: 'Reference does not exist' } }
    throw error
  })

  await release({ ...releaseArgs, github })
})

test('release propagates other release PR ref deletion errors', async () => {
  const error = new Error('Forbidden')
  error.status = 403
  const github = createGithub(async () => {
    throw error
  })

  await rejects(release({ ...releaseArgs, github }), (actual) => actual === error)
})