first commit
This commit is contained in:
35
tests/_bootstrap.php
Normal file
35
tests/_bootstrap.php
Normal file
@@ -0,0 +1,35 @@
|
||||
<?php
|
||||
namespace Grav;
|
||||
|
||||
use Codeception\Util\Fixtures;
|
||||
use Faker\Factory;
|
||||
use Grav\Common\Grav;
|
||||
|
||||
ini_set('error_log', __DIR__ . '/error.log');
|
||||
|
||||
$grav = function () {
|
||||
Grav::resetInstance();
|
||||
$grav = Grav::instance();
|
||||
$grav['config']->init();
|
||||
|
||||
// This must be set first before the other init
|
||||
$grav['config']->set('system.languages.supported', ['en', 'fr', 'vi']);
|
||||
$grav['config']->set('system.languages.default_lang', 'en');
|
||||
|
||||
foreach (array_keys($grav['setup']->getStreams()) as $stream) {
|
||||
@stream_wrapper_unregister($stream);
|
||||
}
|
||||
|
||||
$grav['streams'];
|
||||
|
||||
$grav['uri']->init();
|
||||
$grav['debugger']->init();
|
||||
$grav['assets']->init();
|
||||
|
||||
$grav['config']->set('system.cache.enabled', false);
|
||||
$grav['locator']->addPath('tests', '', 'tests', false);
|
||||
|
||||
return $grav;
|
||||
};
|
||||
|
||||
Fixtures::add('grav', $grav);
|
26
tests/_support/AcceptanceTester.php
Normal file
26
tests/_support/AcceptanceTester.php
Normal file
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
|
||||
/**
|
||||
* Inherited Methods
|
||||
* @method void wantToTest($text)
|
||||
* @method void wantTo($text)
|
||||
* @method void execute($callable)
|
||||
* @method void expectTo($prediction)
|
||||
* @method void expect($prediction)
|
||||
* @method void amGoingTo($argumentation)
|
||||
* @method void am($role)
|
||||
* @method void lookForwardTo($achieveValue)
|
||||
* @method void comment($description)
|
||||
* @method \Codeception\Lib\Friend haveFriend($name, $actorClass = NULL)
|
||||
*
|
||||
* @SuppressWarnings(PHPMD)
|
||||
*/
|
||||
class AcceptanceTester extends \Codeception\Actor
|
||||
{
|
||||
use _generated\AcceptanceTesterActions;
|
||||
|
||||
/**
|
||||
* Define custom actions here
|
||||
*/
|
||||
}
|
26
tests/_support/FunctionalTester.php
Normal file
26
tests/_support/FunctionalTester.php
Normal file
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
|
||||
/**
|
||||
* Inherited Methods
|
||||
* @method void wantToTest($text)
|
||||
* @method void wantTo($text)
|
||||
* @method void execute($callable)
|
||||
* @method void expectTo($prediction)
|
||||
* @method void expect($prediction)
|
||||
* @method void amGoingTo($argumentation)
|
||||
* @method void am($role)
|
||||
* @method void lookForwardTo($achieveValue)
|
||||
* @method void comment($description)
|
||||
* @method \Codeception\Lib\Friend haveFriend($name, $actorClass = NULL)
|
||||
*
|
||||
* @SuppressWarnings(PHPMD)
|
||||
*/
|
||||
class FunctionalTester extends \Codeception\Actor
|
||||
{
|
||||
use _generated\FunctionalTesterActions;
|
||||
|
||||
/**
|
||||
* Define custom actions here
|
||||
*/
|
||||
}
|
10
tests/_support/Helper/Acceptance.php
Normal file
10
tests/_support/Helper/Acceptance.php
Normal file
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
namespace Helper;
|
||||
|
||||
// here you can define custom actions
|
||||
// all public methods declared in helper class will be available in $I
|
||||
|
||||
class Acceptance extends \Codeception\Module
|
||||
{
|
||||
|
||||
}
|
10
tests/_support/Helper/Functional.php
Normal file
10
tests/_support/Helper/Functional.php
Normal file
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
namespace Helper;
|
||||
|
||||
// here you can define custom actions
|
||||
// all public methods declared in helper class will be available in $I
|
||||
|
||||
class Functional extends \Codeception\Module
|
||||
{
|
||||
|
||||
}
|
90
tests/_support/Helper/Unit.php
Normal file
90
tests/_support/Helper/Unit.php
Normal file
@@ -0,0 +1,90 @@
|
||||
<?php
|
||||
namespace Helper;
|
||||
|
||||
use Codeception;
|
||||
|
||||
// here you can define custom actions
|
||||
// all public methods declared in helper class will be available in $I
|
||||
|
||||
/**
|
||||
* Class Unit
|
||||
* @package Helper
|
||||
*/
|
||||
class Unit extends Codeception\Module
|
||||
{
|
||||
/**
|
||||
* HOOK: used after configuration is loaded
|
||||
*/
|
||||
public function _initialize()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* HOOK: on every Actor class initialization
|
||||
*/
|
||||
public function _cleanup()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* HOOK: before suite
|
||||
*
|
||||
* @param array $settings
|
||||
*/
|
||||
public function _beforeSuite($settings = [])
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* HOOK: after suite
|
||||
**/
|
||||
public function _afterSuite()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* HOOK: before each step
|
||||
*
|
||||
* @param Codeception\Step $step*
|
||||
*/
|
||||
public function _beforeStep(Codeception\Step $step)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* HOOK: after each step
|
||||
*
|
||||
* @param Codeception\Step $step
|
||||
*/
|
||||
public function _afterStep(Codeception\Step $step)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* HOOK: before each suite
|
||||
*
|
||||
* @param Codeception\TestCase $test
|
||||
*/
|
||||
public function _before(Codeception\TestCase $test)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* HOOK: before each suite
|
||||
*
|
||||
* @param Codeception\TestCase $test
|
||||
*/
|
||||
public function _after(Codeception\TestCase $test)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* HOOK: on fail
|
||||
*
|
||||
* @param Codeception\TestCase $test
|
||||
* @param $fail
|
||||
*/
|
||||
public function _failed(Codeception\TestCase $test, $fail)
|
||||
{
|
||||
}
|
||||
}
|
26
tests/_support/UnitTester.php
Normal file
26
tests/_support/UnitTester.php
Normal file
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
|
||||
/**
|
||||
* Inherited Methods
|
||||
* @method void wantToTest($text)
|
||||
* @method void wantTo($text)
|
||||
* @method void execute($callable)
|
||||
* @method void expectTo($prediction)
|
||||
* @method void expect($prediction)
|
||||
* @method void amGoingTo($argumentation)
|
||||
* @method void am($role)
|
||||
* @method void lookForwardTo($achieveValue)
|
||||
* @method void comment($description)
|
||||
* @method \Codeception\Lib\Friend haveFriend($name, $actorClass = NULL)
|
||||
*
|
||||
* @SuppressWarnings(PHPMD)
|
||||
*/
|
||||
class UnitTester extends \Codeception\Actor
|
||||
{
|
||||
use _generated\UnitTesterActions;
|
||||
|
||||
/**
|
||||
* Define custom actions here
|
||||
*/
|
||||
}
|
12
tests/acceptance.suite.yml
Normal file
12
tests/acceptance.suite.yml
Normal file
@@ -0,0 +1,12 @@
|
||||
# Codeception Test Suite Configuration
|
||||
#
|
||||
# Suite for acceptance tests.
|
||||
# Perform tests in browser using the WebDriver or PhpBrowser.
|
||||
# If you need both WebDriver and PHPBrowser tests - create a separate suite.
|
||||
|
||||
class_name: AcceptanceTester
|
||||
modules:
|
||||
enabled:
|
||||
- PhpBrowser:
|
||||
url: http://localhost:8080/grav
|
||||
- \Helper\Acceptance
|
2
tests/acceptance/_bootstrap.php
Normal file
2
tests/acceptance/_bootstrap.php
Normal file
@@ -0,0 +1,2 @@
|
||||
<?php
|
||||
// Here you can initialize variables that will be available to your tests
|
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: Item 1-1-1
|
||||
---
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: Item 1-1-2
|
||||
---
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: Item 1-1-3
|
||||
---
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: Item 1-1
|
||||
---
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: Item 1-2-1
|
||||
---
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: Item 1-2-2
|
||||
---
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: Item 1-2-3
|
||||
---
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: Item 1-2
|
||||
---
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: Item 1-3-1
|
||||
---
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: Item 1-3-2
|
||||
---
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: Item 1-3-3
|
||||
---
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: Item 1-3
|
||||
---
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
10
tests/fake/nested-site/user/pages/01.item1/default.md
Normal file
10
tests/fake/nested-site/user/pages/01.item1/default.md
Normal file
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: Item 1
|
||||
---
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
BIN
tests/fake/nested-site/user/pages/01.item1/existing-file.zip
Normal file
BIN
tests/fake/nested-site/user/pages/01.item1/existing-file.zip
Normal file
Binary file not shown.
BIN
tests/fake/nested-site/user/pages/01.item1/home-cache-image.jpg
Normal file
BIN
tests/fake/nested-site/user/pages/01.item1/home-cache-image.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 153 KiB |
BIN
tests/fake/nested-site/user/pages/01.item1/home-sample-image.jpg
Normal file
BIN
tests/fake/nested-site/user/pages/01.item1/home-sample-image.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 153 KiB |
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: Item 2-1-1
|
||||
---
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: Item 2-1-2
|
||||
---
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: Item 2-1-3
|
||||
---
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: Item 2-1
|
||||
---
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: Item 2-2-1
|
||||
---
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: Item 2-2-2
|
||||
---
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: Item 2-2-3
|
||||
---
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
Binary file not shown.
After Width: | Height: | Size: 153 KiB |
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: Item 2-2
|
||||
---
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
Binary file not shown.
Binary file not shown.
After Width: | Height: | Size: 153 KiB |
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: Item 2-3-1
|
||||
---
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: Item 2-3-2
|
||||
---
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: Item 2-3-3
|
||||
---
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: Item 2-3
|
||||
---
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
10
tests/fake/nested-site/user/pages/02.item2/default.md
Normal file
10
tests/fake/nested-site/user/pages/02.item2/default.md
Normal file
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: Item 2
|
||||
---
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
@@ -0,0 +1,14 @@
|
||||
---
|
||||
title: Animal
|
||||
taxonomy:
|
||||
tag: [animal, cat]
|
||||
---
|
||||
|
||||
<h1>Tags: animal</h1
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: Item 3-1-2
|
||||
---
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: Item 3-1-3
|
||||
---
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: Item 2-1
|
||||
---
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: Item 3-2-1
|
||||
---
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: Item 3-2-2
|
||||
---
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: Item 3-2-3
|
||||
---
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: Item 2-1
|
||||
---
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: Item 3-3-1
|
||||
---
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: Item 3-3-2
|
||||
---
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: Item 3-3-3
|
||||
---
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: Item 2
|
||||
---
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
10
tests/fake/nested-site/user/pages/03.item3/default.md
Normal file
10
tests/fake/nested-site/user/pages/03.item3/default.md
Normal file
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: Item 3
|
||||
---
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
10
tests/fake/simple-site/user/pages/01.home/default.md
Normal file
10
tests/fake/simple-site/user/pages/01.home/default.md
Normal file
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: Home
|
||||
---
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
10
tests/fake/simple-site/user/pages/02.blog/blog.md
Normal file
10
tests/fake/simple-site/user/pages/02.blog/blog.md
Normal file
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: Blog
|
||||
---
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
10
tests/fake/simple-site/user/pages/02.blog/post-one/item.md
Normal file
10
tests/fake/simple-site/user/pages/02.blog/post-one/item.md
Normal file
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: Post 1
|
||||
---
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
10
tests/fake/simple-site/user/pages/02.blog/post-two/item.md
Normal file
10
tests/fake/simple-site/user/pages/02.blog/post-two/item.md
Normal file
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: Post 2
|
||||
---
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
10
tests/fake/simple-site/user/pages/03.about/default.md
Normal file
10
tests/fake/simple-site/user/pages/03.about/default.md
Normal file
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: About
|
||||
---
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
@@ -0,0 +1,5 @@
|
||||
---
|
||||
title: Simple Page avec traduction
|
||||
---
|
||||
|
||||
Simple Page Content in English
|
@@ -0,0 +1,5 @@
|
||||
---
|
||||
title: Simple Page avec traduction
|
||||
---
|
||||
|
||||
Page Simple FR
|
@@ -0,0 +1,5 @@
|
||||
---
|
||||
title: Simple Page avec traduction
|
||||
---
|
||||
|
||||
Page Simple FR
|
5
tests/fake/single-pages/01.simple-page/default.md
Normal file
5
tests/fake/single-pages/01.simple-page/default.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
title: Simple Page
|
||||
---
|
||||
|
||||
Simple Page Content
|
11
tests/functional.suite.yml
Normal file
11
tests/functional.suite.yml
Normal file
@@ -0,0 +1,11 @@
|
||||
# Codeception Test Suite Configuration
|
||||
#
|
||||
# Suite for functional (integration) tests
|
||||
# Emulate web requests and make application process them
|
||||
# Include one of framework modules (Symfony2, Yii2, Laravel5) to use it
|
||||
|
||||
class_name: FunctionalTester
|
||||
modules:
|
||||
enabled:
|
||||
# add framework module here
|
||||
- \Helper\Functional
|
38
tests/functional/Grav/Console/DirectInstallCommandTest.php
Normal file
38
tests/functional/Grav/Console/DirectInstallCommandTest.php
Normal file
@@ -0,0 +1,38 @@
|
||||
<?php
|
||||
|
||||
use Codeception\Util\Fixtures;
|
||||
use Grav\Common\Grav;
|
||||
use Grav\Console\Gpm\DirectInstallCommand;
|
||||
|
||||
/**
|
||||
* Class DirectInstallCommandTest
|
||||
*/
|
||||
class DirectInstallCommandTest extends \Codeception\TestCase\Test
|
||||
{
|
||||
/** @var Grav $grav */
|
||||
protected $grav;
|
||||
|
||||
/** @var DirectInstallCommand */
|
||||
protected $directInstall;
|
||||
|
||||
|
||||
protected function _before(): void
|
||||
{
|
||||
$this->grav = Fixtures::get('grav');
|
||||
$this->directInstallCommand = new DirectInstallCommand();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Why this test file is empty
|
||||
*
|
||||
* Wasn't able to call a symfony\console. Kept having $output problem.
|
||||
* symfony console \NullOutput didn't cut it.
|
||||
*
|
||||
* We would also need to Mock tests since downloading packages would
|
||||
* make tests slow and unreliable. But it's not worth the time ATM.
|
||||
*
|
||||
* Look at Gpm/InstallCommandTest.php
|
||||
*
|
||||
* For the full story: https://git.io/vSlI3
|
||||
*/
|
2
tests/functional/_bootstrap.php
Normal file
2
tests/functional/_bootstrap.php
Normal file
@@ -0,0 +1,2 @@
|
||||
<?php
|
||||
// Here you can initialize variables that will be available to your tests
|
@@ -0,0 +1,51 @@
|
||||
<?php
|
||||
|
||||
namespace PHPStan\Toolbox;
|
||||
|
||||
use PhpParser\Node\Expr\MethodCall;
|
||||
use PHPStan\Analyser\Scope;
|
||||
use PHPStan\Reflection\MethodReflection;
|
||||
use PHPStan\Reflection\ParametersAcceptorSelector;
|
||||
use PHPStan\Type\DynamicMethodReturnTypeExtension;
|
||||
use PHPStan\Type\StringType;
|
||||
use PHPStan\Type\Type;
|
||||
use RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator;
|
||||
|
||||
/**
|
||||
* Extension to handle UniformResourceLocator return types.
|
||||
*/
|
||||
class UniformResourceLocatorExtension implements DynamicMethodReturnTypeExtension
|
||||
{
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getClass(): string
|
||||
{
|
||||
return UniformResourceLocator::class;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param MethodReflection $methodReflection
|
||||
* @return bool
|
||||
*/
|
||||
public function isMethodSupported(MethodReflection $methodReflection): bool
|
||||
{
|
||||
return $methodReflection->getName() === 'findResource';
|
||||
}
|
||||
|
||||
/**
|
||||
* @param MethodReflection $methodReflection
|
||||
* @param MethodCall $methodCall
|
||||
* @param Scope $scope
|
||||
* @return Type
|
||||
*/
|
||||
public function getTypeFromMethodCall(MethodReflection $methodReflection, MethodCall $methodCall, Scope $scope): Type
|
||||
{
|
||||
$first = $methodCall->getArgs()[2] ?? false;
|
||||
if ($first) {
|
||||
return new StringType();
|
||||
}
|
||||
|
||||
return ParametersAcceptorSelector::selectSingle($methodReflection->getVariants())->getReturnType();
|
||||
}
|
||||
}
|
5
tests/phpstan/extension.neon
Normal file
5
tests/phpstan/extension.neon
Normal file
@@ -0,0 +1,5 @@
|
||||
services:
|
||||
-
|
||||
class: PHPStan\Toolbox\UniformResourceLocatorExtension
|
||||
tags:
|
||||
- phpstan.broker.dynamicMethodReturnTypeExtension
|
7
tests/phpstan/phpstan-bootstrap.php
Normal file
7
tests/phpstan/phpstan-bootstrap.php
Normal file
@@ -0,0 +1,7 @@
|
||||
<?php declare(strict_types=1);
|
||||
/**
|
||||
*To help phpstan dealing with LogicException in Common\User\User.php
|
||||
*/
|
||||
|
||||
define('GRAV_USER_INSTANCE', 'FLEX');
|
||||
define('GRAV_REQUEST_TIME', microtime(true));
|
175
tests/phpstan/phpstan.neon
Normal file
175
tests/phpstan/phpstan.neon
Normal file
@@ -0,0 +1,175 @@
|
||||
#phpVersion: 70300
|
||||
includes:
|
||||
#- '../../vendor/phpstan/phpstan-strict-rules/rules.neon'
|
||||
- '../../vendor/phpstan/phpstan-deprecation-rules/rules.neon'
|
||||
- 'extension.neon'
|
||||
parameters:
|
||||
fileExtensions:
|
||||
- php
|
||||
- dist
|
||||
bootstrapFiles:
|
||||
- phpstan-bootstrap.php
|
||||
excludePaths:
|
||||
- */system/src/Grav/Common/Errors/Resources/layout.html.php
|
||||
- */system/src/Twig/DeferredExtension/DeferredNodeVisitorCompat.php # Twig 1
|
||||
- */system/src/Twig/DeferredExtension/DeferredNodeVisitor.php # Twig 2+3
|
||||
# Ignore vendor dev dependencies and tests
|
||||
- */vendor/*/*/tests
|
||||
- */vendor/behat
|
||||
- */vendor/codeception
|
||||
- */vendor/phpstan
|
||||
- */vendor/phpunit
|
||||
- */vendor/phpspec
|
||||
- */vendor/phpdocumentor
|
||||
- */vendor/sebastian
|
||||
- */vendor/theseer
|
||||
- */vendor/webmozart
|
||||
|
||||
inferPrivatePropertyTypeFromConstructor: true
|
||||
reportUnmatchedIgnoredErrors: false
|
||||
treatPhpDocTypesAsCertain: false
|
||||
|
||||
# These checks are new in phpstan 1, ignore them for now.
|
||||
checkMissingIterableValueType: false
|
||||
#checkGenericClassInNonGenericObjectType: false
|
||||
|
||||
universalObjectCratesClasses:
|
||||
- Grav\Common\Config\Config
|
||||
- Grav\Common\Config\Languages
|
||||
- Grav\Common\Config\Setup
|
||||
- Grav\Common\Data\Data
|
||||
- Grav\Common\GPM\Common\Package
|
||||
- Grav\Common\GPM\Local\Package
|
||||
- Grav\Common\GPM\Remote\Package
|
||||
- Grav\Common\Page\Header
|
||||
- Grav\Common\Session
|
||||
dynamicConstantNames:
|
||||
- GRAV_CLI
|
||||
ignoreErrors:
|
||||
# New in phpstan 1, ignore them for now.
|
||||
- '#Unsafe usage of new static\(\)#'
|
||||
|
||||
# TODO: Errors that needs some more thinking (bad design?)
|
||||
- '#Access to an undefined property RocketTheme\\Toolbox\\Event\\Event::#'
|
||||
- '#Instantiation of deprecated class RocketTheme\\Toolbox\\Event\\Event#'
|
||||
- '#extends deprecated class RocketTheme\\Toolbox\\Event\\Event#'
|
||||
- '#Access to an undefined property Grav\\Common\\Data\\Blueprint::#'
|
||||
-
|
||||
message: '#Cannot call method path\(\) on string#'
|
||||
path: '*/system/src/Grav/Common/Page/Media.php'
|
||||
|
||||
# TODO: system.twig.umask_fix will not work with Twig 2 anymore
|
||||
-
|
||||
message: '#Call to deprecated method writeCacheFile\(\) of class Twig\\Environment#'
|
||||
path: '*/system/src/Grav/Common/Twig/WriteCacheFileTrait.php'
|
||||
|
||||
# PSR-16 Exception interfaces do not extend \Throwable
|
||||
- '#PHPDoc tag \@throws with type Psr\\SimpleCache\\(CacheException|InvalidArgumentException) is not subtype of Throwable#'
|
||||
|
||||
# Medium __call() methods
|
||||
- '#Call to an undefined method Grav\\Common\\Page\\Medium\\(\w*)Medium::#'
|
||||
|
||||
# These errors are about plugins (need to find a better solution)
|
||||
-
|
||||
message: '#Call to static method sendEmail\(\) on an unknown class Grav\\Plugin\\Email\\Utils#'
|
||||
path: '*/system/src/Grav/Common/Scheduler/Job.php'
|
||||
-
|
||||
message: '#unknown class Grav\\Plugin\\Admin#'
|
||||
path: '*/system/src/Grav/Common/Page/Pages.php'
|
||||
-
|
||||
message: '#unknown class Grav\\Plugin\\Admin#'
|
||||
path: '*/system/src/Grav/Common/Flex/Pages/PageObject.php'
|
||||
-
|
||||
message: '#unknown class Grav\\Plugin\\Admin\\Admin#'
|
||||
path: '*/system/src/Grav/Common/Flex/Types/Pages/PageObject.php'
|
||||
-
|
||||
message: '#unknown class Grav\\Plugin\\Form\\Forms#'
|
||||
path: '*/system/src/Grav/Common/Processors/PagesProcessor.php'
|
||||
|
||||
# Clockwork does not define functions for __call() call
|
||||
-
|
||||
message: '#Call to an undefined method Clockwork\\Clockwork::(info|userData|addEvent|alert)\(\)#'
|
||||
path: '*/system/src/Grav/Common/Debugger.php'
|
||||
|
||||
# These errors can be ignored (they depend on installed extensions)
|
||||
-
|
||||
message: '#Instantiated class (Memcache|Memcached|Redis|RedisException) not found#'
|
||||
path: '*/system/src/Grav/Common/Cache.php'
|
||||
-
|
||||
message: '#unknown class (Memcache|Memcached|Redis|RedisException)#'
|
||||
path: '*/system/src/Grav/Common/Cache.php'
|
||||
-
|
||||
message: '#unknown class Collator#'
|
||||
path: '*/system/src/Grav/Common/Page/Pages.php'
|
||||
-
|
||||
message: '#unknown class Collator#'
|
||||
path: '*/system/src/Grav/Common/Flex/Types/Pages/PageCollection.php'
|
||||
-
|
||||
message: '#Ternary operator condition is always true#'
|
||||
path: '*/system/src/Grav/Framework/Cache/AbstractCache.php'
|
||||
-
|
||||
message: '#Call to function is_object\(\) with int will always evaluate to false#'
|
||||
path: '*/system/src/Grav/Framework/Cache/AbstractCache.php'
|
||||
|
||||
# XHprof
|
||||
- '#tideways_xhprof_enable#'
|
||||
|
||||
# Support for deprecated features
|
||||
-
|
||||
message: '#Instantiation of deprecated class Doctrine\\Common\\Cache\\(\w+)Cache#'
|
||||
path: '*/system/src/Grav/Common/Cache.php'
|
||||
-
|
||||
message: '#Instantiation of deprecated class Doctrine\\Common\\Cache\\(\w+)Cache#'
|
||||
path: '*/system/src/Grav/Common/GPM/Remote/*.php'
|
||||
-
|
||||
message: '#Call to deprecated method order#'
|
||||
path: '*/system/src/Grav/Common/Page/Pages.php'
|
||||
-
|
||||
message: '#Fetching class constant class of deprecated class Grav\\Common\\User\\User#'
|
||||
path: '*/system/src/Grav/Common/Service/AccountsServiceProvider.php'
|
||||
-
|
||||
message: '#Call to deprecated method getLegacyFiles\(\)#'
|
||||
path: '*/system/src/Grav/Common/Session.php'
|
||||
-
|
||||
message: '#Call to deprecated method \w+\(\) of class Grav\\Common\\Flex\\Types\\Users\\UserObject#'
|
||||
path: '*/system/src/Grav/Common/Flex/Types/Users/UserObject.php'
|
||||
-
|
||||
message: '#Call to deprecated method \w+\(\) of class Grav\\Framework\\Flex\\FlexObject#'
|
||||
path: '*/system/src/Grav/Framework/Flex/FlexObject.php'
|
||||
-
|
||||
message: '#Call to deprecated method \w+\(\) of class Grav\\Framework\\Flex\\FlexIndex#'
|
||||
path: '*/system/src/Grav/Framework/Flex/FlexIndex.php'
|
||||
-
|
||||
message: '#Call to deprecated method \w+\(\) of class Grav\\Framework\\Flex\\FlexCollection#'
|
||||
path: '*/system/src/Grav/Framework/Flex/FlexCollection.php'
|
||||
-
|
||||
message: '#Call to deprecated method (getAuthorizeScope|getActiveUser)\(\) of class Grav\\Framework\\Flex\\FlexObject#'
|
||||
path: '*/system/src/Grav/Framework/Flex/Pages/Traits/PageAuthorsTrait.php'
|
||||
-
|
||||
message: '#deprecated class#'
|
||||
path: '*/system/src/Grav/Framework/Uri/Uri.php'
|
||||
-
|
||||
message: '#Method Symfony\\Contracts\\EventDispatcher\\EventDispatcherInterface::dispatch#'
|
||||
path: '*/system/src/Grav/Common/Grav.php'
|
||||
|
||||
- '#has typehint with deprecated class RocketTheme\\Toolbox\\Event\\Event#'
|
||||
- '#Call to deprecated method stopPropagation\(\) of class Symfony\\Component\\EventDispatcher\\Event#'
|
||||
- '#Parameter \#2 \$listener of method Symfony\\Component\\EventDispatcher\\EventDispatcher::addListener\(\)#'
|
||||
- '#Parameter \#2 \$listener of method Symfony\\Component\\EventDispatcher\\EventDispatcher::removeListener\(\)#'
|
||||
- '#Class Grav\\Common\\GPM\\Response not found#'
|
||||
|
||||
# Installer updates
|
||||
-
|
||||
message: '#Variable \$this in PHPDoc tag @var does not exist#'
|
||||
path: '*/system/src/Grav/Installer/updates/*'
|
||||
-
|
||||
message: '#YamlUpdater::isInlineComment\(\) is unused#'
|
||||
path: '*/system/src/Grav/Installer/YamlUpdater.php'
|
||||
|
||||
# Twig Deferred extension compatibility
|
||||
-
|
||||
message: '#typehint with deprecated interface#'
|
||||
path: '*/system/src/Twig/DeferredExtension/DeferredNodeVisitorCompat.php'
|
||||
-
|
||||
message: '#Function twig_array_filter not found#'
|
||||
path: '*/system/src/Grav/Common/Twig/Extension/GravExtension.php'
|
64
tests/phpstan/plugins-bootstrap.php
Normal file
64
tests/phpstan/plugins-bootstrap.php
Normal file
@@ -0,0 +1,64 @@
|
||||
<?php
|
||||
|
||||
use Grav\Common\Grav;
|
||||
use Grav\Common\Plugin;
|
||||
use RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator;
|
||||
|
||||
\define('GRAV_CLI', true);
|
||||
\define('GRAV_REQUEST_TIME', microtime(true));
|
||||
\define('GRAV_USER_INSTANCE', 'FLEX');
|
||||
|
||||
$autoload = require __DIR__ . '/../../vendor/autoload.php';
|
||||
|
||||
if (!ini_get('date.timezone')) {
|
||||
date_default_timezone_set('UTC');
|
||||
}
|
||||
|
||||
if (!file_exists(GRAV_ROOT . '/index.php')) {
|
||||
exit('FATAL: Must be run from ROOT directory of Grav!');
|
||||
}
|
||||
|
||||
$grav = Grav::instance(['loader' => $autoload]);
|
||||
$grav->setup('tests');
|
||||
$grav['config']->init();
|
||||
|
||||
// Find all plugins in Grav installation and autoload their classes.
|
||||
|
||||
/** @var UniformResourceLocator $locator */
|
||||
$locator = Grav::instance()['locator'];
|
||||
$iterator = $locator->getIterator('plugins://');
|
||||
/** @var DirectoryIterator $directory */
|
||||
foreach ($iterator as $directory) {
|
||||
if (!$directory->isDir()) {
|
||||
continue;
|
||||
}
|
||||
$plugin = $directory->getBasename();
|
||||
$file = $directory->getPathname() . '/' . $plugin . '.php';
|
||||
$classloader = null;
|
||||
if (file_exists($file)) {
|
||||
require_once $file;
|
||||
|
||||
$pluginClass = "\\Grav\\Plugin\\{$plugin}Plugin";
|
||||
|
||||
if (is_subclass_of($pluginClass, Plugin::class, true)) {
|
||||
$class = new $pluginClass($plugin, $grav);
|
||||
if (is_callable([$class, 'autoload'])) {
|
||||
$classloader = $class->autoload();
|
||||
}
|
||||
}
|
||||
}
|
||||
if (null === $classloader) {
|
||||
$autoloader = $directory->getPathname() . '/vendor/autoload.php';
|
||||
if (file_exists($autoloader)) {
|
||||
require $autoloader;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
define('GANTRY_DEBUGGER', true);
|
||||
define('GANTRY5_DEBUG', true);
|
||||
define('GANTRY5_PLATFORM', 'grav');
|
||||
define('GANTRY5_ROOT', GRAV_ROOT);
|
||||
define('GANTRY5_VERSION', '@version@');
|
||||
define('GANTRY5_VERSION_DATE', '@versiondate@');
|
||||
define('GANTRYADMIN_PATH', '');
|
70
tests/phpstan/plugins.neon
Normal file
70
tests/phpstan/plugins.neon
Normal file
@@ -0,0 +1,70 @@
|
||||
includes:
|
||||
#- '../../vendor/phpstan/phpstan-strict-rules/rules.neon'
|
||||
- '../../vendor/phpstan/phpstan-deprecation-rules/rules.neon'
|
||||
- 'extension.neon'
|
||||
parameters:
|
||||
fileExtensions:
|
||||
- php
|
||||
excludePaths:
|
||||
- %currentWorkingDirectory%/user/plugins/*/vendor/*
|
||||
- %currentWorkingDirectory%/user/plugins/*/tests/*
|
||||
- %currentWorkingDirectory%/user/plugins/gantry5/src/platforms
|
||||
- %currentWorkingDirectory%/user/plugins/gantry5/src/classes/Gantry/Framework/Services/ErrorServiceProvider.php
|
||||
# Ignore vendor dev dependencies and tests
|
||||
- */vendor/*/*/tests
|
||||
- */vendor/behat
|
||||
- */vendor/codeception
|
||||
- */vendor/phpstan
|
||||
- */vendor/phpunit
|
||||
- */vendor/phpspec
|
||||
- */vendor/phpdocumentor
|
||||
- */vendor/sebastian
|
||||
- */vendor/theseer
|
||||
- */vendor/webmozart
|
||||
bootstrapFiles:
|
||||
- plugins-bootstrap.php
|
||||
inferPrivatePropertyTypeFromConstructor: true
|
||||
reportUnmatchedIgnoredErrors: false
|
||||
|
||||
# These checks are new in phpstan 1, ignore them for now.
|
||||
checkMissingIterableValueType: false
|
||||
checkGenericClassInNonGenericObjectType: false
|
||||
|
||||
universalObjectCratesClasses:
|
||||
- Grav\Common\Config\Config
|
||||
- Grav\Common\Config\Languages
|
||||
- Grav\Common\Config\Setup
|
||||
- Grav\Common\Data\Data
|
||||
- Grav\Common\GPM\Common\Package
|
||||
- Grav\Common\GPM\Local\Package
|
||||
- Grav\Common\GPM\Remote\Package
|
||||
- Grav\Common\Page\Header
|
||||
- Grav\Common\Session
|
||||
- Gantry\Component\Config\Config
|
||||
dynamicConstantNames:
|
||||
- GRAV_CLI
|
||||
- GANTRY_DEBUGGER
|
||||
- GANTRY5_DEBUG
|
||||
- GANTRY5_VERSION
|
||||
- GANTRY5_VERSION_DATE
|
||||
- GANTRY5_PLATFORM
|
||||
- GANTRY5_ROOT
|
||||
ignoreErrors:
|
||||
# New in phpstan 1, ignore them for now.
|
||||
- '#Unsafe usage of new static\(\)#'
|
||||
- '#Cannot instantiate interface Grav\\Framework\\#'
|
||||
|
||||
# PSR-16 Exception interfaces do not extend \Throwable
|
||||
- '#PHPDoc tag \@throws with type (.*|)?Psr\\SimpleCache\\(CacheException|InvalidArgumentException)(|.*)? is not subtype of Throwable#'
|
||||
|
||||
- '#Access to an undefined property RocketTheme\\Toolbox\\Event\\Event::#'
|
||||
- '#Instantiation of deprecated class RocketTheme\\Toolbox\\Event\\Event#'
|
||||
- '#extends deprecated class RocketTheme\\Toolbox\\Event\\Event#'
|
||||
- '#implements deprecated interface RocketTheme\\Toolbox\\Event\\EventSubscriberInterface#'
|
||||
- '#Call to method __construct\(\) of deprecated class RocketTheme\\Toolbox\\Event\\Event#'
|
||||
- '#Call to deprecated method (stopPropagation|isPropagationStopped)\(\) of class Symfony\\Component\\EventDispatcher\\Event#'
|
||||
- '#Call to an undefined method Grav\\Plugin\\ApartmentData\\Application\\Application::#'
|
||||
- '#Parameter \#1 \$lineNumberStyle of method ScssPhp\\ScssPhp\\Compiler::setLineNumberStyle\(\) expects string, int given#'
|
||||
|
||||
# Deprecated event class
|
||||
- '#has typehint with deprecated class RocketTheme\\Toolbox\\Event\\Event#'
|
9
tests/unit.suite.yml
Normal file
9
tests/unit.suite.yml
Normal file
@@ -0,0 +1,9 @@
|
||||
# Codeception Test Suite Configuration
|
||||
#
|
||||
# Suite for unit (internal) tests.
|
||||
|
||||
class_name: UnitTester
|
||||
modules:
|
||||
enabled:
|
||||
- Asserts
|
||||
- \Helper\Unit
|
847
tests/unit/Grav/Common/AssetsTest.php
Normal file
847
tests/unit/Grav/Common/AssetsTest.php
Normal file
@@ -0,0 +1,847 @@
|
||||
<?php
|
||||
|
||||
use Codeception\Util\Fixtures;
|
||||
use Grav\Common\Grav;
|
||||
use Grav\Common\Assets;
|
||||
|
||||
/**
|
||||
* Class AssetsTest
|
||||
*/
|
||||
class AssetsTest extends \Codeception\TestCase\Test
|
||||
{
|
||||
/** @var Grav $grav */
|
||||
protected $grav;
|
||||
|
||||
/** @var Assets $assets */
|
||||
protected $assets;
|
||||
|
||||
protected function _before(): void
|
||||
{
|
||||
$grav = Fixtures::get('grav');
|
||||
$this->grav = $grav();
|
||||
$this->assets = $this->grav['assets'];
|
||||
}
|
||||
|
||||
protected function _after(): void
|
||||
{
|
||||
}
|
||||
|
||||
public function testAddingAssets(): void
|
||||
{
|
||||
//test add()
|
||||
$this->assets->add('test.css');
|
||||
|
||||
$css = $this->assets->css();
|
||||
self::assertSame('<link href="/test.css" type="text/css" rel="stylesheet">' . PHP_EOL, $css);
|
||||
|
||||
$array = $this->assets->getCss();
|
||||
|
||||
/** @var Assets\BaseAsset $item */
|
||||
$item = reset($array);
|
||||
$actual = json_encode($item);
|
||||
$expected = '
|
||||
{
|
||||
"type":"css",
|
||||
"elements":{
|
||||
"asset":"\/test.css",
|
||||
"asset_type":"css",
|
||||
"order":0,
|
||||
"group":"head",
|
||||
"position":"pipeline",
|
||||
"priority":10,
|
||||
"attributes":{
|
||||
"type":"text\/css",
|
||||
"rel":"stylesheet"
|
||||
},
|
||||
"modified":false,
|
||||
"query":""
|
||||
}
|
||||
}';
|
||||
self::assertJsonStringEqualsJsonString($expected, $actual);
|
||||
|
||||
$this->assets->add('test.js');
|
||||
$js = $this->assets->js();
|
||||
self::assertSame('<script src="/test.js"></script>' . PHP_EOL, $js);
|
||||
|
||||
$array = $this->assets->getJs();
|
||||
|
||||
/** @var Assets\BaseAsset $item */
|
||||
$item = reset($array);
|
||||
$actual = json_encode($item);
|
||||
$expected = '
|
||||
{
|
||||
"type":"js",
|
||||
"elements":{
|
||||
"asset":"\/test.js",
|
||||
"asset_type":"js",
|
||||
"order":0,
|
||||
"group":"head",
|
||||
"position":"pipeline",
|
||||
"priority":10,
|
||||
"attributes":[
|
||||
|
||||
],
|
||||
"modified":false,
|
||||
"query":""
|
||||
}
|
||||
}';
|
||||
self::assertJsonStringEqualsJsonString($expected, $actual);
|
||||
|
||||
//test addCss(). Test adding asset to a separate group
|
||||
$this->assets->reset();
|
||||
$this->assets->addCSS('test.css');
|
||||
$css = $this->assets->css();
|
||||
self::assertSame('<link href="/test.css" type="text/css" rel="stylesheet">' . PHP_EOL, $css);
|
||||
|
||||
$array = $this->assets->getCss();
|
||||
/** @var Assets\BaseAsset $item */
|
||||
$item = reset($array);
|
||||
$actual = json_encode($item);
|
||||
$expected = '
|
||||
{
|
||||
"type":"css",
|
||||
"elements":{
|
||||
"asset":"\/test.css",
|
||||
"asset_type":"css",
|
||||
"order":0,
|
||||
"group":"head",
|
||||
"position":"pipeline",
|
||||
"priority":10,
|
||||
"attributes":{
|
||||
"type":"text\/css",
|
||||
"rel":"stylesheet"
|
||||
},
|
||||
"modified":false,
|
||||
"query":""
|
||||
}
|
||||
}';
|
||||
self::assertJsonStringEqualsJsonString($expected, $actual);
|
||||
|
||||
//test addCss(). Testing with remote URL
|
||||
$this->assets->reset();
|
||||
$this->assets->addCSS('http://www.somesite.com/test.css');
|
||||
$css = $this->assets->css();
|
||||
self::assertSame('<link href="http://www.somesite.com/test.css" type="text/css" rel="stylesheet">' . PHP_EOL, $css);
|
||||
|
||||
$array = $this->assets->getCss();
|
||||
/** @var Assets\BaseAsset $item */
|
||||
$item = reset($array);
|
||||
$actual = json_encode($item);
|
||||
$expected = '
|
||||
{
|
||||
"type":"css",
|
||||
"elements":{
|
||||
"asset":"http:\/\/www.somesite.com\/test.css",
|
||||
"asset_type":"css",
|
||||
"order":0,
|
||||
"group":"head",
|
||||
"position":"pipeline",
|
||||
"priority":10,
|
||||
"attributes":{
|
||||
"type":"text\/css",
|
||||
"rel":"stylesheet"
|
||||
},
|
||||
"query":""
|
||||
}
|
||||
}';
|
||||
self::assertJsonStringEqualsJsonString($expected, $actual);
|
||||
|
||||
//test addCss() adding asset to a separate group, and with an alternate rel attribute
|
||||
$this->assets->reset();
|
||||
$this->assets->addCSS('test.css', ['group' => 'alternate', 'rel' => 'alternate']);
|
||||
$css = $this->assets->css('alternate');
|
||||
self::assertSame('<link href="/test.css" type="text/css" rel="alternate">' . PHP_EOL, $css);
|
||||
|
||||
//test addJs()
|
||||
$this->assets->reset();
|
||||
$this->assets->addJs('test.js');
|
||||
$js = $this->assets->js();
|
||||
self::assertSame('<script src="/test.js"></script>' . PHP_EOL, $js);
|
||||
|
||||
$array = $this->assets->getJs();
|
||||
/** @var Assets\BaseAsset $item */
|
||||
$item = reset($array);
|
||||
$actual = json_encode($item);
|
||||
$expected = '
|
||||
{
|
||||
"type":"js",
|
||||
"elements":{
|
||||
"asset":"\/test.js",
|
||||
"asset_type":"js",
|
||||
"order":0,
|
||||
"group":"head",
|
||||
"position":"pipeline",
|
||||
"priority":10,
|
||||
"attributes":[],
|
||||
"modified":false,
|
||||
"query":""
|
||||
}
|
||||
}';
|
||||
self::assertJsonStringEqualsJsonString($expected, $actual);
|
||||
|
||||
//Test CSS Groups
|
||||
$this->assets->reset();
|
||||
$this->assets->addCSS('test.css', ['group' => 'footer']);
|
||||
$css = $this->assets->css();
|
||||
self::assertEmpty($css);
|
||||
$css = $this->assets->css('footer');
|
||||
self::assertSame('<link href="/test.css" type="text/css" rel="stylesheet">' . PHP_EOL, $css);
|
||||
|
||||
$array = $this->assets->getCss();
|
||||
/** @var Assets\BaseAsset $item */
|
||||
$item = reset($array);
|
||||
$actual = json_encode($item);
|
||||
$expected = '
|
||||
{
|
||||
"type": "css",
|
||||
"elements": {
|
||||
"asset": "/test.css",
|
||||
"asset_type": "css",
|
||||
"order": 0,
|
||||
"group": "footer",
|
||||
"position": "pipeline",
|
||||
"priority": 10,
|
||||
"attributes": {
|
||||
"type": "text/css",
|
||||
"rel": "stylesheet"
|
||||
},
|
||||
"modified": false,
|
||||
"query": ""
|
||||
}
|
||||
}
|
||||
';
|
||||
self::assertJsonStringEqualsJsonString($expected, $actual);
|
||||
|
||||
//Test JS Groups
|
||||
$this->assets->reset();
|
||||
$this->assets->addJs('test.js', ['group' => 'footer']);
|
||||
$js = $this->assets->js();
|
||||
self::assertEmpty($js);
|
||||
$js = $this->assets->js('footer');
|
||||
self::assertSame('<script src="/test.js"></script>' . PHP_EOL, $js);
|
||||
|
||||
$array = $this->assets->getJs();
|
||||
/** @var Assets\BaseAsset $item */
|
||||
$item = reset($array);
|
||||
$actual = json_encode($item);
|
||||
$expected = '
|
||||
{
|
||||
"type": "js",
|
||||
"elements": {
|
||||
"asset": "/test.js",
|
||||
"asset_type": "js",
|
||||
"order": 0,
|
||||
"group": "footer",
|
||||
"position": "pipeline",
|
||||
"priority": 10,
|
||||
"attributes": [],
|
||||
"modified": false,
|
||||
"query": ""
|
||||
}
|
||||
}';
|
||||
self::assertJsonStringEqualsJsonString($expected, $actual);
|
||||
|
||||
//Test async / defer
|
||||
$this->assets->reset();
|
||||
$this->assets->addJs('test.js', ['loading' => 'async']);
|
||||
$js = $this->assets->js();
|
||||
self::assertSame('<script src="/test.js" async></script>' . PHP_EOL, $js);
|
||||
|
||||
$array = $this->assets->getJs();
|
||||
/** @var Assets\BaseAsset $item */
|
||||
$item = reset($array);
|
||||
$actual = json_encode($item);
|
||||
$expected = '
|
||||
{
|
||||
"type": "js",
|
||||
"elements": {
|
||||
"asset": "/test.js",
|
||||
"asset_type": "js",
|
||||
"order": 0,
|
||||
"group": "head",
|
||||
"position": "pipeline",
|
||||
"priority": 10,
|
||||
"attributes": {
|
||||
"loading": "async"
|
||||
},
|
||||
"modified": false,
|
||||
"query": ""
|
||||
}
|
||||
}';
|
||||
self::assertJsonStringEqualsJsonString($expected, $actual);
|
||||
|
||||
$this->assets->reset();
|
||||
$this->assets->addJs('test.js', ['loading' => 'defer']);
|
||||
$js = $this->assets->js();
|
||||
self::assertSame('<script src="/test.js" defer></script>' . PHP_EOL, $js);
|
||||
|
||||
$array = $this->assets->getJs();
|
||||
/** @var Assets\BaseAsset $item */
|
||||
$item = reset($array);
|
||||
$actual = json_encode($item);
|
||||
$expected = '
|
||||
{
|
||||
"type": "js",
|
||||
"elements": {
|
||||
"asset": "/test.js",
|
||||
"asset_type": "js",
|
||||
"order": 0,
|
||||
"group": "head",
|
||||
"position": "pipeline",
|
||||
"priority": 10,
|
||||
"attributes": {
|
||||
"loading": "defer"
|
||||
},
|
||||
"modified": false,
|
||||
"query": ""
|
||||
}
|
||||
}';
|
||||
self::assertJsonStringEqualsJsonString($expected, $actual);
|
||||
|
||||
//Test inline
|
||||
$this->assets->reset();
|
||||
$this->assets->setJsPipeline(true);
|
||||
$this->assets->addJs('/system/assets/jquery/jquery-3.x.min.js');
|
||||
$js = $this->assets->js('head', ['loading' => 'inline']);
|
||||
self::assertStringContainsString('"jquery",[],function()', $js);
|
||||
|
||||
$this->assets->reset();
|
||||
$this->assets->setCssPipeline(true);
|
||||
$this->assets->addCss('/system/assets/debugger/phpdebugbar.css');
|
||||
$css = $this->assets->css('head', ['loading' => 'inline']);
|
||||
self::assertStringContainsString('div.phpdebugbar', $css);
|
||||
|
||||
$this->assets->reset();
|
||||
$this->assets->setCssPipeline(true);
|
||||
$this->assets->addCss('https://fonts.googleapis.com/css?family=Roboto');
|
||||
$css = $this->assets->css('head', ['loading' => 'inline']);
|
||||
self::assertStringContainsString('font-family:\'Roboto\';', $css);
|
||||
|
||||
//Test adding media queries
|
||||
$this->assets->reset();
|
||||
$this->assets->add('test.css', ['media' => 'only screen and (min-width: 640px)']);
|
||||
$css = $this->assets->css();
|
||||
self::assertSame('<link href="/test.css" type="text/css" rel="stylesheet" media="only screen and (min-width: 640px)">' . PHP_EOL, $css);
|
||||
}
|
||||
|
||||
public function testAddingAssetPropertiesWithArray(): void
|
||||
{
|
||||
//Test adding assets with object to define properties
|
||||
$this->assets->reset();
|
||||
$this->assets->addJs('test.js', ['loading' => 'async']);
|
||||
$js = $this->assets->js();
|
||||
self::assertSame('<script src="/test.js" async></script>' . PHP_EOL, $js);
|
||||
$this->assets->reset();
|
||||
}
|
||||
|
||||
public function testAddingJSAssetPropertiesWithArrayFromCollection(): void
|
||||
{
|
||||
//Test adding properties with array
|
||||
$this->assets->reset();
|
||||
$this->assets->addJs('jquery', ['loading' => 'async']);
|
||||
$js = $this->assets->js();
|
||||
self::assertSame('<script src="/system/assets/jquery/jquery-3.x.min.js" async></script>' . PHP_EOL, $js);
|
||||
|
||||
//Test priority too
|
||||
$this->assets->reset();
|
||||
$this->assets->addJs('jquery', ['loading' => 'async', 'priority' => 1]);
|
||||
$this->assets->addJs('test.js', ['loading' => 'async', 'priority' => 2]);
|
||||
$js = $this->assets->js();
|
||||
self::assertSame('<script src="/test.js" async></script>' . PHP_EOL .
|
||||
'<script src="/system/assets/jquery/jquery-3.x.min.js" async></script>' . PHP_EOL, $js);
|
||||
|
||||
//Test multiple groups
|
||||
$this->assets->reset();
|
||||
$this->assets->addJs('jquery', ['loading' => 'async', 'priority' => 1, 'group' => 'footer']);
|
||||
$this->assets->addJs('test.js', ['loading' => 'async', 'priority' => 2]);
|
||||
$js = $this->assets->js();
|
||||
self::assertSame('<script src="/test.js" async></script>' . PHP_EOL, $js);
|
||||
$js = $this->assets->js('footer');
|
||||
self::assertSame('<script src="/system/assets/jquery/jquery-3.x.min.js" async></script>' . PHP_EOL, $js);
|
||||
|
||||
//Test adding array of assets
|
||||
//Test priority too
|
||||
$this->assets->reset();
|
||||
$this->assets->addJs(['jquery', 'test.js'], ['loading' => 'async']);
|
||||
$js = $this->assets->js();
|
||||
|
||||
self::assertSame('<script src="/system/assets/jquery/jquery-3.x.min.js" async></script>' . PHP_EOL .
|
||||
'<script src="/test.js" async></script>' . PHP_EOL, $js);
|
||||
}
|
||||
|
||||
public function testAddingLegacyFormat(): void
|
||||
{
|
||||
// regular CSS add
|
||||
//test addCss(). Test adding asset to a separate group
|
||||
$this->assets->reset();
|
||||
$this->assets->addCSS('test.css', 15, true, 'bottom', 'async');
|
||||
$css = $this->assets->css('bottom');
|
||||
self::assertSame('<link href="/test.css" type="text/css" rel="stylesheet" async>' . PHP_EOL, $css);
|
||||
|
||||
$array = $this->assets->getCss();
|
||||
/** @var Assets\BaseAsset $item */
|
||||
$item = reset($array);
|
||||
$actual = json_encode($item);
|
||||
$expected = '
|
||||
{
|
||||
"type":"css",
|
||||
"elements":{
|
||||
"asset":"\/test.css",
|
||||
"asset_type":"css",
|
||||
"order":0,
|
||||
"group":"bottom",
|
||||
"position":"pipeline",
|
||||
"priority":15,
|
||||
"attributes":{
|
||||
"type":"text\/css",
|
||||
"rel":"stylesheet",
|
||||
"loading":"async"
|
||||
},
|
||||
"modified":false,
|
||||
"query":""
|
||||
}
|
||||
}';
|
||||
self::assertJsonStringEqualsJsonString($expected, $actual);
|
||||
|
||||
$this->assets->reset();
|
||||
$this->assets->addJs('test.js', 15, false, 'defer', 'bottom');
|
||||
$js = $this->assets->js('bottom');
|
||||
self::assertSame('<script src="/test.js" defer></script>' . PHP_EOL, $js);
|
||||
|
||||
$array = $this->assets->getJs();
|
||||
/** @var Assets\BaseAsset $item */
|
||||
$item = reset($array);
|
||||
$actual = json_encode($item);
|
||||
$expected = '
|
||||
{
|
||||
"type": "js",
|
||||
"elements": {
|
||||
"asset": "/test.js",
|
||||
"asset_type": "js",
|
||||
"order": 0,
|
||||
"group": "bottom",
|
||||
"position": "after",
|
||||
"priority": 15,
|
||||
"attributes": {
|
||||
"loading": "defer"
|
||||
},
|
||||
"modified": false,
|
||||
"query": ""
|
||||
}
|
||||
}';
|
||||
self::assertJsonStringEqualsJsonString($expected, $actual);
|
||||
|
||||
|
||||
$this->assets->reset();
|
||||
$this->assets->addInlineCss('body { color: black }', 15, 'bottom');
|
||||
$css = $this->assets->css('bottom');
|
||||
self::assertSame('<style>' . PHP_EOL . 'body { color: black }' . PHP_EOL . '</style>' . PHP_EOL, $css);
|
||||
|
||||
$this->assets->reset();
|
||||
$this->assets->addInlineJs('alert("test")', 15, 'bottom', ['id' => 'foo']);
|
||||
$js = $this->assets->js('bottom');
|
||||
self::assertSame('<script id="foo">' . PHP_EOL . 'alert("test")' . PHP_EOL . '</script>' . PHP_EOL, $js);
|
||||
}
|
||||
|
||||
public function testAddingCSSAssetPropertiesWithArrayFromCollection(): void
|
||||
{
|
||||
$this->assets->registerCollection('test', ['/system/assets/whoops.css']);
|
||||
|
||||
//Test priority too
|
||||
$this->assets->reset();
|
||||
$this->assets->addCss('test', ['priority' => 1]);
|
||||
$this->assets->addCss('test.css', ['priority' => 2]);
|
||||
$css = $this->assets->css();
|
||||
self::assertSame('<link href="/test.css" type="text/css" rel="stylesheet">' . PHP_EOL .
|
||||
'<link href="/system/assets/whoops.css" type="text/css" rel="stylesheet">' . PHP_EOL, $css);
|
||||
|
||||
//Test multiple groups
|
||||
$this->assets->reset();
|
||||
$this->assets->addCss('test', ['priority' => 1, 'group' => 'footer']);
|
||||
$this->assets->addCss('test.css', ['priority' => 2]);
|
||||
$css = $this->assets->css();
|
||||
self::assertSame('<link href="/test.css" type="text/css" rel="stylesheet">' . PHP_EOL, $css);
|
||||
$css = $this->assets->css('footer');
|
||||
self::assertSame('<link href="/system/assets/whoops.css" type="text/css" rel="stylesheet">' . PHP_EOL, $css);
|
||||
|
||||
//Test adding array of assets
|
||||
//Test priority too
|
||||
$this->assets->reset();
|
||||
$this->assets->addCss(['test', 'test.css'], ['loading' => 'async']);
|
||||
$css = $this->assets->css();
|
||||
self::assertSame('<link href="/system/assets/whoops.css" type="text/css" rel="stylesheet" async>' . PHP_EOL .
|
||||
'<link href="/test.css" type="text/css" rel="stylesheet" async>' . PHP_EOL, $css);
|
||||
}
|
||||
|
||||
public function testAddingAssetPropertiesWithArrayFromCollectionAndParameters(): void
|
||||
{
|
||||
$this->assets->registerCollection('collection_multi_params', [
|
||||
'foo.js' => [ 'defer' => true ],
|
||||
'bar.js' => [ 'integrity' => 'sha512-abc123' ],
|
||||
'foobar.css' => [ 'defer' => null, 'loading' => null ]
|
||||
]);
|
||||
|
||||
// # Test adding properties with array
|
||||
$this->assets->addJs('collection_multi_params', ['loading' => 'async']);
|
||||
$js = $this->assets->js();
|
||||
|
||||
// expected output
|
||||
$expected = [
|
||||
'<script src="/foo.js" async defer="1"></script>',
|
||||
'<script src="/bar.js" async integrity="sha512-abc123"></script>',
|
||||
'<script src="/foobar.css"></script>',
|
||||
];
|
||||
|
||||
self::assertCount(count($expected), array_filter(explode("\n", $js)));
|
||||
self::assertSame(implode("\n", $expected) . PHP_EOL, $js);
|
||||
|
||||
// # Test priority as second argument + render JS should not have any css
|
||||
$this->assets->reset();
|
||||
$this->assets->add('low_priority.js', 1);
|
||||
$this->assets->add('collection_multi_params', 2);
|
||||
$js = $this->assets->js();
|
||||
|
||||
// expected output
|
||||
$expected = [
|
||||
'<script src="/foo.js" defer="1"></script>',
|
||||
'<script src="/bar.js" integrity="sha512-abc123"></script>',
|
||||
'<script src="/low_priority.js"></script>',
|
||||
];
|
||||
|
||||
self::assertCount(3, array_filter(explode("\n", $js)));
|
||||
self::assertSame(implode("\n", $expected) . PHP_EOL, $js);
|
||||
|
||||
// # Test rendering CSS, should not have any JS
|
||||
$this->assets->reset();
|
||||
$this->assets->add('collection_multi_params', [ 'class' => '__classname' ]);
|
||||
$css = $this->assets->css();
|
||||
|
||||
// expected output
|
||||
$expected = [
|
||||
'<link href="/foobar.css" type="text/css" rel="stylesheet" class="__classname">',
|
||||
];
|
||||
|
||||
|
||||
self::assertCount(1, array_filter(explode("\n", $css)));
|
||||
self::assertSame(implode("\n", $expected) . PHP_EOL, $css);
|
||||
}
|
||||
|
||||
public function testPriorityOfAssets(): void
|
||||
{
|
||||
$this->assets->reset();
|
||||
$this->assets->add('test.css');
|
||||
$this->assets->add('test-after.css');
|
||||
|
||||
$css = $this->assets->css();
|
||||
self::assertSame('<link href="/test.css" type="text/css" rel="stylesheet">' . PHP_EOL .
|
||||
'<link href="/test-after.css" type="text/css" rel="stylesheet">' . PHP_EOL, $css);
|
||||
|
||||
//----------------
|
||||
$this->assets->reset();
|
||||
$this->assets->add('test-after.css', 1);
|
||||
$this->assets->add('test.css', 2);
|
||||
|
||||
$css = $this->assets->css();
|
||||
self::assertSame('<link href="/test.css" type="text/css" rel="stylesheet">' . PHP_EOL .
|
||||
'<link href="/test-after.css" type="text/css" rel="stylesheet">' . PHP_EOL, $css);
|
||||
|
||||
//----------------
|
||||
$this->assets->reset();
|
||||
$this->assets->add('test-after.css', 1);
|
||||
$this->assets->add('test.css', 2);
|
||||
$this->assets->add('test-before.css', 3);
|
||||
|
||||
$css = $this->assets->css();
|
||||
self::assertSame('<link href="/test-before.css" type="text/css" rel="stylesheet">' . PHP_EOL .
|
||||
'<link href="/test.css" type="text/css" rel="stylesheet">' . PHP_EOL .
|
||||
'<link href="/test-after.css" type="text/css" rel="stylesheet">' . PHP_EOL, $css);
|
||||
}
|
||||
|
||||
public function testPipeline(): void
|
||||
{
|
||||
$this->assets->reset();
|
||||
|
||||
//File not existing. Pipeline searches for that file without reaching it. Output is empty.
|
||||
$this->assets->add('test.css', null, true);
|
||||
$this->assets->setCssPipeline(true);
|
||||
$css = $this->assets->css();
|
||||
self::assertRegExp('#<link href=\"\/assets\/(.*).css\" type=\"text\/css\" rel=\"stylesheet\">#', $css);
|
||||
|
||||
//Add a core Grav CSS file, which is found. Pipeline will now return a file
|
||||
$this->assets->add('/system/assets/debugger/phpdebugbar', null, true);
|
||||
$css = $this->assets->css();
|
||||
self::assertRegExp('#<link href=\"\/assets\/(.*).css\" type=\"text\/css\" rel=\"stylesheet\">#', $css);
|
||||
}
|
||||
|
||||
public function testPipelineWithTimestamp(): void
|
||||
{
|
||||
$this->assets->reset();
|
||||
$this->assets->setTimestamp('foo');
|
||||
$this->assets->setCssPipeline(true);
|
||||
|
||||
//Add a core Grav CSS file, which is found. Pipeline will now return a file
|
||||
$this->assets->add('/system/assets/debugger.css', null, true);
|
||||
$css = $this->assets->css();
|
||||
self::assertRegExp('#<link href=\"\/assets\/(.*).css\?foo\" type=\"text\/css\" rel=\"stylesheet\">#', $css);
|
||||
}
|
||||
|
||||
public function testInline(): void
|
||||
{
|
||||
$this->assets->reset();
|
||||
|
||||
//File not existing. Pipeline searches for that file without reaching it. Output is empty.
|
||||
$this->assets->add('test.css', ['loading' => 'inline']);
|
||||
$css = $this->assets->css();
|
||||
self::assertSame("<style>\n\n</style>\n", $css);
|
||||
|
||||
$this->assets->reset();
|
||||
//Add a core Grav CSS file, which is found. Pipeline will now return its content.
|
||||
$this->assets->addCss('https://fonts.googleapis.com/css?family=Roboto', ['loading' => 'inline']);
|
||||
$this->assets->addCss('/system/assets/debugger/phpdebugbar.css', ['loading' => 'inline']);
|
||||
$css = $this->assets->css();
|
||||
self::assertStringContainsString('font-family: \'Roboto\';', $css);
|
||||
self::assertStringContainsString('div.phpdebugbar-header', $css);
|
||||
}
|
||||
|
||||
public function testInlinePipeline(): void
|
||||
{
|
||||
$this->assets->reset();
|
||||
$this->assets->setCssPipeline(true);
|
||||
|
||||
//File not existing. Pipeline searches for that file without reaching it. Output is empty.
|
||||
$this->assets->add('test.css');
|
||||
$css = $this->assets->css('head', ['loading' => 'inline']);
|
||||
self::assertSame("<style>\n\n</style>\n", $css);
|
||||
|
||||
//Add a core Grav CSS file, which is found. Pipeline will now return its content.
|
||||
$this->assets->addCss('https://fonts.googleapis.com/css?family=Roboto', null, true);
|
||||
$this->assets->add('/system/assets/debugger/phpdebugbar.css', null, true);
|
||||
$css = $this->assets->css('head', ['loading' => 'inline']);
|
||||
self::assertStringContainsString('font-family:\'Roboto\';', $css);
|
||||
self::assertStringContainsString('div.phpdebugbar', $css);
|
||||
}
|
||||
|
||||
public function testAddAsyncJs(): void
|
||||
{
|
||||
$this->assets->reset();
|
||||
$this->assets->addAsyncJs('jquery');
|
||||
$js = $this->assets->js();
|
||||
self::assertSame('<script src="/system/assets/jquery/jquery-3.x.min.js" async></script>' . PHP_EOL, $js);
|
||||
}
|
||||
|
||||
public function testAddDeferJs(): void
|
||||
{
|
||||
$this->assets->reset();
|
||||
$this->assets->addDeferJs('jquery');
|
||||
$js = $this->assets->js();
|
||||
self::assertSame('<script src="/system/assets/jquery/jquery-3.x.min.js" defer></script>' . PHP_EOL, $js);
|
||||
}
|
||||
|
||||
public function testTimestamps(): void
|
||||
{
|
||||
// local CSS nothing extra
|
||||
$this->assets->reset();
|
||||
$this->assets->setTimestamp('foo');
|
||||
$this->assets->addCSS('test.css');
|
||||
$css = $this->assets->css();
|
||||
self::assertSame('<link href="/test.css?foo" type="text/css" rel="stylesheet">' . PHP_EOL, $css);
|
||||
|
||||
// local CSS already with param
|
||||
$this->assets->reset();
|
||||
$this->assets->setTimestamp('foo');
|
||||
$this->assets->addCSS('test.css?bar');
|
||||
$css = $this->assets->css();
|
||||
self::assertSame('<link href="/test.css?bar&foo" type="text/css" rel="stylesheet">' . PHP_EOL, $css);
|
||||
|
||||
// external CSS already
|
||||
$this->assets->reset();
|
||||
$this->assets->setTimestamp('foo');
|
||||
$this->assets->addCSS('http://somesite.com/test.css');
|
||||
$css = $this->assets->css();
|
||||
self::assertSame('<link href="http://somesite.com/test.css?foo" type="text/css" rel="stylesheet">' . PHP_EOL, $css);
|
||||
|
||||
// external CSS already with param
|
||||
$this->assets->reset();
|
||||
$this->assets->setTimestamp('foo');
|
||||
$this->assets->addCSS('http://somesite.com/test.css?bar');
|
||||
$css = $this->assets->css();
|
||||
self::assertSame('<link href="http://somesite.com/test.css?bar&foo" type="text/css" rel="stylesheet">' . PHP_EOL, $css);
|
||||
|
||||
// local JS nothing extra
|
||||
$this->assets->reset();
|
||||
$this->assets->setTimestamp('foo');
|
||||
$this->assets->addJs('test.js');
|
||||
$css = $this->assets->js();
|
||||
self::assertSame('<script src="/test.js?foo"></script>' . PHP_EOL, $css);
|
||||
|
||||
// local JS already with param
|
||||
$this->assets->reset();
|
||||
$this->assets->setTimestamp('foo');
|
||||
$this->assets->addJs('test.js?bar');
|
||||
$css = $this->assets->js();
|
||||
self::assertSame('<script src="/test.js?bar&foo"></script>' . PHP_EOL, $css);
|
||||
|
||||
// external JS already
|
||||
$this->assets->reset();
|
||||
$this->assets->setTimestamp('foo');
|
||||
$this->assets->addJs('http://somesite.com/test.js');
|
||||
$css = $this->assets->js();
|
||||
self::assertSame('<script src="http://somesite.com/test.js?foo"></script>' . PHP_EOL, $css);
|
||||
|
||||
// external JS already with param
|
||||
$this->assets->reset();
|
||||
$this->assets->setTimestamp('foo');
|
||||
$this->assets->addJs('http://somesite.com/test.js?bar');
|
||||
$css = $this->assets->js();
|
||||
self::assertSame('<script src="http://somesite.com/test.js?bar&foo"></script>' . PHP_EOL, $css);
|
||||
}
|
||||
|
||||
public function testAddInlineCss(): void
|
||||
{
|
||||
$this->assets->reset();
|
||||
$this->assets->addInlineCss('body { color: black }');
|
||||
$css = $this->assets->css();
|
||||
self::assertSame('<style>' . PHP_EOL . 'body { color: black }' . PHP_EOL . '</style>' . PHP_EOL, $css);
|
||||
}
|
||||
|
||||
public function testAddInlineJs(): void
|
||||
{
|
||||
$this->assets->reset();
|
||||
$this->assets->addInlineJs('alert("test")');
|
||||
$js = $this->assets->js();
|
||||
self::assertSame('<script>' . PHP_EOL . 'alert("test")' . PHP_EOL . '</script>' . PHP_EOL, $js);
|
||||
}
|
||||
|
||||
public function testGetCollections(): void
|
||||
{
|
||||
self::assertIsArray($this->assets->getCollections());
|
||||
self::assertContains('jquery', array_keys($this->assets->getCollections()));
|
||||
self::assertContains('system://assets/jquery/jquery-3.x.min.js', $this->assets->getCollections());
|
||||
}
|
||||
|
||||
public function testExists(): void
|
||||
{
|
||||
self::assertTrue($this->assets->exists('jquery'));
|
||||
self::assertFalse($this->assets->exists('another-unexisting-library'));
|
||||
}
|
||||
|
||||
public function testRegisterCollection(): void
|
||||
{
|
||||
$this->assets->registerCollection('debugger', ['/system/assets/debugger.css']);
|
||||
self::assertTrue($this->assets->exists('debugger'));
|
||||
self::assertContains('debugger', array_keys($this->assets->getCollections()));
|
||||
}
|
||||
|
||||
public function testRegisterCollectionWithParameters(): void
|
||||
{
|
||||
$this->assets->registerCollection('collection_multi_params', [
|
||||
'foo.js' => [ 'defer' => true ],
|
||||
'bar.js' => [ 'integrity' => 'sha512-abc123' ],
|
||||
'foobar.css' => [ 'defer' => null ],
|
||||
]);
|
||||
|
||||
self::assertTrue($this->assets->exists('collection_multi_params'));
|
||||
|
||||
$collection = $this->assets->getCollections()['collection_multi_params'];
|
||||
self::assertArrayHasKey('foo.js', $collection);
|
||||
self::assertArrayHasKey('bar.js', $collection);
|
||||
self::assertArrayHasKey('foobar.css', $collection);
|
||||
self::assertArrayHasKey('defer', $collection['foo.js']);
|
||||
self::assertArrayHasKey('defer', $collection['foobar.css']);
|
||||
|
||||
self::assertNull($collection['foobar.css']['defer']);
|
||||
self::assertTrue($collection['foo.js']['defer']);
|
||||
}
|
||||
|
||||
public function testReset(): void
|
||||
{
|
||||
$this->assets->addInlineJs('alert("test")');
|
||||
$this->assets->reset();
|
||||
self::assertCount(0, (array) $this->assets->getJs());
|
||||
|
||||
$this->assets->addAsyncJs('jquery');
|
||||
$this->assets->reset();
|
||||
self::assertCount(0, (array) $this->assets->getJs());
|
||||
|
||||
$this->assets->addInlineCss('body { color: black }');
|
||||
$this->assets->reset();
|
||||
self::assertCount(0, (array) $this->assets->getCss());
|
||||
|
||||
$this->assets->add('/system/assets/debugger.css', null, true);
|
||||
$this->assets->reset();
|
||||
self::assertCount(0, (array) $this->assets->getCss());
|
||||
}
|
||||
|
||||
public function testResetJs(): void
|
||||
{
|
||||
$this->assets->addInlineJs('alert("test")');
|
||||
$this->assets->resetJs();
|
||||
self::assertCount(0, (array) $this->assets->getJs());
|
||||
|
||||
$this->assets->addAsyncJs('jquery');
|
||||
$this->assets->resetJs();
|
||||
self::assertCount(0, (array) $this->assets->getJs());
|
||||
}
|
||||
|
||||
public function testResetCss(): void
|
||||
{
|
||||
$this->assets->addInlineCss('body { color: black }');
|
||||
$this->assets->resetCss();
|
||||
self::assertCount(0, (array) $this->assets->getCss());
|
||||
|
||||
$this->assets->add('/system/assets/debugger.css', null, true);
|
||||
$this->assets->resetCss();
|
||||
self::assertCount(0, (array) $this->assets->getCss());
|
||||
}
|
||||
|
||||
public function testAddDirCss(): void
|
||||
{
|
||||
$this->assets->addDirCss('/system');
|
||||
|
||||
self::assertIsArray($this->assets->getCss());
|
||||
self::assertGreaterThan(0, (array) $this->assets->getCss());
|
||||
self::assertIsArray($this->assets->getJs());
|
||||
self::assertCount(0, (array) $this->assets->getJs());
|
||||
|
||||
$this->assets->reset();
|
||||
$this->assets->addDirCss('/system/assets');
|
||||
|
||||
self::assertIsArray($this->assets->getCss());
|
||||
self::assertGreaterThan(0, (array) $this->assets->getCss());
|
||||
self::assertIsArray($this->assets->getJs());
|
||||
self::assertCount(0, (array) $this->assets->getJs());
|
||||
|
||||
$this->assets->reset();
|
||||
$this->assets->addDirJs('/system');
|
||||
|
||||
self::assertIsArray($this->assets->getCss());
|
||||
self::assertCount(0, (array) $this->assets->getCss());
|
||||
self::assertIsArray($this->assets->getJs());
|
||||
self::assertGreaterThan(0, (array) $this->assets->getJs());
|
||||
|
||||
$this->assets->reset();
|
||||
$this->assets->addDirJs('/system/assets');
|
||||
|
||||
self::assertIsArray($this->assets->getCss());
|
||||
self::assertCount(0, (array) $this->assets->getCss());
|
||||
self::assertIsArray($this->assets->getJs());
|
||||
self::assertGreaterThan(0, (array) $this->assets->getJs());
|
||||
|
||||
$this->assets->reset();
|
||||
$this->assets->addDir('/system/assets');
|
||||
|
||||
self::assertIsArray($this->assets->getCss());
|
||||
self::assertGreaterThan(0, (array) $this->assets->getCss());
|
||||
self::assertIsArray($this->assets->getJs());
|
||||
self::assertGreaterThan(0, (array) $this->assets->getJs());
|
||||
|
||||
//Use streams
|
||||
$this->assets->reset();
|
||||
$this->assets->addDir('system://assets');
|
||||
|
||||
self::assertIsArray($this->assets->getCss());
|
||||
self::assertGreaterThan(0, (array) $this->assets->getCss());
|
||||
self::assertIsArray($this->assets->getJs());
|
||||
self::assertGreaterThan(0, (array) $this->assets->getJs());
|
||||
}
|
||||
}
|
51
tests/unit/Grav/Common/BrowserTest.php
Normal file
51
tests/unit/Grav/Common/BrowserTest.php
Normal file
@@ -0,0 +1,51 @@
|
||||
<?php
|
||||
|
||||
use Codeception\Util\Fixtures;
|
||||
use Grav\Common\Grav;
|
||||
|
||||
/**
|
||||
* Class BrowserTest
|
||||
*/
|
||||
class BrowserTest extends \Codeception\TestCase\Test
|
||||
{
|
||||
/** @var Grav $grav */
|
||||
protected $grav;
|
||||
|
||||
protected function _before(): void
|
||||
{
|
||||
$grav = Fixtures::get('grav');
|
||||
$this->grav = $grav();
|
||||
}
|
||||
|
||||
protected function _after(): void
|
||||
{
|
||||
}
|
||||
|
||||
public function testGetBrowser(): void
|
||||
{
|
||||
/* Already covered by PhpUserAgent tests */
|
||||
}
|
||||
|
||||
public function testGetPlatform(): void
|
||||
{
|
||||
/* Already covered by PhpUserAgent tests */
|
||||
}
|
||||
|
||||
public function testGetLongVersion(): void
|
||||
{
|
||||
/* Already covered by PhpUserAgent tests */
|
||||
}
|
||||
|
||||
public function testGetVersion(): void
|
||||
{
|
||||
/* Already covered by PhpUserAgent tests */
|
||||
}
|
||||
|
||||
public function testIsHuman(): void
|
||||
{
|
||||
//Already Partially covered by PhpUserAgent tests
|
||||
|
||||
//Make sure it recognizes the test as not human
|
||||
self::assertFalse($this->grav['browser']->isHuman());
|
||||
}
|
||||
}
|
31
tests/unit/Grav/Common/ComposerTest.php
Normal file
31
tests/unit/Grav/Common/ComposerTest.php
Normal file
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
|
||||
use Codeception\Util\Fixtures;
|
||||
use Grav\Common\Composer;
|
||||
|
||||
class ComposerTest extends \Codeception\TestCase\Test
|
||||
{
|
||||
protected function _before(): void
|
||||
{
|
||||
}
|
||||
|
||||
protected function _after(): void
|
||||
{
|
||||
}
|
||||
|
||||
public function testGetComposerLocation(): void
|
||||
{
|
||||
$composerLocation = Composer::getComposerLocation();
|
||||
self::assertIsString($composerLocation);
|
||||
self::assertSame('/', $composerLocation[0]);
|
||||
}
|
||||
|
||||
public function testGetComposerExecutor(): void
|
||||
{
|
||||
$composerExecutor = Composer::getComposerExecutor();
|
||||
self::assertIsString($composerExecutor);
|
||||
self::assertSame('/', $composerExecutor[0]);
|
||||
self::assertNotNull(strstr($composerExecutor, 'php'));
|
||||
self::assertNotNull(strstr($composerExecutor, 'composer'));
|
||||
}
|
||||
}
|
72
tests/unit/Grav/Common/Data/BlueprintTest.php
Normal file
72
tests/unit/Grav/Common/Data/BlueprintTest.php
Normal file
@@ -0,0 +1,72 @@
|
||||
<?php
|
||||
|
||||
use Grav\Common\Config\Config;
|
||||
use Grav\Common\Data\Blueprint;
|
||||
use Grav\Common\Grav;
|
||||
|
||||
/**
|
||||
* Class InstallCommandTest
|
||||
*/
|
||||
class BlueprintTest extends \Codeception\TestCase\Test
|
||||
{
|
||||
/**
|
||||
*/
|
||||
public function testValidateStrict(): void
|
||||
{
|
||||
$blueprint = $this->loadBlueprint('strict');
|
||||
|
||||
$blueprint->validate(['test' => 'string']);
|
||||
}
|
||||
|
||||
/**
|
||||
* @depends testValidateStrict
|
||||
*/
|
||||
public function testValidateStrictRequired(): void
|
||||
{
|
||||
$blueprint = $this->loadBlueprint('strict');
|
||||
|
||||
$this->expectException(\Grav\Common\Data\ValidationException::class);
|
||||
$blueprint->validate([]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @depends testValidateStrict
|
||||
*/
|
||||
public function testValidateStrictExtra(): void
|
||||
{
|
||||
$blueprint = $this->loadBlueprint('strict');
|
||||
|
||||
$blueprint->validate(['test' => 'string', 'wrong' => 'field']);
|
||||
}
|
||||
|
||||
/**
|
||||
* @depends testValidateStrict
|
||||
*/
|
||||
public function testValidateStrictExtraException(): void
|
||||
{
|
||||
$blueprint = $this->loadBlueprint('strict');
|
||||
|
||||
/** @var Config $config */
|
||||
$config = Grav::instance()['config'];
|
||||
$var = 'system.strict_mode.blueprint_strict_compat';
|
||||
$config->set($var, false);
|
||||
|
||||
$this->expectException(\Grav\Common\Data\ValidationException::class);
|
||||
$blueprint->validate(['test' => 'string', 'wrong' => 'field']);
|
||||
|
||||
$config->set($var, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $filename
|
||||
* @return Blueprint
|
||||
*/
|
||||
protected function loadBlueprint($filename): Blueprint
|
||||
{
|
||||
$blueprint = new Blueprint('strict');
|
||||
$blueprint->setContext(dirname(__DIR__, 3). '/data/blueprints');
|
||||
$blueprint->load()->init();
|
||||
|
||||
return $blueprint;
|
||||
}
|
||||
}
|
329
tests/unit/Grav/Common/GPM/GPMTest.php
Normal file
329
tests/unit/Grav/Common/GPM/GPMTest.php
Normal file
@@ -0,0 +1,329 @@
|
||||
<?php
|
||||
|
||||
use Codeception\Util\Fixtures;
|
||||
use Grav\Common\Grav;
|
||||
use Grav\Common\GPM\GPM;
|
||||
|
||||
define('EXCEPTION_BAD_FORMAT', 1);
|
||||
define('EXCEPTION_INCOMPATIBLE_VERSIONS', 2);
|
||||
|
||||
/**
|
||||
* Class GpmStub
|
||||
*/
|
||||
class GpmStub extends GPM
|
||||
{
|
||||
/** @var array */
|
||||
public $data;
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function findPackage($search, $ignore_exception = false)
|
||||
{
|
||||
return $this->data[$search] ?? false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function findPackages($searches = [])
|
||||
{
|
||||
return $this->data;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Class InstallCommandTest
|
||||
*/
|
||||
class GpmTest extends \Codeception\TestCase\Test
|
||||
{
|
||||
/** @var Grav $grav */
|
||||
protected $grav;
|
||||
|
||||
/** @var GpmStub */
|
||||
protected $gpm;
|
||||
|
||||
protected function _before(): void
|
||||
{
|
||||
$this->grav = Fixtures::get('grav');
|
||||
$this->gpm = new GpmStub();
|
||||
}
|
||||
|
||||
protected function _after(): void
|
||||
{
|
||||
}
|
||||
|
||||
public function testCalculateMergedDependenciesOfPackages(): void
|
||||
{
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// First working example
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
$this->gpm->data = [
|
||||
'admin' => (object)[
|
||||
'dependencies' => [
|
||||
['name' => 'grav', 'version' => '>=1.0.10'],
|
||||
['name' => 'form', 'version' => '~2.0'],
|
||||
['name' => 'login', 'version' => '>=2.0'],
|
||||
['name' => 'errors', 'version' => '*'],
|
||||
['name' => 'problems'],
|
||||
]
|
||||
],
|
||||
'test' => (object)[
|
||||
'dependencies' => [
|
||||
['name' => 'errors', 'version' => '>=1.0']
|
||||
]
|
||||
],
|
||||
'grav',
|
||||
'form' => (object)[
|
||||
'dependencies' => [
|
||||
['name' => 'errors', 'version' => '>=3.2']
|
||||
]
|
||||
]
|
||||
|
||||
|
||||
];
|
||||
|
||||
$packages = ['admin', 'test'];
|
||||
|
||||
$dependencies = $this->gpm->calculateMergedDependenciesOfPackages($packages);
|
||||
|
||||
self::assertIsArray($dependencies);
|
||||
self::assertCount(5, $dependencies);
|
||||
|
||||
self::assertSame('>=1.0.10', $dependencies['grav']);
|
||||
self::assertArrayHasKey('errors', $dependencies);
|
||||
self::assertArrayHasKey('problems', $dependencies);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Second working example
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
$packages = ['admin', 'form'];
|
||||
|
||||
$dependencies = $this->gpm->calculateMergedDependenciesOfPackages($packages);
|
||||
self::assertIsArray($dependencies);
|
||||
self::assertCount(5, $dependencies);
|
||||
self::assertSame('>=3.2', $dependencies['errors']);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Third working example
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
$this->gpm->data = [
|
||||
|
||||
'admin' => (object)[
|
||||
'dependencies' => [
|
||||
['name' => 'errors', 'version' => '>=4.0'],
|
||||
]
|
||||
],
|
||||
'test' => (object)[
|
||||
'dependencies' => [
|
||||
['name' => 'errors', 'version' => '>=1.0']
|
||||
]
|
||||
],
|
||||
'another' => (object)[
|
||||
'dependencies' => [
|
||||
['name' => 'errors', 'version' => '>=3.2']
|
||||
]
|
||||
]
|
||||
|
||||
];
|
||||
|
||||
$packages = ['admin', 'test', 'another'];
|
||||
|
||||
|
||||
$dependencies = $this->gpm->calculateMergedDependenciesOfPackages($packages);
|
||||
self::assertIsArray($dependencies);
|
||||
self::assertCount(1, $dependencies);
|
||||
self::assertSame('>=4.0', $dependencies['errors']);
|
||||
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Test alpha / beta / rc
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
$this->gpm->data = [
|
||||
'admin' => (object)[
|
||||
'dependencies' => [
|
||||
['name' => 'package1', 'version' => '>=4.0.0-rc1'],
|
||||
['name' => 'package4', 'version' => '>=3.2.0'],
|
||||
]
|
||||
],
|
||||
'test' => (object)[
|
||||
'dependencies' => [
|
||||
['name' => 'package1', 'version' => '>=4.0.0-rc2'],
|
||||
['name' => 'package2', 'version' => '>=3.2.0-alpha'],
|
||||
['name' => 'package3', 'version' => '>=3.2.0-alpha.2'],
|
||||
['name' => 'package4', 'version' => '>=3.2.0-alpha'],
|
||||
]
|
||||
],
|
||||
'another' => (object)[
|
||||
'dependencies' => [
|
||||
['name' => 'package2', 'version' => '>=3.2.0-beta.11'],
|
||||
['name' => 'package3', 'version' => '>=3.2.0-alpha.1'],
|
||||
['name' => 'package4', 'version' => '>=3.2.0-beta'],
|
||||
]
|
||||
]
|
||||
];
|
||||
|
||||
$packages = ['admin', 'test', 'another'];
|
||||
|
||||
|
||||
$dependencies = $this->gpm->calculateMergedDependenciesOfPackages($packages);
|
||||
self::assertSame('>=4.0.0-rc2', $dependencies['package1']);
|
||||
self::assertSame('>=3.2.0-beta.11', $dependencies['package2']);
|
||||
self::assertSame('>=3.2.0-alpha.2', $dependencies['package3']);
|
||||
self::assertSame('>=3.2.0', $dependencies['package4']);
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Raise exception if no version is specified
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
$this->gpm->data = [
|
||||
|
||||
'admin' => (object)[
|
||||
'dependencies' => [
|
||||
['name' => 'errors', 'version' => '>=4.0'],
|
||||
]
|
||||
],
|
||||
'test' => (object)[
|
||||
'dependencies' => [
|
||||
['name' => 'errors', 'version' => '>=']
|
||||
]
|
||||
],
|
||||
|
||||
];
|
||||
|
||||
$packages = ['admin', 'test'];
|
||||
|
||||
try {
|
||||
$this->gpm->calculateMergedDependenciesOfPackages($packages);
|
||||
self::fail('Expected Exception not thrown');
|
||||
} catch (Exception $e) {
|
||||
self::assertEquals(EXCEPTION_BAD_FORMAT, $e->getCode());
|
||||
self::assertStringStartsWith('Bad format for version of dependency', $e->getMessage());
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Raise exception if incompatible versions are specified
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
$this->gpm->data = [
|
||||
'admin' => (object)[
|
||||
'dependencies' => [
|
||||
['name' => 'errors', 'version' => '~4.0'],
|
||||
]
|
||||
],
|
||||
'test' => (object)[
|
||||
'dependencies' => [
|
||||
['name' => 'errors', 'version' => '~3.0']
|
||||
]
|
||||
],
|
||||
];
|
||||
|
||||
$packages = ['admin', 'test'];
|
||||
|
||||
try {
|
||||
$this->gpm->calculateMergedDependenciesOfPackages($packages);
|
||||
self::fail('Expected Exception not thrown');
|
||||
} catch (Exception $e) {
|
||||
self::assertEquals(EXCEPTION_INCOMPATIBLE_VERSIONS, $e->getCode());
|
||||
self::assertStringEndsWith('required in two incompatible versions', $e->getMessage());
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Test dependencies of dependencies
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
$this->gpm->data = [
|
||||
'admin' => (object)[
|
||||
'dependencies' => [
|
||||
['name' => 'grav', 'version' => '>=1.0.10'],
|
||||
['name' => 'form', 'version' => '~2.0'],
|
||||
['name' => 'login', 'version' => '>=2.0'],
|
||||
['name' => 'errors', 'version' => '*'],
|
||||
['name' => 'problems'],
|
||||
]
|
||||
],
|
||||
'login' => (object)[
|
||||
'dependencies' => [
|
||||
['name' => 'antimatter', 'version' => '>=1.0']
|
||||
]
|
||||
],
|
||||
'grav',
|
||||
'antimatter' => (object)[
|
||||
'dependencies' => [
|
||||
['name' => 'something', 'version' => '>=3.2']
|
||||
]
|
||||
]
|
||||
|
||||
|
||||
];
|
||||
|
||||
$packages = ['admin'];
|
||||
|
||||
$dependencies = $this->gpm->calculateMergedDependenciesOfPackages($packages);
|
||||
|
||||
self::assertIsArray($dependencies);
|
||||
self::assertCount(7, $dependencies);
|
||||
|
||||
self::assertSame('>=1.0.10', $dependencies['grav']);
|
||||
self::assertArrayHasKey('errors', $dependencies);
|
||||
self::assertArrayHasKey('problems', $dependencies);
|
||||
self::assertArrayHasKey('antimatter', $dependencies);
|
||||
self::assertArrayHasKey('something', $dependencies);
|
||||
self::assertSame('>=3.2', $dependencies['something']);
|
||||
}
|
||||
|
||||
public function testVersionFormatIsNextSignificantRelease(): void
|
||||
{
|
||||
self::assertFalse($this->gpm->versionFormatIsNextSignificantRelease('>=1.0'));
|
||||
self::assertFalse($this->gpm->versionFormatIsNextSignificantRelease('>=2.3.4'));
|
||||
self::assertFalse($this->gpm->versionFormatIsNextSignificantRelease('>=2.3.x'));
|
||||
self::assertFalse($this->gpm->versionFormatIsNextSignificantRelease('1.0'));
|
||||
self::assertTrue($this->gpm->versionFormatIsNextSignificantRelease('~2.3.x'));
|
||||
self::assertTrue($this->gpm->versionFormatIsNextSignificantRelease('~2.0'));
|
||||
}
|
||||
|
||||
public function testVersionFormatIsEqualOrHigher(): void
|
||||
{
|
||||
self::assertTrue($this->gpm->versionFormatIsEqualOrHigher('>=1.0'));
|
||||
self::assertTrue($this->gpm->versionFormatIsEqualOrHigher('>=2.3.4'));
|
||||
self::assertTrue($this->gpm->versionFormatIsEqualOrHigher('>=2.3.x'));
|
||||
self::assertFalse($this->gpm->versionFormatIsEqualOrHigher('~2.3.x'));
|
||||
self::assertFalse($this->gpm->versionFormatIsEqualOrHigher('1.0'));
|
||||
}
|
||||
|
||||
public function testCheckNextSignificantReleasesAreCompatible(): void
|
||||
{
|
||||
/*
|
||||
* ~1.0 is equivalent to >=1.0 < 2.0.0
|
||||
* ~1.2 is equivalent to >=1.2 <2.0.0
|
||||
* ~1.2.3 is equivalent to >=1.2.3 <1.3.0
|
||||
*/
|
||||
self::assertTrue($this->gpm->checkNextSignificantReleasesAreCompatible('1.0', '1.2'));
|
||||
self::assertTrue($this->gpm->checkNextSignificantReleasesAreCompatible('1.2', '1.0'));
|
||||
self::assertTrue($this->gpm->checkNextSignificantReleasesAreCompatible('1.0', '1.0.10'));
|
||||
self::assertTrue($this->gpm->checkNextSignificantReleasesAreCompatible('1.1', '1.1.10'));
|
||||
self::assertTrue($this->gpm->checkNextSignificantReleasesAreCompatible('30.0', '30.10'));
|
||||
self::assertTrue($this->gpm->checkNextSignificantReleasesAreCompatible('1.0', '1.1.10'));
|
||||
self::assertTrue($this->gpm->checkNextSignificantReleasesAreCompatible('1.0', '1.8'));
|
||||
self::assertTrue($this->gpm->checkNextSignificantReleasesAreCompatible('1.0.1', '1.1'));
|
||||
self::assertTrue($this->gpm->checkNextSignificantReleasesAreCompatible('2.0.0-beta', '2.0'));
|
||||
self::assertTrue($this->gpm->checkNextSignificantReleasesAreCompatible('2.0.0-rc.1', '2.0'));
|
||||
self::assertTrue($this->gpm->checkNextSignificantReleasesAreCompatible('2.0', '2.0.0-alpha'));
|
||||
|
||||
self::assertFalse($this->gpm->checkNextSignificantReleasesAreCompatible('1.0', '2.2'));
|
||||
self::assertFalse($this->gpm->checkNextSignificantReleasesAreCompatible('1.0.0-beta.1', '2.0'));
|
||||
self::assertFalse($this->gpm->checkNextSignificantReleasesAreCompatible('0.9.99', '1.0.0'));
|
||||
self::assertFalse($this->gpm->checkNextSignificantReleasesAreCompatible('0.9.99', '1.0.10'));
|
||||
self::assertFalse($this->gpm->checkNextSignificantReleasesAreCompatible('0.9.99', '1.0.10.2'));
|
||||
}
|
||||
|
||||
public function testCalculateVersionNumberFromDependencyVersion(): void
|
||||
{
|
||||
self::assertSame('2.0', $this->gpm->calculateVersionNumberFromDependencyVersion('>=2.0'));
|
||||
self::assertSame('2.0.2', $this->gpm->calculateVersionNumberFromDependencyVersion('>=2.0.2'));
|
||||
self::assertSame('2.0.2', $this->gpm->calculateVersionNumberFromDependencyVersion('~2.0.2'));
|
||||
self::assertSame('1', $this->gpm->calculateVersionNumberFromDependencyVersion('~1'));
|
||||
self::assertNull($this->gpm->calculateVersionNumberFromDependencyVersion(''));
|
||||
self::assertNull($this->gpm->calculateVersionNumberFromDependencyVersion('*'));
|
||||
self::assertSame('2.0.2', $this->gpm->calculateVersionNumberFromDependencyVersion('2.0.2'));
|
||||
}
|
||||
}
|
120
tests/unit/Grav/Common/Helpers/ExcerptsTest.php
Normal file
120
tests/unit/Grav/Common/Helpers/ExcerptsTest.php
Normal file
@@ -0,0 +1,120 @@
|
||||
<?php
|
||||
|
||||
use Codeception\Util\Fixtures;
|
||||
use Grav\Common\Helpers\Excerpts;
|
||||
use Grav\Common\Grav;
|
||||
use Grav\Common\Page\Interfaces\PageInterface;
|
||||
use Grav\Common\Uri;
|
||||
use Grav\Common\Config\Config;
|
||||
use Grav\Common\Page\Pages;
|
||||
use Grav\Common\Language\Language;
|
||||
use RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator;
|
||||
|
||||
/**
|
||||
* Class ExcerptsTest
|
||||
*/
|
||||
class ExcerptsTest extends \Codeception\TestCase\Test
|
||||
{
|
||||
/** @var Parsedown $parsedown */
|
||||
protected $parsedown;
|
||||
|
||||
/** @var Grav $grav */
|
||||
protected $grav;
|
||||
|
||||
/** @var PageInterface $page */
|
||||
protected $page;
|
||||
|
||||
/** @var Pages $pages */
|
||||
protected $pages;
|
||||
|
||||
/** @var Config $config */
|
||||
protected $config;
|
||||
|
||||
/** @var Uri $uri */
|
||||
protected $uri;
|
||||
|
||||
/** @var Language $language */
|
||||
protected $language;
|
||||
|
||||
protected $old_home;
|
||||
|
||||
protected function _before(): void
|
||||
{
|
||||
$grav = Fixtures::get('grav');
|
||||
$this->grav = $grav();
|
||||
$this->pages = $this->grav['pages'];
|
||||
$this->config = $this->grav['config'];
|
||||
$this->uri = $this->grav['uri'];
|
||||
$this->language = $this->grav['language'];
|
||||
$this->old_home = $this->config->get('system.home.alias');
|
||||
$this->config->set('system.home.alias', '/item1');
|
||||
$this->config->set('system.absolute_urls', false);
|
||||
$this->config->set('system.languages.supported', []);
|
||||
|
||||
unset($this->grav['language']);
|
||||
$this->grav['language'] = new Language($this->grav);
|
||||
|
||||
/** @var UniformResourceLocator $locator */
|
||||
$locator = $this->grav['locator'];
|
||||
$locator->addPath('page', '', 'tests/fake/nested-site/user/pages', false);
|
||||
$this->pages->init();
|
||||
|
||||
$defaults = [
|
||||
'extra' => false,
|
||||
'auto_line_breaks' => false,
|
||||
'auto_url_links' => false,
|
||||
'escape_markup' => false,
|
||||
'special_chars' => ['>' => 'gt', '<' => 'lt'],
|
||||
];
|
||||
$this->page = $this->pages->find('/item2/item2-2');
|
||||
$this->uri->initializeWithURL('http://testing.dev/item2/item2-2')->init();
|
||||
}
|
||||
|
||||
protected function _after(): void
|
||||
{
|
||||
$this->config->set('system.home.alias', $this->old_home);
|
||||
}
|
||||
|
||||
|
||||
public function testProcessImageHtml(): void
|
||||
{
|
||||
self::assertRegexp(
|
||||
'|<img alt="Sample Image" src="\/images\/.*-sample-image.jpe?g\" data-src="sample-image\.jpg\?cropZoom=300,300" \/>|',
|
||||
Excerpts::processImageHtml('<img src="sample-image.jpg?cropZoom=300,300" alt="Sample Image" />', $this->page)
|
||||
);
|
||||
self::assertRegexp(
|
||||
'|<img alt="Sample Image" class="foo" src="\/images\/.*-sample-image.jpe?g\" data-src="sample-image\.jpg\?classes=foo" \/>|',
|
||||
Excerpts::processImageHtml('<img src="sample-image.jpg?classes=foo" alt="Sample Image" />', $this->page)
|
||||
);
|
||||
}
|
||||
|
||||
public function testNoProcess(): void
|
||||
{
|
||||
self::assertStringStartsWith(
|
||||
'<a href="https://play.google.com/store/apps/details?hl=de" id="org.jitsi.meet" target="_blank"',
|
||||
Excerpts::processLinkHtml('<a href="https://play.google.com/store/apps/details?id=org.jitsi.meet&hl=de&target=_blank">regular process</a>')
|
||||
);
|
||||
|
||||
self::assertStringStartsWith(
|
||||
'<a href="https://play.google.com/store/apps/details?id=org.jitsi.meet&hl=de&target=_blank"',
|
||||
Excerpts::processLinkHtml('<a href="https://play.google.com/store/apps/details?id=org.jitsi.meet&hl=de&target=_blank&noprocess">noprocess</a>')
|
||||
);
|
||||
|
||||
self::assertStringStartsWith(
|
||||
'<a href="https://play.google.com/store/apps/details?id=org.jitsi.meet&hl=de" target="_blank"',
|
||||
Excerpts::processLinkHtml('<a href="https://play.google.com/store/apps/details?id=org.jitsi.meet&hl=de&target=_blank&noprocess=id">noprocess=id</a>')
|
||||
);
|
||||
}
|
||||
|
||||
public function testTarget(): void
|
||||
{
|
||||
self::assertStringStartsWith(
|
||||
'<a href="https://play.google.com/store/apps/details" target="_blank"',
|
||||
Excerpts::processLinkHtml('<a href="https://play.google.com/store/apps/details?target=_blank">only target</a>')
|
||||
);
|
||||
self::assertStringStartsWith(
|
||||
'<a href="https://meet.weikamp.biz/Support" rel="nofollow" target="_blank"',
|
||||
Excerpts::processLinkHtml('<a href="https://meet.weikamp.biz/Support?rel=nofollow&target=_blank">target and rel</a>')
|
||||
);
|
||||
}
|
||||
}
|
145
tests/unit/Grav/Common/InflectorTest.php
Normal file
145
tests/unit/Grav/Common/InflectorTest.php
Normal file
@@ -0,0 +1,145 @@
|
||||
<?php
|
||||
|
||||
use Codeception\Util\Fixtures;
|
||||
use Grav\Common\Grav;
|
||||
use Grav\Common\Inflector;
|
||||
use Grav\Common\Utils;
|
||||
|
||||
/**
|
||||
* Class InflectorTest
|
||||
*/
|
||||
class InflectorTest extends \Codeception\TestCase\Test
|
||||
{
|
||||
/** @var Grav $grav */
|
||||
protected $grav;
|
||||
|
||||
/** @var Inflector $uri */
|
||||
protected $inflector;
|
||||
|
||||
protected function _before(): void
|
||||
{
|
||||
$grav = Fixtures::get('grav');
|
||||
$this->grav = $grav();
|
||||
$this->inflector = $this->grav['inflector'];
|
||||
}
|
||||
|
||||
protected function _after(): void
|
||||
{
|
||||
}
|
||||
|
||||
public function testPluralize(): void
|
||||
{
|
||||
self::assertSame('words', $this->inflector->pluralize('word'));
|
||||
self::assertSame('kisses', $this->inflector->pluralize('kiss'));
|
||||
self::assertSame('volcanoes', $this->inflector->pluralize('volcanoe'));
|
||||
self::assertSame('cherries', $this->inflector->pluralize('cherry'));
|
||||
self::assertSame('days', $this->inflector->pluralize('day'));
|
||||
self::assertSame('knives', $this->inflector->pluralize('knife'));
|
||||
}
|
||||
|
||||
public function testSingularize(): void
|
||||
{
|
||||
self::assertSame('word', $this->inflector->singularize('words'));
|
||||
self::assertSame('kiss', $this->inflector->singularize('kisses'));
|
||||
self::assertSame('volcanoe', $this->inflector->singularize('volcanoe'));
|
||||
self::assertSame('cherry', $this->inflector->singularize('cherries'));
|
||||
self::assertSame('day', $this->inflector->singularize('days'));
|
||||
self::assertSame('knife', $this->inflector->singularize('knives'));
|
||||
}
|
||||
|
||||
public function testTitleize(): void
|
||||
{
|
||||
self::assertSame('This String Is Titleized', $this->inflector->titleize('ThisStringIsTitleized'));
|
||||
self::assertSame('This String Is Titleized', $this->inflector->titleize('this string is titleized'));
|
||||
self::assertSame('This String Is Titleized', $this->inflector->titleize('this_string_is_titleized'));
|
||||
self::assertSame('This String Is Titleized', $this->inflector->titleize('this-string-is-titleized'));
|
||||
|
||||
self::assertSame('This string is titleized', $this->inflector->titleize('ThisStringIsTitleized', 'first'));
|
||||
self::assertSame('This string is titleized', $this->inflector->titleize('this string is titleized', 'first'));
|
||||
self::assertSame('This string is titleized', $this->inflector->titleize('this_string_is_titleized', 'first'));
|
||||
self::assertSame('This string is titleized', $this->inflector->titleize('this-string-is-titleized', 'first'));
|
||||
}
|
||||
|
||||
public function testCamelize(): void
|
||||
{
|
||||
self::assertSame('ThisStringIsCamelized', $this->inflector->camelize('This String Is Camelized'));
|
||||
self::assertSame('ThisStringIsCamelized', $this->inflector->camelize('thisStringIsCamelized'));
|
||||
self::assertSame('ThisStringIsCamelized', $this->inflector->camelize('This_String_Is_Camelized'));
|
||||
self::assertSame('ThisStringIsCamelized', $this->inflector->camelize('this string is camelized'));
|
||||
self::assertSame('GravSPrettyCoolMy1', $this->inflector->camelize("Grav's Pretty Cool. My #1!"));
|
||||
}
|
||||
|
||||
public function testUnderscorize(): void
|
||||
{
|
||||
self::assertSame('this_string_is_underscorized', $this->inflector->underscorize('This String Is Underscorized'));
|
||||
self::assertSame('this_string_is_underscorized', $this->inflector->underscorize('ThisStringIsUnderscorized'));
|
||||
self::assertSame('this_string_is_underscorized', $this->inflector->underscorize('This_String_Is_Underscorized'));
|
||||
self::assertSame('this_string_is_underscorized', $this->inflector->underscorize('This-String-Is-Underscorized'));
|
||||
}
|
||||
|
||||
public function testHyphenize(): void
|
||||
{
|
||||
self::assertSame('this-string-is-hyphenized', $this->inflector->hyphenize('This String Is Hyphenized'));
|
||||
self::assertSame('this-string-is-hyphenized', $this->inflector->hyphenize('ThisStringIsHyphenized'));
|
||||
self::assertSame('this-string-is-hyphenized', $this->inflector->hyphenize('This-String-Is-Hyphenized'));
|
||||
self::assertSame('this-string-is-hyphenized', $this->inflector->hyphenize('This_String_Is_Hyphenized'));
|
||||
}
|
||||
|
||||
public function testHumanize(): void
|
||||
{
|
||||
//self::assertSame('This string is humanized', $this->inflector->humanize('ThisStringIsHumanized'));
|
||||
self::assertSame('This string is humanized', $this->inflector->humanize('this_string_is_humanized'));
|
||||
//self::assertSame('This string is humanized', $this->inflector->humanize('this-string-is-humanized'));
|
||||
|
||||
self::assertSame('This String Is Humanized', $this->inflector->humanize('this_string_is_humanized', 'all'));
|
||||
//self::assertSame('This String Is Humanized', $this->inflector->humanize('this-string-is-humanized'), 'all');
|
||||
}
|
||||
|
||||
public function testVariablize(): void
|
||||
{
|
||||
self::assertSame('thisStringIsVariablized', $this->inflector->variablize('This String Is Variablized'));
|
||||
self::assertSame('thisStringIsVariablized', $this->inflector->variablize('ThisStringIsVariablized'));
|
||||
self::assertSame('thisStringIsVariablized', $this->inflector->variablize('This_String_Is_Variablized'));
|
||||
self::assertSame('thisStringIsVariablized', $this->inflector->variablize('this string is variablized'));
|
||||
self::assertSame('gravSPrettyCoolMy1', $this->inflector->variablize("Grav's Pretty Cool. My #1!"));
|
||||
}
|
||||
|
||||
public function testTableize(): void
|
||||
{
|
||||
self::assertSame('people', $this->inflector->tableize('Person'));
|
||||
self::assertSame('pages', $this->inflector->tableize('Page'));
|
||||
self::assertSame('blog_pages', $this->inflector->tableize('BlogPage'));
|
||||
self::assertSame('admin_dependencies', $this->inflector->tableize('adminDependency'));
|
||||
self::assertSame('admin_dependencies', $this->inflector->tableize('admin-dependency'));
|
||||
self::assertSame('admin_dependencies', $this->inflector->tableize('admin_dependency'));
|
||||
}
|
||||
|
||||
public function testClassify(): void
|
||||
{
|
||||
self::assertSame('Person', $this->inflector->classify('people'));
|
||||
self::assertSame('Page', $this->inflector->classify('pages'));
|
||||
self::assertSame('BlogPage', $this->inflector->classify('blog_pages'));
|
||||
self::assertSame('AdminDependency', $this->inflector->classify('admin_dependencies'));
|
||||
}
|
||||
|
||||
public function testOrdinalize(): void
|
||||
{
|
||||
self::assertSame('1st', $this->inflector->ordinalize(1));
|
||||
self::assertSame('2nd', $this->inflector->ordinalize(2));
|
||||
self::assertSame('3rd', $this->inflector->ordinalize(3));
|
||||
self::assertSame('4th', $this->inflector->ordinalize(4));
|
||||
self::assertSame('5th', $this->inflector->ordinalize(5));
|
||||
self::assertSame('16th', $this->inflector->ordinalize(16));
|
||||
self::assertSame('51st', $this->inflector->ordinalize(51));
|
||||
self::assertSame('111th', $this->inflector->ordinalize(111));
|
||||
self::assertSame('123rd', $this->inflector->ordinalize(123));
|
||||
}
|
||||
|
||||
public function testMonthize(): void
|
||||
{
|
||||
self::assertSame(0, $this->inflector->monthize(10));
|
||||
self::assertSame(1, $this->inflector->monthize(33));
|
||||
self::assertSame(1, $this->inflector->monthize(41));
|
||||
self::assertSame(11, $this->inflector->monthize(364));
|
||||
}
|
||||
}
|
27
tests/unit/Grav/Common/Language/LanguageCodesTest.php
Normal file
27
tests/unit/Grav/Common/Language/LanguageCodesTest.php
Normal file
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
use Grav\Common\Language\LanguageCodes;
|
||||
|
||||
/**
|
||||
* Class ParsedownTest
|
||||
*/
|
||||
class LanguageCodesTest extends \Codeception\TestCase\Test
|
||||
{
|
||||
public function testRtl(): void
|
||||
{
|
||||
self::assertSame(
|
||||
'ltr',
|
||||
LanguageCodes::getOrientation('en')
|
||||
);
|
||||
self::assertSame(
|
||||
'rtl',
|
||||
LanguageCodes::getOrientation('ar')
|
||||
);
|
||||
self::assertSame(
|
||||
'rtl',
|
||||
LanguageCodes::getOrientation('he')
|
||||
);
|
||||
self::assertTrue(LanguageCodes::isRtl('ar'));
|
||||
self::assertFalse(LanguageCodes::isRtl('fr'));
|
||||
}
|
||||
}
|
1260
tests/unit/Grav/Common/Markdown/ParsedownTest.php
Normal file
1260
tests/unit/Grav/Common/Markdown/ParsedownTest.php
Normal file
File diff suppressed because it is too large
Load Diff
299
tests/unit/Grav/Common/Page/PagesTest.php
Normal file
299
tests/unit/Grav/Common/Page/PagesTest.php
Normal file
@@ -0,0 +1,299 @@
|
||||
<?php
|
||||
|
||||
use Codeception\Util\Fixtures;
|
||||
use Grav\Common\Grav;
|
||||
use Grav\Common\Page\Pages;
|
||||
use Grav\Common\Page\Page;
|
||||
use Grav\Common\Page\Interfaces\PageInterface;
|
||||
use RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator;
|
||||
|
||||
/**
|
||||
* Class PagesTest
|
||||
*/
|
||||
class PagesTest extends \Codeception\TestCase\Test
|
||||
{
|
||||
/** @var Grav $grav */
|
||||
protected $grav;
|
||||
|
||||
/** @var Pages $pages */
|
||||
protected $pages;
|
||||
|
||||
/** @var PageInterface $root_page */
|
||||
protected $root_page;
|
||||
|
||||
protected function _before(): void
|
||||
{
|
||||
$grav = Fixtures::get('grav');
|
||||
$this->grav = $grav();
|
||||
$this->pages = $this->grav['pages'];
|
||||
$this->grav['config']->set('system.home.alias', '/home');
|
||||
|
||||
/** @var UniformResourceLocator $locator */
|
||||
$locator = $this->grav['locator'];
|
||||
|
||||
$locator->addPath('page', '', 'tests/fake/simple-site/user/pages', false);
|
||||
$this->pages->init();
|
||||
}
|
||||
|
||||
public function testBase(): void
|
||||
{
|
||||
self::assertSame('', $this->pages->base());
|
||||
$this->pages->base('/test');
|
||||
self::assertSame('/test', $this->pages->base());
|
||||
$this->pages->base('');
|
||||
self::assertSame($this->pages->base(), '');
|
||||
}
|
||||
|
||||
public function testLastModified(): void
|
||||
{
|
||||
self::assertNull($this->pages->lastModified());
|
||||
$this->pages->lastModified('test');
|
||||
self::assertSame('test', $this->pages->lastModified());
|
||||
}
|
||||
|
||||
public function testInstances(): void
|
||||
{
|
||||
self::assertIsArray($this->pages->instances());
|
||||
foreach ($this->pages->instances() as $instance) {
|
||||
self::assertInstanceOf(PageInterface::class, $instance);
|
||||
}
|
||||
}
|
||||
|
||||
public function testRoutes(): void
|
||||
{
|
||||
/** @var UniformResourceLocator $locator */
|
||||
$locator = $this->grav['locator'];
|
||||
$folder = $locator->findResource('tests://');
|
||||
|
||||
self::assertIsArray($this->pages->routes());
|
||||
self::assertSame($folder . '/fake/simple-site/user/pages/01.home', $this->pages->routes()['/']);
|
||||
self::assertSame($folder . '/fake/simple-site/user/pages/01.home', $this->pages->routes()['/home']);
|
||||
self::assertSame($folder . '/fake/simple-site/user/pages/02.blog', $this->pages->routes()['/blog']);
|
||||
self::assertSame($folder . '/fake/simple-site/user/pages/02.blog/post-one', $this->pages->routes()['/blog/post-one']);
|
||||
self::assertSame($folder . '/fake/simple-site/user/pages/02.blog/post-two', $this->pages->routes()['/blog/post-two']);
|
||||
self::assertSame($folder . '/fake/simple-site/user/pages/03.about', $this->pages->routes()['/about']);
|
||||
}
|
||||
|
||||
public function testAddPage(): void
|
||||
{
|
||||
/** @var UniformResourceLocator $locator */
|
||||
$locator = $this->grav['locator'];
|
||||
$folder = $locator->findResource('tests://');
|
||||
|
||||
$path = $folder . '/fake/single-pages/01.simple-page/default.md';
|
||||
$aPage = new Page();
|
||||
$aPage->init(new \SplFileInfo($path));
|
||||
|
||||
$this->pages->addPage($aPage, '/new-page');
|
||||
|
||||
self::assertContains('/new-page', array_keys($this->pages->routes()));
|
||||
self::assertSame($folder . '/fake/single-pages/01.simple-page', $this->pages->routes()['/new-page']);
|
||||
}
|
||||
|
||||
public function testSort(): void
|
||||
{
|
||||
/** @var UniformResourceLocator $locator */
|
||||
$locator = $this->grav['locator'];
|
||||
$folder = $locator->findResource('tests://');
|
||||
|
||||
$aPage = $this->pages->find('/blog');
|
||||
$subPagesSorted = $this->pages->sort($aPage);
|
||||
|
||||
self::assertIsArray($subPagesSorted);
|
||||
self::assertCount(2, $subPagesSorted);
|
||||
|
||||
self::assertSame($folder . '/fake/simple-site/user/pages/02.blog/post-one', array_keys($subPagesSorted)[0]);
|
||||
self::assertSame($folder . '/fake/simple-site/user/pages/02.blog/post-two', array_keys($subPagesSorted)[1]);
|
||||
|
||||
self::assertContains($folder . '/fake/simple-site/user/pages/02.blog/post-one', array_keys($subPagesSorted));
|
||||
self::assertContains($folder . '/fake/simple-site/user/pages/02.blog/post-two', array_keys($subPagesSorted));
|
||||
|
||||
self::assertSame(['slug' => 'post-one'], $subPagesSorted[$folder . '/fake/simple-site/user/pages/02.blog/post-one']);
|
||||
self::assertSame(['slug' => 'post-two'], $subPagesSorted[$folder . '/fake/simple-site/user/pages/02.blog/post-two']);
|
||||
|
||||
$subPagesSorted = $this->pages->sort($aPage, null, 'desc');
|
||||
|
||||
self::assertIsArray($subPagesSorted);
|
||||
self::assertCount(2, $subPagesSorted);
|
||||
|
||||
self::assertSame($folder . '/fake/simple-site/user/pages/02.blog/post-two', array_keys($subPagesSorted)[0]);
|
||||
self::assertSame($folder . '/fake/simple-site/user/pages/02.blog/post-one', array_keys($subPagesSorted)[1]);
|
||||
|
||||
self::assertContains($folder . '/fake/simple-site/user/pages/02.blog/post-one', array_keys($subPagesSorted));
|
||||
self::assertContains($folder . '/fake/simple-site/user/pages/02.blog/post-two', array_keys($subPagesSorted));
|
||||
|
||||
self::assertSame(['slug' => 'post-one'], $subPagesSorted[$folder . '/fake/simple-site/user/pages/02.blog/post-one']);
|
||||
self::assertSame(['slug' => 'post-two'], $subPagesSorted[$folder . '/fake/simple-site/user/pages/02.blog/post-two']);
|
||||
}
|
||||
|
||||
public function testSortCollection(): void
|
||||
{
|
||||
/** @var UniformResourceLocator $locator */
|
||||
$locator = $this->grav['locator'];
|
||||
$folder = $locator->findResource('tests://');
|
||||
|
||||
$aPage = $this->pages->find('/blog');
|
||||
$subPagesSorted = $this->pages->sortCollection($aPage->children(), $aPage->orderBy());
|
||||
|
||||
self::assertIsArray($subPagesSorted);
|
||||
self::assertCount(2, $subPagesSorted);
|
||||
|
||||
self::assertSame($folder . '/fake/simple-site/user/pages/02.blog/post-one', array_keys($subPagesSorted)[0]);
|
||||
self::assertSame($folder . '/fake/simple-site/user/pages/02.blog/post-two', array_keys($subPagesSorted)[1]);
|
||||
|
||||
self::assertContains($folder . '/fake/simple-site/user/pages/02.blog/post-one', array_keys($subPagesSorted));
|
||||
self::assertContains($folder . '/fake/simple-site/user/pages/02.blog/post-two', array_keys($subPagesSorted));
|
||||
|
||||
self::assertSame(['slug' => 'post-one'], $subPagesSorted[$folder . '/fake/simple-site/user/pages/02.blog/post-one']);
|
||||
self::assertSame(['slug' => 'post-two'], $subPagesSorted[$folder . '/fake/simple-site/user/pages/02.blog/post-two']);
|
||||
|
||||
$subPagesSorted = $this->pages->sortCollection($aPage->children(), $aPage->orderBy(), 'desc');
|
||||
|
||||
self::assertIsArray($subPagesSorted);
|
||||
self::assertCount(2, $subPagesSorted);
|
||||
|
||||
self::assertSame($folder . '/fake/simple-site/user/pages/02.blog/post-two', array_keys($subPagesSorted)[0]);
|
||||
self::assertSame($folder . '/fake/simple-site/user/pages/02.blog/post-one', array_keys($subPagesSorted)[1]);
|
||||
|
||||
self::assertContains($folder . '/fake/simple-site/user/pages/02.blog/post-one', array_keys($subPagesSorted));
|
||||
self::assertContains($folder . '/fake/simple-site/user/pages/02.blog/post-two', array_keys($subPagesSorted));
|
||||
|
||||
self::assertSame(['slug' => 'post-one'], $subPagesSorted[$folder . '/fake/simple-site/user/pages/02.blog/post-one']);
|
||||
self::assertSame(['slug' => 'post-two'], $subPagesSorted[$folder . '/fake/simple-site/user/pages/02.blog/post-two']);
|
||||
}
|
||||
|
||||
public function testGet(): void
|
||||
{
|
||||
/** @var UniformResourceLocator $locator */
|
||||
$locator = $this->grav['locator'];
|
||||
$folder = $locator->findResource('tests://');
|
||||
|
||||
//Page existing
|
||||
$aPage = $this->pages->get($folder . '/fake/simple-site/user/pages/03.about');
|
||||
self::assertInstanceOf(PageInterface::class, $aPage);
|
||||
|
||||
//Page not existing
|
||||
$anotherPage = $this->pages->get($folder . '/fake/simple-site/user/pages/03.non-existing');
|
||||
self::assertNull($anotherPage);
|
||||
}
|
||||
|
||||
public function testChildren(): void
|
||||
{
|
||||
/** @var UniformResourceLocator $locator */
|
||||
$locator = $this->grav['locator'];
|
||||
$folder = $locator->findResource('tests://');
|
||||
|
||||
//Page existing
|
||||
$children = $this->pages->children($folder . '/fake/simple-site/user/pages/02.blog');
|
||||
self::assertInstanceOf('Grav\Common\Page\Collection', $children);
|
||||
|
||||
//Page not existing
|
||||
$children = $this->pages->children($folder . '/fake/whatever/non-existing');
|
||||
self::assertSame([], $children->toArray());
|
||||
}
|
||||
|
||||
public function testDispatch(): void
|
||||
{
|
||||
$aPage = $this->pages->dispatch('/blog');
|
||||
self::assertInstanceOf(PageInterface::class, $aPage);
|
||||
|
||||
$aPage = $this->pages->dispatch('/about');
|
||||
self::assertInstanceOf(PageInterface::class, $aPage);
|
||||
|
||||
$aPage = $this->pages->dispatch('/blog/post-one');
|
||||
self::assertInstanceOf(PageInterface::class, $aPage);
|
||||
|
||||
//Page not existing
|
||||
$aPage = $this->pages->dispatch('/non-existing');
|
||||
self::assertNull($aPage);
|
||||
}
|
||||
|
||||
public function testRoot(): void
|
||||
{
|
||||
$root = $this->pages->root();
|
||||
self::assertInstanceOf(PageInterface::class, $root);
|
||||
self::assertSame('pages', $root->folder());
|
||||
}
|
||||
|
||||
public function testBlueprints(): void
|
||||
{
|
||||
}
|
||||
|
||||
public function testAll()
|
||||
{
|
||||
self::assertIsObject($this->pages->all());
|
||||
self::assertIsArray($this->pages->all()->toArray());
|
||||
foreach ($this->pages->all() as $page) {
|
||||
self::assertInstanceOf(PageInterface::class, $page);
|
||||
}
|
||||
}
|
||||
|
||||
public function testGetList(): void
|
||||
{
|
||||
$list = $this->pages->getList();
|
||||
self::assertIsArray($list);
|
||||
self::assertSame('—-▸ Home', $list['/']);
|
||||
self::assertSame('—-▸ Blog', $list['/blog']);
|
||||
}
|
||||
|
||||
public function testTranslatedLanguages(): void
|
||||
{
|
||||
/** @var UniformResourceLocator $locator */
|
||||
$locator = $this->grav['locator'];
|
||||
$folder = $locator->findResource('tests://');
|
||||
|
||||
$page = $this->pages->get($folder . '/fake/simple-site/user/pages/04.page-translated');
|
||||
$this->assertInstanceOf(PageInterface::class, $page);
|
||||
$translatedLanguages = $page->translatedLanguages();
|
||||
$this->assertIsArray($translatedLanguages);
|
||||
$this->assertSame(["en" => "/page-translated", "fr" => "/page-translated"], $translatedLanguages);
|
||||
}
|
||||
|
||||
public function testLongPathTranslatedLanguages(): void
|
||||
{
|
||||
/** @var UniformResourceLocator $locator */
|
||||
$locator = $this->grav['locator'];
|
||||
$folder = $locator->findResource('tests://');
|
||||
$page = $this->pages->get($folder . '/fake/simple-site/user/pages/05.translatedlong/part2');
|
||||
$this->assertInstanceOf(PageInterface::class, $page);
|
||||
$translatedLanguages = $page->translatedLanguages();
|
||||
$this->assertIsArray($translatedLanguages);
|
||||
$this->assertSame(["en" => "/translatedlong/part2", "fr" => "/translatedlong/part2"], $translatedLanguages);
|
||||
}
|
||||
|
||||
public function testGetTypes(): void
|
||||
{
|
||||
}
|
||||
|
||||
public function testTypes(): void
|
||||
{
|
||||
}
|
||||
|
||||
public function testModularTypes(): void
|
||||
{
|
||||
}
|
||||
|
||||
public function testPageTypes(): void
|
||||
{
|
||||
}
|
||||
|
||||
public function testAccessLevels(): void
|
||||
{
|
||||
}
|
||||
|
||||
public function testParents(): void
|
||||
{
|
||||
}
|
||||
|
||||
public function testParentsRawRoutes(): void
|
||||
{
|
||||
}
|
||||
|
||||
public function testGetHomeRoute(): void
|
||||
{
|
||||
}
|
||||
|
||||
public function testResetPages(): void
|
||||
{
|
||||
}
|
||||
}
|
202
tests/unit/Grav/Common/Twig/Extensions/GravExtensionTest.php
Normal file
202
tests/unit/Grav/Common/Twig/Extensions/GravExtensionTest.php
Normal file
@@ -0,0 +1,202 @@
|
||||
<?php
|
||||
|
||||
use Codeception\Util\Fixtures;
|
||||
use Grav\Common\Grav;
|
||||
use Grav\Common\Twig\Extension\GravExtension;
|
||||
|
||||
/**
|
||||
* Class GravExtensionTest
|
||||
*/
|
||||
class GravExtensionTest extends \Codeception\TestCase\Test
|
||||
{
|
||||
/** @var Grav $grav */
|
||||
protected $grav;
|
||||
|
||||
/** @var GravExtension $twig_ext */
|
||||
protected $twig_ext;
|
||||
|
||||
protected function _before(): void
|
||||
{
|
||||
$this->grav = Fixtures::get('grav');
|
||||
$this->twig_ext = new GravExtension();
|
||||
}
|
||||
|
||||
public function testInflectorFilter(): void
|
||||
{
|
||||
self::assertSame('people', $this->twig_ext->inflectorFilter('plural', 'person'));
|
||||
self::assertSame('shoe', $this->twig_ext->inflectorFilter('singular', 'shoes'));
|
||||
self::assertSame('Welcome Page', $this->twig_ext->inflectorFilter('title', 'welcome page'));
|
||||
self::assertSame('SendEmail', $this->twig_ext->inflectorFilter('camel', 'send_email'));
|
||||
self::assertSame('camel_cased', $this->twig_ext->inflectorFilter('underscor', 'CamelCased'));
|
||||
self::assertSame('something-text', $this->twig_ext->inflectorFilter('hyphen', 'Something Text'));
|
||||
self::assertSame('Something text to read', $this->twig_ext->inflectorFilter('human', 'something_text_to_read'));
|
||||
self::assertSame(5, $this->twig_ext->inflectorFilter('month', '175'));
|
||||
self::assertSame('10th', $this->twig_ext->inflectorFilter('ordinal', '10'));
|
||||
}
|
||||
|
||||
public function testMd5Filter(): void
|
||||
{
|
||||
self::assertSame(md5('grav'), $this->twig_ext->md5Filter('grav'));
|
||||
self::assertSame(md5('devs@getgrav.org'), $this->twig_ext->md5Filter('devs@getgrav.org'));
|
||||
}
|
||||
|
||||
public function testKsortFilter(): void
|
||||
{
|
||||
$object = array("name"=>"Bob","age"=>8,"colour"=>"red");
|
||||
self::assertSame(array("age"=>8,"colour"=>"red","name"=>"Bob"), $this->twig_ext->ksortFilter($object));
|
||||
}
|
||||
|
||||
public function testContainsFilter(): void
|
||||
{
|
||||
self::assertTrue($this->twig_ext->containsFilter('grav', 'grav'));
|
||||
self::assertTrue($this->twig_ext->containsFilter('So, I found this new cms, called grav, and it\'s pretty awesome guys', 'grav'));
|
||||
}
|
||||
|
||||
public function testNicetimeFilter(): void
|
||||
{
|
||||
$now = time();
|
||||
$threeMinutes = time() - (60*3);
|
||||
$threeHours = time() - (60*60*3);
|
||||
$threeDays = time() - (60*60*24*3);
|
||||
$threeMonths = time() - (60*60*24*30*3);
|
||||
$threeYears = time() - (60*60*24*365*3);
|
||||
$measures = ['minutes','hours','days','months','years'];
|
||||
|
||||
self::assertSame('No date provided', $this->twig_ext->nicetimeFunc(null));
|
||||
|
||||
for ($i=0; $i<count($measures); $i++) {
|
||||
$time = 'three' . ucfirst($measures[$i]);
|
||||
self::assertSame('3 ' . $measures[$i] . ' ago', $this->twig_ext->nicetimeFunc($$time));
|
||||
}
|
||||
}
|
||||
|
||||
public function testRandomizeFilter(): void
|
||||
{
|
||||
$array = [1,2,3,4,5];
|
||||
self::assertContains(2, $this->twig_ext->randomizeFilter($array));
|
||||
self::assertSame($array, $this->twig_ext->randomizeFilter($array, 5));
|
||||
self::assertSame($array[0], $this->twig_ext->randomizeFilter($array, 1)[0]);
|
||||
self::assertSame($array[3], $this->twig_ext->randomizeFilter($array, 4)[3]);
|
||||
self::assertSame($array[1], $this->twig_ext->randomizeFilter($array, 4)[1]);
|
||||
}
|
||||
|
||||
public function testModulusFilter(): void
|
||||
{
|
||||
self::assertSame(3, $this->twig_ext->modulusFilter(3, 4));
|
||||
self::assertSame(1, $this->twig_ext->modulusFilter(11, 2));
|
||||
self::assertSame(0, $this->twig_ext->modulusFilter(10, 2));
|
||||
self::assertSame(2, $this->twig_ext->modulusFilter(10, 4));
|
||||
}
|
||||
|
||||
public function testAbsoluteUrlFilter(): void
|
||||
{
|
||||
}
|
||||
|
||||
public function testMarkdownFilter(): void
|
||||
{
|
||||
}
|
||||
|
||||
public function testStartsWithFilter(): void
|
||||
{
|
||||
}
|
||||
|
||||
public function testEndsWithFilter(): void
|
||||
{
|
||||
}
|
||||
|
||||
public function testDefinedDefaultFilter(): void
|
||||
{
|
||||
}
|
||||
|
||||
public function testRtrimFilter(): void
|
||||
{
|
||||
}
|
||||
|
||||
public function testLtrimFilter(): void
|
||||
{
|
||||
}
|
||||
|
||||
public function testRepeatFunc(): void
|
||||
{
|
||||
}
|
||||
|
||||
public function testRegexReplace(): void
|
||||
{
|
||||
}
|
||||
|
||||
public function testUrlFunc(): void
|
||||
{
|
||||
}
|
||||
|
||||
public function testEvaluateFunc(): void
|
||||
{
|
||||
}
|
||||
|
||||
public function testDump(): void
|
||||
{
|
||||
}
|
||||
|
||||
public function testGistFunc(): void
|
||||
{
|
||||
}
|
||||
|
||||
public function testRandomStringFunc(): void
|
||||
{
|
||||
}
|
||||
|
||||
public function testPadFilter(): void
|
||||
{
|
||||
}
|
||||
|
||||
public function testArrayFunc(): void
|
||||
{
|
||||
self::assertSame(
|
||||
'this is my text',
|
||||
$this->twig_ext->regexReplace('<p>this is my text</p>', '(<\/?p>)', '')
|
||||
);
|
||||
self::assertSame(
|
||||
'<i>this is my text</i>',
|
||||
$this->twig_ext->regexReplace('<p>this is my text</p>', ['(<p>)','(<\/p>)'], ['<i>','</i>'])
|
||||
);
|
||||
}
|
||||
|
||||
public function testArrayKeyValue(): void
|
||||
{
|
||||
self::assertSame(
|
||||
['meat' => 'steak'],
|
||||
$this->twig_ext->arrayKeyValueFunc('meat', 'steak')
|
||||
);
|
||||
self::assertSame(
|
||||
['fruit' => 'apple', 'meat' => 'steak'],
|
||||
$this->twig_ext->arrayKeyValueFunc('meat', 'steak', ['fruit' => 'apple'])
|
||||
);
|
||||
}
|
||||
|
||||
public function stringFunc(): void
|
||||
{
|
||||
}
|
||||
|
||||
public function testRangeFunc(): void
|
||||
{
|
||||
$hundred = [];
|
||||
for ($i = 0; $i <= 100; $i++) {
|
||||
$hundred[] = $i;
|
||||
}
|
||||
|
||||
|
||||
self::assertSame([0], $this->twig_ext->rangeFunc(0, 0));
|
||||
self::assertSame([0, 1, 2], $this->twig_ext->rangeFunc(0, 2));
|
||||
|
||||
self::assertSame([0, 5, 10, 15], $this->twig_ext->rangeFunc(0, 16, 5));
|
||||
|
||||
// default (min 0, max 100, step 1)
|
||||
self::assertSame($hundred, $this->twig_ext->rangeFunc());
|
||||
|
||||
// 95 items, starting from 5, (min 5, max 100, step 1)
|
||||
self::assertSame(array_slice($hundred, 5), $this->twig_ext->rangeFunc(5));
|
||||
|
||||
// reversed range
|
||||
self::assertSame(array_reverse($hundred), $this->twig_ext->rangeFunc(100, 0));
|
||||
self::assertSame([4, 2, 0], $this->twig_ext->rangeFunc(4, 0, 2));
|
||||
}
|
||||
}
|
1152
tests/unit/Grav/Common/UriTest.php
Normal file
1152
tests/unit/Grav/Common/UriTest.php
Normal file
File diff suppressed because it is too large
Load Diff
572
tests/unit/Grav/Common/UtilsTest.php
Normal file
572
tests/unit/Grav/Common/UtilsTest.php
Normal file
@@ -0,0 +1,572 @@
|
||||
<?php
|
||||
|
||||
use Codeception\Util\Fixtures;
|
||||
use Grav\Common\Grav;
|
||||
use Grav\Common\Uri;
|
||||
use Grav\Common\Utils;
|
||||
|
||||
/**
|
||||
* Class UtilsTest
|
||||
*/
|
||||
class UtilsTest extends \Codeception\TestCase\Test
|
||||
{
|
||||
/** @var Grav $grav */
|
||||
protected $grav;
|
||||
|
||||
/** @var Uri $uri */
|
||||
protected $uri;
|
||||
|
||||
protected function _before(): void
|
||||
{
|
||||
$grav = Fixtures::get('grav');
|
||||
$this->grav = $grav();
|
||||
$this->uri = $this->grav['uri'];
|
||||
}
|
||||
|
||||
protected function _after(): void
|
||||
{
|
||||
}
|
||||
|
||||
public function testStartsWith(): void
|
||||
{
|
||||
self::assertTrue(Utils::startsWith('english', 'en'));
|
||||
self::assertTrue(Utils::startsWith('English', 'En'));
|
||||
self::assertTrue(Utils::startsWith('ENGLISH', 'EN'));
|
||||
self::assertTrue(Utils::startsWith(
|
||||
'ENGLISHENGLISHENGLISHENGLISHENGLISHENGLISHENGLISHENGLISHENGLISHENGLISH',
|
||||
'EN'
|
||||
));
|
||||
|
||||
self::assertFalse(Utils::startsWith('english', 'En'));
|
||||
self::assertFalse(Utils::startsWith('English', 'EN'));
|
||||
self::assertFalse(Utils::startsWith('ENGLISH', 'en'));
|
||||
self::assertFalse(Utils::startsWith(
|
||||
'ENGLISHENGLISHENGLISHENGLISHENGLISHENGLISHENGLISHENGLISHENGLISHENGLISH',
|
||||
'e'
|
||||
));
|
||||
|
||||
self::assertTrue(Utils::startsWith('english', 'En', false));
|
||||
self::assertTrue(Utils::startsWith('English', 'EN', false));
|
||||
self::assertTrue(Utils::startsWith('ENGLISH', 'en', false));
|
||||
self::assertTrue(Utils::startsWith(
|
||||
'ENGLISHENGLISHENGLISHENGLISHENGLISHENGLISHENGLISHENGLISHENGLISHENGLISH',
|
||||
'e',
|
||||
false
|
||||
));
|
||||
}
|
||||
|
||||
public function testEndsWith(): void
|
||||
{
|
||||
self::assertTrue(Utils::endsWith('english', 'sh'));
|
||||
self::assertTrue(Utils::endsWith('EngliSh', 'Sh'));
|
||||
self::assertTrue(Utils::endsWith('ENGLISH', 'SH'));
|
||||
self::assertTrue(Utils::endsWith(
|
||||
'ENGLISHENGLISHENGLISHENGLISHENGLISHENGLISHENGLISHENGLISHENGLISHENGLISH',
|
||||
'ENGLISH'
|
||||
));
|
||||
|
||||
self::assertFalse(Utils::endsWith('english', 'de'));
|
||||
self::assertFalse(Utils::endsWith('EngliSh', 'sh'));
|
||||
self::assertFalse(Utils::endsWith('ENGLISH', 'Sh'));
|
||||
self::assertFalse(Utils::endsWith(
|
||||
'ENGLISHENGLISHENGLISHENGLISHENGLISHENGLISHENGLISHENGLISHENGLISHENGLISH',
|
||||
'DEUSTCH'
|
||||
));
|
||||
|
||||
self::assertTrue(Utils::endsWith('english', 'SH', false));
|
||||
self::assertTrue(Utils::endsWith('EngliSh', 'sH', false));
|
||||
self::assertTrue(Utils::endsWith('ENGLISH', 'sh', false));
|
||||
self::assertTrue(Utils::endsWith(
|
||||
'ENGLISHENGLISHENGLISHENGLISHENGLISHENGLISHENGLISHENGLISHENGLISHENGLISH',
|
||||
'english',
|
||||
false
|
||||
));
|
||||
}
|
||||
|
||||
public function testContains(): void
|
||||
{
|
||||
self::assertTrue(Utils::contains('english', 'nglis'));
|
||||
self::assertTrue(Utils::contains('EngliSh', 'gliSh'));
|
||||
self::assertTrue(Utils::contains('ENGLISH', 'ENGLI'));
|
||||
self::assertTrue(Utils::contains(
|
||||
'ENGLISHENGLISHENGLISHENGLISHENGLISHENGLISHENGLISHENGLISHENGLISHENGLISH',
|
||||
'ENGLISH'
|
||||
));
|
||||
|
||||
self::assertFalse(Utils::contains('EngliSh', 'GLI'));
|
||||
self::assertFalse(Utils::contains('EngliSh', 'English'));
|
||||
self::assertFalse(Utils::contains('ENGLISH', 'SCH'));
|
||||
self::assertFalse(Utils::contains(
|
||||
'ENGLISHENGLISHENGLISHENGLISHENGLISHENGLISHENGLISHENGLISHENGLISHENGLISH',
|
||||
'DEUSTCH'
|
||||
));
|
||||
|
||||
self::assertTrue(Utils::contains('EngliSh', 'GLI', false));
|
||||
self::assertTrue(Utils::contains('EngliSh', 'ENGLISH', false));
|
||||
self::assertTrue(Utils::contains('ENGLISH', 'ish', false));
|
||||
self::assertTrue(Utils::contains(
|
||||
'ENGLISHENGLISHENGLISHENGLISHENGLISHENGLISHENGLISHENGLISHENGLISHENGLISH',
|
||||
'english',
|
||||
false
|
||||
));
|
||||
}
|
||||
|
||||
public function testSubstrToString(): void
|
||||
{
|
||||
self::assertEquals('en', Utils::substrToString('english', 'glish'));
|
||||
self::assertEquals('english', Utils::substrToString('english', 'test'));
|
||||
self::assertNotEquals('en', Utils::substrToString('english', 'lish'));
|
||||
|
||||
self::assertEquals('en', Utils::substrToString('english', 'GLISH', false));
|
||||
self::assertEquals('english', Utils::substrToString('english', 'TEST', false));
|
||||
self::assertNotEquals('en', Utils::substrToString('english', 'LISH', false));
|
||||
}
|
||||
|
||||
public function testMergeObjects(): void
|
||||
{
|
||||
$obj1 = new stdClass();
|
||||
$obj1->test1 = 'x';
|
||||
$obj2 = new stdClass();
|
||||
$obj2->test2 = 'y';
|
||||
|
||||
$objMerged = Utils::mergeObjects($obj1, $obj2);
|
||||
|
||||
self::arrayHasKey('test1', (array) $objMerged);
|
||||
self::arrayHasKey('test2', (array) $objMerged);
|
||||
}
|
||||
|
||||
public function testDateFormats(): void
|
||||
{
|
||||
$dateFormats = Utils::dateFormats();
|
||||
self::assertIsArray($dateFormats);
|
||||
self::assertContainsOnly('string', $dateFormats);
|
||||
|
||||
$default_format = $this->grav['config']->get('system.pages.dateformat.default');
|
||||
|
||||
if ($default_format !== null) {
|
||||
self::assertArrayHasKey($default_format, $dateFormats);
|
||||
}
|
||||
}
|
||||
|
||||
public function testTruncate(): void
|
||||
{
|
||||
self::assertEquals('engli' . '…', Utils::truncate('english', 5));
|
||||
self::assertEquals('english', Utils::truncate('english'));
|
||||
self::assertEquals('This is a string to truncate', Utils::truncate('This is a string to truncate'));
|
||||
self::assertEquals('Th' . '…', Utils::truncate('This is a string to truncate', 2));
|
||||
self::assertEquals('engli' . '...', Utils::truncate('english', 5, true, " ", "..."));
|
||||
self::assertEquals('english', Utils::truncate('english'));
|
||||
self::assertEquals('This is a string to truncate', Utils::truncate('This is a string to truncate'));
|
||||
self::assertEquals('This' . '…', Utils::truncate('This is a string to truncate', 3, true));
|
||||
self::assertEquals('<input' . '…', Utils::truncate('<input type="file" id="file" multiple />', 6, true));
|
||||
}
|
||||
|
||||
public function testSafeTruncate(): void
|
||||
{
|
||||
self::assertEquals('This' . '…', Utils::safeTruncate('This is a string to truncate', 1));
|
||||
self::assertEquals('This' . '…', Utils::safeTruncate('This is a string to truncate', 4));
|
||||
self::assertEquals('This is' . '…', Utils::safeTruncate('This is a string to truncate', 5));
|
||||
}
|
||||
|
||||
public function testTruncateHtml(): void
|
||||
{
|
||||
self::assertEquals('T...', Utils::truncateHtml('This is a string to truncate', 1));
|
||||
self::assertEquals('This is...', Utils::truncateHtml('This is a string to truncate', 7));
|
||||
self::assertEquals('<p>T...</p>', Utils::truncateHtml('<p>This is a string to truncate</p>', 1));
|
||||
self::assertEquals('<p>This...</p>', Utils::truncateHtml('<p>This is a string to truncate</p>', 4));
|
||||
self::assertEquals('<p>This is a...</p>', Utils::truncateHtml('<p>This is a string to truncate</p>', 10));
|
||||
self::assertEquals('<p>This is a string to truncate</p>', Utils::truncateHtml('<p>This is a string to truncate</p>', 100));
|
||||
self::assertEquals('<input type="file" id="file" multiple />', Utils::truncateHtml('<input type="file" id="file" multiple />', 6));
|
||||
self::assertEquals('<ol><li>item 1 <i>so...</i></li></ol>', Utils::truncateHtml('<ol><li>item 1 <i>something</i></li><li>item 2 <strong>bold</strong></li></ol>', 10));
|
||||
self::assertEquals("<p>This is a string.</p>\n<p>It splits two lines.</p>", Utils::truncateHtml("<p>This is a string.</p>\n<p>It splits two lines.</p>", 100));
|
||||
}
|
||||
|
||||
public function testSafeTruncateHtml(): void
|
||||
{
|
||||
self::assertEquals('This...', Utils::safeTruncateHtml('This is a string to truncate', 1));
|
||||
self::assertEquals('This is a...', Utils::safeTruncateHtml('This is a string to truncate', 3));
|
||||
self::assertEquals('<p>This...</p>', Utils::safeTruncateHtml('<p>This is a string to truncate</p>', 1));
|
||||
self::assertEquals('<p>This is...</p>', Utils::safeTruncateHtml('<p>This is a string to truncate</p>', 2));
|
||||
self::assertEquals('<p>This is a string to...</p>', Utils::safeTruncateHtml('<p>This is a string to truncate</p>', 5));
|
||||
self::assertEquals('<p>This is a string to truncate</p>', Utils::safeTruncateHtml('<p>This is a string to truncate</p>', 20));
|
||||
self::assertEquals('<input type="file" id="file" multiple />', Utils::safeTruncateHtml('<input type="file" id="file" multiple />', 6));
|
||||
self::assertEquals('<ol><li>item 1 <i>something</i></li><li>item 2...</li></ol>', Utils::safeTruncateHtml('<ol><li>item 1 <i>something</i></li><li>item 2 <strong>bold</strong></li></ol>', 5));
|
||||
}
|
||||
|
||||
public function testGenerateRandomString(): void
|
||||
{
|
||||
self::assertNotEquals(Utils::generateRandomString(), Utils::generateRandomString());
|
||||
self::assertNotEquals(Utils::generateRandomString(20), Utils::generateRandomString(20));
|
||||
}
|
||||
|
||||
public function download(): void
|
||||
{
|
||||
}
|
||||
|
||||
public function testGetMimeByExtension(): void
|
||||
{
|
||||
self::assertEquals('application/octet-stream', Utils::getMimeByExtension(''));
|
||||
self::assertEquals('text/html', Utils::getMimeByExtension('html'));
|
||||
self::assertEquals('application/json', Utils::getMimeByExtension('json'));
|
||||
self::assertEquals('application/atom+xml', Utils::getMimeByExtension('atom'));
|
||||
self::assertEquals('application/rss+xml', Utils::getMimeByExtension('rss'));
|
||||
self::assertEquals('image/jpeg', Utils::getMimeByExtension('jpg'));
|
||||
self::assertEquals('image/png', Utils::getMimeByExtension('png'));
|
||||
self::assertEquals('text/plain', Utils::getMimeByExtension('txt'));
|
||||
self::assertEquals('application/msword', Utils::getMimeByExtension('doc'));
|
||||
self::assertEquals('application/octet-stream', Utils::getMimeByExtension('foo'));
|
||||
self::assertEquals('foo/bar', Utils::getMimeByExtension('foo', 'foo/bar'));
|
||||
self::assertEquals('text/html', Utils::getMimeByExtension('foo', 'text/html'));
|
||||
}
|
||||
|
||||
public function testGetExtensionByMime(): void
|
||||
{
|
||||
self::assertEquals('html', Utils::getExtensionByMime('*/*'));
|
||||
self::assertEquals('html', Utils::getExtensionByMime('text/*'));
|
||||
self::assertEquals('html', Utils::getExtensionByMime('text/html'));
|
||||
self::assertEquals('json', Utils::getExtensionByMime('application/json'));
|
||||
self::assertEquals('atom', Utils::getExtensionByMime('application/atom+xml'));
|
||||
self::assertEquals('rss', Utils::getExtensionByMime('application/rss+xml'));
|
||||
self::assertEquals('jpg', Utils::getExtensionByMime('image/jpeg'));
|
||||
self::assertEquals('png', Utils::getExtensionByMime('image/png'));
|
||||
self::assertEquals('txt', Utils::getExtensionByMime('text/plain'));
|
||||
self::assertEquals('doc', Utils::getExtensionByMime('application/msword'));
|
||||
self::assertEquals('html', Utils::getExtensionByMime('foo/bar'));
|
||||
self::assertEquals('baz', Utils::getExtensionByMime('foo/bar', 'baz'));
|
||||
}
|
||||
|
||||
public function testNormalizePath(): void
|
||||
{
|
||||
self::assertEquals('/test', Utils::normalizePath('/test'));
|
||||
self::assertEquals('test', Utils::normalizePath('test'));
|
||||
self::assertEquals('test', Utils::normalizePath('../test'));
|
||||
self::assertEquals('/test', Utils::normalizePath('/../test'));
|
||||
self::assertEquals('/test2', Utils::normalizePath('/test/../test2'));
|
||||
self::assertEquals('/test3', Utils::normalizePath('/test/../test2/../test3'));
|
||||
|
||||
self::assertEquals('//cdnjs.cloudflare.com/ajax/libs/Leaflet.awesome-markers/2.0.2/leaflet.awesome-markers.css', Utils::normalizePath('//cdnjs.cloudflare.com/ajax/libs/Leaflet.awesome-markers/2.0.2/leaflet.awesome-markers.css'));
|
||||
self::assertEquals('//use.fontawesome.com/releases/v5.8.1/css/all.css', Utils::normalizePath('//use.fontawesome.com/releases/v5.8.1/css/all.css'));
|
||||
self::assertEquals('//use.fontawesome.com/releases/v5.8.1/webfonts/fa-brands-400.eot', Utils::normalizePath('//use.fontawesome.com/releases/v5.8.1/css/../webfonts/fa-brands-400.eot'));
|
||||
|
||||
self::assertEquals('http://cdnjs.cloudflare.com/ajax/libs/Leaflet.awesome-markers/2.0.2/leaflet.awesome-markers.css', Utils::normalizePath('http://cdnjs.cloudflare.com/ajax/libs/Leaflet.awesome-markers/2.0.2/leaflet.awesome-markers.css'));
|
||||
self::assertEquals('http://use.fontawesome.com/releases/v5.8.1/css/all.css', Utils::normalizePath('http://use.fontawesome.com/releases/v5.8.1/css/all.css'));
|
||||
self::assertEquals('http://use.fontawesome.com/releases/v5.8.1/webfonts/fa-brands-400.eot', Utils::normalizePath('http://use.fontawesome.com/releases/v5.8.1/css/../webfonts/fa-brands-400.eot'));
|
||||
|
||||
self::assertEquals('https://cdnjs.cloudflare.com/ajax/libs/Leaflet.awesome-markers/2.0.2/leaflet.awesome-markers.css', Utils::normalizePath('https://cdnjs.cloudflare.com/ajax/libs/Leaflet.awesome-markers/2.0.2/leaflet.awesome-markers.css'));
|
||||
self::assertEquals('https://use.fontawesome.com/releases/v5.8.1/css/all.css', Utils::normalizePath('https://use.fontawesome.com/releases/v5.8.1/css/all.css'));
|
||||
self::assertEquals('https://use.fontawesome.com/releases/v5.8.1/webfonts/fa-brands-400.eot', Utils::normalizePath('https://use.fontawesome.com/releases/v5.8.1/css/../webfonts/fa-brands-400.eot'));
|
||||
}
|
||||
|
||||
public function testIsFunctionDisabled(): void
|
||||
{
|
||||
$disabledFunctions = explode(',', ini_get('disable_functions'));
|
||||
|
||||
if ($disabledFunctions[0]) {
|
||||
self::assertEquals(Utils::isFunctionDisabled($disabledFunctions[0]), true);
|
||||
}
|
||||
}
|
||||
|
||||
public function testTimezones(): void
|
||||
{
|
||||
$timezones = Utils::timezones();
|
||||
|
||||
self::assertIsArray($timezones);
|
||||
self::assertContainsOnly('string', $timezones);
|
||||
}
|
||||
|
||||
public function testArrayFilterRecursive(): void
|
||||
{
|
||||
$array = [
|
||||
'test' => '',
|
||||
'test2' => 'test2'
|
||||
];
|
||||
|
||||
$array = Utils::arrayFilterRecursive($array, function ($k, $v) {
|
||||
return !(is_null($v) || $v === '');
|
||||
});
|
||||
|
||||
self::assertContainsOnly('string', $array);
|
||||
self::assertArrayNotHasKey('test', $array);
|
||||
self::assertArrayHasKey('test2', $array);
|
||||
self::assertEquals('test2', $array['test2']);
|
||||
}
|
||||
|
||||
public function testPathPrefixedByLangCode(): void
|
||||
{
|
||||
$languagesEnabled = $this->grav['config']->get('system.languages.supported', []);
|
||||
$arrayOfLanguages = ['en', 'de', 'it', 'es', 'dk', 'el'];
|
||||
$languagesNotEnabled = array_diff($arrayOfLanguages, $languagesEnabled);
|
||||
$oneLanguageNotEnabled = reset($languagesNotEnabled);
|
||||
|
||||
if (count($languagesEnabled)) {
|
||||
$languageCodePathPrefix = Utils::pathPrefixedByLangCode('/' . $languagesEnabled[0] . '/test');
|
||||
$this->assertIsString($languageCodePathPrefix);
|
||||
$this->assertTrue(in_array($languageCodePathPrefix, $languagesEnabled));
|
||||
}
|
||||
|
||||
self::assertFalse(Utils::pathPrefixedByLangCode('/' . $oneLanguageNotEnabled . '/test'));
|
||||
self::assertFalse(Utils::pathPrefixedByLangCode('/test'));
|
||||
self::assertFalse(Utils::pathPrefixedByLangCode('/xx'));
|
||||
self::assertFalse(Utils::pathPrefixedByLangCode('/xx/'));
|
||||
self::assertFalse(Utils::pathPrefixedByLangCode('/'));
|
||||
}
|
||||
|
||||
public function testDate2timestamp(): void
|
||||
{
|
||||
$timestamp = strtotime('10 September 2000');
|
||||
self::assertSame($timestamp, Utils::date2timestamp('10 September 2000'));
|
||||
self::assertSame($timestamp, Utils::date2timestamp('2000-09-10 00:00:00'));
|
||||
}
|
||||
|
||||
public function testResolve(): void
|
||||
{
|
||||
$array = [
|
||||
'test' => [
|
||||
'test2' => 'test2Value'
|
||||
]
|
||||
];
|
||||
|
||||
self::assertEquals('test2Value', Utils::resolve($array, 'test.test2'));
|
||||
}
|
||||
|
||||
public function testGetDotNotation(): void
|
||||
{
|
||||
$array = [
|
||||
'test' => [
|
||||
'test2' => 'test2Value',
|
||||
'test3' => [
|
||||
'test4' => 'test4Value'
|
||||
]
|
||||
]
|
||||
];
|
||||
|
||||
self::assertEquals('test2Value', Utils::getDotNotation($array, 'test.test2'));
|
||||
self::assertEquals('test4Value', Utils::getDotNotation($array, 'test.test3.test4'));
|
||||
self::assertEquals('defaultValue', Utils::getDotNotation($array, 'test.non_existent', 'defaultValue'));
|
||||
}
|
||||
|
||||
public function testSetDotNotation(): void
|
||||
{
|
||||
$array = [
|
||||
'test' => [
|
||||
'test2' => 'test2Value',
|
||||
'test3' => [
|
||||
'test4' => 'test4Value'
|
||||
]
|
||||
]
|
||||
];
|
||||
|
||||
$new = [
|
||||
'test1' => 'test1Value'
|
||||
];
|
||||
|
||||
Utils::setDotNotation($array, 'test.test3.test4', $new);
|
||||
self::assertEquals('test1Value', $array['test']['test3']['test4']['test1']);
|
||||
}
|
||||
|
||||
public function testIsPositive(): void
|
||||
{
|
||||
self::assertTrue(Utils::isPositive(true));
|
||||
self::assertTrue(Utils::isPositive(1));
|
||||
self::assertTrue(Utils::isPositive('1'));
|
||||
self::assertTrue(Utils::isPositive('yes'));
|
||||
self::assertTrue(Utils::isPositive('on'));
|
||||
self::assertTrue(Utils::isPositive('true'));
|
||||
self::assertFalse(Utils::isPositive(false));
|
||||
self::assertFalse(Utils::isPositive(0));
|
||||
self::assertFalse(Utils::isPositive('0'));
|
||||
self::assertFalse(Utils::isPositive('no'));
|
||||
self::assertFalse(Utils::isPositive('off'));
|
||||
self::assertFalse(Utils::isPositive('false'));
|
||||
self::assertFalse(Utils::isPositive('some'));
|
||||
self::assertFalse(Utils::isPositive(2));
|
||||
}
|
||||
|
||||
public function testGetNonce(): void
|
||||
{
|
||||
self::assertIsString(Utils::getNonce('test-action'));
|
||||
self::assertIsString(Utils::getNonce('test-action', true));
|
||||
self::assertSame(Utils::getNonce('test-action'), Utils::getNonce('test-action'));
|
||||
self::assertNotSame(Utils::getNonce('test-action'), Utils::getNonce('test-action2'));
|
||||
}
|
||||
|
||||
public function testVerifyNonce(): void
|
||||
{
|
||||
self::assertTrue(Utils::verifyNonce(Utils::getNonce('test-action'), 'test-action'));
|
||||
}
|
||||
|
||||
public function testGetPagePathFromToken(): void
|
||||
{
|
||||
self::assertEquals('', Utils::getPagePathFromToken(''));
|
||||
self::assertEquals('/test/path', Utils::getPagePathFromToken('/test/path'));
|
||||
}
|
||||
|
||||
public function testUrl(): void
|
||||
{
|
||||
$this->uri->initializeWithUrl('http://testing.dev/path1/path2')->init();
|
||||
|
||||
// Fail hard
|
||||
self::assertSame(false, Utils::url('', true));
|
||||
self::assertSame(false, Utils::url(''));
|
||||
self::assertSame(false, Utils::url(new stdClass()));
|
||||
self::assertSame(false, Utils::url(['foo','bar','baz']));
|
||||
self::assertSame(false, Utils::url('user://does/not/exist'));
|
||||
|
||||
// Fail Gracefully
|
||||
self::assertSame('/', Utils::url('/', false, true));
|
||||
self::assertSame('/', Utils::url('', false, true));
|
||||
self::assertSame('/', Utils::url(new stdClass(), false, true));
|
||||
self::assertSame('/', Utils::url(['foo','bar','baz'], false, true));
|
||||
self::assertSame('/user/does/not/exist', Utils::url('user://does/not/exist', false, true));
|
||||
|
||||
// Simple paths
|
||||
self::assertSame('/', Utils::url('/'));
|
||||
self::assertSame('/path1', Utils::url('/path1'));
|
||||
self::assertSame('/path1/path2', Utils::url('/path1/path2'));
|
||||
self::assertSame('/random/path1/path2', Utils::url('/random/path1/path2'));
|
||||
self::assertSame('/foobar.jpg', Utils::url('/foobar.jpg'));
|
||||
self::assertSame('/path1/foobar.jpg', Utils::url('/path1/foobar.jpg'));
|
||||
self::assertSame('/path1/path2/foobar.jpg', Utils::url('/path1/path2/foobar.jpg'));
|
||||
self::assertSame('/random/path1/path2/foobar.jpg', Utils::url('/random/path1/path2/foobar.jpg'));
|
||||
|
||||
// Simple paths with domain
|
||||
self::assertSame('http://testing.dev/', Utils::url('/', true));
|
||||
self::assertSame('http://testing.dev/path1', Utils::url('/path1', true));
|
||||
self::assertSame('http://testing.dev/path1/path2', Utils::url('/path1/path2', true));
|
||||
self::assertSame('http://testing.dev/random/path1/path2', Utils::url('/random/path1/path2', true));
|
||||
self::assertSame('http://testing.dev/foobar.jpg', Utils::url('/foobar.jpg', true));
|
||||
self::assertSame('http://testing.dev/path1/foobar.jpg', Utils::url('/path1/foobar.jpg', true));
|
||||
self::assertSame('http://testing.dev/path1/path2/foobar.jpg', Utils::url('/path1/path2/foobar.jpg', true));
|
||||
self::assertSame('http://testing.dev/random/path1/path2/foobar.jpg', Utils::url('/random/path1/path2/foobar.jpg', true));
|
||||
|
||||
// Relative paths from Grav root.
|
||||
self::assertSame('/subdir', Utils::url('subdir'));
|
||||
self::assertSame('/subdir/path1', Utils::url('subdir/path1'));
|
||||
self::assertSame('/subdir/path1/path2', Utils::url('subdir/path1/path2'));
|
||||
self::assertSame('/path1', Utils::url('path1'));
|
||||
self::assertSame('/path1/path2', Utils::url('path1/path2'));
|
||||
self::assertSame('/foobar.jpg', Utils::url('foobar.jpg'));
|
||||
self::assertSame('http://testing.dev/foobar.jpg', Utils::url('foobar.jpg', true));
|
||||
|
||||
// Relative paths from Grav root with domain.
|
||||
self::assertSame('http://testing.dev/foobar.jpg', Utils::url('foobar.jpg', true));
|
||||
self::assertSame('http://testing.dev/foobar.jpg', Utils::url('/foobar.jpg', true));
|
||||
self::assertSame('http://testing.dev/path1/foobar.jpg', Utils::url('/path1/foobar.jpg', true));
|
||||
|
||||
// All Non-existing streams should be treated as external URI / protocol.
|
||||
self::assertSame('http://domain.com/path', Utils::url('http://domain.com/path'));
|
||||
self::assertSame('ftp://domain.com/path', Utils::url('ftp://domain.com/path'));
|
||||
self::assertSame('sftp://domain.com/path', Utils::url('sftp://domain.com/path'));
|
||||
self::assertSame('ssh://domain.com', Utils::url('ssh://domain.com'));
|
||||
self::assertSame('pop://domain.com', Utils::url('pop://domain.com'));
|
||||
self::assertSame('foo://bar/baz', Utils::url('foo://bar/baz'));
|
||||
self::assertSame('foo://bar/baz', Utils::url('foo://bar/baz', true));
|
||||
// self::assertSame('mailto:joe@domain.com', Utils::url('mailto:joe@domain.com', true)); // FIXME <-
|
||||
}
|
||||
|
||||
public function testUrlWithRoot(): void
|
||||
{
|
||||
$this->uri->initializeWithUrlAndRootPath('http://testing.dev/subdir/path1/path2', '/subdir')->init();
|
||||
|
||||
// Fail hard
|
||||
self::assertSame(false, Utils::url('', true));
|
||||
self::assertSame(false, Utils::url(''));
|
||||
self::assertSame(false, Utils::url(new stdClass()));
|
||||
self::assertSame(false, Utils::url(['foo','bar','baz']));
|
||||
self::assertSame(false, Utils::url('user://does/not/exist'));
|
||||
|
||||
// Fail Gracefully
|
||||
self::assertSame('/subdir/', Utils::url('/', false, true));
|
||||
self::assertSame('/subdir/', Utils::url('', false, true));
|
||||
self::assertSame('/subdir/', Utils::url(new stdClass(), false, true));
|
||||
self::assertSame('/subdir/', Utils::url(['foo','bar','baz'], false, true));
|
||||
self::assertSame('/subdir/user/does/not/exist', Utils::url('user://does/not/exist', false, true));
|
||||
|
||||
// Simple paths
|
||||
self::assertSame('/subdir/', Utils::url('/'));
|
||||
self::assertSame('/subdir/path1', Utils::url('/path1'));
|
||||
self::assertSame('/subdir/path1/path2', Utils::url('/path1/path2'));
|
||||
self::assertSame('/subdir/random/path1/path2', Utils::url('/random/path1/path2'));
|
||||
self::assertSame('/subdir/foobar.jpg', Utils::url('/foobar.jpg'));
|
||||
self::assertSame('/subdir/path1/foobar.jpg', Utils::url('/path1/foobar.jpg'));
|
||||
self::assertSame('/subdir/path1/path2/foobar.jpg', Utils::url('/path1/path2/foobar.jpg'));
|
||||
self::assertSame('/subdir/random/path1/path2/foobar.jpg', Utils::url('/random/path1/path2/foobar.jpg'));
|
||||
|
||||
// Simple paths with domain
|
||||
self::assertSame('http://testing.dev/subdir/', Utils::url('/', true));
|
||||
self::assertSame('http://testing.dev/subdir/path1', Utils::url('/path1', true));
|
||||
self::assertSame('http://testing.dev/subdir/path1/path2', Utils::url('/path1/path2', true));
|
||||
self::assertSame('http://testing.dev/subdir/random/path1/path2', Utils::url('/random/path1/path2', true));
|
||||
self::assertSame('http://testing.dev/subdir/foobar.jpg', Utils::url('/foobar.jpg', true));
|
||||
self::assertSame('http://testing.dev/subdir/path1/foobar.jpg', Utils::url('/path1/foobar.jpg', true));
|
||||
self::assertSame('http://testing.dev/subdir/path1/path2/foobar.jpg', Utils::url('/path1/path2/foobar.jpg', true));
|
||||
self::assertSame('http://testing.dev/subdir/random/path1/path2/foobar.jpg', Utils::url('/random/path1/path2/foobar.jpg', true));
|
||||
|
||||
// Absolute Paths including the grav base.
|
||||
self::assertSame('/subdir/', Utils::url('/subdir'));
|
||||
self::assertSame('/subdir/', Utils::url('/subdir/'));
|
||||
self::assertSame('/subdir/path1', Utils::url('/subdir/path1'));
|
||||
self::assertSame('/subdir/path1/path2', Utils::url('/subdir/path1/path2'));
|
||||
self::assertSame('/subdir/foobar.jpg', Utils::url('/subdir/foobar.jpg'));
|
||||
self::assertSame('/subdir/path1/foobar.jpg', Utils::url('/subdir/path1/foobar.jpg'));
|
||||
|
||||
// Absolute paths from Grav root with domain.
|
||||
self::assertSame('http://testing.dev/subdir/', Utils::url('/subdir', true));
|
||||
self::assertSame('http://testing.dev/subdir/', Utils::url('/subdir/', true));
|
||||
self::assertSame('http://testing.dev/subdir/path1', Utils::url('/subdir/path1', true));
|
||||
self::assertSame('http://testing.dev/subdir/path1/path2', Utils::url('/subdir/path1/path2', true));
|
||||
self::assertSame('http://testing.dev/subdir/foobar.jpg', Utils::url('/subdir/foobar.jpg', true));
|
||||
self::assertSame('http://testing.dev/subdir/path1/foobar.jpg', Utils::url('/subdir/path1/foobar.jpg', true));
|
||||
|
||||
// Relative paths from Grav root.
|
||||
self::assertSame('/subdir/sub', Utils::url('/sub'));
|
||||
self::assertSame('/subdir/subdir', Utils::url('subdir'));
|
||||
self::assertSame('/subdir/subdir2/sub', Utils::url('/subdir2/sub'));
|
||||
self::assertSame('/subdir/subdir/path1', Utils::url('subdir/path1'));
|
||||
self::assertSame('/subdir/subdir/path1/path2', Utils::url('subdir/path1/path2'));
|
||||
self::assertSame('/subdir/path1', Utils::url('path1'));
|
||||
self::assertSame('/subdir/path1/path2', Utils::url('path1/path2'));
|
||||
self::assertSame('/subdir/foobar.jpg', Utils::url('foobar.jpg'));
|
||||
self::assertSame('http://testing.dev/subdir/foobar.jpg', Utils::url('foobar.jpg', true));
|
||||
|
||||
// All Non-existing streams should be treated as external URI / protocol.
|
||||
self::assertSame('http://domain.com/path', Utils::url('http://domain.com/path'));
|
||||
self::assertSame('ftp://domain.com/path', Utils::url('ftp://domain.com/path'));
|
||||
self::assertSame('sftp://domain.com/path', Utils::url('sftp://domain.com/path'));
|
||||
self::assertSame('ssh://domain.com', Utils::url('ssh://domain.com'));
|
||||
self::assertSame('pop://domain.com', Utils::url('pop://domain.com'));
|
||||
self::assertSame('foo://bar/baz', Utils::url('foo://bar/baz'));
|
||||
self::assertSame('foo://bar/baz', Utils::url('foo://bar/baz', true));
|
||||
// self::assertSame('mailto:joe@domain.com', Utils::url('mailto:joe@domain.com', true)); // FIXME <-
|
||||
}
|
||||
|
||||
public function testUrlWithStreams(): void
|
||||
{
|
||||
}
|
||||
|
||||
public function testUrlwithExternals(): void
|
||||
{
|
||||
$this->uri->initializeWithUrl('http://testing.dev/path1/path2')->init();
|
||||
self::assertSame('http://foo.com', Utils::url('http://foo.com'));
|
||||
self::assertSame('https://foo.com', Utils::url('https://foo.com'));
|
||||
self::assertSame('//foo.com', Utils::url('//foo.com'));
|
||||
self::assertSame('//foo.com?param=x', Utils::url('//foo.com?param=x'));
|
||||
}
|
||||
|
||||
public function testCheckFilename(): void
|
||||
{
|
||||
// configure extension for consistent results
|
||||
/** @var \Grav\Common\Config\Config $config */
|
||||
$config = $this->grav['config'];
|
||||
$config->set('security.uploads_dangerous_extensions', ['php', 'html', 'htm', 'exe', 'js']);
|
||||
|
||||
self::assertFalse(Utils::checkFilename('foo.php'));
|
||||
self::assertFalse(Utils::checkFilename('foo.PHP'));
|
||||
self::assertFalse(Utils::checkFilename('bar.js'));
|
||||
|
||||
self::assertTrue(Utils::checkFilename('foo.json'));
|
||||
self::assertTrue(Utils::checkFilename('foo.xml'));
|
||||
self::assertTrue(Utils::checkFilename('foo.yaml'));
|
||||
self::assertTrue(Utils::checkFilename('foo.yml'));
|
||||
}
|
||||
}
|
28
tests/unit/Grav/Console/Gpm/InstallCommandTest.php
Normal file
28
tests/unit/Grav/Console/Gpm/InstallCommandTest.php
Normal file
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
use Codeception\Util\Fixtures;
|
||||
use Grav\Common\Grav;
|
||||
use Grav\Console\Gpm\InstallCommand;
|
||||
|
||||
/**
|
||||
* Class InstallCommandTest
|
||||
*/
|
||||
class InstallCommandTest extends \Codeception\TestCase\Test
|
||||
{
|
||||
/** @var Grav $grav */
|
||||
protected $grav;
|
||||
|
||||
/** @var InstallCommand */
|
||||
protected $installCommand;
|
||||
|
||||
|
||||
protected function _before(): void
|
||||
{
|
||||
$this->grav = Fixtures::get('grav');
|
||||
$this->installCommand = new InstallCommand();
|
||||
}
|
||||
|
||||
protected function _after(): void
|
||||
{
|
||||
}
|
||||
}
|
@@ -0,0 +1,48 @@
|
||||
<?php
|
||||
|
||||
use Grav\Framework\File\Formatter\CsvFormatter;
|
||||
|
||||
/**
|
||||
* Class CsvFormatterTest
|
||||
*/
|
||||
class CsvFormatterTest extends \Codeception\TestCase\Test
|
||||
{
|
||||
public function testEncodeWithAssocColumns(): void
|
||||
{
|
||||
$data = [
|
||||
['col1' => 1, 'col2' => 2, 'col3' => 3],
|
||||
['col1' => 'aaa', 'col2' => 'bbb', 'col3' => 'ccc'],
|
||||
];
|
||||
|
||||
$encoded = (new CsvFormatter())->encode($data);
|
||||
|
||||
$lines = array_filter(explode(PHP_EOL, $encoded));
|
||||
|
||||
self::assertCount(3, $lines);
|
||||
self::assertEquals('col1,col2,col3', $lines[0]);
|
||||
}
|
||||
|
||||
/**
|
||||
* TBD - If indexes are all numeric, what's the purpose
|
||||
* of displaying header
|
||||
*/
|
||||
public function testEncodeWithIndexColumns(): void
|
||||
{
|
||||
$data = [
|
||||
[0 => 1, 1 => 2, 2 => 3],
|
||||
];
|
||||
|
||||
$encoded = (new CsvFormatter())->encode($data);
|
||||
|
||||
$lines = array_filter(explode(PHP_EOL, $encoded));
|
||||
|
||||
self::assertCount(2, $lines);
|
||||
self::assertEquals('0,1,2', $lines[0]);
|
||||
}
|
||||
|
||||
public function testEncodeEmptyData(): void
|
||||
{
|
||||
$encoded = (new CsvFormatter())->encode([]);
|
||||
self::assertEquals('', $encoded);
|
||||
}
|
||||
}
|
338
tests/unit/Grav/Framework/Filesystem/FilesystemTest.php
Normal file
338
tests/unit/Grav/Framework/Filesystem/FilesystemTest.php
Normal file
@@ -0,0 +1,338 @@
|
||||
<?php
|
||||
|
||||
use Grav\Framework\Filesystem\Filesystem;
|
||||
|
||||
/**
|
||||
* Class FilesystemTest
|
||||
*/
|
||||
class FilesystemTest extends \Codeception\TestCase\Test
|
||||
{
|
||||
protected $class;
|
||||
|
||||
protected $tests = [
|
||||
'' => [
|
||||
'parent' => '',
|
||||
'normalize' => '',
|
||||
'dirname' => '',
|
||||
'pathinfo' => [
|
||||
'basename' => '',
|
||||
'filename' => '',
|
||||
]
|
||||
],
|
||||
'.' => [
|
||||
'parent' => '',
|
||||
'normalize' => '',
|
||||
'dirname' => '.',
|
||||
'pathinfo' => [
|
||||
'dirname' => '.',
|
||||
'basename' => '.',
|
||||
'extension' => '',
|
||||
'filename' => '',
|
||||
]
|
||||
],
|
||||
'./' => [
|
||||
'parent' => '',
|
||||
'normalize' => '',
|
||||
'dirname' => '.',
|
||||
'pathinfo' => [
|
||||
'dirname' => '.',
|
||||
'basename' => '.',
|
||||
'extension' => '',
|
||||
'filename' => '',
|
||||
]
|
||||
],
|
||||
'././.' => [
|
||||
'parent' => '',
|
||||
'normalize' => '',
|
||||
'dirname' => './.',
|
||||
'pathinfo' => [
|
||||
'dirname' => './.',
|
||||
'basename' => '.',
|
||||
'extension' => '',
|
||||
'filename' => '',
|
||||
]
|
||||
],
|
||||
'.file' => [
|
||||
'parent' => '.',
|
||||
'normalize' => '.file',
|
||||
'dirname' => '.',
|
||||
'pathinfo' => [
|
||||
'dirname' => '.',
|
||||
'basename' => '.file',
|
||||
'extension' => 'file',
|
||||
'filename' => '',
|
||||
]
|
||||
],
|
||||
'/' => [
|
||||
'parent' => '',
|
||||
'normalize' => '/',
|
||||
'dirname' => '/',
|
||||
'pathinfo' => [
|
||||
'dirname' => '/',
|
||||
'basename' => '',
|
||||
'filename' => '',
|
||||
]
|
||||
],
|
||||
'/absolute' => [
|
||||
'parent' => '/',
|
||||
'normalize' => '/absolute',
|
||||
'dirname' => '/',
|
||||
'pathinfo' => [
|
||||
'dirname' => '/',
|
||||
'basename' => 'absolute',
|
||||
'filename' => 'absolute',
|
||||
]
|
||||
],
|
||||
'/absolute/' => [
|
||||
'parent' => '/',
|
||||
'normalize' => '/absolute',
|
||||
'dirname' => '/',
|
||||
'pathinfo' => [
|
||||
'dirname' => '/',
|
||||
'basename' => 'absolute',
|
||||
'filename' => 'absolute',
|
||||
]
|
||||
],
|
||||
'/very/long/absolute/path' => [
|
||||
'parent' => '/very/long/absolute',
|
||||
'normalize' => '/very/long/absolute/path',
|
||||
'dirname' => '/very/long/absolute',
|
||||
'pathinfo' => [
|
||||
'dirname' => '/very/long/absolute',
|
||||
'basename' => 'path',
|
||||
'filename' => 'path',
|
||||
]
|
||||
],
|
||||
'/very/long/absolute/../path' => [
|
||||
'parent' => '/very/long',
|
||||
'normalize' => '/very/long/path',
|
||||
'dirname' => '/very/long/absolute/..',
|
||||
'pathinfo' => [
|
||||
'dirname' => '/very/long/absolute/..',
|
||||
'basename' => 'path',
|
||||
'filename' => 'path',
|
||||
]
|
||||
],
|
||||
'relative' => [
|
||||
'parent' => '.',
|
||||
'normalize' => 'relative',
|
||||
'dirname' => '.',
|
||||
'pathinfo' => [
|
||||
'dirname' => '.',
|
||||
'basename' => 'relative',
|
||||
'filename' => 'relative',
|
||||
]
|
||||
],
|
||||
'very/long/relative/path' => [
|
||||
'parent' => 'very/long/relative',
|
||||
'normalize' => 'very/long/relative/path',
|
||||
'dirname' => 'very/long/relative',
|
||||
'pathinfo' => [
|
||||
'dirname' => 'very/long/relative',
|
||||
'basename' => 'path',
|
||||
'filename' => 'path',
|
||||
]
|
||||
],
|
||||
'path/to/file.jpg' => [
|
||||
'parent' => 'path/to',
|
||||
'normalize' => 'path/to/file.jpg',
|
||||
'dirname' => 'path/to',
|
||||
'pathinfo' => [
|
||||
'dirname' => 'path/to',
|
||||
'basename' => 'file.jpg',
|
||||
'extension' => 'jpg',
|
||||
'filename' => 'file',
|
||||
]
|
||||
],
|
||||
'user://' => [
|
||||
'parent' => '',
|
||||
'normalize' => 'user://',
|
||||
'dirname' => 'user://',
|
||||
'pathinfo' => [
|
||||
'dirname' => 'user://',
|
||||
'basename' => '',
|
||||
'filename' => '',
|
||||
'scheme' => 'user',
|
||||
]
|
||||
],
|
||||
'user://.' => [
|
||||
'parent' => '',
|
||||
'normalize' => 'user://',
|
||||
'dirname' => 'user://',
|
||||
'pathinfo' => [
|
||||
'dirname' => 'user://',
|
||||
'basename' => '',
|
||||
'filename' => '',
|
||||
'scheme' => 'user',
|
||||
]
|
||||
],
|
||||
'user://././.' => [
|
||||
'parent' => '',
|
||||
'normalize' => 'user://',
|
||||
'dirname' => 'user://',
|
||||
'pathinfo' => [
|
||||
'dirname' => 'user://',
|
||||
'basename' => '',
|
||||
'filename' => '',
|
||||
'scheme' => 'user',
|
||||
]
|
||||
],
|
||||
'user://./././file' => [
|
||||
'parent' => 'user://',
|
||||
'normalize' => 'user://file',
|
||||
'dirname' => 'user://',
|
||||
'pathinfo' => [
|
||||
'dirname' => 'user://',
|
||||
'basename' => 'file',
|
||||
'filename' => 'file',
|
||||
'scheme' => 'user',
|
||||
]
|
||||
],
|
||||
'user://./././folder/file' => [
|
||||
'parent' => 'user://folder',
|
||||
'normalize' => 'user://folder/file',
|
||||
'dirname' => 'user://folder',
|
||||
'pathinfo' => [
|
||||
'dirname' => 'user://folder',
|
||||
'basename' => 'file',
|
||||
'filename' => 'file',
|
||||
'scheme' => 'user',
|
||||
]
|
||||
],
|
||||
'user://.file' => [
|
||||
'parent' => 'user://',
|
||||
'normalize' => 'user://.file',
|
||||
'dirname' => 'user://',
|
||||
'pathinfo' => [
|
||||
'dirname' => 'user://',
|
||||
'basename' => '.file',
|
||||
'extension' => 'file',
|
||||
'filename' => '',
|
||||
'scheme' => 'user',
|
||||
]
|
||||
],
|
||||
'user:///' => [
|
||||
'parent' => '',
|
||||
'normalize' => 'user:///',
|
||||
'dirname' => 'user:///',
|
||||
'pathinfo' => [
|
||||
'dirname' => 'user:///',
|
||||
'basename' => '',
|
||||
'filename' => '',
|
||||
'scheme' => 'user',
|
||||
]
|
||||
],
|
||||
'user:///absolute' => [
|
||||
'parent' => 'user:///',
|
||||
'normalize' => 'user:///absolute',
|
||||
'dirname' => 'user:///',
|
||||
'pathinfo' => [
|
||||
'dirname' => 'user:///',
|
||||
'basename' => 'absolute',
|
||||
'filename' => 'absolute',
|
||||
'scheme' => 'user',
|
||||
]
|
||||
],
|
||||
'user:///very/long/absolute/path' => [
|
||||
'parent' => 'user:///very/long/absolute',
|
||||
'normalize' => 'user:///very/long/absolute/path',
|
||||
'dirname' => 'user:///very/long/absolute',
|
||||
'pathinfo' => [
|
||||
'dirname' => 'user:///very/long/absolute',
|
||||
'basename' => 'path',
|
||||
'filename' => 'path',
|
||||
'scheme' => 'user',
|
||||
]
|
||||
],
|
||||
'user://relative' => [
|
||||
'parent' => 'user://',
|
||||
'normalize' => 'user://relative',
|
||||
'dirname' => 'user://',
|
||||
'pathinfo' => [
|
||||
'dirname' => 'user://',
|
||||
'basename' => 'relative',
|
||||
'filename' => 'relative',
|
||||
'scheme' => 'user',
|
||||
]
|
||||
],
|
||||
'user://very/long/relative/path' => [
|
||||
'parent' => 'user://very/long/relative',
|
||||
'normalize' => 'user://very/long/relative/path',
|
||||
'dirname' => 'user://very/long/relative',
|
||||
'pathinfo' => [
|
||||
'dirname' => 'user://very/long/relative',
|
||||
'basename' => 'path',
|
||||
'filename' => 'path',
|
||||
'scheme' => 'user',
|
||||
]
|
||||
],
|
||||
'user://path/to/file.jpg' => [
|
||||
'parent' => 'user://path/to',
|
||||
'normalize' => 'user://path/to/file.jpg',
|
||||
'dirname' => 'user://path/to',
|
||||
'pathinfo' => [
|
||||
'dirname' => 'user://path/to',
|
||||
'basename' => 'file.jpg',
|
||||
'extension' => 'jpg',
|
||||
'filename' => 'file',
|
||||
'scheme' => 'user',
|
||||
]
|
||||
],
|
||||
];
|
||||
|
||||
protected function _before(): void
|
||||
{
|
||||
$this->class = Filesystem::getInstance();
|
||||
}
|
||||
|
||||
protected function _after(): void
|
||||
{
|
||||
unset($this->class);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $tests
|
||||
* @param string $method
|
||||
*/
|
||||
protected function runTestSet(array $tests, $method): void
|
||||
{
|
||||
$class = $this->class;
|
||||
foreach ($tests as $path => $candidates) {
|
||||
if (!array_key_exists($method, $candidates)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$expected = $candidates[$method];
|
||||
|
||||
$result = $class->{$method}($path);
|
||||
|
||||
self::assertSame($expected, $result, "Test {$method}('{$path}')");
|
||||
|
||||
if (function_exists($method) && !strpos($path, '://')) {
|
||||
$cmp_result = $method($path);
|
||||
|
||||
self::assertSame($cmp_result, $result, "Compare to original {$method}('{$path}')");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function testParent(): void
|
||||
{
|
||||
$this->runTestSet($this->tests, 'parent');
|
||||
}
|
||||
|
||||
public function testNormalize(): void
|
||||
{
|
||||
$this->runTestSet($this->tests, 'normalize');
|
||||
}
|
||||
|
||||
public function testDirname(): void
|
||||
{
|
||||
$this->runTestSet($this->tests, 'dirname');
|
||||
}
|
||||
|
||||
public function testPathinfo(): void
|
||||
{
|
||||
$this->runTestSet($this->tests, 'pathinfo');
|
||||
}
|
||||
}
|
3
tests/unit/_bootstrap.php
Normal file
3
tests/unit/_bootstrap.php
Normal file
@@ -0,0 +1,3 @@
|
||||
<?php
|
||||
// Here you can initialize variables that will be available to your tests
|
||||
define('GRAV_CLI', true);
|
15
tests/unit/data/blueprints/strict.yaml
Normal file
15
tests/unit/data/blueprints/strict.yaml
Normal file
@@ -0,0 +1,15 @@
|
||||
form:
|
||||
validation: strict
|
||||
|
||||
fields:
|
||||
tabs:
|
||||
type: tabs
|
||||
fields:
|
||||
tab:
|
||||
type: tab
|
||||
fields:
|
||||
test:
|
||||
type: text
|
||||
label: Test
|
||||
validate:
|
||||
required: true
|
Reference in New Issue
Block a user