diff --git a/system/Common.php b/system/Common.php index 48bb5bddbe..61380b9ff7 100644 --- a/system/Common.php +++ b/system/Common.php @@ -440,8 +440,10 @@ if ( ! function_exists('log_message')) return $logger->log($level, $message, $context); } + // @codeCoverageIgnoreStart return Services::logger(true) ->log($level, $message, $context); + // @codeCoverageIgnoreEnd } } @@ -668,6 +670,9 @@ if ( ! function_exists('force_https')) * Defaults to 1 year. * @param RequestInterface $request * @param ResponseInterface $response + * + * Not testable, as it will exit! + * @codeCoverageIgnore */ function force_https(int $duration = 31536000, RequestInterface $request = null, ResponseInterface $response = null) { @@ -837,6 +842,8 @@ if ( ! function_exists('is_really_writable')) * @param string $file * * @return bool + * + * @codeCoverageIgnore Not practical to test, as travis runs on linux */ function is_really_writable($file) { @@ -931,6 +938,8 @@ if ( ! function_exists('function_usable')) * @param string $function_name Function to check for * @return bool TRUE if the function exists and is safe to call, * FALSE otherwise. + * + * @codeCoverageIgnore This is too exotic */ function function_usable($function_name) { @@ -959,6 +968,8 @@ if (! function_exists('dd')) * Prints a Kint debug report and exits. * * @param array ...$vars + * + * @codeCoverageIgnore Can't be tested ... exits */ function dd(...$vars) { diff --git a/tests/_support/View/Views/simple.php b/tests/_support/View/Views/simple.php new file mode 100644 index 0000000000..afd6c25fe2 --- /dev/null +++ b/tests/_support/View/Views/simple.php @@ -0,0 +1 @@ +

\ No newline at end of file diff --git a/tests/system/CommonFunctionsTest.php b/tests/system/CommonFunctionsTest.php index e5ac5b327c..0c88d29c25 100644 --- a/tests/system/CommonFunctionsTest.php +++ b/tests/system/CommonFunctionsTest.php @@ -1,5 +1,16 @@ assertEquals('baz', env('foo', 'baz')); - } + public function testEnvReturnsDefault() + { + $this->assertEquals('baz', env('foo', 'baz')); + } - public function testEnvGetsFromSERVER() - { - $_SERVER['foo'] = 'bar'; + public function testEnvGetsFromSERVER() + { + $_SERVER['foo'] = 'bar'; - $this->assertEquals('bar', env('foo', 'baz')); - } + $this->assertEquals('bar', env('foo', 'baz')); + } - public function testEnvGetsFromENV() - { - $_ENV['foo'] = 'bar'; + public function testEnvGetsFromENV() + { + $_ENV['foo'] = 'bar'; - $this->assertEquals('bar', env('foo', 'baz')); - } + $this->assertEquals('bar', env('foo', 'baz')); + } + + public function testEnvBooleans() + { + $_ENV['p1'] = 'true'; + $_ENV['p2'] = 'false'; + $_ENV['p3'] = 'empty'; + $_ENV['p4'] = 'null'; + + $this->assertTrue(env('p1')); + $this->assertFalse(env('p2')); + $this->assertEmpty(env('p3')); + $this->assertNull(env('p4')); + } + + // ------------------------------------------------------------------------ public function testRedirectReturnsRedirectResponse() { $_SERVER['REQUEST_METHOD'] = 'GET'; $response = $this->createMock(\CodeIgniter\HTTP\Response::class); - $routes = new \CodeIgniter\Router\RouteCollection(new \Tests\Support\Autoloader\MockFileLocator(new \Config\Autoload())); + $routes = new \CodeIgniter\Router\RouteCollection(new \Tests\Support\Autoloader\MockFileLocator(new \Config\Autoload())); \CodeIgniter\Services::injectMock('response', $response); \CodeIgniter\Services::injectMock('routes', $routes); $routes->add('home/base', 'Controller::index', ['as' => 'base']); $response->method('redirect') - ->will($this->returnArgument(0)); + ->will($this->returnArgument(0)); $this->assertInstanceOf(\CodeIgniter\HTTP\RedirectResponse::class, redirect('base')); - } + } + + public function testRedirectDefault() + { + $this->assertInstanceOf(\CodeIgniter\HTTP\RedirectResponse::class, redirect()); + } + + // ------------------------------------------------------------------------ + + public function testView() + { + $data = [ + 'testString' => 'bar', + 'bar' => 'baz', + ]; + $expected = '

