Skip to content
Merged
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
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ Versioning](https://semver.org/spec/v2.0.0.html).
- Add custom error message for batch orders when there are no available seats
- Add purchase order reference modal for quote process in dashboard organization
- Update english texts for batch orders
- Uncheck payment method in sale tunnel during the batch order creation

### Fixed

Expand Down
38 changes: 22 additions & 16 deletions src/frontend/js/api/lms/dummy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,26 +25,32 @@ type JWTPayload = {
username: string;
};

/* All JWT tokens will expire the 02 Feb 2026 ! */
/* All JWT tokens will expire the 05 Feb 2027 ! */
const JOANIE_DEV_DEMO_USER_JWT_TOKENS = {
user0:
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzcwMjIzOTY5LCJpYXQiOjE3Mzg2ODc5NjksImp0aSI6ImQwZmU1Zjg5ZjFhYTQ4YmM5NDhmNWU4ODFkNTNhNTU2IiwiZW1haWwiOiJwc21pdGhAZXhhbXBsZS5vcmciLCJsYW5ndWFnZSI6ImVuLXVzIiwidXNlcm5hbWUiOiJ1c2VyMCIsImZ1bGxfbmFtZSI6Ik90aGVyIE93bmVyIn0.eCawfaCzpO7U7iUPC1TE_XYDiRjq_crI93GqE8Fj8zc',
user1:
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzcwMjIzOTY5LCJpYXQiOjE3Mzg2ODc5NjksImp0aSI6ImIwYjk3YjZkZjFlMzRkMTg4NjFiMGFhMjcxYWI0YWU1IiwiZW1haWwiOiJzYW1wc29uYW5uYUBleGFtcGxlLm9yZyIsImxhbmd1YWdlIjoiZW4tdXMiLCJ1c2VybmFtZSI6InVzZXIxIiwiZnVsbF9uYW1lIjoiT3RoZXIgT3duZXIifQ.yd46_63iuw19zmzH8aVNRAVAvAE4VGH8W8BjmFs6PPU',
user2:
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzcwMjIzOTY5LCJpYXQiOjE3Mzg2ODc5NjksImp0aSI6ImNmYzY2OTNmY2Q5ZTRlZGViM2Y2NzU1MTZhNDIzMTdiIiwiZW1haWwiOiJsb3BlemFtYmVyQGV4YW1wbGUub3JnIiwibGFuZ3VhZ2UiOiJlbi11cyIsInVzZXJuYW1lIjoidXNlcjIiLCJmdWxsX25hbWUiOiJPdGhlciBPd25lciJ9.TlFILOXY-wK29M_BUgDKgjdOovSfEIlw5cNXed6ZV3w',
user3:
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzcwMjIzOTY5LCJpYXQiOjE3Mzg2ODc5NjksImp0aSI6IjA4ZTcxZGJjYWIyMDRjMmZhZjgyMDVjZTRiNTliMjZiIiwiZW1haWwiOiJsb25nZWxpemFiZXRoQGV4YW1wbGUub3JnIiwibGFuZ3VhZ2UiOiJlbi11cyIsInVzZXJuYW1lIjoidXNlcjMiLCJmdWxsX25hbWUiOiJPdGhlciBPd25lciJ9.8NxYyjc567lO2Yc7me-TQr8PNvKqB5VLRzHd1Z4vA4U',
user4:
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzcwMjIzOTY5LCJpYXQiOjE3Mzg2ODc5NjksImp0aSI6ImVmZGRkM2Q0YTdmZDQ4ZmFhYmZkM2Q2OTI4YzMwM2U4IiwiZW1haWwiOiJqb25lc2plbm5pZmVyQGV4YW1wbGUub3JnIiwibGFuZ3VhZ2UiOiJlbi11cyIsInVzZXJuYW1lIjoidXNlcjQiLCJmdWxsX25hbWUiOiJPdGhlciBPd25lciJ9.Wn5CKuNPn0s4B_76Mxd3zTKqdUMaZGV456bhZ-fDe-o',
admin:
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxODAxODMyNDI4LCJpYXQiOjE3NzAyOTY0MjgsImp0aSI6IjY2NWQ2N2Y3ZTU4MzQyMDc4YTg1MWNjNTFhNGMyMDg5IiwiZW1haWwiOiJhZG1pbkBleGFtcGxlLmNvbSIsImxhbmd1YWdlIjoiZW4tdXMiLCJ1c2VybmFtZSI6ImFkbWluIiwiZnVsbF9uYW1lIjoiIn0.yDC39WViIYl_pnJAjTedpVNBl14lSXZsXbDv-604VOo',
organization_owner:
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzcwMjIzOTY5LCJpYXQiOjE3Mzg2ODc5NjksImp0aSI6ImRiYmU2ZGExZjhmNDQzNDA4N2U2NzQ0YTIzM2JmNjFiIiwiZW1haWwiOiJkZXZlbG9wZXIrb3JnYW5pemF0aW9uX293bmVyQGV4YW1wbGUuY29tIiwibGFuZ3VhZ2UiOiJlbi11cyIsInVzZXJuYW1lIjoib3JnYW5pemF0aW9uX293bmVyIiwiZnVsbF9uYW1lIjoiT3JnYSBPd25lciJ9.a6QjOAOxCw7ZFKvg8OCcUaW8Xhbmfuqy3cwIqUCPfzE',
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxODAxODMyNDI4LCJpYXQiOjE3NzAyOTY0MjgsImp0aSI6IjlmY2EyZTA5MjcxYjRmZDQ5MTAzMGQ5YjJkMzk3MDhhIiwiZW1haWwiOiJkZXZlbG9wZXIrb3JnYW5pemF0aW9uX293bmVyQGV4YW1wbGUuY29tIiwibGFuZ3VhZ2UiOiJmci1mciIsInVzZXJuYW1lIjoib3JnYW5pemF0aW9uX293bmVyIiwiZnVsbF9uYW1lIjoiT3JnYSBPd25lciJ9.lf2ePQ-xZ-uHY6azh32kFIU3JvzKn3YJZZjmkApqBuE',
student_user:
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzcwMjIzOTY5LCJpYXQiOjE3Mzg2ODc5NjksImp0aSI6IjNhMGExYjM0OWEwNDQxNTg5ODU4NGUwZjMwNTc5M2EwIiwiZW1haWwiOiJkZXZlbG9wZXIrc3R1ZGVudF91c2VyQGV4YW1wbGUuY29tIiwibGFuZ3VhZ2UiOiJmci1mciIsInVzZXJuYW1lIjoic3R1ZGVudF91c2VyIiwiZnVsbF9uYW1lIjoiXHUwMGM5dHVkaWFudCJ9.3VvjPXwtuNA684hSIem3X2uFD-4WH8fipVDXMsi1cAc',
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxODAxODMyNDI4LCJpYXQiOjE3NzAyOTY0MjgsImp0aSI6ImU0M2U3NDg4NDBlYzRkMTI4YTUzMTZmZDY0M2Y1ZWZjIiwiZW1haWwiOiJkZXZlbG9wZXIrc3R1ZGVudF91c2VyQGV4YW1wbGUuY29tIiwibGFuZ3VhZ2UiOiJlbi11cyIsInVzZXJuYW1lIjoic3R1ZGVudF91c2VyIiwiZnVsbF9uYW1lIjoiXHUwMGM5dHVkaWFudCJ9.KViEfiPEv9UGq3nuYxoXBOcJDXxoBfr-sPZEqEJtve4',
second_student_user:
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzcwMjIzOTY5LCJpYXQiOjE3Mzg2ODc5NjksImp0aSI6Ijg5ZDIyNDJjODRkODRiNThiZWVkYjg1NmU2MGNiM2FiIiwiZW1haWwiOiJkZXZlbG9wZXIrc2Vjb25kX3N0dWRlbnRfdXNlckBleGFtcGxlLmNvbSIsImxhbmd1YWdlIjoiZnItZnIiLCJ1c2VybmFtZSI6InNlY29uZF9zdHVkZW50X3VzZXIiLCJmdWxsX25hbWUiOiJcdTAwYzl0dWRpYW50IDAwMiJ9.p5p4Ku0w8mHortWW9TYHTJgORF9wnfCpq-6pvBRjU0Y',
admin:
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzcwMjIzOTY5LCJpYXQiOjE3Mzg2ODc5NjksImp0aSI6Ijk4M2UzNmI5MTUzODQ2Mjg4ZGMxNWNjOTAwNDgwMDA4IiwiZW1haWwiOiJhZG1pbkBleGFtcGxlLmNvbSIsImxhbmd1YWdlIjoiZW4tdXMiLCJ1c2VybmFtZSI6ImFkbWluIiwiZnVsbF9uYW1lIjoiIn0.VuSqfh4l0vtIDSdkEgCNyciiOhlFlMAsf5u5snm2Avw',
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxODAxODMyNDI4LCJpYXQiOjE3NzAyOTY0MjgsImp0aSI6IjIzZDI1OGI5ZmIxMzQyMWFiNDlmNDk1M2RjMjRkZjM5IiwiZW1haWwiOiJkZXZlbG9wZXIrc2Vjb25kX3N0dWRlbnRfdXNlckBleGFtcGxlLmNvbSIsImxhbmd1YWdlIjoiZnItZnIiLCJ1c2VybmFtZSI6InNlY29uZF9zdHVkZW50X3VzZXIiLCJmdWxsX25hbWUiOiJcdTAwYzl0dWRpYW50IDAwMiJ9.WOSPWNi9XRAap4Cd0Nzwp7A-3M1Rkp4A2k9yFI1sUdQ',
user4:
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxODAxODMyNDI4LCJpYXQiOjE3NzAyOTY0MjgsImp0aSI6ImM0ZThjNDhmYTVhMjQyOTZhMzliMzQzNDI5MTYxYmU2IiwiZW1haWwiOiJkdXN0aW5tYXJ0aW5lekBleGFtcGxlLmNvbSIsImxhbmd1YWdlIjoiZW4tdXMiLCJ1c2VybmFtZSI6InVzZXI0IiwiZnVsbF9uYW1lIjoiSmFyZWQgQmVuc29uIn0.J6q6Vgn-TJBCF1HJk7jf8OWjdI5zBjCHYAdoJeVB_Lk',
user5:
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxODAxODMyNDI4LCJpYXQiOjE3NzAyOTY0MjgsImp0aSI6ImEzMzNhNjZjMTJmODQ5ZDNhY2FmMzFjNDc1NzVmZjFiIiwiZW1haWwiOiJnYWNvc3RhQGV4YW1wbGUub3JnIiwibGFuZ3VhZ2UiOiJlbi11cyIsInVzZXJuYW1lIjoidXNlcjUiLCJmdWxsX25hbWUiOiJKZXJyeSBKYW1lcyJ9.E9Cs8ETQveN7VNq0gq3enIBFWbth3ESZ1JHrIaeQvkY',
user6:
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxODAxODMyNDI4LCJpYXQiOjE3NzAyOTY0MjgsImp0aSI6ImNhZDAzOTFkMTk5NjQwNWQ5YThmZWYzMGQ4YzBiZTNiIiwiZW1haWwiOiJtb3JnYW5kb25uYUBleGFtcGxlLmNvbSIsImxhbmd1YWdlIjoiZnItZnIiLCJ1c2VybmFtZSI6InVzZXI2IiwiZnVsbF9uYW1lIjoiS3Jpc3RpbiBOb2JsZSJ9.FowqEHxSh72wGq52QTm6aG3U1GZfcJBQseiSPm4RXOc',
user7:
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxODAxODMyNDI4LCJpYXQiOjE3NzAyOTY0MjgsImp0aSI6ImJhZjUxYjM4OWNhNzQwYWVhMzk3Y2EwY2QzOGFmYzczIiwiZW1haWwiOiJ0dXJuZXJtYWRpc29uQGV4YW1wbGUubmV0IiwibGFuZ3VhZ2UiOiJmci1mciIsInVzZXJuYW1lIjoidXNlcjciLCJmdWxsX25hbWUiOiJCZWNreSBWYXNxdWV6In0.mtbflgik7w7PEVJ-W6mjL2Wnq-bKrugGlWkkmc_jxxU',
user8:
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxODAxODMyNDI4LCJpYXQiOjE3NzAyOTY0MjgsImp0aSI6IjM4NWNiZDljMTI4MjQxMDk4YjZlOGFmYjI2ZjA1Y2Y0IiwiZW1haWwiOiJyb2JlcnQ3NUBleGFtcGxlLm5ldCIsImxhbmd1YWdlIjoiZW4tdXMiLCJ1c2VybmFtZSI6InVzZXI4IiwiZnVsbF9uYW1lIjoiS2V2aW4gQm9vbmUifQ.c_mwfr72SC49hdNOupjgPlplPXBOrm0Gb5d5KuC6NI4',
user9:
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxODAxODMyNDI4LCJpYXQiOjE3NzAyOTY0MjgsImp0aSI6IjI5MGVlN2UxZDQ5YTRjZTJiOTk1ZGMyOWExN2QyOTZiIiwiZW1haWwiOiJjbGFya2tpbWJlcmx5QGV4YW1wbGUubmV0IiwibGFuZ3VhZ2UiOiJlbi11cyIsInVzZXJuYW1lIjoidXNlcjkiLCJmdWxsX25hbWUiOiJKb2huIE93ZW5zIn0.ke-2g7942a2LgBR2OpMxYg-ozB7269ymWx8nzaJs-kc',
user10:
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxODAxODMyNDI4LCJpYXQiOjE3NzAyOTY0MjgsImp0aSI6ImMxMWJhNDY3YWY0YTRjMWFhZDIwOTZhOGU1MDA3NTJiIiwiZW1haWwiOiJiZW5qYW1pbjU5QGV4YW1wbGUub3JnIiwibGFuZ3VhZ2UiOiJlbi11cyIsInVzZXJuYW1lIjoidXNlcjEwIiwiZnVsbF9uYW1lIjoiUm9uYWxkIEpvaG5zb24ifQ.c_AEOp6jD_K0xsJK4ZvkZcGnKlD3wmm_eJ2UEBGY5v0',
user11:
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxODAxODMyNDI4LCJpYXQiOjE3NzAyOTY0MjgsImp0aSI6Ijc5ZDg3NDkxZDU0NDRmMWVhZDAzYTYyMmQ0NWI0Y2E1IiwiZW1haWwiOiJhbWFuZGExMUBleGFtcGxlLm5ldCIsImxhbmd1YWdlIjoiZW4tdXMiLCJ1c2VybmFtZSI6InVzZXIxMSIsImZ1bGxfbmFtZSI6IkNoZXJ5bCBUYXlsb3IifQ.e6DEq75EHvCgtjf7aLr7Tk1DyZ9-4f-n-W8DXySCZZM',
};

export type DevDemoUser = keyof typeof JOANIE_DEV_DEMO_USER_JWT_TOKENS;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ const BatchOrderForm = () => {
signatory_email: '',
signatory_telephone: '',
nb_seats: 0,
payment_method: PaymentMethod.PURCHASE_ORDER,
payment_method: undefined as any,
funding_amount: 0,
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,7 @@ export const StepContent = ({
value: organization.id,
}));
const [otherBillingAddress, setOtherBillingAddress] = useState(false);
const organizationId = form.watch('organization_id');

return (
<div className="step-content">
Expand Down Expand Up @@ -525,11 +526,14 @@ export const StepContent = ({
</div>
<FormattedMessage {...messages.recommandation} />
<Select
{...register('organization_id')}
label={intl.formatMessage(messages.participatingOrganisations)}
clearable
options={orgOptions}
className="recommandation"
value={organizationId ?? ''}
onChange={(e) => {
form.setValue('organization_id', e.target.value as string);
}}
/>
</div>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { screen, within } from '@testing-library/react';
import fetchMock from 'fetch-mock';
import queryString from 'query-string';
import userEvent from '@testing-library/user-event';
import { PaymentMethod } from 'components/PaymentInterfaces/types';
import {
RichieContextFactory as mockRichieContextFactory,
PacedCourseFactory,
Expand All @@ -17,6 +18,7 @@ import {
OfferingBatchOrderFactory,
BatchOrderReadFactory,
CredentialOrderFactory,
OrganizationFactory,
} from 'utils/test/factories/joanie';
import { CourseRun, NOT_CANCELED_ORDER_STATES, OrderState } from 'types/Joanie';
import { Priority } from 'types';
Expand Down Expand Up @@ -82,9 +84,7 @@ describe('SaleTunnel', () => {
const product = ProductFactory().one();
const offering = OfferingFactory({ course, product, is_withdrawable: false }).one();
const paymentPlan = PaymentPlanFactory().one();
const offeringOrganization = OfferingBatchOrderFactory({
product: { id: product.id, title: product.title },
}).one();
const organizations = OrganizationFactory().many(3);

fetchMock.get(
`https://joanie.endpoint/api/v1.0/courses/${course.code}/products/${product.id}/`,
Expand All @@ -105,7 +105,7 @@ describe('SaleTunnel', () => {
);
fetchMock.get(
`https://joanie.endpoint/api/v1.0/offerings/${offering.id}/get-organizations/`,
offeringOrganization,
organizations,
);

render(<CourseProductItem productId={product.id} course={course} />, {
Expand Down Expand Up @@ -214,6 +214,33 @@ describe('SaleTunnel', () => {
await user.type($nbParticipants, '13');
expect($nbParticipants).toHaveValue(13);

// Financing step
await user.click(screen.getByRole('button', { name: 'Next' }));

const $purchaseOrderRadio = await screen.findByLabelText('Purchase order');
await user.click($purchaseOrderRadio);

const $fundingEntity = screen.getByLabelText('Entity name');
await user.type($fundingEntity, 'OPCO');
expect($fundingEntity).toHaveValue('OPCO');

const $fundingAmount = screen.getByLabelText('Amount covered');
await user.type($fundingAmount, '5000');
expect($fundingAmount).toHaveValue(5000);

const organizationComboboxes = screen.getAllByRole('combobox', {
name: 'Participating organizations',
});

const $organizationSelect = organizationComboboxes[organizationComboboxes.length - 1];
await user.click($organizationSelect);
const organizationMenu: HTMLDivElement = screen.getByRole('listbox', {
name: 'Participating organizations',
});
expectMenuToBeOpen(organizationMenu);
const firstOrg = organizations[0];
await user.click(screen.getByRole('option', { name: firstOrg.title }));

// Submit the batch order
const batchOrderRead = BatchOrderReadFactory().one();
fetchMock.post('https://joanie.endpoint/api/v1.0/batch-orders/', batchOrderRead);
Expand All @@ -229,6 +256,39 @@ describe('SaleTunnel', () => {
'href',
`/en/dashboard/batch-orders/${batchOrderRead.id}`,
);

// Verify the batch order payload contains all required and optional fields
const batchOrderCalls = fetchMock.calls('https://joanie.endpoint/api/v1.0/batch-orders/');
expect(batchOrderCalls).toHaveLength(1);
const batchOrderCall = batchOrderCalls[0];
const batchOrderRequest = batchOrderCall[1];
const batchOrderPayload = JSON.parse(batchOrderRequest?.body as string);

// Verify all payload fields
expect(batchOrderPayload).toEqual({
offering_id: offering.id,
company_name: 'GIP-FUN',
identification_number: '789 242 229 01694',
address: '61 Bis Rue de la Glaciere',
postcode: '75013',
city: 'Paris',
country: 'FR',
administrative_lastname: 'Doe',
administrative_firstname: 'John',
administrative_profession: 'HR',
administrative_email: 'john.doe@fun-mooc.com',
administrative_telephone: '+338203920103',
signatory_lastname: 'Doe',
signatory_firstname: 'John',
signatory_profession: 'CEO',
signatory_email: 'john.doe@fun-mooc.com',
signatory_telephone: '+338203920103',
nb_seats: '13',
payment_method: PaymentMethod.PURCHASE_ORDER,
funding_entity: 'OPCO',
funding_amount: '5000',
organization_id: firstOrg.id,
});
}, 30000);

it('tests the entire process of subscribing with a voucher from a batch order', async () => {
Expand Down Expand Up @@ -491,6 +551,12 @@ describe('SaleTunnel', () => {
await user.type($nbParticipants, '13');
expect($nbParticipants).toHaveValue(13);

// Financing step
await user.click(screen.getByRole('button', { name: 'Next' }));

const $purchaseOrderRadio = await screen.findByLabelText('Purchase order');
await user.click($purchaseOrderRadio);

fetchMock.post('https://joanie.endpoint/api/v1.0/batch-orders/', {
status: 422,
body: {
Expand Down