Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 9 additions & 2 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,17 @@ on:
paths:
- '.browserslistrc'
- 'babel.config.*'
- 'postcss.config.*'
- 'webpack.config.*'
- 'Dockerfile'
- 'src/**'
- '!**/*.test.*'

workflow_dispatch:
inputs:
version:
description: 'Version number manual override'
required: false

concurrency:
group: publish
Expand All @@ -24,7 +30,7 @@ permissions:

env:
AWS_REGION: eu-west-2
AWS_ACCOUNT_ID: "094954420758"
AWS_ACCOUNT_ID: '094954420758'

jobs:
build:
Expand All @@ -33,9 +39,10 @@ jobs:
runs-on: ubuntu-24.04
steps:
- name: Check out code
uses: actions/checkout@v5
uses: actions/checkout@v6

- name: Build and Publish
uses: DEFRA/cdp-build-action/build@main
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
version: ${{ inputs.version }}
28 changes: 21 additions & 7 deletions src/lib/manager.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
import { FormStatus } from '@defra/forms-model'

import { config } from '~/src/config/index.js'
import { createLogger } from '~/src/helpers/logging/logger.js'
import { getJson } from '~/src/lib/fetch.js'

const managerUrl = config.get('managerUrl')
const logger = createLogger()

/**
* Gets the form definition from the Forms Manager API
* Gets the form definition from the Forms Manager API
* @param {string} formId
* @param {FormStatus} formStatus
* @param {number|undefined} versionNumber - Optional specific version to fetch
Expand All @@ -16,16 +19,27 @@
throw new Error('Missing MANAGER_URL')
}

const statusPath = formStatus === FormStatus.Draft ? FormStatus.Draft : ''
const formUrl =
versionNumber !== undefined
? new URL(
if (versionNumber !== undefined) {
try {
const { body } = await getJson(

Check warning on line 24 in src/lib/manager.js

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

'body' is already declared in the upper scope on line 40 column 11.

See more on https://sonarcloud.io/project/issues?id=DEFRA_forms-notify-listener&issues=AZ1oL3n5HXaEWCXnVffG&open=AZ1oL3n5HXaEWCXnVffG&pullRequest=147
new URL(
`/forms/${formId}/versions/${versionNumber}/definition`,
managerUrl
)
: new URL(`/forms/${formId}/definition/${statusPath}`, managerUrl)
)
return body
} catch (err) {
logger.warn(
err,
`[getFormDefinition] Version ${versionNumber} not found for form ${formId}, falling back to current definition`
)
}
}

const { body } = await getJson(formUrl)
const statusPath = formStatus === FormStatus.Draft ? FormStatus.Draft : ''
const { body } = await getJson(
new URL(`/forms/${formId}/definition/${statusPath}`, managerUrl)
)

return body
}
Expand Down
66 changes: 66 additions & 0 deletions src/lib/manager.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,14 @@ import { buildDefinition, buildMetaData } from '@defra/forms-model/stubs'
import { getJson } from '~/src/lib/fetch.js'
import { getFormDefinition, getFormMetadata } from '~/src/lib/manager.js'
jest.mock('~/src/lib/fetch.js')
jest.mock('~/src/helpers/logging/logger.js', () => ({
createLogger: () => ({
info: jest.fn(),
warn: jest.fn(),
error: jest.fn(),
debug: jest.fn()
})
}))
jest.mock('~/src/config/index.js', () => ({
config: {
get: jest.fn().mockReturnValueOnce('http://forms-manager')
Expand Down Expand Up @@ -110,6 +118,64 @@ describe('Manager', () => {
expect(definition).toEqual(expectedDefinition)
})

it('should fall back to current definition when versioned endpoint fails', async () => {
const expectedDefinition = buildDefinition()
const formId = '68a890909ab460290c289409'
const versionNumber = 5
jest
.mocked(getJson)
.mockRejectedValueOnce(new Error('Version not found'))
.mockResolvedValueOnce({ response: {}, body: expectedDefinition })
const definition = await getFormDefinition(
formId,
FormStatus.Live,
versionNumber
)
expect(getJson).toHaveBeenCalledTimes(2)
expect(getJson).toHaveBeenNthCalledWith(
1,
expect.objectContaining({
href: 'http://forms-manager/forms/68a890909ab460290c289409/versions/5/definition'
})
)
expect(getJson).toHaveBeenNthCalledWith(
2,
expect.objectContaining({
href: 'http://forms-manager/forms/68a890909ab460290c289409/definition/'
})
)
expect(definition).toEqual(expectedDefinition)
})

it('should fall back to draft definition when versioned endpoint fails for draft status', async () => {
const expectedDefinition = buildDefinition()
const formId = '68a890909ab460290c289409'
const versionNumber = 2
jest
.mocked(getJson)
.mockRejectedValueOnce(new Error('Version not found'))
.mockResolvedValueOnce({ response: {}, body: expectedDefinition })
const definition = await getFormDefinition(
formId,
FormStatus.Draft,
versionNumber
)
expect(getJson).toHaveBeenCalledTimes(2)
expect(getJson).toHaveBeenNthCalledWith(
1,
expect.objectContaining({
href: 'http://forms-manager/forms/68a890909ab460290c289409/versions/2/definition'
})
)
expect(getJson).toHaveBeenNthCalledWith(
2,
expect.objectContaining({
href: 'http://forms-manager/forms/68a890909ab460290c289409/definition/draft'
})
)
expect(definition).toEqual(expectedDefinition)
})

it('should throw if no manager url set', async () => {
const expectedDefinition = buildDefinition()
const formId = '68a890909ab460290c289409'
Expand Down
Loading