bar

'; + $this->assertContains($expected, view('\Tests\Support\View\Views\simple', $data, [])); + } + + public function testViewSavedData() + { + $data = [ + 'testString' => 'bar', + 'bar' => 'baz', + ]; + $expected = '

bar

'; + $this->assertContains($expected, view('\Tests\Support\View\Views\simple', $data, ['saveData' => true])); + $this->assertContains($expected, view('\Tests\Support\View\Views\simple')); + } + + // ------------------------------------------------------------------------ + + public function testViewCell() + { + $expected = 'Hello'; + $this->assertEquals($expected, view_cell('\CodeIgniter\View\SampleClass::hello')); + } + + // ------------------------------------------------------------------------ + + public function testEscapeBadContext() + { + $this->expectException(InvalidArgumentException::class); + esc(['width' => '800', 'height' => '600'], 'bogus'); + } + + // ------------------------------------------------------------------------ + + public function testSessionInstance() + { + $this->assertInstanceOf(CodeIgniter\Session\Session::class, session()); + } + + public function testSessionVariable() + { + $_SESSION['notbogus'] = 'Hi there'; + $this->assertEquals('Hi there', session('notbogus')); + } + + public function testSessionVariableNotThere() + { + $_SESSION['bogus'] = 'Hi there'; + $this->assertEquals(null, session('notbogus')); + } + + // ------------------------------------------------------------------------ + + public function testSingleService() + { + $timer1 = single_service('timer'); + $timer2 = single_service('timer'); + $this->assertFalse($timer1 === $timer2); + } + + // ------------------------------------------------------------------------ + + public function testRouteTo() + { + // prime the pump + $routes = service('routes'); + $routes->add('path/(:any)/to/(:num)', 'myController::goto/$1/$2'); + + $this->assertEquals('/path/string/to/13', route_to('myController::goto', 'string', 13)); + } + + // ------------------------------------------------------------------------ + + public function testInvisible() + { + $this->assertEquals('Javascript', remove_invisible_characters("Java\0script")); + } + + public function testInvisibleEncoded() + { + $this->assertEquals('Javascript', remove_invisible_characters("Java%0cscript", true)); + } + + // ------------------------------------------------------------------------ + + public function testAppTimezone() + { + $this->assertEquals('America/Chicago', app_timezone()); + } + + // ------------------------------------------------------------------------ + + public function testCSRFToken() + { + $this->assertEquals('csrf_test_name', csrf_token()); + } + + public function testHash() + { + $this->assertEquals(32, strlen(csrf_hash())); + } + + public function testCSRFField() + { + $this->assertContains('config = new App(); + $this->config->baseURL = 'http://example.com'; + + $this->routes = new RouteCollection(new MockFileLocator(new Autoload())); + Services::injectMock('routes', $this->routes); + + $this->request = new MockIncomingRequest($this->config, new URI('http://example.com'), null, new UserAgent()); + Services::injectMock('request', $this->request); + + // setup & ask for a redirect... + $_SESSION = []; + $_GET = ['foo' => 'bar']; + $_POST = ['bar' => 'baz', 'zibble' => serialize('fritz')]; + + $response = new RedirectResponse(new App()); + $returned = $response->withInput(); + + $this->assertEquals('bar', old('foo')); // regular parameter + $this->assertEquals('doo', old('yabba dabba', 'doo')); // non-existing parameter + $this->assertEquals('fritz', old('zibble')); // serialized parameter + } + + // ------------------------------------------------------------------------ + + public function testReallyWritable() + { + // cannot test fully on *nix + $this->assertTrue(is_really_writable(WRITEPATH)); + } + + // ------------------------------------------------------------------------ + + public function testSlashItem() + { + $this->assertEquals('/', slash_item('cookiePath')); // slash already there + $this->assertEquals('', slash_item('cookieDomain')); // empty, so untouched + $this->assertEquals('en/', slash_item('defaultLocale')); // slash appended + } }