true]); $this->assertTrue($result['ok']); $this->assertSame('jibit_matched', $result['code']); } public function test_matched_false_explains_shahkar_mismatch(): void { $result = JibitIdentityService::interpretNationalMobileMatch(['matched' => false]); $this->assertFalse($result['ok']); $this->assertSame('jibit_mismatch', $result['code']); $this->assertStringContainsString('شاهکار', $result['message']); $this->assertStringContainsString('سیم‌کارت', $result['message']); } public function test_forbidden_mentions_token(): void { $result = JibitIdentityService::interpretNationalMobileMatch([ 'code' => 'forbidden', 'message' => 'no access', ]); $this->assertFalse($result['ok']); $this->assertSame('jibit_forbidden', $result['code']); $this->assertStringContainsString('توکن', $result['message']); } public function test_unknown_payload_includes_jibit_code_and_message(): void { $result = JibitIdentityService::interpretNationalMobileMatch([ 'code' => 'some.service.error', 'message' => 'provider down', 'http_status' => 503, ]); $this->assertFalse($result['ok']); $this->assertSame('jibit_some.service.error', $result['code']); $this->assertStringContainsString('some.service.error', $result['message']); $this->assertStringContainsString('provider down', $result['message']); $this->assertStringContainsString('503', $result['message']); } public function test_empty_response_is_not_generic_wait_for_admin(): void { $result = JibitIdentityService::interpretNationalMobileMatch(null); $this->assertFalse($result['ok']); $this->assertSame('jibit_no_response', $result['code']); $this->assertStringNotContainsString('منتظر بررسی', $result['message']); } public function test_national_code_checksum(): void { $this->assertNull(JibitIdentityService::nationalCodeError('0452262615')); $this->assertSame('کد ملی وارد نشده است.', JibitIdentityService::nationalCodeError('')); $this->assertSame('کد ملی باید ۱۰ رقم باشد.', JibitIdentityService::nationalCodeError('123')); $this->assertSame('کد ملی از نظر رقم کنترل نامعتبر است.', JibitIdentityService::nationalCodeError('0000000000')); } }