currency); self::assertSame(Payment::METHOD_ETRANSFER, $payment->method); self::assertSame(Payment::STATUS_PENDING, $payment->status); self::assertFalse($payment->isPaid()); self::assertNull($payment->id); } public function testConstants(): void { self::assertContains(Payment::METHOD_CARD, Payment::VALID_METHODS); self::assertContains(Payment::METHOD_ETRANSFER, Payment::VALID_METHODS); self::assertContains(Payment::METHOD_COMP, Payment::VALID_METHODS); self::assertContains(Payment::STATUS_PAID, Payment::VALID_STATUSES); } public function testFromRowMapsCorrectly(): void { $payment = Payment::fromRow((object) [ 'id' => '7', 'student_id' => '5', 'instructor_id' => '3', 'registration_type' => Payment::REG_ENROLLMENT, 'registration_id' => '12', 'amount' => '120.00', 'currency' => 'CAD', 'method' => Payment::METHOD_COMP, 'status' => Payment::STATUS_PAID, 'etransfer_email' => null, 'stripe_payment_intent_id' => null, 'receipt_number' => 'USC-7', 'receipt_sent_at' => null, 'paid_at' => '2026-06-08 10:00:00', ]); self::assertSame(7, $payment->id); self::assertSame(120.00, $payment->amount); self::assertSame(Payment::METHOD_COMP, $payment->method); self::assertTrue($payment->isPaid()); self::assertSame('USC-7', $payment->receiptNumber); } public function testToArrayContainsExpectedKeys(): void { $arr = (new Payment(5, 3, Payment::REG_LESSON, 12, 35.00, id: 7))->toArray(); foreach (['id', 'student_id', 'amount', 'currency', 'method', 'status', 'receipt_number'] as $key) { self::assertArrayHasKey($key, $arr); } } }