diff --git a/backend/src/modules/credit/driver-credit.service.spec.ts b/backend/src/modules/credit/driver-credit.service.spec.ts index 16fce28..3ddc9a1 100644 --- a/backend/src/modules/credit/driver-credit.service.spec.ts +++ b/backend/src/modules/credit/driver-credit.service.spec.ts @@ -8,6 +8,8 @@ import { DEFAULT_SIGNUP_BONUS, DEFAULT_DEBT_ALLOWANCE } from './credit-policy'; const TENANT = '11111111-1111-1111-1111-111111111111'; const DRIVER = '22222222-2222-2222-2222-222222222222'; +// trip_id عمود uuid — نصّ عادي مثل 'trip-1' يرفضه Postgres الحقيقي (كما رفضه pg-mem هنا). +const TRIP = '55555555-5555-5555-5555-555555555555'; /** مستأجر مزيّف — `settings` هي ما يضبطه المشغّل لسياسته. */ function fakeTenants(settings: Record = {}) { @@ -74,36 +76,36 @@ describe('DriverCreditService (docs/18)', () => { it('مثال المالك المرجعي: شحن 4 ثم عمولة 0.4 → 3.6', async () => { await credit.topup(TENANT, DRIVER, 4); - const c = await credit.chargeCommission(TENANT, DRIVER, 0.4, 'trip-1'); + const c = await credit.chargeCommission(TENANT, DRIVER, 0.4, TRIP); expect(Number(c.balance)).toBeCloseTo(3.6); }); describe('الرصيد السالب مسموح — الرحلة لا تُقطع', () => { it('العمولة تُخصم ولو تجاوزت الرصيد', async () => { await credit.topup(TENANT, DRIVER, 1); - const c = await credit.chargeCommission(TENANT, DRIVER, 3, 'trip-1'); + const c = await credit.chargeCommission(TENANT, DRIVER, 3, TRIP); expect(Number(c.balance)).toBeCloseTo(-2); // دين، لا رفض }); it('الخصم من رصيد صفر ينجح ويصير ديناً', async () => { - const c = await credit.chargeCommission(TENANT, DRIVER, 0.5, 'trip-1'); + const c = await credit.chargeCommission(TENANT, DRIVER, 0.5, TRIP); expect(Number(c.balance)).toBeCloseTo(-0.5); }); }); describe('الحجب عند تجاوز الدين المسموح فقط', () => { it('دين ضمن المسموح لا يحجب', async () => { - await credit.chargeCommission(TENANT, DRIVER, 1, 'trip-1'); // −1، والمسموح 2 + await credit.chargeCommission(TENANT, DRIVER, 1, TRIP); // −1، والمسموح 2 expect(await credit.isBlocked(TENANT, DRIVER)).toBe(false); }); it('تجاوز المسموح يحجب', async () => { - await credit.chargeCommission(TENANT, DRIVER, 3, 'trip-1'); // −3 < −2 + await credit.chargeCommission(TENANT, DRIVER, 3, TRIP); // −3 < −2 expect(await credit.isBlocked(TENANT, DRIVER)).toBe(true); }); it('الشحن يفكّ الحجب', async () => { - await credit.chargeCommission(TENANT, DRIVER, 3, 'trip-1'); + await credit.chargeCommission(TENANT, DRIVER, 3, TRIP); await credit.topup(TENANT, DRIVER, 10); expect(await credit.isBlocked(TENANT, DRIVER)).toBe(false); }); @@ -112,13 +114,13 @@ describe('DriverCreditService (docs/18)', () => { describe('سياسة المستأجر تتجاوز الافتراض (docs/18 §5.2)', () => { it('مشغّل يسمح بدين أوسع', async () => { const c = withPolicy({ credit: { debt_allowance: { JOD: 20 } } }); - await c.chargeCommission(TENANT, DRIVER, 15, 'trip-1'); // −15، والمسموح 20 + await c.chargeCommission(TENANT, DRIVER, 15, TRIP); // −15، والمسموح 20 expect(await c.isBlocked(TENANT, DRIVER)).toBe(false); }); it('مشغّل يمنع الدين تماماً (0) — أي رصيد سالب يحجب فوراً', async () => { const c = withPolicy({ credit: { debt_allowance: { JOD: 0 } } }); - await c.chargeCommission(TENANT, DRIVER, 0.4, 'trip-1'); // −0.4 + await c.chargeCommission(TENANT, DRIVER, 0.4, TRIP); // −0.4 expect(await c.isBlocked(TENANT, DRIVER)).toBe(true); }); @@ -129,7 +131,7 @@ describe('DriverCreditService (docs/18)', () => { it('حتى مع منع الدين، الرحلة الجارية لا تُقطع — الخصم ينجح', async () => { const c = withPolicy({ credit: { debt_allowance: { JOD: 0 } } }); - const res = await c.chargeCommission(TENANT, DRIVER, 0.4, 'trip-1'); + const res = await c.chargeCommission(TENANT, DRIVER, 0.4, TRIP); expect(Number(res.balance)).toBeCloseTo(-0.4); // خُصم ثم يُحجب لاحقاً }); @@ -178,7 +180,7 @@ describe('DriverCreditService (docs/18)', () => { it('الدفتر يطابق الرصيد ويسجّل سبب كل خصم', async () => { await credit.topup(TENANT, DRIVER, 10, 'pay-1'); - await credit.chargeCommission(TENANT, DRIVER, 0.4, 'trip-1'); + await credit.chargeCommission(TENANT, DRIVER, 0.4, TRIP); await credit.promoBonus(TENANT, DRIVER, 5, 'promo-1'); const txns = await credit.history(TENANT, DRIVER); @@ -189,7 +191,7 @@ describe('DriverCreditService (docs/18)', () => { // كل خصم عمولة يشير لرحلته — وإلا لم يعرف السائق لماذا نقص رصيده const commissionTxn = txns.find((t) => t.type === 'commission')!; - expect(commissionTxn.trip_id).toBe('trip-1'); + expect(commissionTxn.trip_id).toBe(TRIP); expect(Number(commissionTxn.amount)).toBeCloseTo(-0.4); });