setSetting('shipping.international_shipping_enabled', true); $settings->setSetting('shipping.available_countries', [ ['code' => 'KR', 'name' => ['ko' => '대한민국'], 'is_active' => true], ['code' => 'US', 'name' => ['ko' => '미국'], 'is_active' => true], ['code' => 'JP', 'name' => ['ko' => '일본'], 'is_active' => false], ]); } private function url(string $uuid): string { return "/api/modules/sirsoft-ecommerce/admin/users/{$uuid}/shipping-country"; } public function test_admin_with_permission_can_change_user_shipping_country(): void { $this->createDefaultRoles(); $admin = $this->createAdminUser(['sirsoft-ecommerce.user-shipping-country.manage']); $target = User::factory()->create(); Sanctum::actingAs($admin); $response = $this->patchJson($this->url($target->uuid), ['shipping_country' => 'US']); $response->assertOk(); $this->assertSame( 'US', app(EcommerceUserProfileRepositoryInterface::class)->getPreferredShippingCountry($target->id) ); } public function test_inactive_country_rejected_422(): void { $this->createDefaultRoles(); $admin = $this->createAdminUser(['sirsoft-ecommerce.user-shipping-country.manage']); $target = User::factory()->create(); Sanctum::actingAs($admin); $response = $this->patchJson($this->url($target->uuid), ['shipping_country' => 'JP']); $response->assertStatus(422); } public function test_admin_without_permission_forbidden(): void { $this->createDefaultRoles(); $admin = $this->createAdminUser(); $target = User::factory()->create(); Sanctum::actingAs($admin); $response = $this->patchJson($this->url($target->uuid), ['shipping_country' => 'US']); $response->assertStatus(403); } public function test_shipping_country_change_fires_activity_log_hook(): void { $this->createDefaultRoles(); $admin = $this->createAdminUser(['sirsoft-ecommerce.user-shipping-country.manage']); $target = User::factory()->create(); Sanctum::actingAs($admin); $fired = false; HookManager::addAction( 'sirsoft-ecommerce.admin.user_shipping_country.changed', function () use (&$fired) { $fired = true; } ); $this->patchJson($this->url($target->uuid), ['shipping_country' => 'US'])->assertOk(); $this->assertTrue($fired, '배송국가 변경 활동 로그 훅이 발화하지 않았습니다.'); } }