Compare commits
28 commits
master
...
feature/te
Author | SHA1 | Date | |
---|---|---|---|
6c248452df | |||
bbe14360d9 | |||
7769e25c75 | |||
56be2ebec7 | |||
8aa1b2f8c3 | |||
f8094c45f8 | |||
f55605bea0 | |||
b1bf3a42a1 | |||
c16e4652cb | |||
2ed04163b4 | |||
496cd46db7 | |||
dd3630237c | |||
5dbcc51309 | |||
4b1fdb8652 | |||
2aab5310d2 | |||
3df5aba320 | |||
85e04205cd | |||
40633fa567 | |||
8535ef9082 | |||
f6c932314b | |||
80af94a95e | |||
a22725ad6d | |||
49b90f6e6c | |||
919edfe664 | |||
518c98710e | |||
9937160ae0 | |||
d4eabf1937 | |||
fdc6c423ff |
|
@ -2,6 +2,5 @@
|
|||
KERNEL_CLASS='App\Kernel'
|
||||
APP_SECRET='$ecretf0rt3st'
|
||||
SYMFONY_DEPRECATIONS_HELPER=999999
|
||||
PANTHER_APP_ENV=panther
|
||||
PANTHER_APP_ENV=test
|
||||
PANTHER_ERROR_SCREENSHOT_DIR=./var/error-screenshots
|
||||
DATABASE_URL="sqlite:///%kernel.project_dir%/var/data_tests.db"
|
||||
|
|
3
.gitignore
vendored
3
.gitignore
vendored
|
@ -33,3 +33,6 @@ yarn-error.log
|
|||
/phpunit.xml
|
||||
.phpunit.result.cache
|
||||
###< phpunit/phpunit ###
|
||||
|
||||
# Tests
|
||||
/drivers/
|
||||
|
|
62
.woodpecker.yml
Normal file
62
.woodpecker.yml
Normal file
|
@ -0,0 +1,62 @@
|
|||
matrix:
|
||||
PHP_VERSION:
|
||||
# - 8.0
|
||||
- 8.1
|
||||
|
||||
services:
|
||||
db:
|
||||
image: mariadb:10.3
|
||||
environment:
|
||||
- MARIADB_ROOT_PASSWORD=root
|
||||
|
||||
pipeline:
|
||||
wait_db:
|
||||
image: gitnet.fr/deblan/timeout:latest
|
||||
commands:
|
||||
- /bin/timeout -t 30 -v -c 'while true; do nc -z -v db 3306 2>&1 | grep succeeded && exit 0; sleep 0.5; done'
|
||||
|
||||
create_db:
|
||||
image: mariadb:10.3
|
||||
commands:
|
||||
- mysql -hdb -uroot -proot -e "CREATE DATABASE app"
|
||||
- mysql -hdb -uroot -proot -e "CREATE DATABASE app_test"
|
||||
|
||||
config:
|
||||
image: deblan/php:8.1
|
||||
commands:
|
||||
- echo APP_ENV=prod >> .env.local
|
||||
- echo APP_SECRET=$(openssl rand -hex 32) >> .env.local
|
||||
- echo DATABASE_URL=mysql://root:root@db/app >> .env.local
|
||||
- echo DATABASE_URL=mysql://root:root@db/app_test >> .env.test.local
|
||||
|
||||
composer:
|
||||
image: deblan/php:${PHP_VERSION}
|
||||
commands:
|
||||
- apt-get update && apt-get -y install git
|
||||
- composer install --no-scripts
|
||||
|
||||
migrate:
|
||||
image: deblan/php:${PHP_VERSION}
|
||||
environment:
|
||||
- PHP=php
|
||||
commands:
|
||||
- ./bin/doctrine-migrate
|
||||
|
||||
node:
|
||||
image: node:16-slim
|
||||
commands:
|
||||
- yarn
|
||||
- test -d public/js || mkdir public/js
|
||||
- test -f public/js/fos_js_routes.json || echo "{}" > public/js/fos_js_routes.json
|
||||
- npm run build
|
||||
|
||||
tests:
|
||||
image: deblan/php:${PHP_VERSION}
|
||||
commands:
|
||||
- apt-get update && apt-get install -y unzip
|
||||
- composer install --no-scripts --dev
|
||||
- curl -o chromedriver_linux64.zip https://chromedriver.storage.googleapis.com/108.0.5359.71/chromedriver_linux64.zip && unzip -d drivers chromedriver_linux64.zip
|
||||
- curl -o /tmp/chrome.deb https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb && apt install -y /tmp/chrome.deb
|
||||
- vendor/bin/bdi detect drivers
|
||||
- symfony server:start --port=9080 --no-tls -d
|
||||
- php bin/phpunit
|
3
Makefile
3
Makefile
|
@ -24,3 +24,6 @@ doctrine-migration:
|
|||
PHP=$(PHP_BIN) ./bin/doctrine-migrate
|
||||
|
||||
build: clean js-routing asset
|
||||
|
||||
run-tests:
|
||||
$(PHP_BIN) bin/phpunit tests/
|
||||
|
|
|
@ -1,7 +1,9 @@
|
|||
#!/bin/sh
|
||||
|
||||
CLASS_NAME="$(echo "yes" | "$PHP" ./bin/console doctrine:migration:diff -e dev | grep -o "Version[0-9]*" | tail -n 1)"
|
||||
APP_ENV="${APP_ENV:-dev}"
|
||||
|
||||
CLASS_NAME="$(echo "yes" | "$PHP" ./bin/console doctrine:migration:diff -e "$APP_ENV" | grep -o "Version[0-9]*" | tail -n 1)"
|
||||
|
||||
if [ -n "$CLASS_NAME" ]; then
|
||||
echo "yes" | "$PHP" ./bin/console doctrine:migration:exec --up "DoctrineMigrations\\$CLASS_NAME" -e dev
|
||||
echo "yes" | "$PHP" ./bin/console doctrine:migration:exec --up "DoctrineMigrations\\$CLASS_NAME" -e "$APP_ENV"
|
||||
fi
|
||||
|
|
|
@ -7,13 +7,15 @@
|
|||
"prefer-stable": true,
|
||||
"require": {
|
||||
"php": ">=8.0.0",
|
||||
"murph/murph-core": "^1.17"
|
||||
"murph/murph-core": "dev-master"
|
||||
},
|
||||
"require-dev": {
|
||||
"dbrekelmans/bdi": "^1.0",
|
||||
"symfony/browser-kit": "^5.4",
|
||||
"symfony/css-selector": "^5.4",
|
||||
"symfony/debug-bundle": "^5.4",
|
||||
"symfony/maker-bundle": "^1.0",
|
||||
"symfony/panther": "^2.0",
|
||||
"symfony/phpunit-bridge": "^6.2",
|
||||
"symfony/stopwatch": "^5.4",
|
||||
"symfony/var-dumper": "^5.4",
|
||||
|
|
|
@ -29,11 +29,11 @@ doctrine:
|
|||
alias: GedmoTree # (optional) it will default to the name set for the mapping
|
||||
is_bundle: false
|
||||
|
||||
when@test:
|
||||
doctrine:
|
||||
dbal:
|
||||
# "TEST_TOKEN" is typically set by ParaTest
|
||||
dbname_suffix: '_test%env(default::TEST_TOKEN)%'
|
||||
# when@test:
|
||||
# doctrine:
|
||||
# dbal:
|
||||
# # "TEST_TOKEN" is typically set by ParaTest
|
||||
# dbname_suffix: '_test%env(default::TEST_TOKEN)%'
|
||||
|
||||
when@prod:
|
||||
doctrine:
|
||||
|
|
|
@ -13,13 +13,22 @@
|
|||
<ini name="error_reporting" value="-1" />
|
||||
<server name="APP_ENV" value="test" force="true" />
|
||||
<server name="SHELL_VERBOSITY" value="-1" />
|
||||
<server name="SYMFONY_DEPRECATIONS_HELPER" value="weak" />
|
||||
<server name="SYMFONY_PHPUNIT_REMOVE" value="" />
|
||||
<server name="SYMFONY_PHPUNIT_VERSION" value="9.5" />
|
||||
</php>
|
||||
|
||||
<testsuites>
|
||||
<testsuite name="Project Test Suite">
|
||||
<directory>tests</directory>
|
||||
<testsuite name="CLI">
|
||||
<file>tests/Core/Command/CreateUserTest.php</file>
|
||||
</testsuite>
|
||||
<testsuite name="Login">
|
||||
<file>tests/Core/Auth/LoginTest.php</file>
|
||||
</testsuite>
|
||||
<testsuite name="Site">
|
||||
<file>tests/Core/Site/NavigationTest.php</file>
|
||||
<file>tests/Core/Site/TreeTest.php</file>
|
||||
<file>tests/Core/Site/PageTest.php</file>
|
||||
</testsuite>
|
||||
</testsuites>
|
||||
|
||||
|
@ -33,10 +42,7 @@
|
|||
<listener class="Symfony\Bridge\PhpUnit\SymfonyTestsListener" />
|
||||
</listeners>
|
||||
|
||||
<!-- Run `composer require symfony/panther` before enabling this extension -->
|
||||
<!--
|
||||
<extensions>
|
||||
<extension class="Symfony\Component\Panther\ServerExtension" />
|
||||
</extensions>
|
||||
-->
|
||||
</phpunit>
|
||||
|
|
40
tests/Core/Auth/LoginTest.php
Normal file
40
tests/Core/Auth/LoginTest.php
Normal file
|
@ -0,0 +1,40 @@
|
|||
<?php
|
||||
|
||||
namespace App\Tests\Core\Auth;
|
||||
|
||||
use App\Repository\UserRepositoryQuery;
|
||||
use Symfony\Bundle\FrameworkBundle\KernelBrowser;
|
||||
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
* @coversNothing
|
||||
*/
|
||||
class LoginTest extends WebTestCase
|
||||
{
|
||||
protected UserRepositoryQuery $query;
|
||||
protected KernelBrowser $client;
|
||||
|
||||
protected function setUp(): void
|
||||
{
|
||||
$this->client = static::createClient();
|
||||
$this->query = self::$container->get(UserRepositoryQuery::class);
|
||||
}
|
||||
|
||||
public function testLoginRedirect(): void
|
||||
{
|
||||
$crawler = $this->client->request('GET', '/admin');
|
||||
|
||||
$this->assertResponseStatusCodeSame(302);
|
||||
$this->client->followRedirect();
|
||||
$this->assertResponseIsSuccessful();
|
||||
}
|
||||
|
||||
public function testLoginUser(): void
|
||||
{
|
||||
$user = $this->query->create()->andWhere('.email=\'admin@localhost\'')->findOne();
|
||||
$this->client->loginUser($user);
|
||||
$this->client->request('GET', '/admin/account/');
|
||||
$this->assertResponseStatusCodeSame(200);
|
||||
}
|
||||
}
|
68
tests/Core/Command/CreateUserTest.php
Normal file
68
tests/Core/Command/CreateUserTest.php
Normal file
|
@ -0,0 +1,68 @@
|
|||
<?php
|
||||
|
||||
namespace App\Tests\Core\Command;
|
||||
|
||||
use App\Repository\UserRepositoryQuery;
|
||||
use Symfony\Bundle\FrameworkBundle\Console\Application;
|
||||
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
|
||||
use Symfony\Component\Console\Tester\CommandTester;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
* @coversNothing
|
||||
*/
|
||||
class CreateUserTest extends KernelTestCase
|
||||
{
|
||||
protected UserRepositoryQuery $query;
|
||||
|
||||
protected function setUp(): void
|
||||
{
|
||||
self::bootKernel();
|
||||
|
||||
$this->query = self::$container->get(UserRepositoryQuery::class);
|
||||
}
|
||||
|
||||
public function testCommandExecute(): void
|
||||
{
|
||||
$kernel = static::createKernel();
|
||||
$application = new Application($kernel);
|
||||
$command = $application->find('murph:user:create');
|
||||
$commandTester = new CommandTester($command);
|
||||
|
||||
$commandTester->setInputs([
|
||||
'admin@localhost',
|
||||
'admin_password',
|
||||
'y',
|
||||
'n',
|
||||
]);
|
||||
$commandTester->execute(['command' => $command->getName()]);
|
||||
$output = $commandTester->getDisplay();
|
||||
$this->assertStringContainsString('User created!', $output);
|
||||
|
||||
$commandTester->setInputs([
|
||||
'writer@localhost',
|
||||
'writer_password',
|
||||
'n',
|
||||
'y',
|
||||
]);
|
||||
$commandTester->execute(['command' => $command->getName()]);
|
||||
$output = $commandTester->getDisplay();
|
||||
$this->assertStringContainsString('User created!', $output);
|
||||
}
|
||||
|
||||
public function testCreatedUsers(): void
|
||||
{
|
||||
$users = $this->query->create()->find();
|
||||
$this->assertEquals(2, count($users));
|
||||
|
||||
$this->assertEquals('admin@localhost', $users[0]->getEmail());
|
||||
$this->assertEquals('admin@localhost', $users[0]->getUsername());
|
||||
$this->assertEquals('writer@localhost', $users[1]->getEmail());
|
||||
$this->assertEquals('writer@localhost', $users[1]->getUsername());
|
||||
|
||||
$this->assertEquals(true, $users[0]->getIsAdmin());
|
||||
$this->assertEquals(false, $users[0]->getIsWriter());
|
||||
$this->assertEquals(false, $users[1]->getIsAdmin());
|
||||
$this->assertEquals(true, $users[1]->getIsWriter());
|
||||
}
|
||||
}
|
50
tests/Core/PantherTestCase.php
Normal file
50
tests/Core/PantherTestCase.php
Normal file
|
@ -0,0 +1,50 @@
|
|||
<?php
|
||||
|
||||
namespace App\Tests\Core;
|
||||
|
||||
use App\Repository\UserRepositoryQuery;
|
||||
use Symfony\Component\Panther\Client as PantherClient;
|
||||
use Symfony\Component\Panther\PantherTestCase as BasePantherTestCase;
|
||||
|
||||
abstract class PantherTestCase extends BasePantherTestCase
|
||||
{
|
||||
protected UserRepositoryQuery $query;
|
||||
protected PantherClient $client;
|
||||
|
||||
protected function container()
|
||||
{
|
||||
if (null === self::$container) {
|
||||
static::bootKernel();
|
||||
}
|
||||
|
||||
return self::$container;
|
||||
}
|
||||
|
||||
protected function setUp(): void
|
||||
{
|
||||
$this->client = static::createPantherClient([
|
||||
'external_base_uri' => 'http://localhost:9080'
|
||||
]);
|
||||
$this->query = $this->container()->get(UserRepositoryQuery::class);
|
||||
}
|
||||
|
||||
protected function authenticateAdmin(): void
|
||||
{
|
||||
$this->client->request('GET', '/login');
|
||||
$this->client->submitForm('Login', [
|
||||
'_username' => 'admin@localhost',
|
||||
'_password' => 'admin_password',
|
||||
]);
|
||||
$this->client->waitFor('.nav-item-label');
|
||||
}
|
||||
|
||||
protected function authenticateWriter(): void
|
||||
{
|
||||
$this->client->request('GET', '/login');
|
||||
$this->client->submitForm('Login', [
|
||||
'_username' => 'writer@localhost',
|
||||
'_password' => 'writer_password',
|
||||
]);
|
||||
$this->client->waitFor('.nav-item-label');
|
||||
}
|
||||
}
|
39
tests/Core/Site/NavigationTest.php
Normal file
39
tests/Core/Site/NavigationTest.php
Normal file
|
@ -0,0 +1,39 @@
|
|||
<?php
|
||||
|
||||
namespace App\Tests\Core\Site;
|
||||
|
||||
use App\Tests\Core\PantherTestCase;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
* @coversNothing
|
||||
*/
|
||||
class NavigationTest extends PantherTestCase
|
||||
{
|
||||
public function testCreateNavigation(): void
|
||||
{
|
||||
$this->authenticateAdmin();
|
||||
|
||||
$this->client->request('GET', '/admin/site/tree');
|
||||
$this->client->waitFor('.toast-body.text-text-warning');
|
||||
$this->assertSelectorTextContains('.toast-body.text-text-warning', 'You must add a navigation.');
|
||||
|
||||
$this->client->request('GET', '/admin/site/navigation');
|
||||
$this->assertSelectorTextContains('h1', 'Navigations');
|
||||
|
||||
$this->client->request('GET', '/admin/site/navigation/new');
|
||||
$this->assertSelectorTextContains('h1', 'New navigation');
|
||||
$this->client->submitForm('Save', [
|
||||
'navigation[label]' => 'Test navigation',
|
||||
'navigation[locale]' => 'en',
|
||||
'navigation[code]' => 'nav',
|
||||
'navigation[domain]' => 'localhost',
|
||||
]);
|
||||
|
||||
$this->client->waitFor('.toast-body.text-text-success');
|
||||
$this->assertSelectorTextContains('.toast-body.text-text-success', 'The data has been saved.');
|
||||
|
||||
$this->client->request('GET', '/admin/site/navigation');
|
||||
$this->assertSelectorTextContains('.table tbody tr td', 'Test navigation');
|
||||
}
|
||||
}
|
30
tests/Core/Site/PageTest.php
Normal file
30
tests/Core/Site/PageTest.php
Normal file
|
@ -0,0 +1,30 @@
|
|||
<?php
|
||||
|
||||
namespace App\Tests\Core\Site;
|
||||
|
||||
use App\Tests\Core\PantherTestCase;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
* @coversNothing
|
||||
*/
|
||||
class PageTest extends PantherTestCase
|
||||
{
|
||||
public function testCreatePage(): void
|
||||
{
|
||||
$this->client->request('GET', '/admin/site/tree');
|
||||
$this->client->executeScript("document.querySelector('#node-2 .float-right button[data-modal]').click()");
|
||||
|
||||
$this->client->waitFor('#form-node-edit');
|
||||
$this->client->executeScript("document.querySelector('#node-page-action .card-header label').click()");
|
||||
$this->client->executeScript("document.querySelector('a[href=\"#form-node-edit-routing\"]').click()");
|
||||
$this->client->executeScript("document.querySelector('#node_url').value='/foo'");
|
||||
$this->client->executeScript("document.querySelector('#node_code').value='/foo'");
|
||||
$this->client->executeScript("document.querySelector('.modal.show .modal-footer button[type=\"submit\"]').click()");
|
||||
|
||||
$this->client->waitFor('.toast-body.text-text-success');
|
||||
$this->assertSelectorTextContains('.toast-body.text-text-success', 'The data has been saved.');
|
||||
|
||||
$this->assertSelectorTextContains('#node-2 .float-right a', 'Page');
|
||||
}
|
||||
}
|
32
tests/Core/Site/TreeTest.php
Normal file
32
tests/Core/Site/TreeTest.php
Normal file
|
@ -0,0 +1,32 @@
|
|||
<?php
|
||||
|
||||
namespace App\Tests\Core\Site;
|
||||
|
||||
use App\Tests\Core\PantherTestCase;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
* @coversNothing
|
||||
*/
|
||||
class TreeTest extends PantherTestCase
|
||||
{
|
||||
public function testCreateTree(): void
|
||||
{
|
||||
$this->client->request('GET', '/admin/site/tree');
|
||||
$this->assertSelectorTextContains('button[data-toggle="modal"]', 'Add a menu');
|
||||
$this->client->executeScript("document.querySelector('button[data-toggle=\"modal\"]').click()");
|
||||
|
||||
$this->client->waitFor('#form-menu-new');
|
||||
$this->client->submitForm('Save', [
|
||||
'menu[label]' => 'Test menu',
|
||||
'menu[code]' => 'menu',
|
||||
]);
|
||||
|
||||
$this->client->waitFor('.toast-body.text-text-success');
|
||||
$this->assertSelectorTextContains('.toast-body.text-text-success', 'The data has been saved.');
|
||||
|
||||
$this->client->request('GET', '/admin/site/tree');
|
||||
$this->assertSelectorTextContains('.h4', 'Test menu');
|
||||
$this->assertSelectorTextContains('#node-2 .col-6', 'First element');
|
||||
}
|
||||
}
|
|
@ -13,3 +13,9 @@ if (file_exists(dirname(__DIR__).'/config/bootstrap.php')) {
|
|||
if ($_SERVER['APP_DEBUG']) {
|
||||
umask(0000);
|
||||
}
|
||||
|
||||
passthru(sprintf(
|
||||
'APP_ENV=test PHP=%s "%s/../bin/doctrine-migrate"',
|
||||
$_ENV['PHP_BIN'] ?? $_ENV['PHP'] ?? 'php',
|
||||
__DIR__
|
||||
));
|
||||
|
|
Loading…
Reference in a new issue