fix: trip_id عمود uuid — استخدام معرّف صالح في اختبارات الرصيد التشغيلي

كسر بناء السيرفر. مرّرت 'trip-1' (نصّ عادي) كـ trip_id في
driver-credit.service.spec.ts؛ العمود uuid فرفضه pg-mem تماماً كما سيرفضه
Postgres الحقيقي في الإنتاج. الخطأ في الاختبار لا في الكود — chargeCommission
في الإنتاج يستقبل دائماً trip.id وهو UUID فعلي.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Hamza-Ayed
2026-07-17 16:51:44 +03:00
co-authored by Claude Opus 4.8
parent d2a34f753c
commit 551aa897e1
@@ -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<string, any> = {}) {
@@ -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);
});