Skip to content

Commit df359cd

Browse files
committed
Assertions for Form Validation
1 parent 2cd5dd3 commit df359cd

File tree

1 file changed

+62
-17
lines changed

1 file changed

+62
-17
lines changed

src/Traits/HttpTestAssertions.php

Lines changed: 62 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,55 +2,100 @@
22

33
namespace JMac\Testing\Traits;
44

5+
use Illuminate\Foundation\Testing\Assert as LaravelAssert;
56
use Illuminate\Support\Facades\Route;
6-
use PHPUnit\Framework\Assert;
7+
use PHPUnit\Framework\Assert as PHPUnitAssert;
8+
use Symfony\Component\HttpFoundation\Request as SymfonyRequest;
79

810
trait HttpTestAssertions
911
{
10-
public function assertRouteUsesFormRequest(string $routeName, string $formRequest) {
11-
$controllerAction = collect(Route::getRoutes())->filter(function (\Illuminate\Routing\Route $route) use ($routeName) {
12-
return $route->getName() == $routeName;
13-
})->pluck('action.controller');
12+
public function assertRouteUsesFormRequest(string $routeName, string $formRequest)
13+
{
14+
$controllerAction = collect(Route::getRoutes())->filter(function (\Illuminate\Routing\Route $route) use ($routeName) {
15+
return $route->getName() == $routeName;
16+
})->pluck('action.controller');
1417

15-
Assert::assertNotEmpty($controllerAction, 'Route "' . $routeName . '" is not defined.');
16-
Assert::assertCount(1, $controllerAction, 'Route "' . $routeName . '" is defined multiple times, route names should be unique.');
18+
PHPUnitAssert::assertNotEmpty($controllerAction, 'Route "' . $routeName . '" is not defined.');
19+
PHPUnitAssert::assertCount(1, $controllerAction, 'Route "' . $routeName . '" is defined multiple times, route names should be unique.');
1720

18-
[$controller, $method] = explode('@', $controllerAction->first());
21+
[$controller, $method] = explode('@', $controllerAction->first());
1922

20-
$this->assertActionUsesFormRequest($controller, $method, $formRequest);
21-
}
23+
$this->assertActionUsesFormRequest($controller, $method, $formRequest);
24+
}
2225

2326
public function assertActionUsesFormRequest(string $controller, string $method, string $form_request)
2427
{
25-
Assert::assertTrue(is_subclass_of($form_request, 'Illuminate\\Foundation\\Http\\FormRequest'), $form_request . ' is not a type of Form Request');
28+
PHPUnitAssert::assertTrue(is_subclass_of($form_request, 'Illuminate\\Foundation\\Http\\FormRequest'), $form_request . ' is not a type of Form Request');
2629

2730
try {
2831
$reflector = new \ReflectionClass($controller);
2932
$action = $reflector->getMethod($method);
3033
} catch (\ReflectionException $exception) {
31-
Assert::fail('Controller action could not be found: ' . $controller . '@' . $method);
34+
PHPUnitAssert::fail('Controller action could not be found: ' . $controller . '@' . $method);
3235
}
3336

34-
Assert::assertTrue($action->isPublic(), 'Action "' . $method . '" is not public, controller actions must be public.');
37+
PHPUnitAssert::assertTrue($action->isPublic(), 'Action "' . $method . '" is not public, controller actions must be public.');
3538

3639
$actual = collect($action->getParameters())->contains(function ($parameter) use ($form_request) {
3740
return $parameter->getType() instanceof \ReflectionNamedType && $parameter->getType()->getName() === $form_request;
3841
});
3942

40-
Assert::assertTrue($actual, 'Action "' . $method . '" does not have validation using the "' . $form_request . '" Form Request.');
43+
PHPUnitAssert::assertTrue($actual, 'Action "' . $method . '" does not have validation using the "' . $form_request . '" Form Request.');
4144
}
4245

4346
public function assertActionUsesMiddleware($controller, $method, $middleware)
4447
{
4548
$router = resolve(\Illuminate\Routing\Router::class);
4649
$route = $router->getRoutes()->getByAction($controller . '@' . $method);
4750

48-
Assert::assertNotNull($route, 'Unable to find route for controller action (' . $controller . '@' . $method . ')');
51+
PHPUnitAssert::assertNotNull($route, 'Unable to find route for controller action (' . $controller . '@' . $method . ')');
4952

5053
if (is_array($middleware)) {
51-
Assert::assertSame([], array_diff($middleware, $route->gatherMiddleware()), 'Controller action does not use middleware (' . implode(', ', $middleware) . ')');
54+
PHPUnitAssert::assertSame([], array_diff($middleware, $route->gatherMiddleware()), 'Controller action does not use middleware (' . implode(', ', $middleware) . ')');
5255
} else {
53-
Assert::assertTrue(in_array($middleware, $route->gatherMiddleware()), 'Controller action does not use middleware (' . $middleware . ')');
56+
PHPUnitAssert::assertTrue(in_array($middleware, $route->gatherMiddleware()), 'Controller action does not use middleware (' . $middleware . ')');
57+
}
58+
}
59+
60+
public function createFormRequest(string $form_request, array $data = [])
61+
{
62+
return $form_request::createFromBase(SymfonyRequest::create(null, 'POST', $data));
63+
}
64+
65+
public function assertValidationRules(array $expected, array $actual)
66+
{
67+
LaravelAssert::assertArraySubset($this->normalizeRules($expected), $this->normalizeRules($actual));
68+
}
69+
70+
public function assertExactValidationRules(array $expected, array $actual)
71+
{
72+
PHPUnitAssert::assertEquals($this->normalizeRules($expected), $this->normalizeRules($actual));
73+
}
74+
75+
public function assertValidationRuleContains($rule, string $class)
76+
{
77+
if (is_object($rule)) {
78+
PHPUnitAssert::assertInstanceOf($rule, $class);
79+
80+
return;
81+
}
82+
83+
$matches = array_filter($this->expandRules($rule), function ($rule) use ($class) {
84+
return $rule instanceof $class;
85+
});
86+
87+
if (empty($matches)) {
88+
PHPUnitAssert::fail('Failed asserting rule contains ' . $class);
5489
}
5590
}
91+
92+
private function normalizeRules(array $rules)
93+
{
94+
return array_map([$this, 'expandRules'], $rules);
95+
}
96+
97+
private function expandRules($rule)
98+
{
99+
return is_string($rule) ? explode('|', $rule) : $rule;
100+
}
56101
}

0 commit comments

Comments
 (0)