From 551aa897e12973be7a27456bea3eea965547aeaa Mon Sep 17 00:00:00 2001 From: Hamza-Ayed Date: Fri, 17 Jul 2026 16:51:44 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20trip=5Fid=20=D8=B9=D9=85=D9=88=D8=AF=20u?= =?UTF-8?q?uid=20=E2=80=94=20=D8=A7=D8=B3=D8=AA=D8=AE=D8=AF=D8=A7=D9=85=20?= =?UTF-8?q?=D9=85=D8=B9=D8=B1=D9=91=D9=81=20=D8=B5=D8=A7=D9=84=D8=AD=20?= =?UTF-8?q?=D9=81=D9=8A=20=D8=A7=D8=AE=D8=AA=D8=A8=D8=A7=D8=B1=D8=A7=D8=AA?= =?UTF-8?q?=20=D8=A7=D9=84=D8=B1=D8=B5=D9=8A=D8=AF=20=D8=A7=D9=84=D8=AA?= =?UTF-8?q?=D8=B4=D8=BA=D9=8A=D9=84=D9=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit كسر بناء السيرفر. مرّرت 'trip-1' (نصّ عادي) كـ trip_id في driver-credit.service.spec.ts؛ العمود uuid فرفضه pg-mem تماماً كما سيرفضه Postgres الحقيقي في الإنتاج. الخطأ في الاختبار لا في الكود — chargeCommission في الإنتاج يستقبل دائماً trip.id وهو UUID فعلي. Co-Authored-By: Claude Opus 4.8 --- .../credit/driver-credit.service.spec.ts | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) 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); });