getAllPurposes(); foreach (['signup', 'password_reset', 'self_update', 'sensitive_action'] as $key) { $this->assertArrayHasKey($key, $purposes); $this->assertSame('core', $purposes[$key]['source_type'] ?? null, "코어 기본 purpose {$key} 는 source_type=core 여야 함"); $this->assertSame('core', $purposes[$key]['source_identifier'] ?? null, "코어 기본 purpose {$key} 는 source_identifier=core 여야 함"); } } public function test_registerDeclaredPurposes_marks_module_source(): void { $manager = new IdentityVerificationManager(); $manager->registerDeclaredPurposes([ 'checkout_verification' => [ 'label' => ['ko' => '결제 인증', 'en' => 'Checkout Verification'], 'allowed_channels' => ['email', 'sms', 'ipin'], ], ], 'module', 'sirsoft-ecommerce'); $purposes = $manager->getAllPurposes(); $this->assertArrayHasKey('checkout_verification', $purposes); $this->assertSame('module', $purposes['checkout_verification']['source_type'] ?? null); $this->assertSame('sirsoft-ecommerce', $purposes['checkout_verification']['source_identifier'] ?? null); } public function test_registerDeclaredPurposes_marks_plugin_source(): void { $manager = new IdentityVerificationManager(); $manager->registerDeclaredPurposes([ 'adult_verification' => [ 'label' => ['ko' => '성인 인증', 'en' => 'Adult Verification'], 'allowed_channels' => ['ipin'], ], ], 'plugin', 'sirsoft-adult-cert'); $purposes = $manager->getAllPurposes(); $this->assertArrayHasKey('adult_verification', $purposes); $this->assertSame('plugin', $purposes['adult_verification']['source_type'] ?? null); $this->assertSame('sirsoft-adult-cert', $purposes['adult_verification']['source_identifier'] ?? null); } public function test_registerPurpose_without_source_defaults_to_admin(): void { $manager = new IdentityVerificationManager(); $manager->registerPurpose('runtime_purpose', [ 'label' => 'Runtime', 'allowed_channels' => ['email'], ]); $purposes = $manager->getAllPurposes(); $this->assertSame('admin', $purposes['runtime_purpose']['source_type'] ?? null); $this->assertSame('admin', $purposes['runtime_purpose']['source_identifier'] ?? null); } public function test_module_can_override_core_purpose_and_source_changes(): void { $manager = new IdentityVerificationManager(); $manager->registerDeclaredPurposes([ 'signup' => ['label' => '커스텀 signup', 'allowed_channels' => ['sms']], ], 'module', 'sirsoft-ecommerce'); $purposes = $manager->getAllPurposes(); $this->assertSame('module', $purposes['signup']['source_type'] ?? null); $this->assertSame('sirsoft-ecommerce', $purposes['signup']['source_identifier'] ?? null); } }