mirror of
https://github.com/Tria-plc/edr-platform.git
synced 2026-08-30 04:08:11 +00:00
add dispute functionality for contract duty and implement collection dates
This commit is contained in:
@@ -0,0 +1,89 @@
|
||||
import {
|
||||
diffContractFields,
|
||||
summarizeChanges,
|
||||
} from './contract-document-diff.util';
|
||||
|
||||
/**
|
||||
* The contract-field audit runs on the customer's own edits, so it has to be
|
||||
* exact: never report a field the edit did not touch, and never render a value
|
||||
* as "[object Object]" or "true" in the trail a reviewer reads.
|
||||
*/
|
||||
describe('diffContractFields', () => {
|
||||
it('reports only the fields that actually changed', () => {
|
||||
const changes = diffContractFields(
|
||||
{ freightType: 'BULK', paymentCurrency: 'USD', isReefer: false },
|
||||
{ freightType: 'CONTAINER', paymentCurrency: 'USD', isReefer: false },
|
||||
);
|
||||
|
||||
expect(changes).toEqual([
|
||||
{
|
||||
kind: 'FIELD_CHANGED',
|
||||
field: 'freightType',
|
||||
label: 'Freight type',
|
||||
from: 'BULK',
|
||||
to: 'CONTAINER',
|
||||
},
|
||||
]);
|
||||
});
|
||||
|
||||
it('renders booleans as Yes/No, not true/false', () => {
|
||||
const [change] = diffContractFields({ isHazardous: false }, { isHazardous: true });
|
||||
|
||||
expect(change).toMatchObject({ label: 'Hazardous', from: 'No', to: 'Yes' });
|
||||
});
|
||||
|
||||
it('treats null, undefined and empty string as "not set"', () => {
|
||||
expect(diffContractFields({ unNumber: null }, { unNumber: '' })).toEqual([]);
|
||||
expect(diffContractFields({ unNumber: undefined }, { unNumber: null })).toEqual([]);
|
||||
|
||||
const [set] = diffContractFields({ unNumber: null }, { unNumber: 'UN1234' });
|
||||
expect(set).toMatchObject({ from: null, to: 'UN1234' });
|
||||
});
|
||||
|
||||
it('ignores fields absent from the update', () => {
|
||||
// A partial edit must not report the fields it never sent.
|
||||
expect(diffContractFields({ freightType: 'BULK', isReefer: true }, {})).toEqual([]);
|
||||
});
|
||||
|
||||
it('records a route swap that keeps the same lane count', () => {
|
||||
const [change] = diffContractFields(
|
||||
{ routes: 'Nagad → Mojo' },
|
||||
{ routes: 'Nagad → Adama' },
|
||||
);
|
||||
|
||||
expect(change).toMatchObject({
|
||||
label: 'Routes',
|
||||
from: 'Nagad → Mojo',
|
||||
to: 'Nagad → Adama',
|
||||
});
|
||||
});
|
||||
|
||||
it('summarises field changes by name, and by count once there are many', () => {
|
||||
const few = diffContractFields(
|
||||
{ freightType: 'BULK', paymentCurrency: 'USD' },
|
||||
{ freightType: 'CONTAINER', paymentCurrency: 'ETB' },
|
||||
);
|
||||
expect(summarizeChanges(few)).toBe('freight type, payment currency changed');
|
||||
|
||||
const many = diffContractFields(
|
||||
{ a: '1', b: '1', c: '1', d: '1' },
|
||||
{ a: '2', b: '2', c: '2', d: '2' },
|
||||
);
|
||||
expect(summarizeChanges(many)).toBe('4 contract fields changed');
|
||||
});
|
||||
|
||||
it('summarises document and field changes together', () => {
|
||||
const summary = summarizeChanges([
|
||||
{ kind: 'ARTICLE_BODY_CHANGED', articleId: 'a-1', title: 'Article 1' },
|
||||
{
|
||||
kind: 'FIELD_CHANGED',
|
||||
field: 'routes',
|
||||
label: 'Routes',
|
||||
from: 'A → B',
|
||||
to: 'A → C',
|
||||
},
|
||||
]);
|
||||
|
||||
expect(summary).toBe('1 article edited, routes changed');
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user