Skip to content

Commit 1478cf8

Browse files
committed
Test Symfony Constraints
1 parent 09921b3 commit 1478cf8

File tree

9 files changed

+1844
-754
lines changed

9 files changed

+1844
-754
lines changed

composer.lock

Lines changed: 1509 additions & 747 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

config/routes.php

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
declare(strict_types=1);
44

5+
use App\Controller\BrowserController;
56
use App\Controller\DashboardController;
7+
use App\Controller\DomCrawlerController;
68
use App\Controller\HomeController;
79
use App\Controller\RegistrationController;
810
use App\Controller\SecurityController;
@@ -28,4 +30,32 @@
2830
$routes->add('app_register', '/register')
2931
->controller(RegistrationController::class)
3032
->methods(['GET', 'POST']);
33+
34+
$routes->add('app_browser_request_attr', '/request_attr')
35+
->controller([BrowserController::class, 'requestWithAttribute'])
36+
->methods(['GET']);
37+
38+
$routes->add('app_browser_response_cookie', '/response_cookie')
39+
->controller([BrowserController::class, 'responseWithCookie'])
40+
->methods(['GET']);
41+
42+
$routes->add('app_browser_response_json', '/response_json')
43+
->controller([BrowserController::class, 'responseJsonFormat'])
44+
->methods(['GET']);
45+
46+
$routes->add('app_browser_unprocessable_entity', '/unprocessable_entity')
47+
->controller([BrowserController::class, 'unprocessableEntity'])
48+
->methods(['GET']);
49+
50+
$routes->add('app_browser_redirect_home', '/redirect_home')
51+
->controller([BrowserController::class, 'redirectToHome'])
52+
->methods(['GET']);
53+
54+
$routes->add('app_dom_crawler_test_page', '/test_page')
55+
->controller(DomCrawlerController::class)
56+
->methods(['GET']);
57+
58+
$routes->add('app_form_test', '/test_form')
59+
->controller(App\Controller\FormController::class)
60+
->methods(['GET', 'POST']);
3161
};
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{% extends 'layout.html.twig' %}
2+
3+
{% block body %}
4+
<h1>{{ title }}</h1>
5+
6+
<label for="exampleCheckbox">Example Checkbox</label>
7+
<input type="checkbox" id="exampleCheckbox" name="exampleCheckbox" {% if checked %}checked{% endif %}>
8+
9+
<label for="exampleInput">Example Input</label>
10+
<input type="text" id="exampleInput" name="exampleInput" value="{{ inputValue }}">
11+
12+
<p class="info">This is a test paragraph with some text.</p>
13+
14+
<form id="testForm" action="{{ path('app_form_test') }}" method="post">
15+
<div>
16+
<label for="username">Username</label>
17+
<input type="text" id="username" name="username" value="{{ usernameValue }}">
18+
</div>
19+
<button type="submit">Submit</button>
20+
</form>
21+
{% endblock %}

