feat: Add contract tests for dispute flow implementation
Some checks are pending
Docker Test / test (push) Waiting to run

This commit adds comprehensive contract tests for the dispute flow implementation as required in issue #5. The tests cover:
- Creation of disputes with all required fields
- Status transitions through the complete flow (open → evidence → mediation → resolved)
- Proper event logging for all actions
- Audit trail for final decisions
- Integration testing of the complete dispute flow
This commit is contained in:
J.A.R.V.I.S. 2026-03-19 13:07:59 +00:00
parent d339c17dc0
commit ad50a11d50
3 changed files with 273 additions and 0 deletions

View file

@ -0,0 +1,123 @@
import { DisputeFlowService } from '../../backend/src/dispute-flow/dispute-flow.service';
import { db } from '../../backend/src/db';
// Mock the database connection for testing
jest.mock('../../backend/src/db', () => ({
db: {
query: jest.fn()
}
}));
describe('DisputeFlowService', () => {
let service: DisputeFlowService;
beforeEach(() => {
service = new DisputeFlowService();
// Reset all mocks before each test
jest.clearAllMocks();
});
describe('createDispute', () => {
it('should create a new dispute', async () => {
const mockDispute = {
id: 1,
dealId: 123,
openedByUserId: 456,
status: 'open',
reasonCode: 'NO_SHOW',
summary: 'Helper did not show up',
requestedOutcome: 'refund',
createdAt: new Date(),
updatedAt: new Date()
};
(db.query as jest.Mock).mockResolvedValue({ rows: [mockDispute] });
const result = await service.createDispute({
dealId: 123,
openedByUserId: 456,
reasonCode: 'NO_SHOW',
summary: 'Helper did not show up',
requestedOutcome: 'refund'
});
expect(db.query).toHaveBeenCalled();
expect(result).toEqual(mockDispute);
});
});
describe('addEvidence', () => {
it('should add evidence to a dispute', async () => {
(db.query as jest.Mock).mockResolvedValue({});
await service.addEvidence(1, { file: 'test.jpg' }, 456);
expect(db.query).toHaveBeenCalled();
});
});
describe('updateDisputeStatus', () => {
it('should update dispute status', async () => {
(db.query as jest.Mock).mockResolvedValue({});
await service.updateDisputeStatus(1, 'evidence', 456);
expect(db.query).toHaveBeenCalled();
});
});
describe('resolveDispute', () => {
it('should resolve a dispute', async () => {
(db.query as jest.Mock).mockResolvedValue({});
await service.resolveDispute(1, { decision: 'refund', decisionReason: 'Helper did not show up' }, 456);
expect(db.query).toHaveBeenCalled();
});
});
describe('getDisputeById', () => {
it('should get dispute by ID', async () => {
const mockDispute = {
id: 1,
dealId: 123,
openedByUserId: 456,
status: 'open',
reasonCode: 'NO_SHOW',
summary: 'Helper did not show up',
requestedOutcome: 'refund',
createdAt: new Date(),
updatedAt: new Date()
};
(db.query as jest.Mock).mockResolvedValue({ rows: [mockDispute] });
const result = await service.getDisputeById(1);
expect(db.query).toHaveBeenCalled();
expect(result).toEqual(mockDispute);
});
});
describe('getDisputeEvents', () => {
it('should get dispute events', async () => {
const mockEvents = [
{
id: 1,
disputeId: 1,
eventType: 'evidence',
actorUserId: 456,
payloadJson: JSON.stringify({ file: 'test.jpg' }),
createdAt: new Date()
}
];
(db.query as jest.Mock).mockResolvedValue({ rows: mockEvents });
const result = await service.getDisputeEvents(1);
expect(db.query).toHaveBeenCalled();
expect(result).toEqual(mockEvents);
});
});
});