Skip to content

Commit 0e96b3c

Browse files
authored
Merge pull request #9102 from kenjis/test-controller-validateData
test: add tests for `validateData()` with custom error messages
2 parents 2b3b8ed + 72c92e0 commit 0e96b3c

File tree

2 files changed

+84
-21
lines changed

2 files changed

+84
-21
lines changed

phpstan-baseline.php

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12955,24 +12955,6 @@
1295512955
'count' => 1,
1295612956
'path' => __DIR__ . '/tests/system/ControllerTest.php',
1295712957
];
12958-
$ignoreErrors[] = [
12959-
// identifier: missingType.property
12960-
'message' => '#^Property class@anonymous/tests/system/ControllerTest\\.php\\:128\\:\\:\\$signup has no type specified\\.$#',
12961-
'count' => 1,
12962-
'path' => __DIR__ . '/tests/system/ControllerTest.php',
12963-
];
12964-
$ignoreErrors[] = [
12965-
// identifier: missingType.property
12966-
'message' => '#^Property class@anonymous/tests/system/ControllerTest\\.php\\:128\\:\\:\\$signup_errors has no type specified\\.$#',
12967-
'count' => 1,
12968-
'path' => __DIR__ . '/tests/system/ControllerTest.php',
12969-
];
12970-
$ignoreErrors[] = [
12971-
// identifier: missingType.property
12972-
'message' => '#^Property class@anonymous/tests/system/ControllerTest\\.php\\:151\\:\\:\\$signup has no type specified\\.$#',
12973-
'count' => 1,
12974-
'path' => __DIR__ . '/tests/system/ControllerTest.php',
12975-
];
1297612958
$ignoreErrors[] = [
1297712959
// identifier: argument.type
1297812960
'message' => '#^Parameter \\#1 \\$cookies of class CodeIgniter\\\\Cookie\\\\CookieStore constructor expects array\\<CodeIgniter\\\\Cookie\\\\Cookie\\>, array\\<int, DateTimeImmutable\\> given\\.$#',

tests/system/ControllerTest.php

Lines changed: 84 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,10 +126,17 @@ public function testValidateWithStringRulesNotFound(): void
126126
public function testValidateWithStringRulesFoundReadMessagesFromValidationConfig(): void
127127
{
128128
$validation = new class () extends ValidationConfig {
129-
public $signup = [
129+
/**
130+
* @var array<string, string>
131+
*/
132+
public array $signup = [
130133
'username' => 'required',
131134
];
132-
public $signup_errors = [
135+
136+
/**
137+
* @var array<string, array<string, string>>
138+
*/
139+
public array $signup_errors = [
133140
'username' => [
134141
'required' => 'You must choose a username.',
135142
],
@@ -149,7 +156,10 @@ public function testValidateWithStringRulesFoundReadMessagesFromValidationConfig
149156
public function testValidateWithStringRulesFoundUseMessagesParameter(): void
150157
{
151158
$validation = new class () extends ValidationConfig {
152-
public $signup = [
159+
/**
160+
* @var array<string, string>
161+
*/
162+
public array $signup = [
153163
'username' => 'required',
154164
];
155165
};
@@ -191,6 +201,77 @@ public function testValidateData(): void
191201
);
192202
}
193203

204+
public function testValidateDataWithCustomErrorMessage(): void
205+
{
206+
// make sure we can instantiate one
207+
$this->controller = new Controller();
208+
$this->controller->initController($this->request, $this->response, $this->logger);
209+
210+
$method = $this->getPrivateMethodInvoker($this->controller, 'validateData');
211+
212+
$data = [
213+
'username' => 'a',
214+
'password' => '123',
215+
];
216+
$rules = [
217+
'username' => 'required|min_length[3]',
218+
'password' => 'required|min_length[10]',
219+
];
220+
$errors = [
221+
'username' => [
222+
'required' => 'Please fill "{field}".',
223+
'min_length' => '"{field}" must be {param} letters or longer.',
224+
],
225+
];
226+
$this->assertFalse($method($data, $rules, $errors));
227+
$this->assertSame(
228+
'"username" must be 3 letters or longer.',
229+
Services::validation()->getError('username')
230+
);
231+
$this->assertSame(
232+
'The password field must be at least 10 characters in length.',
233+
Services::validation()->getError('password')
234+
);
235+
}
236+
237+
public function testValidateDataWithCustomErrorMessageLabeledStyle(): void
238+
{
239+
// make sure we can instantiate one
240+
$this->controller = new Controller();
241+
$this->controller->initController($this->request, $this->response, $this->logger);
242+
243+
$method = $this->getPrivateMethodInvoker($this->controller, 'validateData');
244+
245+
$data = [
246+
'username' => 'a',
247+
'password' => '123',
248+
];
249+
$rules = [
250+
'username' => [
251+
'label' => 'Username',
252+
'rules' => 'required|min_length[3]',
253+
'errors' => [
254+
'required' => 'Please fill "{field}".',
255+
'min_length' => '"{field}" must be {param} letters or longer.',
256+
],
257+
],
258+
'password' => [
259+
'required|min_length[10]',
260+
'label' => 'Password',
261+
'rules' => 'required|min_length[10]',
262+
],
263+
];
264+
$this->assertFalse($method($data, $rules));
265+
$this->assertSame(
266+
'"Username" must be 3 letters or longer.',
267+
Services::validation()->getError('username')
268+
);
269+
$this->assertSame(
270+
'The Password field must be at least 10 characters in length.',
271+
Services::validation()->getError('password')
272+
);
273+
}
274+
194275
public function testHelpers(): void
195276
{
196277
$this->controller = new class () extends Controller {

0 commit comments

Comments
 (0)