Files
Gnuboard7/modules/_bundled/sirsoft-ecommerce/tests/Unit/Requests/StoreBanksRequestTest.php
T
2026-07-01 10:30:32 +09:00

236 lines
7.6 KiB
PHP

<?php
namespace Modules\Sirsoft\Ecommerce\Tests\Unit\Requests;
use Illuminate\Support\Facades\Validator;
use Modules\Sirsoft\Ecommerce\Http\Requests\Admin\StoreBanksRequest;
use Tests\TestCase;
/**
* 은행 목록 저장 요청 검증 테스트
*
* - banks 배열 검증
* - banks.*.code 필수/문자열/최대길이
* - banks.*.name 필수/다국어 배열
* - 현재 로케일 은행명만 필수
* - 빈 배열 허용
*/
class StoreBanksRequestTest extends TestCase
{
/**
* 은행명 검증은 "현재 앱 로케일" 필드만 필수로 본다. 테스트 데이터가 ko/en 을 제공하므로
* 환경 로케일(예: ja)에 관계없이 결정적이도록 ko 로 고정한다.
*/
protected function setUp(): void
{
parent::setUp();
app()->setLocale('ko');
}
/**
* 검증 수행
*
* @param array $data 검증 대상 데이터
* @return \Illuminate\Validation\Validator
*/
protected function validate(array $data): \Illuminate\Validation\Validator
{
$request = new StoreBanksRequest();
return Validator::make($data, $request->rules());
}
// ──────────────────────────────────────────────
// banks 배열 검증
// ──────────────────────────────────────────────
public function test_banks_accepts_valid_data(): void
{
$validator = $this->validate([
'banks' => [
['code' => '004', 'name' => ['ko' => '국민은행', 'en' => 'Kookmin Bank']],
['code' => '088', 'name' => ['ko' => '신한은행', 'en' => 'Shinhan Bank']],
],
]);
$this->assertTrue(
$validator->passes(),
'유효한 은행 데이터를 허용해야 합니다. 오류: '.$validator->errors()->toJson()
);
}
public function test_banks_accepts_empty_array(): void
{
$validator = $this->validate([
'banks' => [],
]);
$this->assertTrue(
$validator->passes(),
'빈 배열을 허용해야 합니다'
);
}
public function test_banks_accepts_null(): void
{
$validator = $this->validate([
'banks' => null,
]);
$this->assertTrue(
$validator->passes(),
'null 값을 허용해야 합니다'
);
}
// ──────────────────────────────────────────────
// banks.*.code 검증
// ──────────────────────────────────────────────
public function test_bank_code_required_when_banks_present(): void
{
$validator = $this->validate([
'banks' => [
['name' => ['ko' => '국민은행', 'en' => 'Kookmin Bank']],
],
]);
$this->assertTrue(
$validator->errors()->has('banks.0.code'),
'은행코드는 필수 항목이어야 합니다'
);
}
public function test_bank_code_max_length(): void
{
$validator = $this->validate([
'banks' => [
['code' => 'VERY_LONG_CODE', 'name' => ['ko' => '테스트', 'en' => 'Test']],
],
]);
$this->assertTrue(
$validator->errors()->has('banks.0.code'),
'은행코드는 최대 10자까지 허용해야 합니다'
);
}
// ──────────────────────────────────────────────
// banks.*.name 검증
// ──────────────────────────────────────────────
public function test_bank_name_required_when_banks_present(): void
{
$validator = $this->validate([
'banks' => [
['code' => '004'],
],
]);
$this->assertTrue(
$validator->errors()->has('banks.0.name'),
'은행명은 필수 항목이어야 합니다'
);
}
public function test_bank_name_must_be_array(): void
{
$validator = $this->validate([
'banks' => [
['code' => '004', 'name' => '국민은행'],
],
]);
$this->assertTrue(
$validator->errors()->has('banks.0.name'),
'은행명은 다국어 배열 형식이어야 합니다'
);
}
public function test_bank_name_locale_max_length(): void
{
$validator = $this->validate([
'banks' => [
['code' => '004', 'name' => ['ko' => str_repeat('가', 101)]],
],
]);
$this->assertTrue(
$validator->errors()->has('banks.0.name.ko'),
'은행명 로케일 값은 최대 100자까지 허용해야 합니다'
);
}
// ──────────────────────────────────────────────
// 현재 로케일 기준 은행명 필수 검증
// ──────────────────────────────────────────────
public function test_bank_name_current_locale_only_is_valid(): void
{
// 기본 로케일(ko)만 입력해도 통과해야 함
app()->setLocale('ko');
$validator = $this->validate([
'banks' => [
['code' => '004', 'name' => ['ko' => '국민은행']],
],
]);
$this->assertTrue(
$validator->passes(),
'현재 로케일(ko)만 입력해도 유효해야 합니다. 오류: '.$validator->errors()->toJson()
);
}
public function test_bank_name_other_locale_null_is_valid(): void
{
// 현재 로케일(ko) 입력, 다른 로케일은 null (ConvertEmptyStringsToNull 시뮬레이션)
app()->setLocale('ko');
$validator = $this->validate([
'banks' => [
['code' => '004', 'name' => ['ko' => '국민은행', 'en' => null]],
],
]);
$this->assertTrue(
$validator->passes(),
'다른 로케일이 null이어도 유효해야 합니다. 오류: '.$validator->errors()->toJson()
);
}
public function test_bank_name_current_locale_missing_fails(): void
{
// 현재 로케일(ko)이 없고 다른 로케일만 있으면 실패해야 함
app()->setLocale('ko');
$validator = $this->validate([
'banks' => [
['code' => '004', 'name' => ['en' => 'Kookmin Bank']],
],
]);
$this->assertTrue(
$validator->errors()->has('banks.0.name.ko'),
'현재 로케일(ko) 은행명이 없으면 실패해야 합니다'
);
}
public function test_bank_name_en_locale_required_when_locale_is_en(): void
{
// 로케일이 en일 때는 영문 은행명이 필수
app()->setLocale('en');
$validator = $this->validate([
'banks' => [
['code' => '004', 'name' => ['ko' => '국민은행']],
],
]);
$this->assertTrue(
$validator->errors()->has('banks.0.name.en'),
'로케일이 en일 때 영문 은행명이 없으면 실패해야 합니다'
);
}
}