src/Controller/BrowserController.php

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Controller;
6+
7+
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
8+
use Symfony\Component\HttpFoundation\Cookie;
9+
use Symfony\Component\HttpFoundation\RedirectResponse;
10+
use Symfony\Component\HttpFoundation\Request;
11+
use Symfony\Component\HttpFoundation\Response;
12+
13+
final class BrowserController extends AbstractController
14+
{
15+
public function requestWithAttribute(Request $request): Response
16+
{
17+
$request->attributes->set('page', 'register');
18+
19+
return $this->render('blog/home.html.twig');
20+
}
21+
22+
public function responseWithCookie(): Response
23+
{
24+
$response = new Response('TESTCOOKIE has been set.');
25+
$response->headers->setCookie(new Cookie('TESTCOOKIE', 'codecept'));
26+
27+
return $response;
28+
}
29+
30+
public function responseJsonFormat(): Response
31+
{
32+
return $this->json([
33+
'status' => 'success',
34+
'message' => "Expected format: 'json'.",
35+
]);
36+
}
37+
38+
public function unprocessableEntity(): Response
39+
{
40+
return $this->json([
41+
'status' => 'error',
42+
'message' => 'The request was well-formed but could not be processed.',
43+
], Response::HTTP_UNPROCESSABLE_ENTITY);
44+
}
45+
46+
public function redirectToHome(): RedirectResponse
47+
{
48+
return $this->redirectToRoute('index');
49+
}
50+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Controller;
6+
7+
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
8+
use Symfony\Component\HttpFoundation\Response;
9+
10+
final class DomCrawlerController extends AbstractController
11+
{
12+
public function __invoke(): Response
13+
{
14+
return $this->render('dom_crawler/test_page.html.twig', [
15+
'page_title' => 'Test Page',
16+
'title' => 'Test Page',
17+
'checked' => true,
18+
'inputValue' => 'Expected Value',
19+
]);
20+
}
21+
}

src/Controller/FormController.php

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Controller;
6+
7+
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
8+
use Symfony\Component\HttpFoundation\Request;
9+
use Symfony\Component\HttpFoundation\Response;
10+
11+
final class FormController extends AbstractController
12+
{
13+
public function __invoke(Request $request): Response
14+
{
15+
$data = [
16+
'page_title' => 'Test Page',
17+
'checked' => false,
18+
'inputValue' => '',
19+
];
20+
if ($request->isMethod('POST')) {
21+
$data['usernameValue'] = $request->request->get('username', '');
22+
$data['title'] = 'Form Sent';
23+
} else {
24+
$data['usernameValue'] = 'codeceptUser';
25+
$data['title'] = 'Test Page';
26+
}
27+
28+
return $this->render('dom_crawler/test_page.html.twig', $data);
29+
}
30+
}

tests/Functional/BrowserCest.php

Lines changed: 111 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,115 @@
99

1010
final class BrowserCest
1111
{
12+
public function assertBrowserCookieValueSame(FunctionalTester $I)
13+
{
14+
$I->setCookie('TESTCOOKIE', 'codecept');
15+
$I->assertBrowserCookieValueSame('TESTCOOKIE', 'codecept');
16+
}
17+
18+
public function assertBrowserHasCookie(FunctionalTester $I)
19+
{
20+
$I->setCookie('TESTCOOKIE', 'codecept');
21+
$I->assertBrowserHasCookie('TESTCOOKIE');
22+
}
23+
24+
public function assertBrowserNotHasCookie(FunctionalTester $I)
25+
{
26+
$I->setCookie('TESTCOOKIE', 'codecept');
27+
$I->resetCookie('TESTCOOKIE');
28+
$I->assertBrowserNotHasCookie('TESTCOOKIE');
29+
}
30+
31+
public function assertRequestAttributeValueSame(FunctionalTester $I)
32+
{
33+
$I->amOnPage('/request_attr');
34+
$I->assertRequestAttributeValueSame('page', 'register');
35+
}
36+
37+
public function assertResponseCookieValueSame(FunctionalTester $I)
38+
{
39+
$I->amOnPage('/response_cookie');
40+
$I->assertResponseCookieValueSame('TESTCOOKIE', 'codecept');
41+
}
42+
43+
public function assertResponseFormatSame(FunctionalTester $I)
44+
{
45+
$I->amOnPage('/response_json');
46+
$I->assertResponseFormatSame('json');
47+
}
48+
49+
public function assertResponseHasCookie(FunctionalTester $I)
50+
{
51+
$I->amOnPage('/response_cookie');
52+
$I->assertResponseHasCookie('TESTCOOKIE');
53+
}
54+
55+
public function assertResponseHasHeader(FunctionalTester $I)
56+
{
57+
$I->amOnPage('/response_json');
58+
$I->assertResponseHasHeader('content-type');
59+
}
60+
61+
public function assertResponseHeaderNotSame(FunctionalTester $I)
62+
{
63+
$I->amOnPage('/response_json');
64+
$I->assertResponseHeaderNotSame('content-type', 'application/octet-stream');
65+
}
66+
67+
public function assertResponseHeaderSame(FunctionalTester $I)
68+
{
69+
$I->amOnPage('/response_json');
70+
$I->assertResponseHeaderSame('content-type', 'application/json');
71+
}
72+
73+
public function assertResponseIsSuccessful(FunctionalTester $I)
74+
{
75+
$I->amOnPage('/');
76+
$I->assertResponseIsSuccessful();
77+
}
78+
79+
public function assertResponseIsUnprocessable(FunctionalTester $I)
80+
{
81+
$I->amOnPage('/unprocessable_entity');
82+
$I->assertResponseIsUnprocessable();
83+
}
84+
85+
public function assertResponseNotHasCookie(FunctionalTester $I)
86+
{
87+
$I->amOnPage('/');
88+
$I->assertResponseNotHasCookie('TESTCOOKIE');
89+
}
90+
91+
public function assertResponseNotHasHeader(FunctionalTester $I)
92+
{
93+
$I->amOnPage('/');
94+
$I->assertResponseNotHasHeader('accept-charset');
95+
}
96+
97+
public function assertResponseRedirects(FunctionalTester $I)
98+
{
99+
$I->stopFollowingRedirects();
100+
$I->amOnPage('/redirect_home');
101+
$I->assertResponseRedirects();
102+
$I->assertResponseRedirects('/');
103+
}
104+
105+
public function assertResponseStatusCodeSame(FunctionalTester $I)
106+
{
107+
$I->stopFollowingRedirects();
108+
$I->amOnPage('/redirect_home');
109+
$I->assertResponseStatusCodeSame(302);
110+
}
111+
112+
public function assertRouteSame(FunctionalTester $I)
113+
{
114+
$I->amOnPage('/');
115+
$I->assertRouteSame('index');
116+
117+
$I->amOnPage('/login');
118+
$I->assertRouteSame('app_login');
119+
}
120+
12121
public function seePageIsAvailable(FunctionalTester $I)
13122
{
14123
// With url parameter
@@ -30,10 +139,10 @@ public function submitSymfonyForm(FunctionalTester $I)
30139
$I->submitSymfonyForm('registration_form', [
31140
'[email]' => 'jane_doe@gmail.com',
32141
'[password]' => '123456',
33-
'[agreeTerms]' => true
142+
'[agreeTerms]' => true,
34143
]);
35144
$I->seeInRepository(User::class, [
36-
'email' => 'jane_doe@gmail.com'
145+
'email' => 'jane_doe@gmail.com',
37146
]);
38147
}
39148
}

tests/Functional/DomCrawlerCest.php

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Tests\Functional;
6+
7+
use App\Tests\Support\FunctionalTester;
8+
9+
final class DomCrawlerCest
10+
{
11+
public function _before(FunctionalTester $I): void
12+
{
13+
$I->amOnPage('/test_page');
14+
}
15+
16+
public function assertCheckboxChecked(FunctionalTester $I): void
17+
{
18+
$I->assertCheckboxChecked('exampleCheckbox', 'The checkbox should be checked.');
19+
}
20+
21+
public function assertCheckboxNotChecked(FunctionalTester $I): void
22+
{
23+
$I->assertCheckboxNotChecked('nonExistentCheckbox', 'This checkbox should not be checked.');
24+
}
25+
26+
public function assertInputValueSame(FunctionalTester $I): void
27+
{
28+
$I->assertInputValueSame('exampleInput', 'Expected Value', 'The input value should be "Expected Value".');
29+
}
30+
31+
public function assertPageTitleContains(FunctionalTester $I): void
32+
{
33+
$I->assertPageTitleContains('Test', 'The page title should contain "Test".');
34+
}
35+
36+
public function assertPageTitleSame(FunctionalTester $I): void
37+
{
38+
$I->assertPageTitleSame('Test Page', 'The page title should be "Test Page".');
39+
}
40+
41+
public function assertSelectorExists(FunctionalTester $I): void
42+
{
43+
$I->assertSelectorExists('h1', 'The <h1> element should be present.');
44+
}
45+
46+
public function assertSelectorNotExists(FunctionalTester $I): void
47+
{
48+
$I->assertSelectorNotExists('.non-existent-class', 'This selector should not exist.');
49+
}
50+
51+
public function assertSelectorTextSame(FunctionalTester $I): void
52+
{
53+
$I->assertSelectorTextSame('h1', 'Test Page', 'The text in the <h1> tag should be exactly "Test Page".');
54+
}
55+
}

0 commit comments

Comments
 (0)