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
123 lines
No EOL
3.2 KiB
TypeScript
123 lines
No EOL
3.2 KiB
TypeScript
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);
|
|
});
|
|
});
|
|
}); |