Skip to content

Commit 74a1c1e

Browse files
committed
Test Symfony Constraints
1 parent 09921b3 commit 74a1c1e

File tree

7 files changed

+1785
-749
lines changed

7 files changed

+1785
-749
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: 26 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,28 @@
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']);
3157
};
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
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+
{% 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+
}

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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy