summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/Bootstrap.php13
-rw-r--r--tests/README.md77
-rw-r--r--tests/codeigniter/core/Common_test.php43
-rw-r--r--tests/codeigniter/core/Config_test.php176
-rw-r--r--tests/codeigniter/core/Input_test.php24
-rw-r--r--tests/codeigniter/core/Lang_test.php2
-rw-r--r--tests/codeigniter/core/Loader_test.php461
-rw-r--r--tests/codeigniter/core/Output_test.php37
-rw-r--r--tests/codeigniter/core/URI_test.php12
-rw-r--r--tests/codeigniter/database/DB_driver_test.php7
-rw-r--r--tests/codeigniter/database/query_builder/escape_test.php4
-rw-r--r--tests/codeigniter/database/query_builder/insert_test.php2
-rw-r--r--tests/codeigniter/database/query_builder/like_test.php16
-rw-r--r--tests/codeigniter/helpers/captcha_helper_test.php10
-rw-r--r--tests/codeigniter/helpers/cookie_helper_test.php59
-rw-r--r--tests/codeigniter/helpers/date_helper_test.php26
-rw-r--r--tests/codeigniter/helpers/directory_helper_test.php12
-rw-r--r--tests/codeigniter/helpers/download_helper_test.php10
-rw-r--r--tests/codeigniter/helpers/file_helper_test.php2
-rw-r--r--tests/codeigniter/helpers/form_helper_test.php52
-rw-r--r--tests/codeigniter/helpers/html_helper_test.php16
-rw-r--r--tests/codeigniter/helpers/language_helper_test.php16
-rw-r--r--tests/codeigniter/helpers/number_helper_test.php17
-rw-r--r--tests/codeigniter/helpers/path_helper_test.php1
-rw-r--r--tests/codeigniter/helpers/security_helper_test.php64
-rw-r--r--tests/codeigniter/helpers/text_helper_test.php1
-rw-r--r--tests/codeigniter/helpers/url_helper_test.php2
-rw-r--r--tests/codeigniter/libraries/Calendar_test.php201
-rw-r--r--tests/codeigniter/libraries/Driver_test.php177
-rw-r--r--tests/codeigniter/libraries/Encrypt_test.php33
-rw-r--r--tests/codeigniter/libraries/Parser_test.php8
-rw-r--r--tests/codeigniter/libraries/Session_test.php426
-rw-r--r--tests/codeigniter/libraries/Table_test.php8
-rw-r--r--tests/codeigniter/libraries/Typography_test.php8
-rw-r--r--tests/codeigniter/libraries/Upload_test.php274
-rw-r--r--tests/codeigniter/libraries/Useragent_test.php7
-rw-r--r--tests/mocks/autoloader.php46
-rw-r--r--tests/mocks/ci_testcase.php203
-rw-r--r--tests/mocks/ci_testconfig.php20
-rw-r--r--tests/mocks/core/common.php30
-rw-r--r--tests/mocks/core/input.php10
-rw-r--r--tests/mocks/core/loader.php31
-rw-r--r--tests/mocks/database/config/mysqli.php34
-rw-r--r--tests/mocks/database/config/pdo/mysql.php10
-rw-r--r--tests/mocks/database/config/pdo/pgsql.php6
-rw-r--r--tests/mocks/database/config/pdo/sqlite.php6
-rw-r--r--tests/mocks/database/db.php53
-rw-r--r--tests/mocks/database/db/driver.php1
-rw-r--r--tests/mocks/database/drivers/mysqli.php17
-rw-r--r--tests/mocks/database/schema/skeleton.php11
-rw-r--r--tests/mocks/libraries/driver.php27
-rw-r--r--tests/mocks/libraries/session.php36
-rw-r--r--tests/mocks/libraries/upload.php3
-rw-r--r--tests/mocks/uploads/ci_logo.gifbin0 -> 3270 bytes
-rw-r--r--tests/phpunit.xml7
-rw-r--r--tests/travis/mysql.phpunit.xml2
-rw-r--r--tests/travis/mysqli.phpunit.xml25
-rw-r--r--tests/travis/pdo/mysql.phpunit.xml2
-rw-r--r--tests/travis/pdo/pgsql.phpunit.xml2
-rw-r--r--tests/travis/pdo/sqlite.phpunit.xml2
-rw-r--r--tests/travis/pgsql.phpunit.xml2
-rw-r--r--tests/travis/sqlite.phpunit.xml2
62 files changed, 2607 insertions, 285 deletions
diff --git a/tests/Bootstrap.php b/tests/Bootstrap.php
index 5216038c6..8ce80b3fd 100644
--- a/tests/Bootstrap.php
+++ b/tests/Bootstrap.php
@@ -8,9 +8,7 @@ $dir = realpath(dirname(__FILE__));
// Path constants
defined('PROJECT_BASE') OR define('PROJECT_BASE', realpath($dir.'/../').'/');
-defined('BASEPATH') OR define('BASEPATH', PROJECT_BASE.'system/');
-defined('APPPATH') OR define('APPPATH', PROJECT_BASE.'application/');
-defined('VIEWPATH') OR define('VIEWPATH', PROJECT_BASE.'');
+defined('SYSTEM_PATH') OR define('SYSTEM_PATH', PROJECT_BASE.'system/');
// Get vfsStream either via PEAR or composer
foreach (explode(PATH_SEPARATOR, get_include_path()) as $path)
@@ -30,8 +28,17 @@ if ( ! class_exists('vfsStream') && file_exists(PROJECT_BASE.'vendor/autoload.ph
class_alias('org\bovigo\vfs\vfsStreamWrapper', 'vfsStreamWrapper');
}
+// Define CI path constants to VFS (filesystem setup in CI_TestCase::setUp)
+defined('BASEPATH') OR define('BASEPATH', vfsStream::url('system/'));
+defined('APPPATH') OR define('APPPATH', vfsStream::url('application/'));
+defined('VIEWPATH') OR define('VIEWPATH', APPPATH.'views/');
+
+// Set localhost "remote" IP
+isset($_SERVER['REMOTE_ADDR']) OR $_SERVER['REMOTE_ADDR'] = '127.0.0.1';
+
// Prep our test environment
include_once $dir.'/mocks/core/common.php';
+include_once SYSTEM_PATH.'core/Common.php';
include_once $dir.'/mocks/autoloader.php';
spl_autoload_register('autoload');
diff --git a/tests/README.md b/tests/README.md
index d600951ee..a5f89a2b1 100644
--- a/tests/README.md
+++ b/tests/README.md
@@ -64,6 +64,30 @@ with a base for application and package tests. That gives us:
3. Application Test - bootstrapping for application/tests [not started]
4. Package Test - bootstrapping for <package>/tests [not started]
+### Test Environment:
+
+The test/Bootstrap.php file establishes global constants such as BASEPATH,
+APPPATH, and VIEWPATH, initializing them to point to VFS locations. The
+test case class employs vfsStream to make a clean virtual filesystem with
+the necessary paths for every individual test.
+
+Within each test case, VFS directory objects are available to use as arguments
+to the VFS convenience functions (see below):
+
+- ci_vfs_root: VFS filesystem root
+- ci_app_root: Application directory
+- ci_base_root: System directory
+- ci_view_root: Views directory
+
+Classes being instantiated for testing are read from the actual filesystem
+by the unit test autoloader, as are mockups created in tests/mocks. If you
+need access to the real system directory, the SYSTEM_PATH constant always
+points to it.
+
+Any other resources which need to be read from the path constants must be
+created or cloned within your test. Functions for doing so are outlined
+below.
+
### CI_TestCase Documentation
Test cases should extend CI_TestCase. This internally extends
@@ -78,8 +102,14 @@ Current API is *not stable*. Names and implementations will change.
$this->ci_set_config($key, $val)
-Set the global config variables. If key is an array, it will
-replace the entire config array. They are _not_ merged.
+Set the global config variables in a mock Config object. If key is an array,
+it will replace the entire config array. They are _not_ merged. If called
+without any parameters, it will create the mock object but not set any values.
+The mock Config object also provides rudimentary item() and load() stubs for
+delivering configured values to classes being tested and handling config load
+calls, respectively. The load() stub does _not_ actually load any files, it
+only records the filename provided. Check the config->loaded array to verify
+calls made.
$this->ci_instance($obj)
@@ -103,11 +133,48 @@ $GLOBALS key. For example:
$cfg = new $cfg; // instantiates config and overwrites the CFG global
$this->ci_set_core_class($name, $obj)
-
+
An alternative way to set one of the core globals.
+ $this->ci_vfs_mkdir($name, $root)
+
+Creates a new directory in the test VFS. Pass a directory object to be the
+parent directory or none to create a root-level directory. Returns the new
+directory object.
+
+ $this->ci_vfs_create($file, $content, $root, $path)
+
+Creates a new VFS file. '.php' is automatically appended to the filename if
+it has no extension. Pass a directory object as the root, and an optional path
+to recurse and/or create for containing the file. Path may be a string (such
+as 'models/subdir') or an array (e.g. - array('models', 'subdir') ). Existing
+directories in the VFS root will be recursed until a new directory is
+identified - all others in the path will be created, so you can mix-and-match
+old and new directories. If $file is an array (key = name, value = content),
+multiple files will be created in the same path.
+
+ $this->ci_vfs_clone($path)
+
+Clones an existing file from the real filesystem to exist in the same path of
+the VFS. Path must be relative to the project root (i.e. - starting with
+'system' or 'application').
+
+ $this->ci_vfs_path($path, $base)
+
+Creates a VFS file path string suitable for use with PHP file operations. Path
+may be absolute from the VFS root, or relative to a base path. It is often
+useful to use APPPATH or BASEPATH as the base.
+
+ $this->helper($name)
+
+Loads a helper from the real filesystem.
+
+ $this->lang($name)
+
+Loads a language file from the real filesystem and returns the $lang array.
+
$this->ci_get_config() __internal__
-
+
Returns the global config array. Internal as you shouldn't need to
call this (you're setting it, after all). Used internally to make
CI's get_config() work.
@@ -155,4 +222,4 @@ I don't have a clue how this will work.
Needs to be able to handle packages
that are used multiple times within the application (i.e. EE/Pyro modules)
-as well as packages that are used by multiple applications (library distributions)
+as well as packages that are used by multiple applications (library distributions) \ No newline at end of file
diff --git a/tests/codeigniter/core/Common_test.php b/tests/codeigniter/core/Common_test.php
index f9bf6c27f..999b49cb3 100644
--- a/tests/codeigniter/core/Common_test.php
+++ b/tests/codeigniter/core/Common_test.php
@@ -2,12 +2,51 @@
class Common_test extends CI_TestCase {
- // ------------------------------------------------------------------------
-
public function test_is_php()
{
$this->assertEquals(TRUE, is_php('1.2.0'));
$this->assertEquals(FALSE, is_php('9999.9.9'));
}
+ // ------------------------------------------------------------------------
+
+ public function test_stringify_attributes()
+ {
+ $this->assertEquals(' class="foo" id="bar"', _stringify_attributes(array('class' => 'foo', 'id' => 'bar')));
+
+ $atts = new stdClass;
+ $atts->class = 'foo';
+ $atts->id = 'bar';
+ $this->assertEquals(' class="foo" id="bar"', _stringify_attributes($atts));
+
+ $atts = new stdClass;
+ $this->assertEquals('', _stringify_attributes($atts));
+
+ $this->assertEquals(' class="foo" id="bar"', _stringify_attributes('class="foo" id="bar"'));
+
+ $this->assertEquals('', _stringify_attributes(array()));
+ }
+
+ // ------------------------------------------------------------------------
+
+ public function test_stringify_js_attributes()
+ {
+ $this->assertEquals('width=800,height=600', _stringify_attributes(array('width' => '800', 'height' => '600'), TRUE));
+
+ $atts = new stdClass;
+ $atts->width = 800;
+ $atts->height = 600;
+ $this->assertEquals('width=800,height=600', _stringify_attributes($atts, TRUE));
+ }
+
+ // ------------------------------------------------------------------------
+
+ public function test_html_escape()
+ {
+ $this->assertEquals(
+ html_escape('Here is a string containing "quoted" text.'),
+ 'Here is a string containing &quot;quoted&quot; text.'
+ );
+ }
+
} \ No newline at end of file
diff --git a/tests/codeigniter/core/Config_test.php b/tests/codeigniter/core/Config_test.php
index 30cb90a28..be426d070 100644
--- a/tests/codeigniter/core/Config_test.php
+++ b/tests/codeigniter/core/Config_test.php
@@ -7,11 +7,12 @@ class Config_test extends CI_TestCase {
$cls =& $this->ci_core_class('cfg');
// set predictable config values
- $this->ci_set_config(array(
+ $this->cfg = array(
'index_page' => 'index.php',
- 'base_url' => 'http://example.com/',
+ 'base_url' => 'http://example.com/',
'subclass_prefix' => 'MY_'
- ));
+ );
+ $this->ci_set_config($this->cfg);
$this->config = new $cls;
}
@@ -20,7 +21,7 @@ class Config_test extends CI_TestCase {
public function test_item()
{
- $this->assertEquals('http://example.com/', $this->config->item('base_url'));
+ $this->assertEquals($this->cfg['base_url'], $this->config->item('base_url'));
// Bad Config value
$this->assertFalse($this->config->item('no_good_item'));
@@ -37,7 +38,6 @@ class Config_test extends CI_TestCase {
$this->assertFalse($this->config->item('not_yet_set'));
$this->config->set_item('not_yet_set', 'is set');
-
$this->assertEquals('is set', $this->config->item('not_yet_set'));
}
@@ -48,36 +48,101 @@ class Config_test extends CI_TestCase {
// Bad Config value
$this->assertFalse($this->config->slash_item('no_good_item'));
- $this->assertEquals('http://example.com/', $this->config->slash_item('base_url'));
+ $this->assertEquals($this->cfg['base_url'], $this->config->slash_item('base_url'));
+ $this->assertEquals($this->cfg['subclass_prefix'].'/', $this->config->slash_item('subclass_prefix'));
+ }
+
+ // --------------------------------------------------------------------
+
+ public function test_base_url()
+ {
+ // Test regular base URL
+ $base_url = $this->cfg['base_url'];
+ $this->assertEquals($base_url, $this->config->base_url());
+
+ // Test with URI
+ $uri = 'test';
+ $this->assertEquals($base_url.$uri, $this->config->base_url($uri));
+
+ // Clear base_url
+ $this->ci_set_config('base_url', '');
+
+ // Rerun constructor
+ $cls =& $this->ci_core_class('cfg');
+ $this->config = new $cls;
+
+ // Test default base
+ $this->assertEquals('http://localhost/', $this->config->base_url());
+
+ // Capture server vars
+ $old_host = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : NULL;
+ $old_script = isset($_SERVER['SCRIPT_NAME']) ? $_SERVER['SCRIPT_NAME'] : NULL;
+ $old_https = isset($_SERVER['HTTPS']) ? $_SERVER['HTTPS'] : NULL;
+
+ // Setup server vars for detection
+ $host = 'test.com';
+ $path = '/path/';
+ $script = 'base_test.php';
+ $_SERVER['HTTP_HOST'] = $host;
+ $_SERVER['SCRIPT_NAME'] = $path.$script;
+
+ // Rerun constructor
+ $this->config = new $cls;
+
+ // Test plain detected
+ $this->assertEquals('http://'.$host.$path, $this->config->base_url());
- $this->assertEquals('MY_/', $this->config->slash_item('subclass_prefix'));
+ // Rerun constructor
+ $_SERVER['HTTPS'] = 'on';
+ $this->config = new $cls;
+
+ // Test secure detected
+ $this->assertEquals('https://'.$host.$path, $this->config->base_url());
+
+ // Restore server vars
+ if ($old_host === NULL) unset($_SERVER['HTTP_HOST']);
+ else $_SERVER['HTTP_HOST'] = $old_host;
+ if ($old_script === NULL) unset($_SERVER['SCRIPT_NAME']);
+ else $_SERVER['SCRIPT_NAME'] = $old_script;
+ if ($old_https === NULL) unset($_SERVER['HTTPS']);
+ else $_SERVER['HTTPS'] = $old_https;
}
// --------------------------------------------------------------------
public function test_site_url()
{
- $this->assertEquals('http://example.com/index.php', $this->config->site_url());
-
- $base_url = $this->config->item('base_url');
+ $base_url = $this->cfg['base_url'];
+ $index_page = $this->cfg['index_page'];
+ $this->assertEquals($base_url.$index_page, $this->config->site_url());
+ $old_base = $this->config->item('base_url');
$this->config->set_item('base_url', '');
$q_string = $this->config->item('enable_query_strings');
-
$this->config->set_item('enable_query_strings', FALSE);
- $this->assertEquals('index.php/test', $this->config->site_url('test'));
- $this->assertEquals('index.php/test/1', $this->config->site_url(array('test', '1')));
+ $uri = 'test';
+ $uri2 = '1';
+ $this->assertEquals($index_page.'/'.$uri, $this->config->site_url($uri));
+ $this->assertEquals($index_page.'/'.$uri.'/'.$uri2, $this->config->site_url(array($uri, $uri2)));
+ $suffix = 'ing';
+ $this->config->set_item('url_suffix', $suffix);
+
+ $arg = 'pass';
+ $this->assertEquals($index_page.'/'.$uri.$suffix, $this->config->site_url($uri));
+ $this->assertEquals($index_page.'/'.$uri.$suffix.'?'.$arg, $this->config->site_url($uri.'?'.$arg));
+
+ $this->config->set_item('url_suffix', FALSE);
$this->config->set_item('enable_query_strings', TRUE);
- $this->assertEquals('index.php?test', $this->config->site_url('test'));
- $this->assertEquals('index.php?0=test&1=1', $this->config->site_url(array('test', '1')));
+ $this->assertEquals($index_page.'?'.$uri, $this->config->site_url($uri));
+ $this->assertEquals($index_page.'?0='.$uri.'&1='.$uri2, $this->config->site_url(array($uri, $uri2)));
- $this->config->set_item('base_url', $base_url);
+ $this->config->set_item('base_url', $old_base);
- $this->assertEquals('http://example.com/index.php?test', $this->config->site_url('test'));
+ $this->assertEquals($base_url.$index_page.'?'.$uri, $this->config->site_url($uri));
// back to home base
$this->config->set_item('enable_query_strings', $q_string);
@@ -87,7 +152,82 @@ class Config_test extends CI_TestCase {
public function test_system_url()
{
- $this->assertEquals('http://example.com/system/', $this->config->system_url());
+ $this->assertEquals($this->cfg['base_url'].'system/', $this->config->system_url());
+ }
+
+ // --------------------------------------------------------------------
+
+ public function test_load()
+ {
+ // Test regular load
+ $file = 'test.php';
+ $key = 'testconfig';
+ $val = 'my_value';
+ $cfg = array($key => $val);
+ $this->ci_vfs_create($file, '<?php $config = '.var_export($cfg, TRUE).';', $this->ci_app_root, 'config');
+ $this->assertTrue($this->config->load($file));
+ $this->assertEquals($val, $this->config->item($key));
+
+ // Test reload - value should not change
+ $val2 = 'new_value';
+ $cfg = array($key => $val2);
+ $this->ci_vfs_create($file, '<?php $config = '.var_export($cfg, TRUE).';', $this->ci_app_root, 'config');
+ $this->assertTrue($this->config->load($file));
+ $this->assertEquals($val, $this->config->item($key));
+
+ // Test section load
+ $file = 'secttest';
+ $cfg = array(
+ 'one' => 'prime',
+ 'two' => 2,
+ 'three' => true
+ );
+ $this->ci_vfs_create($file.'.php', '<?php $config = '.var_export($cfg, TRUE).';', $this->ci_app_root, 'config');
+ $this->assertTrue($this->config->load($file, TRUE));
+ $this->assertEquals($cfg, $this->config->item($file));
+
+ // Test section merge
+ $cfg2 = array(
+ 'three' => 'tres',
+ 'number' => 42,
+ 'letter' => 'Z'
+ );
+ $pkg_dir = 'package';
+ $this->ci_vfs_create($file.'.php', '<?php $config = '.var_export($cfg2, TRUE).';', $this->ci_app_root,
+ array($pkg_dir, 'config'));
+ array_push($this->config->_config_paths, $this->ci_vfs_path($pkg_dir.'/', APPPATH));
+ $this->assertTrue($this->config->load($file, TRUE));
+ $this->assertEquals(array_merge($cfg, $cfg2), $this->config->item($file));
+ array_pop($this->config->_config_paths);
+
+ // Test graceful fail of invalid file
+ $file = 'badfile';
+ $this->ci_vfs_create($file, '', $this->ci_app_root, 'config');
+ $this->assertFalse($this->config->load($file, FALSE, TRUE));
+
+ // Test regular fail of invalid file
+ $this->setExpectedException(
+ 'RuntimeException',
+ 'CI Error: Your '.$this->ci_vfs_path('config/'.$file.'.php', APPPATH).
+ ' file does not appear to contain a valid configuration array.'
+ );
+ $this->assertNull($this->config->load($file));
+ }
+
+ // --------------------------------------------------------------------
+
+ public function test_load_nonexistent()
+ {
+ // Test graceful fail of nonexistent file
+ $this->assertFalse($this->config->load('not_config_file', FALSE, TRUE));
+
+ // Test regular fail
+ $file = 'absentia';
+ $this->setExpectedException(
+ 'RuntimeException',
+ 'CI Error: The configuration file '.$file.'.php does not exist.'
+ );
+ $this->assertNull($this->config->load($file));
}
} \ No newline at end of file
diff --git a/tests/codeigniter/core/Input_test.php b/tests/codeigniter/core/Input_test.php
index fe8738832..ca1c6dfd7 100644
--- a/tests/codeigniter/core/Input_test.php
+++ b/tests/codeigniter/core/Input_test.php
@@ -22,18 +22,7 @@ class Input_test extends CI_TestCase {
public function test_get_not_exists()
{
- $this->assertEmpty($this->input->get());
- $this->assertEmpty($this->input->get('foo'));
-
- $this->assertTrue( ! $this->input->get());
- $this->assertTrue( ! $this->input->get('foo'));
-
- // Test we're getting empty results
- $this->assertTrue($this->input->get() === NULL);
- $this->assertTrue($this->input->get('foo') === NULL);
-
- // Test new 3.0 behaviour for non existant results (used to be FALSE)
- $this->assertTrue($this->input->get() === NULL);
+ $this->assertTrue($this->input->get() === array());
$this->assertTrue($this->input->get('foo') === NULL);
}
@@ -64,16 +53,7 @@ class Input_test extends CI_TestCase {
public function test_post_not_exists()
{
- $this->assertEmpty($this->input->post());
- $this->assertEmpty($this->input->post('foo'));
-
- $this->assertTrue( ! $this->input->post());
- $this->assertTrue( ! $this->input->post('foo'));
-
- $this->assertTrue($this->input->post() === NULL);
- $this->assertTrue($this->input->post('foo') === NULL);
-
- $this->assertTrue($this->input->post() === NULL);
+ $this->assertTrue($this->input->post() === array());
$this->assertTrue($this->input->post('foo') === NULL);
}
diff --git a/tests/codeigniter/core/Lang_test.php b/tests/codeigniter/core/Lang_test.php
index a410dabfa..3364362e0 100644
--- a/tests/codeigniter/core/Lang_test.php
+++ b/tests/codeigniter/core/Lang_test.php
@@ -17,6 +17,7 @@ class Lang_test extends CI_TestCase {
public function test_load()
{
+ $this->ci_vfs_clone('system/language/english/profiler_lang.php');
$this->assertTrue($this->lang->load('profiler', 'english'));
$this->assertEquals('URI STRING', $this->lang->line('profiler_uri_string'));
}
@@ -25,6 +26,7 @@ class Lang_test extends CI_TestCase {
public function test_load_with_unspecified_language()
{
+ $this->ci_vfs_clone('system/language/english/profiler_lang.php');
$this->assertTrue($this->lang->load('profiler'));
$this->assertEquals('URI STRING', $this->lang->line('profiler_uri_string'));
}
diff --git a/tests/codeigniter/core/Loader_test.php b/tests/codeigniter/core/Loader_test.php
index fdea962b7..ecc5ca933 100644
--- a/tests/codeigniter/core/Loader_test.php
+++ b/tests/codeigniter/core/Loader_test.php
@@ -7,92 +7,187 @@ class Loader_test extends CI_TestCase {
public function set_up()
{
// Instantiate a new loader
- $this->load = new Mock_Core_Loader();
+ $loader = $this->ci_core_class('loader');
+ $this->load = new $loader();
- // mock up a ci instance
- $this->ci_obj = new stdClass;
+ // Get CI instance
+ $this->ci_obj = $this->ci_instance();
- // Fix get_instance()
- $this->ci_instance($this->ci_obj);
+ // Set subclass prefix
+ $this->prefix = 'MY_';
+ $this->ci_set_config('subclass_prefix', $this->prefix);
}
// --------------------------------------------------------------------
public function test_library()
{
- $this->_setup_config_mock();
+ // Create library in VFS
+ $lib = 'unit_test_lib';
+ $class = 'CI_'.ucfirst($lib);
+ $this->ci_vfs_create($lib, '<?php class '.$class.' { }', $this->ci_base_root, 'libraries');
+
+ // Test is_loaded fail
+ $this->assertFalse($this->load->is_loaded($lib));
// Test loading as an array.
- $this->assertNull($this->load->library(array('table')));
- $this->assertTrue(class_exists('CI_Table'), 'Table class exists');
- $this->assertAttributeInstanceOf('CI_Table', 'table', $this->ci_obj);
+ $this->assertNull($this->load->library(array($lib)));
+ $this->assertTrue(class_exists($class), $class.' does not exist');
+ $this->assertAttributeInstanceOf($class, $lib, $this->ci_obj);
// Test no lib given
- $this->assertEquals(FALSE, $this->load->library());
+ $this->assertNull($this->load->library());
// Test a string given to params
- $this->assertEquals(NULL, $this->load->library('table', ' '));
+ $this->assertNull($this->load->library($lib, ' '));
+
+ // Create library w/o class
+ $lib = 'bad_test_lib';
+ $this->ci_vfs_create($lib, '', $this->ci_base_root, 'libraries');
+
+ // Test non-existent class
+ $this->setExpectedException(
+ 'RuntimeException',
+ 'CI Error: Non-existent class: '.$lib
+ );
+ $this->assertNull($this->load->library($lib));
}
// --------------------------------------------------------------------
- public function test_load_library_in_application_dir()
+ public function test_library_extension()
{
- $this->_setup_config_mock();
+ // Create library and extension in VFS
+ $name = 'ext_test_lib';
+ $lib = ucfirst($name);
+ $class = 'CI_'.$lib;
+ $ext = $this->prefix.$lib;
+ $this->ci_vfs_create($lib, '<?php class '.$class.' { }', $this->ci_base_root, 'libraries');
+ $this->ci_vfs_create($ext, '<?php class '.$ext.' extends '.$class.' { }', $this->ci_app_root, 'libraries');
+
+ // Test loading with extension
+ $this->assertNull($this->load->library($lib));
+ $this->assertTrue(class_exists($class), $class.' does not exist');
+ $this->assertTrue(class_exists($ext), $ext.' does not exist');
+ $this->assertAttributeInstanceOf($class, $name, $this->ci_obj);
+ $this->assertAttributeInstanceOf($ext, $name, $this->ci_obj);
+
+ // Test reloading with object name
+ $obj = 'exttest';
+ $this->assertNull($this->load->library($lib, NULL, $obj));
+ $this->assertAttributeInstanceOf($class, $obj, $this->ci_obj);
+ $this->assertAttributeInstanceOf($ext, $obj, $this->ci_obj);
+
+ // Test reloading
+ unset($this->ci_obj->$name);
+ $this->assertNull($this->load->library($lib));
+ $this->assertObjectNotHasAttribute($name, $this->ci_obj);
+
+ // Create baseless library
+ $name = 'ext_baseless_lib';
+ $lib = ucfirst($name);
+ $class = $this->prefix.$lib;
+ $this->ci_vfs_create($class, '<?php class '.$class.' { }', $this->ci_app_root, 'libraries');
+
+ // Test missing base class
+ $this->setExpectedException(
+ 'RuntimeException',
+ 'CI Error: Unable to load the requested class: '.$lib
+ );
+ $this->assertNull($this->load->library($lib));
+ }
- $content = '<?php class Super_test_library {} ';
+ // --------------------------------------------------------------------
- $model = vfsStream::newFile('Super_test_library.php')->withContent($content)->at($this->load->libs_dir);
- $this->assertNull($this->load->library('super_test_library'));
+ public function test_library_config()
+ {
+ // Create library in VFS
+ $lib = 'unit_test_config_lib';
+ $class = 'CI_'.ucfirst($lib);
+ $content = '<?php class '.$class.' { public function __construct($params) { $this->config = $params; } }';
+ $this->ci_vfs_create($lib, $content, $this->ci_base_root, 'libraries');
+
+ // Create config file
+ $cfg = array(
+ 'foo' => 'bar',
+ 'bar' => 'baz',
+ 'baz' => false
+ );
+ $this->ci_vfs_create($lib, '<?php $config = '.var_export($cfg, TRUE).';', $this->ci_app_root, 'config');
- // Was the model class instantiated.
- $this->assertTrue(class_exists('Super_test_library'));
+ // Test object name and config
+ $obj = 'testy';
+ $this->assertNull($this->load->library($lib, NULL, $obj));
+ $this->assertTrue(class_exists($class), $class.' does not exist');
+ $this->assertAttributeInstanceOf($class, $obj, $this->ci_obj);
+ $this->assertEquals($cfg, $this->ci_obj->$obj->config);
+
+ // Test is_loaded
+ $this->assertEquals($obj, $this->load->is_loaded($lib));
}
// --------------------------------------------------------------------
- private function _setup_config_mock()
+ public function test_load_library_in_application_dir()
{
- // Mock up a config object until we
- // figure out how to test the library configs
- $config = $this->getMock('CI_Config', NULL, array(), '', FALSE);
- $config->expects($this->any())
- ->method('load')
- ->will($this->returnValue(TRUE));
+ // Create library in VFS
+ $lib = 'super_test_library';
+ $class = ucfirst($lib);
+ $this->ci_vfs_create($lib, '<?php class '.$class.' { }', $this->ci_app_root, 'libraries');
+
+ // Load library
+ $this->assertNull($this->load->library($lib));
- // Add the mock to our stdClass
- $this->ci_instance_var('config', $config);
+ // Was the model class instantiated.
+ $this->assertTrue(class_exists($class), $class.' does not exist');
+ $this->assertAttributeInstanceOf($class, $lib, $this->ci_obj);
}
// --------------------------------------------------------------------
- public function test_non_existent_model()
+ public function test_driver()
{
- $this->setExpectedException(
- 'RuntimeException',
- 'CI Error: Unable to locate the model you have specified: ci_test_nonexistent_model.php'
- );
+ // Create driver in VFS
+ $driver = 'unit_test_driver';
+ $dir = ucfirst($driver);
+ $class = 'CI_'.$dir;
+ $content = '<?php class '.$class.' { } ';
+ $this->ci_vfs_create($driver, $content, $this->ci_base_root, 'libraries/'.$dir);
- $this->load->model('ci_test_nonexistent_model.php');
+ // Test loading as an array.
+ $this->assertNull($this->load->driver(array($driver)));
+ $this->assertTrue(class_exists($class), $class.' does not exist');
+ $this->assertAttributeInstanceOf($class, $driver, $this->ci_obj);
+
+ // Test loading as a library with a name
+ $obj = 'testdrive';
+ $this->assertNull($this->load->library($driver, NULL, $obj));
+ $this->assertAttributeInstanceOf($class, $obj, $this->ci_obj);
+
+ // Test no driver given
+ $this->assertFalse($this->load->driver());
+
+ // Test a string given to params
+ $this->assertNull($this->load->driver($driver, ' '));
}
// --------------------------------------------------------------------
- /**
- * @coverts CI_Loader::model
- */
public function test_models()
{
$this->ci_set_core_class('model', 'CI_Model');
- $content = '<?php class Unit_test_model extends CI_Model {} ';
+ // Create model in VFS
+ $model = 'unit_test_model';
+ $class = ucfirst($model);
+ $content = '<?php class '.$class.' extends CI_Model {} ';
+ $this->ci_vfs_create($model, $content, $this->ci_app_root, 'models');
- $model = vfsStream::newFile('unit_test_model.php')->withContent($content)->at($this->load->models_dir);
-
- $this->assertNull($this->load->model('unit_test_model'));
+ // Load model
+ $this->assertNull($this->load->model($model));
// Was the model class instantiated.
- $this->assertTrue(class_exists('Unit_test_model'));
+ $this->assertTrue(class_exists($class));
// Test no model given
$this->assertNull($this->load->model(''));
@@ -100,36 +195,85 @@ class Loader_test extends CI_TestCase {
// --------------------------------------------------------------------
+ public function test_model_subdir()
+ {
+ // Make sure base class is loaded - we'll test _ci_include later
+ $this->ci_core_class('model');
+
+ // Create modelin VFS
+ $model = 'test_sub_model';
+ $base = 'CI_Model';
+ $class = ucfirst($model);
+ $subdir = 'cars';
+ $this->ci_vfs_create($model, '<?php class '.$class.' extends '.$base.' { }', $this->ci_app_root,
+ array('models', $subdir));
+
+ // Load model
+ $name = 'testors';
+ $this->assertNull($this->load->model($subdir.'/'.$model, $name));
+
+ // Was the model class instantiated?
+ $this->assertTrue(class_exists($class));
+ $this->assertObjectHasAttribute($name, $this->ci_obj);
+ $this->assertAttributeInstanceOf($base, $name, $this->ci_obj);
+ $this->assertAttributeInstanceOf($class, $name, $this->ci_obj);
+
+ // Test name conflict
+ $obj = 'conflict';
+ $this->ci_obj->$obj = new StdClass();
+ $this->setExpectedException(
+ 'RuntimeException',
+ 'CI Error: The model name you are loading is the name of a resource that is already being used: '.$obj
+ );
+ $this->load->model('not_real', $obj);
+ }
+
+ // --------------------------------------------------------------------
+
+ public function test_non_existent_model()
+ {
+ $this->setExpectedException(
+ 'RuntimeException',
+ 'CI Error: Unable to locate the model you have specified: ci_test_nonexistent_model.php'
+ );
+
+ $this->load->model('ci_test_nonexistent_model.php');
+ }
+
+ // --------------------------------------------------------------------
+
// public function testDatabase()
// {
- // $this->assertEquals(NULL, $this->load->database());
- // $this->assertEquals(NULL, $this->load->dbutil());
+ // $this->assertNull($this->load->database());
+ // $this->assertNull($this->load->dbutil());
// }
// --------------------------------------------------------------------
- /**
- * @coverts CI_Loader::view
- */
public function test_load_view()
{
- $this->ci_set_core_class('output', 'CI_Output');
-
- $content = 'This is my test page. <?php echo $hello; ?>';
- $view = vfsStream::newFile('unit_test_view.php')->withContent($content)->at($this->load->views_dir);
-
- // Use the optional return parameter in this test, so the view is not
- // run through the output class.
- $this->assertEquals('This is my test page. World!',
- $this->load->view('unit_test_view', array('hello' => "World!"), TRUE));
-
+ // Create view in VFS
+ $view = 'unit_test_view';
+ $var = 'hello';
+ $value = 'World!';
+ $content = 'This is my test page. ';
+ $this->ci_vfs_create($view, $content.'<?php echo $'.$var.';', $this->ci_app_root, 'views');
+
+ // Test returning view
+ $out = $this->load->view($view, array($var => $value), TRUE);
+ $this->assertEquals($content.$value, $out);
+
+ // Mock output class
+ $output = $this->getMock('CI_Output', array('append_output'));
+ $output->expects($this->once())->method('append_output')->with($content.$value);
+ $this->ci_instance_var('output', $output);
+
+ // Test view output
+ $this->assertNull($this->load->view($view, array($var => $value)));
}
// --------------------------------------------------------------------
- /**
- * @coverts CI_Loader::view
- */
public function test_non_existent_view()
{
$this->setExpectedException(
@@ -144,14 +288,17 @@ class Loader_test extends CI_TestCase {
public function test_file()
{
+ // Create view in VFS
+ $dir = 'views';
+ $file = 'ci_test_mock_file';
$content = 'Here is a test file, which we will load now.';
- $file = vfsStream::newFile('ci_test_mock_file.php')->withContent($content)->at($this->load->views_dir);
+ $this->ci_vfs_create($file, $content, $this->ci_app_root, $dir);
// Just like load->view(), take the output class out of the mix here.
- $load = $this->load->file(vfsStream::url('application').'/views/ci_test_mock_file.php', TRUE);
-
- $this->assertEquals($content, $load);
+ $out = $this->load->file(APPPATH.$dir.'/'.$file.'.php', TRUE);
+ $this->assertEquals($content, $out);
+ // Test non-existent file
$this->setExpectedException(
'RuntimeException',
'CI Error: Unable to load the requested file: ci_test_file_not_exists'
@@ -164,21 +311,56 @@ class Loader_test extends CI_TestCase {
public function test_vars()
{
- $this->assertNull($this->load->vars(array('foo' => 'bar')));
- $this->assertNull($this->load->vars('foo', 'bar'));
+ $key1 = 'foo';
+ $val1 = 'bar';
+ $key2 = 'boo';
+ $val2 = 'hoo';
+ $this->assertNull($this->load->vars(array($key1 => $val1)));
+ $this->assertNull($this->load->vars($key2, $val2));
+ $this->assertEquals($val1, $this->load->get_var($key1));
+ $this->assertEquals(array($key1 => $val1, $key2 => $val2), $this->load->get_vars());
}
// --------------------------------------------------------------------
public function test_helper()
{
- $this->assertEquals(NULL, $this->load->helper('array'));
+ // Create helper in VFS
+ $helper = 'test';
+ $func = '_my_helper_test_func';
+ $content = '<?php function '.$func.'() { return true; } ';
+ $this->ci_vfs_create($helper.'_helper', $content, $this->ci_base_root, 'helpers');
+
+ // Create helper extension
+ $exfunc = '_my_extension_func';
+ $content = '<?php function '.$exfunc.'() { return true; } ';
+ $this->ci_vfs_create($this->prefix.$helper.'_helper', $content, $this->ci_app_root, 'helpers');
+
+ // Load helper
+ $this->assertNull($this->load->helper($helper));
+ $this->assertTrue(function_exists($func), $func.' does not exist');
+ $this->assertTrue(function_exists($exfunc), $exfunc.' does not exist');
+
+ // Create baseless extension
+ $ext = 'bad_ext';
+ $this->ci_vfs_create($this->prefix.$ext.'_helper', '', $this->ci_app_root, 'helpers');
+
+ // Test bad extension
+ $this->setExpectedException(
+ 'RuntimeException',
+ 'CI Error: Unable to load the requested file: helpers/'.$ext.'_helper.php'
+ );
+ $this->load->helper($ext);
+ }
+
+ // --------------------------------------------------------------------
+ public function test_non_existent_helper()
+ {
$this->setExpectedException(
'RuntimeException',
'CI Error: Unable to load the requested file: helpers/bad_helper.php'
);
-
$this->load->helper('bad');
}
@@ -186,36 +368,153 @@ class Loader_test extends CI_TestCase {
public function test_loading_multiple_helpers()
{
- $this->assertEquals(NULL, $this->load->helpers(array('file', 'array', 'string')));
+ // Create helpers in VFS
+ $helpers = array();
+ $funcs = array();
+ $files = array();
+ for ($i = 1; $i <= 3; ++$i) {
+ $helper = 'test'.$i;
+ $helpers[] = $helper;
+ $func = '_my_helper_test_func'.$i;
+ $funcs[] = $func;
+ $files[$helper.'_helper'] = '<?php function '.$func.'() { return true; } ';
+ }
+ $this->ci_vfs_create($files, NULL, $this->ci_base_root, 'helpers');
+
+ // Load helpers
+ $this->assertNull($this->load->helpers($helpers));
+
+ // Verify helper existence
+ foreach ($funcs as $func) {
+ $this->assertTrue(function_exists($func), $func.' does not exist');
+ }
}
// --------------------------------------------------------------------
- // public function testLanguage()
- // {
- // $this->assertEquals(NULL, $this->load->language('test'));
- // }
+ public function test_language()
+ {
+ // Mock lang class and test load call
+ $file = 'test';
+ $lang = $this->getMock('CI_Lang', array('load'));
+ $lang->expects($this->once())->method('load')->with($file);
+ $this->ci_instance_var('lang', $lang);
+ $this->assertNull($this->load->language($file));
+ }
// --------------------------------------------------------------------
- public function test_load_config()
+ public function test_packages()
{
- $this->_setup_config_mock();
- $this->assertNull($this->load->config('config', FALSE));
+ // Create model in VFS package path
+ $dir = 'third-party';
+ $lib = 'unit_test_package';
+ $class = 'CI_'.ucfirst($lib);
+ $this->ci_vfs_create($lib, '<?php class '.$class.' { }', $this->ci_app_root, array($dir, 'libraries'));
+
+ // Get paths
+ $paths = $this->load->get_package_paths(TRUE);
+
+ // Add path and verify
+ $path = APPPATH.$dir.'/';
+ $this->assertNull($this->load->add_package_path($path));
+ $this->assertContains($path, $this->load->get_package_paths(TRUE));
+
+ // Test successful load
+ $this->assertNull($this->load->library($lib));
+ $this->assertTrue(class_exists($class), $class.' does not exist');
+
+ // Add another path
+ $path2 = APPPATH.'another/';
+ $this->assertNull($this->load->add_package_path($path2));
+ $this->assertContains($path2, $this->load->get_package_paths(TRUE));
+
+ // Remove last path
+ $this->assertNull($this->load->remove_package_path());
+ $this->assertNotContains($path2, $this->load->get_package_paths(TRUE));
+
+ // Remove path and verify restored paths
+ $this->assertNull($this->load->remove_package_path($path));
+ $this->assertEquals($paths, $this->load->get_package_paths(TRUE));
+
+ // Test failed load without path
+ $this->setExpectedException(
+ 'RuntimeException',
+ 'CI Error: Unable to load the requested class: '.$lib
+ );
+ $this->load->library($lib);
}
// --------------------------------------------------------------------
- public function test_load_bad_config()
+ public function test_load_config()
{
- $this->_setup_config_mock();
+ $cfg = 'someconfig';
+ $this->assertTrue($this->load->config($cfg, FALSE));
+ $this->assertContains($cfg, $this->ci_obj->config->loaded);
+ }
- $this->setExpectedException(
- 'RuntimeException',
- 'CI Error: The configuration file foobar.php does not exist.'
+ // --------------------------------------------------------------------
+
+ public function test_initialize()
+ {
+ // Create helper in VFS
+ $helper = 'autohelp';
+ $hlp_func = '_autohelp_test_func';
+ $content = '<?php function '.$hlp_func.'() { return true; }';
+ $this->ci_vfs_create($helper.'_helper', $content, $this->ci_app_root, 'helpers');
+
+ // Create library in VFS
+ $lib = 'autolib';
+ $lib_class = 'CI_'.ucfirst($lib);
+ $this->ci_vfs_create($lib, '<?php class '.$lib_class.' { }', $this->ci_base_root, 'libraries');
+
+ // Create driver in VFS
+ $drv = 'autodrv';
+ $subdir = ucfirst($drv);
+ $drv_class = 'CI_'.$subdir;
+ $this->ci_vfs_create($drv, '<?php class '.$drv_class.' { }', $this->ci_base_root, array('libraries', $subdir));
+
+ // Create model in VFS package path
+ $dir = 'testdir';
+ $path = APPPATH.$dir.'/';
+ $model = 'automod';
+ $mod_class = ucfirst($model);
+ $this->ci_vfs_create($model, '<?php class '.$mod_class.' { }', $this->ci_app_root, array($dir, 'models'));
+
+ // Create autoloader config
+ $cfg = array(
+ 'packages' => array($path),
+ 'helper' => array($helper),
+ 'libraries' => array($lib),
+ 'drivers' => array($drv),
+ 'model' => array($model),
+ 'config' => array('config1', 'config2')
);
+ $this->ci_vfs_create('autoload', '<?php $autoload = '.var_export($cfg, TRUE).';', $this->ci_app_root, 'config');
+
+ $this->load->initialize();
+
+ // Verify path
+ $this->assertContains($path, $this->load->get_package_paths());
+
+ // Verify helper
+ $this->assertTrue(function_exists($hlp_func), $hlp_func.' does not exist');
+
+ // Verify library
+ $this->assertTrue(class_exists($lib_class), $lib_class.' does not exist');
+ $this->assertAttributeInstanceOf($lib_class, $lib, $this->ci_obj);
+
+ // Verify driver
+ $this->assertTrue(class_exists($drv_class), $drv_class.' does not exist');
+ $this->assertAttributeInstanceOf($drv_class, $drv, $this->ci_obj);
+
+ // Verify model
+ $this->assertTrue(class_exists($mod_class), $mod_class.' does not exist');
+ $this->assertAttributeInstanceOf($mod_class, $model, $this->ci_obj);
- $this->load->config('foobar', FALSE);
+ // Verify config calls
+ $this->assertEquals($cfg['config'], $this->ci_obj->config->loaded);
}
} \ No newline at end of file
diff --git a/tests/codeigniter/core/Output_test.php b/tests/codeigniter/core/Output_test.php
new file mode 100644
index 000000000..d8252403d
--- /dev/null
+++ b/tests/codeigniter/core/Output_test.php
@@ -0,0 +1,37 @@
+<?php
+
+class Output_test extends CI_TestCase {
+
+ public $output;
+
+ public function set_up()
+ {
+ $this->ci_set_config('charset', 'UTF-8');
+ $output = $this->ci_core_class('output');
+ $this->output = new $output();
+ }
+
+ // --------------------------------------------------------------------
+
+ public function test_get_content_type()
+ {
+ $this->assertEquals('text/html', $this->output->get_content_type());
+ }
+
+ // --------------------------------------------------------------------
+
+ public function test_get_header()
+ {
+ $this->assertNull($this->output->get_header('Non-Existent-Header'));
+
+ // TODO: Find a way to test header() values as well. Currently,
+ // PHPUnit prevents this by not using output buffering.
+
+ $this->output->set_content_type('text/plain', 'WINDOWS-1251');
+ $this->assertEquals(
+ 'text/plain; charset=windows-1251', // Character set is converted to lowercase
+ $this->output->get_header('content-type') // Case-insensitive comparison
+ );
+ }
+
+} \ No newline at end of file
diff --git a/tests/codeigniter/core/URI_test.php b/tests/codeigniter/core/URI_test.php
index 60ed1a4e9..e2deabe51 100644
--- a/tests/codeigniter/core/URI_test.php
+++ b/tests/codeigniter/core/URI_test.php
@@ -40,13 +40,13 @@ class URI_test extends CI_TestCase {
'/index.php?/controller/method/?var=foo' => 'controller/method'
);
- foreach($requests as $request => $expected)
+ foreach ($requests as $request => $expected)
{
$_SERVER['SCRIPT_NAME'] = '/index.php';
$_SERVER['REQUEST_URI'] = $request;
$this->uri->_fetch_uri_string();
- $this->assertEquals($expected, $this->uri->uri_string );
+ $this->assertEquals($expected, $this->uri->uri_string);
}
// Test a subfolder
@@ -60,10 +60,10 @@ class URI_test extends CI_TestCase {
unset($_SERVER['REQUEST_URI']);
// life to path info
- $_SERVER['PATH_INFO'] = $a = '/controller/method/';
+ $_SERVER['PATH_INFO'] = '/controller/method/';
$this->uri->_fetch_uri_string();
- $this->assertEquals($a, $this->uri->uri_string);
+ $this->assertEquals('controller/method', $this->uri->uri_string);
// death to path info
// At this point your server must be seriously drunk
@@ -72,7 +72,7 @@ class URI_test extends CI_TestCase {
$_SERVER['QUERY_STRING'] = '/controller/method/';
$this->uri->_fetch_uri_string();
- $this->assertEquals($a, $this->uri->uri_string);
+ $this->assertEquals('controller/method', $this->uri->uri_string);
// At this point your server is a labotomy victim
unset($_SERVER['QUERY_STRING']);
@@ -80,7 +80,7 @@ class URI_test extends CI_TestCase {
$_GET['/controller/method/'] = '';
$this->uri->_fetch_uri_string();
- $this->assertEquals($a, $this->uri->uri_string);
+ $this->assertEquals('controller/method', $this->uri->uri_string);
// Test coverage implies that these will work
// uri_protocol: REQUEST_URI
diff --git a/tests/codeigniter/database/DB_driver_test.php b/tests/codeigniter/database/DB_driver_test.php
index 9e16e29b4..c04c42b09 100644
--- a/tests/codeigniter/database/DB_driver_test.php
+++ b/tests/codeigniter/database/DB_driver_test.php
@@ -5,7 +5,7 @@ class DB_driver_test extends CI_TestCase {
public function test_initialize()
{
$config = Mock_Database_DB::config(DB_DRIVER);
- $driver_name = current(explode('/', DB_DRIVER));
+ sscanf(DB_DRIVER, '%[^/]/', $driver_name);
$driver = $this->$driver_name($config[DB_DRIVER]);
$this->assertTrue($driver->initialize());
@@ -21,6 +21,11 @@ class DB_driver_test extends CI_TestCase {
return new Mock_Database_Drivers_Mysql($config);
}
+ protected function mysqli($config)
+ {
+ return new Mock_Database_Drivers_Mysqli($config);
+ }
+
protected function sqlite($config)
{
return new Mock_Database_Drivers_Sqlite($config);
diff --git a/tests/codeigniter/database/query_builder/escape_test.php b/tests/codeigniter/database/query_builder/escape_test.php
index c6380ddf1..27e678f22 100644
--- a/tests/codeigniter/database/query_builder/escape_test.php
+++ b/tests/codeigniter/database/query_builder/escape_test.php
@@ -27,7 +27,7 @@ class Escape_test extends CI_TestCase {
if (strpos(DB_DRIVER, 'mysql') !== FALSE)
{
- $sql = "SELECT `value` FROM `misc` WHERE `key` LIKE '$string%' ESCAPE '';";
+ $sql = "SELECT `value` FROM `misc` WHERE `key` LIKE '$string%' ESCAPE '!';";
}
else
{
@@ -52,7 +52,7 @@ class Escape_test extends CI_TestCase {
if (strpos(DB_DRIVER, 'mysql') !== FALSE)
{
- $sql = "SELECT `value` FROM `misc` WHERE `key` LIKE '$string%' ESCAPE '';";
+ $sql = "SELECT `value` FROM `misc` WHERE `key` LIKE '$string%' ESCAPE '!';";
}
else
{
diff --git a/tests/codeigniter/database/query_builder/insert_test.php b/tests/codeigniter/database/query_builder/insert_test.php
index a9aafb66e..30c055680 100644
--- a/tests/codeigniter/database/query_builder/insert_test.php
+++ b/tests/codeigniter/database/query_builder/insert_test.php
@@ -52,7 +52,7 @@ class Insert_test extends CI_TestCase {
// Do insert batch except for sqlite driver
if (strpos(DB_DRIVER, 'sqlite') === FALSE)
{
- $this->assertTrue($this->db->insert_batch('job', $job_datas));
+ $this->assertEquals(2, $this->db->insert_batch('job', $job_datas));
$job_2 = $this->db->where('id', 2)->get('job')->row();
$job_3 = $this->db->where('id', 3)->get('job')->row();
diff --git a/tests/codeigniter/database/query_builder/like_test.php b/tests/codeigniter/database/query_builder/like_test.php
index 5f3e52228..2736fbe0b 100644
--- a/tests/codeigniter/database/query_builder/like_test.php
+++ b/tests/codeigniter/database/query_builder/like_test.php
@@ -87,4 +87,20 @@ class Like_test extends CI_TestCase {
$this->assertEquals('Musician', $jobs[2]['name']);
}
+ // ------------------------------------------------------------------------
+
+ /**
+ * GitHub issue #273
+ *
+ * @see ./mocks/schema/skeleton.php
+ */
+ public function test_like_spaces_and_tabs()
+ {
+ $spaces = $this->db->like('value', ' ')->get('misc')->result_array();
+ $tabs = $this->db->like('value', "\t")->get('misc')->result_array();
+
+ $this->assertEquals(1, count($spaces));
+ $this->assertEquals(1, count($tabs));
+ }
+
} \ No newline at end of file
diff --git a/tests/codeigniter/helpers/captcha_helper_test.php b/tests/codeigniter/helpers/captcha_helper_test.php
new file mode 100644
index 000000000..fc86305e3
--- /dev/null
+++ b/tests/codeigniter/helpers/captcha_helper_test.php
@@ -0,0 +1,10 @@
+<?php
+
+class Captcha_helper_test extends CI_TestCase {
+
+ public function test_create_captcha()
+ {
+ $this->markTestSkipped('Cant easily test');
+ }
+
+} \ No newline at end of file
diff --git a/tests/codeigniter/helpers/cookie_helper_test.php b/tests/codeigniter/helpers/cookie_helper_test.php
new file mode 100644
index 000000000..fba68f20f
--- /dev/null
+++ b/tests/codeigniter/helpers/cookie_helper_test.php
@@ -0,0 +1,59 @@
+<?php
+
+class Cookie_helper_test extends CI_TestCase {
+
+ public function set_up()
+ {
+ $this->helper('cookie');
+ }
+
+ // ------------------------------------------------------------------------
+
+ function test_set_cookie()
+ {
+ /*$input_cls = $this->ci_core_class('input');
+ $this->ci_instance_var('input', new $input_cls);
+
+ $this->assertTrue(set_cookie(
+ 'my_cookie',
+ 'foobar'
+ ));*/
+
+ $this->markTestSkipped('Need to find a way to overcome a headers already set exception');
+ }
+
+ // ------------------------------------------------------------------------
+
+ function test_get_cookie()
+ {
+ $_COOKIE['foo'] = 'bar';
+
+ $security = new Mock_Core_Security();
+ $utf8 = new Mock_Core_Utf8();
+ $input_cls = $this->ci_core_class('input');
+ $this->ci_instance_var('input', new Mock_Core_Input($security, $utf8));
+
+ $this->assertEquals('bar', get_cookie('foo', FALSE));
+ $this->assertEquals('bar', get_cookie('foo', TRUE));
+
+ $_COOKIE['bar'] = "Hello, i try to <script>alert('Hack');</script> your site";
+
+ $this->assertEquals("Hello, i try to [removed]alert&#40;'Hack'&#41;;[removed] your site", get_cookie('bar', TRUE));
+ $this->assertEquals("Hello, i try to <script>alert('Hack');</script> your site", get_cookie('bar', FALSE));
+ }
+
+ // ------------------------------------------------------------------------
+
+ function test_delete_cookie()
+ {
+ /*$input_cls = $this->ci_core_class('input');
+ $this->ci_instance_var('input', new $input_cls);
+
+ $this->assertTrue(delete_cookie(
+ 'my_cookie'
+ ));*/
+
+ $this->markTestSkipped('Need to find a way to overcome a headers already set exception');
+ }
+
+} \ No newline at end of file
diff --git a/tests/codeigniter/helpers/date_helper_test.php b/tests/codeigniter/helpers/date_helper_test.php
index 1b79b9480..0f16e6c49 100644
--- a/tests/codeigniter/helpers/date_helper_test.php
+++ b/tests/codeigniter/helpers/date_helper_test.php
@@ -5,7 +5,6 @@ class Date_helper_test extends CI_TestCase {
public function set_up()
{
$this->helper('date');
-
$this->time = time();
}
@@ -168,6 +167,8 @@ class Date_helper_test extends CI_TestCase {
public function test_timespan()
{
+ $this->ci_vfs_clone('system/language/english/date_lang.php');
+
$loader_cls = $this->ci_core_class('load');
$this->ci_instance_var('load', new $loader_cls);
@@ -290,6 +291,29 @@ class Date_helper_test extends CI_TestCase {
$this->assertEquals(0, timezones('non_existant'));
}
+ // ------------------------------------------------------------------------
+
+ public function test_date_range()
+ {
+ $dates = array(
+ '29-01-2012', '30-01-2012', '31-01-2012',
+ '01-02-2012', '02-02-2012', '03-02-2012',
+ '04-02-2012', '05-02-2012', '06-02-2012',
+ '07-02-2012', '08-02-2012', '09-02-2012',
+ '10-02-2012', '11-02-2012', '12-02-2012',
+ '13-02-2012', '14-02-2012', '15-02-2012',
+ '16-02-2012', '17-02-2012', '18-02-2012',
+ '19-02-2012', '20-02-2012', '21-02-2012',
+ '22-02-2012', '23-02-2012', '24-02-2012',
+ '25-02-2012', '26-02-2012', '27-02-2012',
+ '28-02-2012', '29-02-2012', '01-03-2012'
+ );
+
+ $this->assertEquals($dates, date_range(mktime(12, 0, 0, 1, 29, 2012), mktime(12, 0, 0, 3, 1, 2012), TRUE, 'd-m-Y'));
+ array_pop($dates);
+ $this->assertEquals($dates, date_range(mktime(12, 0, 0, 1, 29, 2012), 31, FALSE, 'd-m-Y'));
+ }
+
}
/* End of file date_helper_test.php */ \ No newline at end of file
diff --git a/tests/codeigniter/helpers/directory_helper_test.php b/tests/codeigniter/helpers/directory_helper_test.php
index 176ff1d78..41370e6e7 100644
--- a/tests/codeigniter/helpers/directory_helper_test.php
+++ b/tests/codeigniter/helpers/directory_helper_test.php
@@ -19,6 +19,7 @@ class Directory_helper_test extends CI_TestCase {
'benchmark.html' => '',
'database' => array('active_record.html' => '', 'binds.html' => ''),
'email.html' => '',
+ '0' => '',
'.hiddenfile.txt' => ''
)
);
@@ -27,22 +28,23 @@ class Directory_helper_test extends CI_TestCase {
// test default recursive behavior
$expected = array(
- 'libraries' => array(
+ 'libraries/' => array(
'benchmark.html',
- 'database' => array('active_record.html', 'binds.html'),
- 'email.html'
+ 'database/' => array('active_record.html', 'binds.html'),
+ 'email.html',
+ '0'
)
);
$this->assertEquals($expected, directory_map(vfsStream::url('testDir')));
// test detection of hidden files
- $expected['libraries'][] = '.hiddenfile.txt';
+ $expected['libraries/'][] = '.hiddenfile.txt';
$this->assertEquals($expected, directory_map(vfsStream::url('testDir'), FALSE, TRUE));
// test recursion depth behavior
- $this->assertEquals(array('libraries'), directory_map(vfsStream::url('testDir'), 1));
+ $this->assertEquals(array('libraries/'), directory_map(vfsStream::url('testDir'), 1));
}
}
diff --git a/tests/codeigniter/helpers/download_helper_test.php b/tests/codeigniter/helpers/download_helper_test.php
new file mode 100644
index 000000000..d2b42e46b
--- /dev/null
+++ b/tests/codeigniter/helpers/download_helper_test.php
@@ -0,0 +1,10 @@
+<?php
+
+class Download_helper_test extends CI_TestCase {
+
+ public function test_force_download()
+ {
+ $this->markTestSkipped('Cant easily test');
+ }
+
+} \ No newline at end of file
diff --git a/tests/codeigniter/helpers/file_helper_test.php b/tests/codeigniter/helpers/file_helper_test.php
index 9b03da9d7..3a6c73a5c 100644
--- a/tests/codeigniter/helpers/file_helper_test.php
+++ b/tests/codeigniter/helpers/file_helper_test.php
@@ -148,6 +148,4 @@ class File_helper_Test extends CI_TestCase {
//
// }
- // --------------------------------------------------------------------
-
} \ No newline at end of file
diff --git a/tests/codeigniter/helpers/form_helper_test.php b/tests/codeigniter/helpers/form_helper_test.php
index 1a30ed993..89165271e 100644
--- a/tests/codeigniter/helpers/form_helper_test.php
+++ b/tests/codeigniter/helpers/form_helper_test.php
@@ -1,10 +1,14 @@
<?php
-require BASEPATH . 'core/Common.php';
-require BASEPATH . 'helpers/form_helper.php';
-
class Form_helper_test extends CI_TestCase
{
+ public function set_up()
+ {
+ $this->helper('form');
+ }
+
+ // ------------------------------------------------------------------------
+
public function test_form_hidden()
{
$expected = <<<EOH
@@ -16,6 +20,8 @@ EOH;
$this->assertEquals($expected, form_hidden('username', 'johndoe'));
}
+ // ------------------------------------------------------------------------
+
public function test_form_input()
{
$expected = <<<EOH
@@ -35,6 +41,8 @@ EOH;
$this->assertEquals($expected, form_input($data));
}
+ // ------------------------------------------------------------------------
+
public function test_form_password()
{
$expected = <<<EOH
@@ -45,6 +53,8 @@ EOH;
$this->assertEquals($expected, form_password('password'));
}
+ // ------------------------------------------------------------------------
+
public function test_form_upload()
{
$expected = <<<EOH
@@ -55,6 +65,8 @@ EOH;
$this->assertEquals($expected, form_upload('attachment'));
}
+ // ------------------------------------------------------------------------
+
public function test_form_textarea()
{
$expected = <<<EOH
@@ -65,6 +77,8 @@ EOH;
$this->assertEquals($expected, form_textarea('notes', 'Notes'));
}
+ // ------------------------------------------------------------------------
+
public function test_form_dropdown()
{
$expected = <<<EOH
@@ -128,6 +142,8 @@ EOH;
$this->assertEquals($expected, form_dropdown('cars', $options, array('volvo', 'audi')));
}
+ // ------------------------------------------------------------------------
+
public function test_form_multiselect()
{
$expected = <<<EOH
@@ -150,6 +166,8 @@ EOH;
$this->assertEquals($expected, form_multiselect('shirts[]', $options, array('med', 'large')));
}
+ // ------------------------------------------------------------------------
+
public function test_form_fieldset()
{
$expected = <<<EOH
@@ -161,6 +179,8 @@ EOH;
$this->assertEquals($expected, form_fieldset('Address Information'));
}
+ // ------------------------------------------------------------------------
+
public function test_form_fieldset_close()
{
$expected = <<<EOH
@@ -170,6 +190,8 @@ EOH;
$this->assertEquals($expected, form_fieldset_close('</div></div>'));
}
+ // ------------------------------------------------------------------------
+
public function test_form_checkbox()
{
$expected = <<<EOH
@@ -180,6 +202,8 @@ EOH;
$this->assertEquals($expected, form_checkbox('newsletter', 'accept', TRUE));
}
+ // ------------------------------------------------------------------------
+
public function test_form_radio()
{
$expected = <<<EOH
@@ -190,6 +214,8 @@ EOH;
$this->assertEquals($expected, form_radio('newsletter', 'accept', TRUE));
}
+ // ------------------------------------------------------------------------
+
public function test_form_submit()
{
$expected = <<<EOH
@@ -200,6 +226,8 @@ EOH;
$this->assertEquals($expected, form_submit('mysubmit', 'Submit Post!'));
}
+ // ------------------------------------------------------------------------
+
public function test_form_label()
{
$expected = <<<EOH
@@ -209,6 +237,8 @@ EOH;
$this->assertEquals($expected, form_label('What is your Name', 'username'));
}
+ // ------------------------------------------------------------------------
+
public function test_form_reset()
{
$expected = <<<EOH
@@ -219,6 +249,8 @@ EOH;
$this->assertEquals($expected, form_reset('myreset', 'Reset'));
}
+ // ------------------------------------------------------------------------
+
public function test_form_button()
{
$expected = <<<EOH
@@ -229,6 +261,8 @@ EOH;
$this->assertEquals($expected, form_button('name', 'content'));
}
+ // ------------------------------------------------------------------------
+
public function test_form_close()
{
$expected = <<<EOH
@@ -238,11 +272,19 @@ EOH;
$this->assertEquals($expected, form_close('</div></div>'));
}
+ // ------------------------------------------------------------------------
+
public function test_form_prep()
{
- $expected = 'Here is a string containing &quot;quoted&quot; text.';
+ $this->assertEquals(
+ 'Here is a string containing &quot;quoted&quot; text.',
+ form_prep('Here is a string containing "quoted" text.')
+ );
- $this->assertEquals($expected, form_prep('Here is a string containing "quoted" text.'));
+ $this->assertEquals(
+ 'Here is a string containing a &lt;tag&gt;.',
+ form_prep('Here is a string containing a <tag>.', TRUE)
+ );
}
}
diff --git a/tests/codeigniter/helpers/html_helper_test.php b/tests/codeigniter/helpers/html_helper_test.php
index 9a7bb48bf..d66ad895c 100644
--- a/tests/codeigniter/helpers/html_helper_test.php
+++ b/tests/codeigniter/helpers/html_helper_test.php
@@ -22,6 +22,22 @@ class Html_helper_test extends CI_TestCase {
$this->assertEquals('<h2 class="bar">foobar</h2>', heading('foobar', 2, 'class="bar"'));
}
+ public function test_heading_array_attributes()
+ {
+ // Test array of attributes
+ $this->assertEquals('<h2 class="bar" id="foo">foobar</h2>', heading('foobar', 2, array('class' => 'bar', 'id' => 'foo')));
+ }
+
+ public function test_heading_object_attributes()
+ {
+ // Test array of attributes
+ $this->assertEquals('<h2 class="bar" id="foo">foobar</h2>', heading('foobar', 2, array('class' => 'bar', 'id' => 'foo')));
+ $test = new stdClass;
+ $test->class = "bar";
+ $test->id = "foo";
+ $this->assertEquals('<h2 class="bar" id="foo">foobar</h2>', heading('foobar', 2, $test));
+ }
+
// ------------------------------------------------------------------------
public function test_Ul()
diff --git a/tests/codeigniter/helpers/language_helper_test.php b/tests/codeigniter/helpers/language_helper_test.php
new file mode 100644
index 000000000..176da689a
--- /dev/null
+++ b/tests/codeigniter/helpers/language_helper_test.php
@@ -0,0 +1,16 @@
+<?php
+
+class Language_helper_test extends CI_TestCase {
+
+ public function test_lang()
+ {
+ $this->helper('language');
+ $lang = $this->getMock('CI_Lang', array('line'));
+ $lang->expects($this->any())->method('line')->will($this->returnValue(FALSE));
+ $this->ci_instance_var('lang', $lang);
+
+ $this->assertFalse(lang(1));
+ $this->assertEquals('<label for="foo" class="bar"></label>', lang(1, 'foo', array('class' => 'bar')));
+ }
+
+} \ No newline at end of file
diff --git a/tests/codeigniter/helpers/number_helper_test.php b/tests/codeigniter/helpers/number_helper_test.php
index ef6aae138..817db2c7e 100644
--- a/tests/codeigniter/helpers/number_helper_test.php
+++ b/tests/codeigniter/helpers/number_helper_test.php
@@ -11,31 +11,18 @@ class Number_helper_test extends CI_TestCase {
// Mock away load, too much going on in there,
// we'll just check for the expected parameter
-
$lang = $this->getMock($lang_cls, array('load'));
$lang->expects($this->once())
->method('load')
->with($this->equalTo('number'));
// Assign the proper language array
-
- $lang->language = $this->_get_lang('number');
+ $lang->language = $this->lang('number');
// We don't have a controller, so just create
// a cheap class to act as our super object.
// Make sure it has a lang attribute.
-
- $obj = new stdClass;
- $obj->lang = $lang;
- $this->ci_instance($obj);
- }
-
- // Quick helper to actually grab the language
- // file. Consider moving this to ci_testcase?
- public function _get_lang($name)
- {
- require BASEPATH.'language/english/'.$name.'_lang.php';
- return $lang;
+ $this->ci_instance_var('lang', $lang);
}
public function test_byte_format()
diff --git a/tests/codeigniter/helpers/path_helper_test.php b/tests/codeigniter/helpers/path_helper_test.php
index 0faf6f383..d25c3ed9b 100644
--- a/tests/codeigniter/helpers/path_helper_test.php
+++ b/tests/codeigniter/helpers/path_helper_test.php
@@ -26,6 +26,7 @@ class Path_helper_test extends CI_TestCase {
set_realpath('/path/to/nowhere', TRUE);
}
+
}
/* End of file path_helper_test.php */ \ No newline at end of file
diff --git a/tests/codeigniter/helpers/security_helper_test.php b/tests/codeigniter/helpers/security_helper_test.php
new file mode 100644
index 000000000..effd3ec02
--- /dev/null
+++ b/tests/codeigniter/helpers/security_helper_test.php
@@ -0,0 +1,64 @@
+<?php
+
+class Security_helper_tests extends CI_TestCase {
+
+ function setUp()
+ {
+ $this->helper('security');
+ $obj = new stdClass;
+ $obj->security = new Mock_Core_Security();
+ $this->ci_instance($obj);
+ }
+
+ function test_xss_clean()
+ {
+ $this->assertEquals('foo', xss_clean('foo'));
+
+ $this->assertEquals("Hello, i try to [removed]alert&#40;'Hack'&#41;;[removed] your site", xss_clean("Hello, i try to <script>alert('Hack');</script> your site"));
+ }
+
+ function test_sanitize_filename()
+ {
+ $this->assertEquals('hello.doc', sanitize_filename('hello.doc'));
+
+ $filename = './<!--foo-->';
+ $this->assertEquals('foo', sanitize_filename($filename));
+ }
+
+ function test_do_hash()
+ {
+ $md5 = md5('foo');
+ $sha1 = sha1('foo');
+
+ $algos = hash_algos();
+ $algo_results = array();
+ foreach ($algos as $k => $v)
+ {
+ $algo_results[$v] = hash($v, 'foo');
+ }
+
+ $this->assertEquals($sha1, do_hash('foo'));
+ $this->assertEquals($sha1, do_hash('foo', 'sha1'));
+ $this->assertEquals($md5, do_hash('foo', 'md5'));
+ $this->assertEquals($md5, do_hash('foo', 'foobar'));
+
+ // Test each algorithm available to PHP
+ foreach ($algo_results as $algo => $result)
+ {
+ $this->assertEquals($result, do_hash('foo', $algo));
+ }
+ }
+
+ function test_strip_image_tags()
+ {
+ $this->assertEquals('http://example.com/spacer.gif', strip_image_tags('http://example.com/spacer.gif'));
+
+ $this->assertEquals('http://example.com/spacer.gif', strip_image_tags('<img src="http://example.com/spacer.gif" alt="Who needs CSS when you have a spacer.gif?" />'));
+ }
+
+ function test_encode_php_tags()
+ {
+ $this->assertEquals('&lt;? echo $foo; ?&gt;', encode_php_tags('<? echo $foo; ?>'));
+ }
+
+} \ No newline at end of file
diff --git a/tests/codeigniter/helpers/text_helper_test.php b/tests/codeigniter/helpers/text_helper_test.php
index f131469cb..d75d26208 100644
--- a/tests/codeigniter/helpers/text_helper_test.php
+++ b/tests/codeigniter/helpers/text_helper_test.php
@@ -64,6 +64,7 @@ class Text_helper_test extends CI_TestCase {
public function test_convert_accented_characters()
{
+ $this->ci_vfs_clone('application/config/foreign_chars.php');
$this->assertEquals('AAAeEEEIIOOEUUUeY', convert_accented_characters('ÀÂÄÈÊËÎÏÔŒÙÛÜŸ'));
$this->assertEquals('a e i o u n ue', convert_accented_characters('á é í ó ú ñ ü'));
}
diff --git a/tests/codeigniter/helpers/url_helper_test.php b/tests/codeigniter/helpers/url_helper_test.php
index c81c5f1b8..5fc364238 100644
--- a/tests/codeigniter/helpers/url_helper_test.php
+++ b/tests/codeigniter/helpers/url_helper_test.php
@@ -51,6 +51,8 @@ class Url_helper_test extends CI_TestCase {
'www.codeigniter.com test' => '<a href="http://www.codeigniter.com">http://www.codeigniter.com</a> test',
'This is my noreply@codeigniter.com test' => 'This is my noreply@codeigniter.com test',
'<br />www.google.com' => '<br /><a href="http://www.google.com">http://www.google.com</a>',
+ 'Download CodeIgniter at www.codeigniter.com. Period test.' => 'Download CodeIgniter at <a href="http://www.codeigniter.com">http://www.codeigniter.com</a>. Period test.',
+ 'Download CodeIgniter at www.codeigniter.com, comma test' => 'Download CodeIgniter at <a href="http://www.codeigniter.com">http://www.codeigniter.com</a>, comma test'
);
foreach ($strings as $in => $out)
diff --git a/tests/codeigniter/libraries/Calendar_test.php b/tests/codeigniter/libraries/Calendar_test.php
new file mode 100644
index 000000000..952e8a8d2
--- /dev/null
+++ b/tests/codeigniter/libraries/Calendar_test.php
@@ -0,0 +1,201 @@
+<?php
+
+class Calendar_test extends CI_TestCase {
+
+ function set_up()
+ {
+ $lang = $this->getMock('CI_Lang', array('load', 'line'));
+ $lang->expects($this->any())->method('line')->will($this->returnValue(FALSE));
+ $this->ci_instance_var('lang', $lang);
+ $this->calendar = new CI_Calendar();
+ }
+
+ function test_initialize()
+ {
+ $this->calendar->initialize(array(
+ 'month_type' => 'short',
+ 'start_day' => 'monday'
+ ));
+ $this->assertEquals('short', $this->calendar->month_type);
+ $this->assertEquals('monday', $this->calendar->start_day);
+ }
+
+ function test_generate()
+ {
+ $no_events = '<table border="0" cellpadding="4" cellspacing="0">
+
+<tr>
+<th colspan="7">September&nbsp;2011</th>
+
+</tr>
+
+<tr>
+<td>Su</td><td>Mo</td><td>Tu</td><td>We</td><td>Th</td><td>Fr</td><td>Sa</td>
+</tr>
+
+<tr>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td><td>2</td><td>3</td>
+</tr>
+
+<tr>
+<td>4</td><td>5</td><td>6</td><td>7</td><td>8</td><td>9</td><td>10</td>
+</tr>
+
+<tr>
+<td>11</td><td>12</td><td>13</td><td>14</td><td>15</td><td>16</td><td>17</td>
+</tr>
+
+<tr>
+<td>18</td><td>19</td><td>20</td><td>21</td><td>22</td><td>23</td><td>24</td>
+</tr>
+
+<tr>
+<td>25</td><td>26</td><td>27</td><td>28</td><td>29</td><td>30</td><td>&nbsp;</td>
+</tr>
+
+</table>';
+
+ $this->assertEquals($no_events, $this->calendar->generate(2011, 9));
+
+ $data = array(
+ 3 => 'http://example.com/news/article/2006/03/',
+ 7 => 'http://example.com/news/article/2006/07/',
+ 13 => 'http://example.com/news/article/2006/13/',
+ 26 => 'http://example.com/news/article/2006/26/'
+ );
+
+ $events = '<table border="0" cellpadding="4" cellspacing="0">
+
+<tr>
+<th colspan="7">September&nbsp;2011</th>
+
+</tr>
+
+<tr>
+<td>Su</td><td>Mo</td><td>Tu</td><td>We</td><td>Th</td><td>Fr</td><td>Sa</td>
+</tr>
+
+<tr>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td><td>2</td><td><a href="http://example.com/news/article/2006/03/">3</a></td>
+</tr>
+
+<tr>
+<td>4</td><td>5</td><td>6</td><td><a href="http://example.com/news/article/2006/07/">7</a></td><td>8</td><td>9</td><td>10</td>
+</tr>
+
+<tr>
+<td>11</td><td>12</td><td><a href="http://example.com/news/article/2006/13/">13</a></td><td>14</td><td>15</td><td>16</td><td>17</td>
+</tr>
+
+<tr>
+<td>18</td><td>19</td><td>20</td><td>21</td><td>22</td><td>23</td><td>24</td>
+</tr>
+
+<tr>
+<td>25</td><td><a href="http://example.com/news/article/2006/26/">26</a></td><td>27</td><td>28</td><td>29</td><td>30</td><td>&nbsp;</td>
+</tr>
+
+</table>';
+
+ $this->assertEquals($events, $this->calendar->generate(2011, 9, $data));
+ }
+
+ function test_get_month_name()
+ {
+ $this->calendar->month_type = NULL;
+ $this->assertEquals('January', $this->calendar->get_month_name('01'));
+
+ $this->calendar->month_type = 'short';
+ $this->assertEquals('Jan', $this->calendar->get_month_name('01'));
+ }
+
+ function test_get_day_names()
+ {
+ $this->assertEquals(array(
+ 'Sunday',
+ 'Monday',
+ 'Tuesday',
+ 'Wednesday',
+ 'Thursday',
+ 'Friday',
+ 'Saturday'
+ ), $this->calendar->get_day_names('long'));
+
+ $this->assertEquals(array(
+ 'Sun',
+ 'Mon',
+ 'Tue',
+ 'Wed',
+ 'Thu',
+ 'Fri',
+ 'Sat'
+ ), $this->calendar->get_day_names('short'));
+
+ $this->calendar->day_type = NULL;
+
+ $this->assertEquals(array(
+ 'Su',
+ 'Mo',
+ 'Tu',
+ 'We',
+ 'Th',
+ 'Fr',
+ 'Sa'
+ ), $this->calendar->get_day_names());
+ }
+
+ function test_adjust_date()
+ {
+ $this->assertEquals(array('month' => 8, 'year' => 2012), $this->calendar->adjust_date(8, 2012));
+ $this->assertEquals(array('month' => 1, 'year' => 2013), $this->calendar->adjust_date(13, 2012));
+ }
+
+ function test_get_total_days()
+ {
+ $this->assertEquals(0, $this->calendar->get_total_days(13, 2012));
+
+ $this->assertEquals(31, $this->calendar->get_total_days(1, 2012));
+ $this->assertEquals(28, $this->calendar->get_total_days(2, 2011));
+ $this->assertEquals(29, $this->calendar->get_total_days(2, 2012));
+ $this->assertEquals(31, $this->calendar->get_total_days(3, 2012));
+ $this->assertEquals(30, $this->calendar->get_total_days(4, 2012));
+ $this->assertEquals(31, $this->calendar->get_total_days(5, 2012));
+ $this->assertEquals(30, $this->calendar->get_total_days(6, 2012));
+ $this->assertEquals(31, $this->calendar->get_total_days(7, 2012));
+ $this->assertEquals(31, $this->calendar->get_total_days(8, 2012));
+ $this->assertEquals(30, $this->calendar->get_total_days(9, 2012));
+ $this->assertEquals(31, $this->calendar->get_total_days(10, 2012));
+ $this->assertEquals(30, $this->calendar->get_total_days(11, 2012));
+ $this->assertEquals(31, $this->calendar->get_total_days(12, 2012));
+ }
+
+ function test_default_template()
+ {
+ $array = array(
+ 'table_open' => '<table border="0" cellpadding="4" cellspacing="0">',
+ 'heading_row_start' => '<tr>',
+ 'heading_previous_cell' => '<th><a href="{previous_url}">&lt;&lt;</a></th>',
+ 'heading_title_cell' => '<th colspan="{colspan}">{heading}</th>',
+ 'heading_next_cell' => '<th><a href="{next_url}">&gt;&gt;</a></th>',
+ 'heading_row_end' => '</tr>',
+ 'week_row_start' => '<tr>',
+ 'week_day_cell' => '<td>{week_day}</td>',
+ 'week_row_end' => '</tr>',
+ 'cal_row_start' => '<tr>',
+ 'cal_cell_start' => '<td>',
+ 'cal_cell_start_today' => '<td>',
+ 'cal_cell_content' => '<a href="{content}">{day}</a>',
+ 'cal_cell_content_today' => '<a href="{content}"><strong>{day}</strong></a>',
+ 'cal_cell_no_content' => '{day}',
+ 'cal_cell_no_content_today' => '<strong>{day}</strong>',
+ 'cal_cell_blank' => '&nbsp;',
+ 'cal_cell_end' => '</td>',
+ 'cal_cell_end_today' => '</td>',
+ 'cal_row_end' => '</tr>',
+ 'table_close' => '</table>'
+ );
+
+ $this->assertEquals($array, $this->calendar->default_template());
+ }
+
+} \ No newline at end of file
diff --git a/tests/codeigniter/libraries/Driver_test.php b/tests/codeigniter/libraries/Driver_test.php
new file mode 100644
index 000000000..d98e8ab98
--- /dev/null
+++ b/tests/codeigniter/libraries/Driver_test.php
@@ -0,0 +1,177 @@
+<?php
+
+/**
+ * Driver library base class unit test
+ */
+class Driver_test extends CI_TestCase {
+ /**
+ * Set up test framework
+ */
+ public function set_up()
+ {
+ // Set our subclass prefix
+ $this->subclass = 'Mock_Libraries_';
+ $this->ci_set_config('subclass_prefix', $this->subclass);
+
+ // Mock Loader->get_package_paths
+ $paths = 'get_package_paths';
+ $ldr = $this->getMock('CI_Loader', array($paths));
+ $ldr->expects($this->any())->method($paths)->will($this->returnValue(array(APPPATH, BASEPATH)));
+ $this->ci_instance_var('load', $ldr);
+
+ // Create mock driver library
+ $this->name = 'Driver';
+ $this->lib = new Mock_Libraries_Driver();
+ }
+
+ /**
+ * Test driver child loading
+ */
+ public function test_load_driver()
+ {
+ // Create driver file
+ $driver = 'basic';
+ $file = $this->name.'_'.$driver;
+ $class = 'CI_'.$file;
+ $prop = 'called';
+ $content = '<?php class '.$class.' extends CI_Driver { public $'.$prop.' = FALSE; '.
+ 'public function decorate($parent) { $this->'.$prop.' = TRUE; } }';
+ $this->ci_vfs_create($file, $content, $this->ci_base_root, array('libraries', $this->name, 'drivers'));
+
+ // Make driver valid
+ $this->lib->driver_list($driver);
+
+ // Load driver
+ $this->assertNotNull($this->lib->load_driver($driver));
+
+ // Did lib name get set?
+ $this->assertEquals($this->name, $this->lib->get_name());
+
+ // Was driver loaded?
+ $this->assertObjectHasAttribute($driver, $this->lib);
+ $this->assertAttributeInstanceOf($class, $driver, $this->lib);
+ $this->assertAttributeInstanceOf('CI_Driver', $driver, $this->lib);
+
+ // Was decorate called?
+ $this->assertObjectHasAttribute($prop, $this->lib->$driver);
+ $this->assertTrue($this->lib->$driver->$prop);
+
+ // Do we get an error for an invalid driver?
+ $driver = 'unlisted';
+ $this->setExpectedException('RuntimeException', 'CI Error: Invalid driver requested: '.$this->name.'_'.$driver);
+ $this->lib->load_driver($driver);
+ }
+
+ /**
+ * Test loading lowercase from app path
+ */
+ public function test_load_app_driver()
+ {
+ // Create driver file
+ $driver = 'lowpack';
+ $file = $this->name.'_'.$driver;
+ $class = 'CI_'.$file;
+ $content = '<?php class '.$class.' extends CI_Driver { }';
+ $this->ci_vfs_create($file, $content, $this->ci_app_root,
+ array('libraries', $this->name, 'drivers'));
+
+ // Make valid list
+ $nodriver = 'absent';
+ $this->lib->driver_list(array($driver, $nodriver));
+
+ // Load driver
+ $this->assertNotNull($this->lib->load_driver($driver));
+
+ // Was driver loaded?
+ $this->assertObjectHasAttribute($driver, $this->lib);
+ $this->assertAttributeInstanceOf($class, $driver, $this->lib);
+ $this->assertAttributeInstanceOf('CI_Driver', $driver, $this->lib);
+
+ // Do we get an error for a non-existent driver?
+ $this->setExpectedException('RuntimeException', 'CI Error: Unable to load the requested driver: CI_'.
+ $this->name.'_'.$nodriver);
+ $this->lib->load_driver($nodriver);
+ }
+
+ /**
+ * Test loading driver extension
+ */
+ public function test_load_driver_ext()
+ {
+ // Create base file
+ $driver = 'extend';
+ $base = $this->name.'_'.$driver;
+ $baseclass = 'CI_'.$base;
+ $content = '<?php class '.$baseclass.' extends CI_Driver { }';
+ $this->ci_vfs_create($base, $content, $this->ci_base_root, array('libraries', $this->name, 'drivers'));
+
+ // Create driver file
+ $class = $this->subclass.$base;
+ $content = '<?php class '.$class.' extends '.$baseclass.' { }';
+ $this->ci_vfs_create($class, $content, $this->ci_app_root, array('libraries', $this->name, 'drivers'));
+
+ // Make valid list
+ $this->lib->driver_list($driver);
+
+ // Load driver
+ $this->assertNotNull($this->lib->load_driver($driver));
+
+ // Was driver loaded?
+ $this->assertObjectHasAttribute($driver, $this->lib);
+ $this->assertAttributeInstanceOf($class, $driver, $this->lib);
+ $this->assertAttributeInstanceOf($baseclass, $driver, $this->lib);
+ $this->assertAttributeInstanceOf('CI_Driver', $driver, $this->lib);
+
+ // Create driver extension without base
+ $driver = 'baseless';
+ $base = $this->name.'_'.$driver;
+ $class = $this->subclass.$base;
+ $content = '<?php class '.$class.' extends CI_Driver { }';
+ $this->ci_vfs_create($class, $content, $this->ci_app_root, array('libraries', $this->name, 'drivers'));
+ $this->lib->driver_list($driver);
+
+ // Do we get an error when base class isn't found?
+ $this->setExpectedException('RuntimeException', 'CI Error: Unable to load the requested class: CI_'.$base);
+ $this->lib->load_driver($driver);
+ }
+
+ /**
+ * Test decorating driver with parent attributes
+ */
+ public function test_decorate()
+ {
+ // Create parent with a method and property to access
+ $pclass = 'Test_Parent';
+ $prop = 'parent_prop';
+ $value = 'initial';
+ $method = 'parent_func';
+ $return = 'func return';
+ $code = 'class '.$pclass.' { public $'.$prop.' = \''.$value.'\'; '.
+ 'public function '.$method.'() { return \''.$return.'\'; } }';
+ eval($code);
+ $parent = new $pclass();
+
+ // Create child driver to decorate
+ $class = 'Test_Driver';
+ eval('class '.$class.' extends CI_Driver { }');
+ $child = new $class();
+
+ // Decorate child
+ $child->decorate($parent);
+
+ // Do we get the initial parent property value?
+ $this->assertEquals($value, $child->$prop);
+
+ // Can we change the parent property?
+ $newval = 'changed';
+ $child->$prop = $newval;
+ $this->assertEquals($newval, $parent->$prop);
+
+ // Do we get back the updated value?
+ $this->assertEquals($newval, $child->$prop);
+
+ // Can we call the parent method?
+ $this->assertEquals($return, $child->$method());
+ }
+
+} \ No newline at end of file
diff --git a/tests/codeigniter/libraries/Encrypt_test.php b/tests/codeigniter/libraries/Encrypt_test.php
index 153a25e1d..a08db8ed0 100644
--- a/tests/codeigniter/libraries/Encrypt_test.php
+++ b/tests/codeigniter/libraries/Encrypt_test.php
@@ -4,14 +4,12 @@ class Encrypt_test extends CI_TestCase {
public function set_up()
{
- $obj = new stdClass;
- $obj->encrypt = new Mock_Libraries_Encrypt();
-
- $this->ci_instance($obj);
- $this->encrypt = $obj->encrypt;
+ $this->encrypt = new Mock_Libraries_Encrypt();
+ $this->ci_instance_var('encrypt', $this->encrypt);
$this->ci_set_config('encryption_key', "Encryptin'glike@boss!");
$this->msg = 'My secret message';
+ $this->mcrypt = extension_loaded('mcrypt');
}
// --------------------------------------------------------------------
@@ -42,14 +40,25 @@ class Encrypt_test extends CI_TestCase {
public function test_default_cipher()
{
+ if ( ! $this->mcrypt)
+ {
+ $this->markTestSkipped('MCrypt not available');
+ return;
+ }
+
$this->assertEquals('rijndael-256', $this->encrypt->get_cipher());
}
// --------------------------------------------------------------------
-
public function test_set_cipher()
{
+ if ( ! $this->mcrypt)
+ {
+ $this->markTestSkipped('MCrypt not available');
+ return;
+ }
+
$this->encrypt->set_cipher(MCRYPT_BLOWFISH);
$this->assertEquals('blowfish', $this->encrypt->get_cipher());
}
@@ -58,6 +67,12 @@ class Encrypt_test extends CI_TestCase {
public function test_default_mode()
{
+ if ( ! $this->mcrypt)
+ {
+ $this->markTestSkipped('MCrypt not available');
+ return;
+ }
+
$this->assertEquals('cbc', $this->encrypt->get_mode());
}
@@ -65,6 +80,12 @@ class Encrypt_test extends CI_TestCase {
public function test_set_mode()
{
+ if ( ! $this->mcrypt)
+ {
+ $this->markTestSkipped('MCrypt not available');
+ return;
+ }
+
$this->encrypt->set_mode(MCRYPT_MODE_CFB);
$this->assertEquals('cfb', $this->encrypt->get_mode());
}
diff --git a/tests/codeigniter/libraries/Parser_test.php b/tests/codeigniter/libraries/Parser_test.php
index b68f44a33..394c22692 100644
--- a/tests/codeigniter/libraries/Parser_test.php
+++ b/tests/codeigniter/libraries/Parser_test.php
@@ -4,12 +4,8 @@ class Parser_test extends CI_TestCase {
public function set_up()
{
- $obj = new stdClass;
- $obj->parser = new Mock_Libraries_Parser();
-
- $this->ci_instance($obj);
-
- $this->parser = $obj->parser;
+ $this->parser = new Mock_Libraries_Parser();
+ $this->ci_instance_var('parser', $this->parser);
}
// --------------------------------------------------------------------
diff --git a/tests/codeigniter/libraries/Session_test.php b/tests/codeigniter/libraries/Session_test.php
new file mode 100644
index 000000000..6edda99d7
--- /dev/null
+++ b/tests/codeigniter/libraries/Session_test.php
@@ -0,0 +1,426 @@
+<?php
+
+/**
+ * Session driver library unit test
+ */
+class Session_test extends CI_TestCase {
+
+ protected $settings = array(
+ 'use_cookies' => 0,
+ 'use_only_cookies' => 0,
+ 'cache_limiter' => false
+ );
+ protected $setting_vals = array();
+ protected $cookie_vals;
+ protected $session;
+
+ /**
+ * Set up test framework
+ */
+ public function set_up()
+ {
+ // Override settings
+ foreach ($this->settings as $name => $value) {
+ $this->setting_vals[$name] = ini_get('session.'.$name);
+ ini_set('session.'.$name, $value);
+ }
+
+ // Start with clean environment
+ $this->cookie_vals = $_COOKIE;
+ $_COOKIE = array();
+
+ // Set subclass prefix to match our mock
+ $this->ci_set_config('subclass_prefix', 'Mock_Libraries_');
+
+ // Establish necessary support classes
+ $ci = $this->ci_instance();
+ $ldr = $this->ci_core_class('load');
+ $ci->load = new $ldr();
+ $ci->input = new Mock_Core_Input(NULL, NULL);
+
+ // Make sure string helper is available
+ $this->ci_vfs_clone('system/helpers/string_helper.php');
+
+ // Attach session instance locally
+ $config = array(
+ 'sess_encrypt_cookie' => FALSE,
+ 'sess_use_database' => FALSE,
+ 'sess_table_name' => '',
+ 'sess_expiration' => 7200,
+ 'sess_expire_on_close' => FALSE,
+ 'sess_match_ip' => FALSE,
+ 'sess_match_useragent' => TRUE,
+ 'sess_cookie_name' => 'ci_session',
+ 'cookie_path' => '',
+ 'cookie_domain' => '',
+ 'cookie_secure' => FALSE,
+ 'cookie_httponly' => FALSE,
+ 'sess_time_to_update' => 300,
+ 'time_reference' => 'local',
+ 'cookie_prefix' => '',
+ 'encryption_key' => 'foobar'
+ );
+ $this->session = new Mock_Libraries_Session($config);
+ }
+
+ /**
+ * Tear down test framework
+ */
+ public function tear_down()
+ {
+ // Restore environment
+ if (session_id()) session_destroy();
+ $_SESSION = array();
+ $_COOKIE = $this->cookie_vals;
+
+ // Restore settings
+ foreach ($this->settings as $name => $value) {
+ ini_set('session.'.$name, $this->setting_vals[$name]);
+ }
+ }
+
+ /**
+ * Test set_userdata() function
+ */
+ public function test_set_userdata()
+ {
+ // Set userdata values for each driver
+ $key1 = 'test1';
+ $ckey2 = 'test2';
+ $nkey2 = 'test3';
+ $cmsg1 = 'Some test data';
+ $cmsg2 = 42;
+ $nmsg1 = 'Other test data';
+ $nmsg2 = true;
+ $this->session->cookie->set_userdata($key1, $cmsg1);
+ $this->session->set_userdata($ckey2, $cmsg2);
+ $this->session->native->set_userdata($key1, $nmsg1);
+ $this->session->set_userdata($nkey2, $nmsg2);
+
+ // Verify independent messages
+ $this->assertEquals($cmsg1, $this->session->cookie->userdata($key1));
+ $this->assertEquals($nmsg1, $this->session->native->userdata($key1));
+
+ // Verify pre-selected driver sets
+ $this->assertEquals($cmsg2, $this->session->cookie->userdata($ckey2));
+ $this->assertEquals($nmsg2, $this->session->native->userdata($nkey2));
+
+ // Verify no crossover
+ $this->assertNull($this->session->cookie->userdata($nkey2));
+ $this->assertNull($this->session->native->userdata($ckey2));
+ }
+
+ /**
+ * Test the has_userdata() function
+ */
+ public function test_has_userdata()
+ {
+ // Set a userdata value for each driver
+ $key = 'hastest';
+ $cmsg = 'My test data';
+ $this->session->cookie->set_userdata($key, $cmsg);
+ $nmsg = 'Your test data';
+ $this->session->native->set_userdata($key, $nmsg);
+
+ // Verify values exist
+ $this->assertTrue($this->session->cookie->has_userdata($key));
+ $this->assertTrue($this->session->native->has_userdata($key));
+
+ // Verify non-existent values
+ $nokey = 'hasnot';
+ $this->assertFalse($this->session->cookie->has_userdata($nokey));
+ $this->assertFalse($this->session->native->has_userdata($nokey));
+ }
+
+ /**
+ * Test the all_userdata() function
+ */
+ public function test_all_userdata()
+ {
+ // Set a specific series of data for each driver
+ $cdata = array(
+ 'one' => 'first',
+ 'two' => 'second',
+ 'three' => 'third',
+ 'foo' => 'bar',
+ 'bar' => 'baz'
+ );
+ $ndata = array(
+ 'one' => 'gold',
+ 'two' => 'silver',
+ 'three' => 'bronze',
+ 'foo' => 'baz',
+ 'bar' => 'foo'
+ );
+ $this->session->cookie->set_userdata($cdata);
+ $this->session->native->set_userdata($ndata);
+
+ // Make sure all values are present
+ $call = $this->session->cookie->all_userdata();
+ foreach ($cdata as $key => $value) {
+ $this->assertEquals($value, $call[$key]);
+ }
+ $nall = $this->session->native->all_userdata();
+ foreach ($ndata as $key => $value) {
+ $this->assertEquals($value, $nall[$key]);
+ }
+ }
+
+ /**
+ * Test the unset_userdata() function
+ */
+ public function test_unset_userdata()
+ {
+ // Set a userdata message for each driver
+ $key = 'untest';
+ $cmsg = 'Other test data';
+ $this->session->cookie->set_userdata($key, $cmsg);
+ $nmsg = 'Sundry test data';
+ $this->session->native->set_userdata($key, $nmsg);
+
+ // Verify independent messages
+ $this->assertEquals($this->session->cookie->userdata($key), $cmsg);
+ $this->assertEquals($this->session->native->userdata($key), $nmsg);
+
+ // Unset them and verify absence
+ $this->session->cookie->unset_userdata($key);
+ $this->session->native->unset_userdata($key);
+ $this->assertNull($this->session->cookie->userdata($key));
+ $this->assertNull($this->session->native->userdata($key));
+ }
+
+ /**
+ * Test the flashdata() functions
+ */
+ public function test_flashdata()
+ {
+ // Set flashdata message for each driver
+ $key = 'fltest';
+ $cmsg = 'Some flash data';
+ $this->session->cookie->set_flashdata($key, $cmsg);
+ $nmsg = 'Other flash data';
+ $this->session->native->set_flashdata($key, $nmsg);
+
+ // Simulate page reload
+ $this->session->cookie->reload();
+ $this->session->native->reload();
+
+ // Verify independent messages
+ $this->assertEquals($cmsg, $this->session->cookie->flashdata($key));
+ $this->assertEquals($nmsg, $this->session->native->flashdata($key));
+
+ // Simulate next page reload
+ $this->session->cookie->reload();
+ $this->session->native->reload();
+
+ // Verify absence of messages
+ $this->assertNull($this->session->cookie->flashdata($key));
+ $this->assertNull($this->session->native->flashdata($key));
+ }
+
+ /**
+ * Test the keep_flashdata() function
+ */
+ public function test_keep_flashdata()
+ {
+ // Set flashdata message for each driver
+ $key = 'kfltest';
+ $cmsg = 'My flash data';
+ $this->session->cookie->set_flashdata($key, $cmsg);
+ $nmsg = 'Your flash data';
+ $this->session->native->set_flashdata($key, $nmsg);
+
+ // Simulate page reload and verify independent messages
+ $this->session->cookie->reload();
+ $this->session->native->reload();
+ $this->assertEquals($cmsg, $this->session->cookie->flashdata($key));
+ $this->assertEquals($nmsg, $this->session->native->flashdata($key));
+
+ // Keep messages
+ $this->session->cookie->keep_flashdata($key);
+ $this->session->native->keep_flashdata($key);
+
+ // Simulate next page reload and verify message persistence
+ $this->session->cookie->reload();
+ $this->session->native->reload();
+ $this->assertEquals($cmsg, $this->session->cookie->flashdata($key));
+ $this->assertEquals($nmsg, $this->session->native->flashdata($key));
+
+ // Simulate next page reload and verify absence of messages
+ $this->session->cookie->reload();
+ $this->session->native->reload();
+ $this->assertNull($this->session->cookie->flashdata($key));
+ $this->assertNull($this->session->native->flashdata($key));
+ }
+
+ public function test_keep_flashdata_with_array()
+ {
+ // Set flashdata array for each driver
+ $cdata = array(
+ 'one' => 'first',
+ 'two' => 'second',
+ 'three' => 'third',
+ 'foo' => 'bar',
+ 'bar' => 'baz'
+ );
+ $ndata = array(
+ 'one' => 'gold',
+ 'two' => 'silver',
+ 'three' => 'bronze',
+ 'foo' => 'baz',
+ 'bar' => 'foo'
+ );
+ $kdata = array(
+ 'one',
+ 'two',
+ 'three',
+ 'foo',
+ 'bar'
+ );
+ $this->session->cookie->set_flashdata($cdata);
+ $this->session->native->set_flashdata($ndata);
+
+ // Simulate page reload and verify independent messages
+ $this->session->cookie->reload();
+ $this->session->native->reload();
+ $this->assertEquals($cdata, $this->session->cookie->all_flashdata());
+ $this->assertEquals($ndata, $this->session->native->all_flashdata());
+
+ // Keep messages
+ $this->session->cookie->keep_flashdata($kdata);
+ $this->session->native->keep_flashdata($kdata);
+
+ // Simulate next page reload and verify message persistence
+ $this->session->cookie->reload();
+ $this->session->native->reload();
+ $this->assertEquals($cdata, $this->session->cookie->all_flashdata());
+ $this->assertEquals($ndata, $this->session->native->all_flashdata());
+
+ // Simulate next page reload and verify absence of messages
+ $this->session->cookie->reload();
+ $this->session->native->reload();
+ $this->assertEmpty($this->session->cookie->all_flashdata());
+ $this->assertEmpty($this->session->native->all_flashdata());
+ }
+
+ /**
+ * Test the all_flashdata() function
+ */
+ public function test_all_flashdata()
+ {
+ // Set a specific series of data for each driver
+ $cdata = array(
+ 'one' => 'first',
+ 'two' => 'second',
+ 'three' => 'third',
+ 'foo' => 'bar',
+ 'bar' => 'baz'
+ );
+ $ndata = array(
+ 'one' => 'gold',
+ 'two' => 'silver',
+ 'three' => 'bronze',
+ 'foo' => 'baz',
+ 'bar' => 'foo'
+ );
+ $this->session->cookie->set_flashdata($cdata);
+ $this->session->native->set_flashdata($ndata);
+
+ // Simulate page reload and make sure all values are present
+ $this->session->cookie->reload();
+ $this->session->native->reload();
+ $this->assertEquals($cdata, $this->session->cookie->all_flashdata());
+ $this->assertEquals($ndata, $this->session->native->all_flashdata());
+ }
+
+ /**
+ * Test the tempdata() functions
+ */
+ public function test_set_tempdata()
+ {
+ // Set tempdata message for each driver - 1 second timeout
+ $key = 'tmptest';
+ $cmsg = 'Some temp data';
+ $this->session->cookie->set_tempdata($key, $cmsg, 1);
+ $nmsg = 'Other temp data';
+ $this->session->native->set_tempdata($key, $nmsg, 1);
+
+ // Simulate page reload and verify independent messages
+ $this->session->cookie->reload();
+ $this->session->native->reload();
+ $this->assertEquals($cmsg, $this->session->cookie->tempdata($key));
+ $this->assertEquals($nmsg, $this->session->native->tempdata($key));
+
+ // Wait 2 seconds, simulate page reload and verify message absence
+ sleep(2);
+ $this->session->cookie->reload();
+ $this->session->native->reload();
+ $this->assertNull($this->session->cookie->tempdata($key));
+ $this->assertNull($this->session->native->tempdata($key));
+ }
+
+ /**
+ * Test the unset_tempdata() function
+ */
+ public function test_unset_tempdata()
+ {
+ // Set tempdata message for each driver - 1 second timeout
+ $key = 'utmptest';
+ $cmsg = 'My temp data';
+ $this->session->cookie->set_tempdata($key, $cmsg, 1);
+ $nmsg = 'Your temp data';
+ $this->session->native->set_tempdata($key, $nmsg, 1);
+
+ // Verify independent messages
+ $this->assertEquals($cmsg, $this->session->cookie->tempdata($key));
+ $this->assertEquals($nmsg, $this->session->native->tempdata($key));
+
+ // Unset data and verify message absence
+ $this->session->cookie->unset_tempdata($key);
+ $this->session->native->unset_tempdata($key);
+ $this->assertNull($this->session->cookie->tempdata($key));
+ $this->assertNull($this->session->native->tempdata($key));
+ }
+
+ /**
+ * Test the sess_regenerate() function
+ */
+ public function test_sess_regenerate()
+ {
+ // Get current session id, regenerate, and compare
+ // Cookie driver
+ $oldid = $this->session->cookie->userdata('session_id');
+ $this->session->cookie->sess_regenerate();
+ $newid = $this->session->cookie->userdata('session_id');
+ $this->assertNotEquals($oldid, $newid);
+
+ // Native driver - bug #55267 (https://bugs.php.net/bug.php?id=55267) prevents testing this
+ // $oldid = session_id();
+ // $this->session->native->sess_regenerate();
+ // $oldid = session_id();
+ // $this->assertNotEquals($oldid, $newid);
+ }
+
+ /**
+ * Test the sess_destroy() function
+ */
+ public function test_sess_destroy()
+ {
+ // Set a userdata message, destroy session, and verify absence
+ $key = 'dsttest';
+ $msg = 'More test data';
+
+ // Cookie driver
+ $this->session->cookie->set_userdata($key, $msg);
+ $this->assertEquals($msg, $this->session->cookie->userdata($key));
+ $this->session->cookie->sess_destroy();
+ $this->assertNull($this->session->cookie->userdata($key));
+
+ // Native driver
+ $this->session->native->set_userdata($key, $msg);
+ $this->assertEquals($msg, $this->session->native->userdata($key));
+ $this->session->native->sess_destroy();
+ $this->assertNull($this->session->native->userdata($key));
+ }
+
+} \ No newline at end of file
diff --git a/tests/codeigniter/libraries/Table_test.php b/tests/codeigniter/libraries/Table_test.php
index edfc83dd0..ce04b6a6d 100644
--- a/tests/codeigniter/libraries/Table_test.php
+++ b/tests/codeigniter/libraries/Table_test.php
@@ -4,12 +4,8 @@ class Table_test extends CI_TestCase {
public function set_up()
{
- $obj = new stdClass;
- $obj->table = new Mock_Libraries_Table();
-
- $this->ci_instance($obj);
-
- $this->table = $obj->table;
+ $this->table = new Mock_Libraries_Table();
+ $this->ci_instance_var('table', $this->table);
}
// Setter Methods
diff --git a/tests/codeigniter/libraries/Typography_test.php b/tests/codeigniter/libraries/Typography_test.php
index eb6dacb73..5dba06243 100644
--- a/tests/codeigniter/libraries/Typography_test.php
+++ b/tests/codeigniter/libraries/Typography_test.php
@@ -4,12 +4,8 @@ class Typography_test extends CI_TestCase {
public function set_up()
{
- $obj = new stdClass;
- $obj->type = new Mock_Libraries_Typography();
-
- $this->ci_instance($obj);
-
- $this->type = $obj->type;
+ $this->type = new Mock_Libraries_Typography();
+ $this->ci_instance('type', $this->type);
}
// --------------------------------------------------------------------
diff --git a/tests/codeigniter/libraries/Upload_test.php b/tests/codeigniter/libraries/Upload_test.php
new file mode 100644
index 000000000..1bd8f1430
--- /dev/null
+++ b/tests/codeigniter/libraries/Upload_test.php
@@ -0,0 +1,274 @@
+<?php
+
+class Upload_test extends CI_TestCase {
+
+ function set_up()
+ {
+ $ci = $this->ci_instance();
+ $ci->upload = new Mock_Libraries_Upload();
+ $ci->security = new Mock_Core_Security();
+ $ci->lang = $this->getMock('CI_Lang', array('load', 'line'));
+ $ci->lang->expects($this->any())->method('line')->will($this->returnValue(FALSE));
+ $this->upload = $ci->upload;
+ }
+
+ function test_do_upload()
+ {
+ $this->markTestSkipped('We can\'t really test this at the moment because of the call to `is_uploaded_file` in do_upload which isn\'t supported by vfsStream');
+ }
+
+ function test_data()
+ {
+ $data = array(
+ 'file_name' => 'hello.txt',
+ 'file_type' => 'text/plain',
+ 'file_path' => '/tmp/',
+ 'full_path' => '/tmp/hello.txt',
+ 'raw_name' => 'hello',
+ 'orig_name' => 'hello.txt',
+ 'client_name' => '',
+ 'file_ext' => '.txt',
+ 'file_size' => 100,
+ 'is_image' => FALSE,
+ 'image_width' => '',
+ 'image_height' => '',
+ 'image_type' => '',
+ 'image_size_str' => ''
+ );
+
+ $this->upload->set_upload_path('/tmp/');
+
+ foreach ($data as $k => $v)
+ {
+ $this->upload->{$k} = $v;
+ }
+
+ $this->assertEquals('hello.txt', $this->upload->data('file_name'));
+ $this->assertEquals($data, $this->upload->data());
+ }
+
+ function test_set_upload_path()
+ {
+ $this->upload->set_upload_path('/tmp/');
+ $this->assertEquals('/tmp/', $this->upload->upload_path);
+
+ $this->upload->set_upload_path('/tmp');
+ $this->assertEquals('/tmp/', $this->upload->upload_path);
+ }
+
+ function test_set_filename()
+ {
+ $dir = 'uploads';
+ $isnew = 'helloworld.txt';
+ $exists = 'hello-world.txt';
+ $this->ci_vfs_create($exists, 'Hello world.', $this->ci_app_root, $dir);
+ $path = $this->ci_vfs_path($dir.'/', APPPATH);
+ $this->upload->file_ext = '.txt';
+
+ $this->assertEquals($isnew, $this->upload->set_filename($path, $isnew));
+ $this->assertEquals('hello-world1.txt', $this->upload->set_filename($path, $exists));
+ }
+
+ function test_set_max_filesize()
+ {
+ $this->upload->set_max_filesize(100);
+ $this->assertEquals(100, $this->upload->max_size);
+ }
+
+ function test_set_max_filename()
+ {
+ $this->upload->set_max_filename(100);
+ $this->assertEquals(100, $this->upload->max_filename);
+ }
+
+ function test_set_max_width()
+ {
+ $this->upload->set_max_width(100);
+ $this->assertEquals(100, $this->upload->max_width);
+ }
+
+ function test_set_max_height()
+ {
+ $this->upload->set_max_height(100);
+ $this->assertEquals(100, $this->upload->max_height);
+ }
+
+ function test_set_allowed_types()
+ {
+ $this->upload->set_allowed_types('*');
+ $this->assertEquals('*', $this->upload->allowed_types);
+
+ $this->upload->set_allowed_types('foo|bar');
+ $this->assertEquals(array('foo', 'bar'), $this->upload->allowed_types);
+ }
+
+ function test_set_image_properties()
+ {
+ $this->upload->file_type = 'image/gif';
+ $this->upload->file_temp = realpath(PROJECT_BASE.'tests/mocks/uploads/ci_logo.gif');
+
+ $props = array(
+ 'image_width' => 170,
+ 'image_height' => 73,
+ 'image_type' => 'gif',
+ 'image_size_str' => 'width="170" height="73"'
+ );
+
+ $this->upload->set_image_properties($this->upload->file_temp);
+
+ $this->assertEquals($props['image_width'], $this->upload->image_width);
+ $this->assertEquals($props['image_height'], $this->upload->image_height);
+ $this->assertEquals($props['image_type'], $this->upload->image_type);
+ $this->assertEquals($props['image_size_str'], $this->upload->image_size_str);
+ }
+
+ function test_set_xss_clean()
+ {
+ $this->upload->set_xss_clean(TRUE);
+ $this->assertTrue($this->upload->xss_clean);
+
+ $this->upload->set_xss_clean(FALSE);
+ $this->assertFalse($this->upload->xss_clean);
+ }
+
+ function test_is_image()
+ {
+ $this->upload->file_type = 'image/x-png';
+ $this->assertTrue($this->upload->is_image());
+
+ $this->upload->file_type = 'text/plain';
+ $this->assertFalse($this->upload->is_image());
+ }
+
+ function test_is_allowed_filetype()
+ {
+ $this->upload->allowed_types = array('html', 'gif');
+
+ $this->upload->file_ext = '.txt';
+ $this->upload->file_type = 'text/plain';
+ $this->assertFalse($this->upload->is_allowed_filetype(FALSE));
+ $this->assertFalse($this->upload->is_allowed_filetype(TRUE));
+
+ $this->upload->file_ext = '.html';
+ $this->upload->file_type = 'text/html';
+ $this->assertTrue($this->upload->is_allowed_filetype(FALSE));
+ $this->assertTrue($this->upload->is_allowed_filetype(TRUE));
+
+ $this->upload->file_temp = realpath(PROJECT_BASE.'tests/mocks/uploads/ci_logo.gif');
+ $this->upload->file_ext = '.gif';
+ $this->upload->file_type = 'image/gif';
+ $this->assertTrue($this->upload->is_allowed_filetype());
+ }
+
+ function test_is_allowed_filesize()
+ {
+ $this->upload->max_size = 100;
+ $this->upload->file_size = 99;
+
+ $this->assertTrue($this->upload->is_allowed_filesize());
+
+ $this->upload->file_size = 101;
+ $this->assertFalse($this->upload->is_allowed_filesize());
+ }
+
+ function test_is_allowed_dimensions()
+ {
+ $this->upload->file_type = 'text/plain';
+ $this->assertTrue($this->upload->is_allowed_dimensions());
+
+ $this->upload->file_type = 'image/gif';
+ $this->upload->file_temp = realpath(PROJECT_BASE.'tests/mocks/uploads/ci_logo.gif');
+
+ $this->upload->max_width = 10;
+ $this->assertFalse($this->upload->is_allowed_dimensions());
+
+ $this->upload->max_width = 170;
+ $this->upload->max_height = 10;
+ $this->assertFalse($this->upload->is_allowed_dimensions());
+
+ $this->upload->max_height = 73;
+ $this->assertTrue($this->upload->is_allowed_dimensions());
+ }
+
+ function test_validate_upload_path()
+ {
+ $this->upload->upload_path = '';
+ $this->assertFalse($this->upload->validate_upload_path());
+
+ $dir = 'uploads';
+ $this->ci_vfs_mkdir($dir);
+ $this->upload->upload_path = $this->ci_vfs_path($dir);
+ $this->assertTrue($this->upload->validate_upload_path());
+ }
+
+ function test_get_extension()
+ {
+ $this->assertEquals('.txt', $this->upload->get_extension('hello.txt'));
+ $this->assertEquals('.htaccess', $this->upload->get_extension('.htaccess'));
+ $this->assertEquals('', $this->upload->get_extension('hello'));
+ }
+
+ function test_clean_file_name()
+ {
+ $this->assertEquals('hello.txt', $this->upload->clean_file_name('hello.txt'));
+ $this->assertEquals('hello.txt', $this->upload->clean_file_name('%253chell>o.txt'));
+ }
+
+ function test_limit_filename_length()
+ {
+ $this->assertEquals('hello.txt', $this->upload->limit_filename_length('hello.txt', 10));
+ $this->assertEquals('hello.txt', $this->upload->limit_filename_length('hello-world.txt', 9));
+ }
+
+ function test_do_xss_clean()
+ {
+ $dir = 'uploads';
+ $file1 = 'file1.txt';
+ $file2 = 'file2.txt';
+ $file3 = 'file3.txt';
+ $this->ci_vfs_create($file1, 'The billy goat was waiting for them.', $this->ci_vfs_root, $dir);
+ $this->ci_vfs_create($file2, '', $this->ci_vfs_root, $dir);
+ $this->ci_vfs_create($file3, '<script type="text/javascript">alert("Boo! said the billy goat")</script>', $this->ci_vfs_root, $dir);
+
+ $this->upload->file_temp = $this->ci_vfs_path($file1, $dir);
+ $this->assertTrue($this->upload->do_xss_clean());
+
+ $this->upload->file_temp = $this->ci_vfs_path($file2, $dir);
+ $this->assertFalse($this->upload->do_xss_clean());
+
+ $this->upload->file_temp = $this->ci_vfs_path($file3, $dir);
+ $this->assertFalse($this->upload->do_xss_clean());
+
+ $this->upload->file_temp = realpath(PROJECT_BASE.'tests/mocks/uploads/ci_logo.gif');
+ $this->assertTrue($this->upload->do_xss_clean());
+ }
+
+ function test_set_error()
+ {
+ $errors = array(
+ 'An error!'
+ );
+
+ $another = 'Another error!';
+
+ $this->upload->set_error($errors);
+ $this->assertEquals($errors, $this->upload->error_msg);
+
+ $errors[] = $another;
+ $this->upload->set_error($another);
+ $this->assertEquals($errors, $this->upload->error_msg);
+ }
+
+ function test_display_errors()
+ {
+ $this->upload->error_msg[] = 'Error test';
+ $this->assertEquals('<p>Error test</p>', $this->upload->display_errors());
+ }
+
+ function test_mimes_types()
+ {
+ $this->assertEquals('text/plain', $this->upload->mimes_types('txt'));
+ $this->assertFalse($this->upload->mimes_types('foobar'));
+ }
+
+} \ No newline at end of file
diff --git a/tests/codeigniter/libraries/Useragent_test.php b/tests/codeigniter/libraries/Useragent_test.php
index 89383f807..e3726554e 100644
--- a/tests/codeigniter/libraries/Useragent_test.php
+++ b/tests/codeigniter/libraries/Useragent_test.php
@@ -10,12 +10,11 @@ class UserAgent_test extends CI_TestCase {
// set a baseline user agent
$_SERVER['HTTP_USER_AGENT'] = $this->_user_agent;
- $obj = new stdClass;
- $obj->agent = new Mock_Libraries_UserAgent();
+ $this->ci_vfs_clone('application/config/user_agents.php');
- $this->ci_instance($obj);
+ $this->agent = new Mock_Libraries_UserAgent();
- $this->agent = $obj->agent;
+ $this->ci_instance_var('agent', $this->agent);
}
// --------------------------------------------------------------------
diff --git a/tests/mocks/autoloader.php b/tests/mocks/autoloader.php
index be1c2220c..3d216da1f 100644
--- a/tests/mocks/autoloader.php
+++ b/tests/mocks/autoloader.php
@@ -16,7 +16,7 @@ function autoload($class)
$ci_core = array(
'Benchmark', 'Config', 'Controller',
'Exceptions', 'Hooks', 'Input',
- 'Lang', 'Loader', 'Model',
+ 'Lang', 'Loader', 'Log', 'Model',
'Output', 'Router', 'Security',
'URI', 'Utf8',
);
@@ -25,42 +25,58 @@ function autoload($class)
'Calendar', 'Cart', 'Driver_Library',
'Email', 'Encrypt', 'Form_validation',
'Ftp', 'Image_lib', 'Javascript',
- 'Log', 'Migration', 'Pagination',
- 'Parser', 'Profiler', 'Session',
- 'Table', 'Trackback', 'Typography',
- 'Unit_test', 'Upload', 'User_agent',
- 'Xmlrpc', 'Zip',
+ 'Migration', 'Pagination', 'Parser',
+ 'Profiler', 'Table', 'Trackback',
+ 'Typography', 'Unit_test', 'Upload',
+ 'User_agent', 'Xmlrpc', 'Zip'
+ );
+
+ $ci_drivers = array(
+ 'Session',
);
if (strpos($class, 'Mock_') === 0)
{
- $class = str_replace(array('Mock_', '_'), array('', DIRECTORY_SEPARATOR), $class);
- $class = strtolower($class);
+ $class = strtolower(str_replace(array('Mock_', '_'), array('', DIRECTORY_SEPARATOR), $class));
}
elseif (strpos($class, 'CI_') === 0)
{
- $fragments = explode('_', $class, 2);
- $subclass = next($fragments);
+ $subclass = substr($class, 3);
if (in_array($subclass, $ci_core))
{
- $dir = BASEPATH.'core'.DIRECTORY_SEPARATOR;
+ $dir = SYSTEM_PATH.'core'.DIRECTORY_SEPARATOR;
$class = $subclass;
}
elseif (in_array($subclass, $ci_libraries))
{
- $dir = BASEPATH.'libraries'.DIRECTORY_SEPARATOR;
+ $dir = SYSTEM_PATH.'libraries'.DIRECTORY_SEPARATOR;
$class = ($subclass === 'Driver_Library') ? 'Driver' : $subclass;
}
+ elseif (in_array($subclass, $ci_drivers))
+ {
+ $dir = SYSTEM_PATH.'libraries'.DIRECTORY_SEPARATOR.$subclass.DIRECTORY_SEPARATOR;
+ $class = $subclass;
+ }
+ elseif (in_array(($parent = strtok($subclass, '_')), $ci_drivers)) {
+ $dir = SYSTEM_PATH.'libraries'.DIRECTORY_SEPARATOR.$parent.DIRECTORY_SEPARATOR.'drivers'.DIRECTORY_SEPARATOR;
+ $class = $subclass;
+ }
+ elseif (preg_match('/^CI_DB_(.+)_(.+)_(driver|forge|result|utility)$/', $class, $m) && count($m) === 4)
+ {
+ $driver_path = SYSTEM_PATH.'database'.DIRECTORY_SEPARATOR.'drivers'.DIRECTORY_SEPARATOR;
+ $dir = $driver_path.$m[1].DIRECTORY_SEPARATOR.'subdrivers'.DIRECTORY_SEPARATOR;
+ $file = $dir.$m[1].'_'.$m[2].'_'.$m[3].'.php';
+ }
elseif (preg_match('/^CI_DB_(.+)_(driver|forge|result|utility)$/', $class, $m) && count($m) === 3)
{
- $driver_path = BASEPATH.'database'.DIRECTORY_SEPARATOR.'drivers'.DIRECTORY_SEPARATOR;
+ $driver_path = SYSTEM_PATH.'database'.DIRECTORY_SEPARATOR.'drivers'.DIRECTORY_SEPARATOR;
$dir = $driver_path.$m[1].DIRECTORY_SEPARATOR;
$file = $dir.$m[1].'_'.$m[2].'.php';
}
elseif (strpos($class, 'CI_DB') === 0)
{
- $dir = BASEPATH.'database'.DIRECTORY_SEPARATOR;
+ $dir = SYSTEM_PATH.'database'.DIRECTORY_SEPARATOR;
$file = $dir.str_replace(array('CI_DB','active_record'), array('DB', 'active_rec'), $subclass).'.php';
}
else
@@ -69,7 +85,7 @@ function autoload($class)
}
}
- $file = (isset($file)) ? $file : $dir.$class.'.php';
+ $file = isset($file) ? $file : $dir.$class.'.php';
if ( ! file_exists($file))
{
diff --git a/tests/mocks/ci_testcase.php b/tests/mocks/ci_testcase.php
index eda9e1b60..f16492945 100644
--- a/tests/mocks/ci_testcase.php
+++ b/tests/mocks/ci_testcase.php
@@ -2,7 +2,9 @@
class CI_TestCase extends PHPUnit_Framework_TestCase {
- protected $ci_config;
+ public $ci_vfs_root;
+ public $ci_app_root;
+ public $ci_base_root;
protected $ci_instance;
protected static $ci_test_instance;
@@ -25,13 +27,19 @@ class CI_TestCase extends PHPUnit_Framework_TestCase {
public function __construct()
{
parent::__construct();
- $this->ci_config = array();
+ $this->ci_instance = new StdClass();
}
// --------------------------------------------------------------------
public function setUp()
{
+ // Setup VFS with base directories
+ $this->ci_vfs_root = vfsStream::setup();
+ $this->ci_app_root = vfsStream::newDirectory('application')->at($this->ci_vfs_root);
+ $this->ci_base_root = vfsStream::newDirectory('system')->at($this->ci_vfs_root);
+ $this->ci_view_root = vfsStream::newDirectory('views')->at($this->ci_app_root);
+
if (method_exists($this, 'set_up'))
{
$this->set_up();
@@ -57,15 +65,27 @@ class CI_TestCase extends PHPUnit_Framework_TestCase {
// --------------------------------------------------------------------
- public function ci_set_config($key, $val = '')
+ public function ci_set_config($key = '', $val = '')
{
+ // Add test config
+ if ( ! isset($this->ci_instance->config))
+ {
+ $this->ci_instance->config = new CI_TestConfig();
+ }
+
+ // Empty key means just do setup above
+ if ($key === '')
+ {
+ return;
+ }
+
if (is_array($key))
{
- $this->ci_config = $key;
+ $this->ci_instance->config->config = $key;
}
else
{
- $this->ci_config[$key] = $val;
+ $this->ci_instance->config->config[$key] = $val;
}
}
@@ -73,7 +93,7 @@ class CI_TestCase extends PHPUnit_Framework_TestCase {
public function ci_get_config()
{
- return $this->ci_config;
+ return isset($this->ci_instance->config) ? $this->ci_instance->config->config : array();
}
// --------------------------------------------------------------------
@@ -132,7 +152,7 @@ class CI_TestCase extends PHPUnit_Framework_TestCase {
if ( ! class_exists('CI_'.$class_name))
{
- require_once BASEPATH.'core/'.$class_name.'.php';
+ require_once SYSTEM_PATH.'core/'.$class_name.'.php';
}
$GLOBALS[strtoupper($global_name)] = 'CI_'.$class_name;
@@ -148,6 +168,165 @@ class CI_TestCase extends PHPUnit_Framework_TestCase {
$orig = $obj;
}
+ /**
+ * Create VFS directory
+ *
+ * @param string Directory name
+ * @param object Optional root to create in
+ * @return object New directory object
+ */
+ public function ci_vfs_mkdir($name, $root = NULL)
+ {
+ // Check for root
+ if ( ! $root)
+ {
+ $root = $this->ci_vfs_root;
+ }
+
+ // Return new directory object
+ return vfsStream::newDirectory($name)->at($root);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Create VFS content
+ *
+ * @param string File name
+ * @param string File content
+ * @param object VFS directory object
+ * @param mixed Optional subdirectory path or array of subs
+ * @return void
+ */
+ public function ci_vfs_create($file, $content = '', $root = NULL, $path = NULL)
+ {
+ // Check for array
+ if (is_array($file))
+ {
+ foreach ($file as $name => $content)
+ {
+ $this->ci_vfs_create($name, $content, $root, $path);
+ }
+ return;
+ }
+
+ // Assert .php extension if none given
+ if (pathinfo($file, PATHINFO_EXTENSION) == '')
+ {
+ $file .= '.php';
+ }
+
+ // Build content
+ $tree = array($file => $content);
+
+ // Check for path
+ $subs = array();
+ if ($path)
+ {
+ // Explode if not array
+ $subs = is_array($path) ? $path : explode('/', trim($path, '/'));
+ }
+
+ // Check for root
+ if ( ! $root)
+ {
+ // Use base VFS root
+ $root = $this->ci_vfs_root;
+ }
+
+ // Handle subdirectories
+ while (($dir = array_shift($subs)))
+ {
+ // See if subdir exists under current root
+ $dir_root = $root->getChild($dir);
+ if ($dir_root)
+ {
+ // Yes - recurse into subdir
+ $root = $dir_root;
+ }
+ else
+ {
+ // No - put subdirectory back and quit
+ array_unshift($subs, $dir);
+ break;
+ }
+ }
+
+ // Create any remaining subdirectories
+ if ($subs)
+ {
+ foreach (array_reverse($subs) as $dir)
+ {
+ // Wrap content in subdirectory for creation
+ $tree = array($dir => $tree);
+ }
+ }
+
+ // Create tree
+ vfsStream::create($tree, $root);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Clone a real file into VFS
+ *
+ * @param string Path from base directory
+ * @return bool TRUE on success, otherwise FALSE
+ */
+ public function ci_vfs_clone($path)
+ {
+ // Check for array
+ if (is_array($path))
+ {
+ foreach ($path as $file)
+ {
+ $this->ci_vfs_clone($file);
+ }
+ return;
+ }
+
+ // Get real file contents
+ $content = file_get_contents(PROJECT_BASE.$path);
+ if ($content === FALSE)
+ {
+ // Couldn't find file to clone
+ return FALSE;
+ }
+
+ $this->ci_vfs_create(basename($path), $content, NULL, dirname($path));
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Helper to get a VFS URL path
+ *
+ * @param string Path
+ * @param string Optional base path
+ * @return string Path URL
+ */
+ public function ci_vfs_path($path, $base = '')
+ {
+ // Check for base path
+ if ($base)
+ {
+ // Prepend to path
+ $path = rtrim($base, '/').'/'.ltrim($path, '/');
+
+ // Is it already in URL form?
+ if (strpos($path, '://') !== FALSE)
+ {
+ // Done - return path
+ return $path;
+ }
+ }
+
+ // Trim leading slash and return URL
+ return vfsStream::url(ltrim($path, '/'));
+ }
+
// --------------------------------------------------------------------
// Internals
// --------------------------------------------------------------------
@@ -171,7 +350,15 @@ class CI_TestCase extends PHPUnit_Framework_TestCase {
public function helper($name)
{
- require_once(BASEPATH.'helpers/'.$name.'_helper.php');
+ require_once(SYSTEM_PATH.'helpers/'.$name.'_helper.php');
+ }
+
+ // --------------------------------------------------------------------
+
+ public function lang($name)
+ {
+ require(SYSTEM_PATH.'language/english/'.$name.'_lang.php');
+ return $lang;
}
// --------------------------------------------------------------------
diff --git a/tests/mocks/ci_testconfig.php b/tests/mocks/ci_testconfig.php
new file mode 100644
index 000000000..f80adc5d4
--- /dev/null
+++ b/tests/mocks/ci_testconfig.php
@@ -0,0 +1,20 @@
+<?php
+
+class CI_TestConfig {
+
+ public $config = array();
+ public $_config_paths = array(APPPATH);
+ public $loaded = array();
+
+ public function item($key)
+ {
+ return isset($this->config[$key]) ? $this->config[$key] : FALSE;
+ }
+
+ public function load($file, $arg2 = FALSE, $arg3 = FALSE)
+ {
+ $this->loaded[] = $file;
+ return TRUE;
+ }
+
+} \ No newline at end of file
diff --git a/tests/mocks/core/common.php b/tests/mocks/core/common.php
index a655ee1db..24d645ae3 100644
--- a/tests/mocks/core/common.php
+++ b/tests/mocks/core/common.php
@@ -39,6 +39,30 @@ if ( ! function_exists('config_item'))
}
}
+if ( ! function_exists('get_mimes'))
+{
+ /**
+ * Returns the MIME types array from config/mimes.php
+ *
+ * @return array
+ */
+ function &get_mimes()
+ {
+ static $_mimes = array();
+
+ if (empty($_mimes))
+ {
+ $path = realpath(PROJECT_BASE.'application/config/mimes.php');
+ if (is_file($path))
+ {
+ $_mimes = include($path);
+ }
+ }
+
+ return $_mimes;
+ }
+}
+
// --------------------------------------------------------------------
if ( ! function_exists('load_class'))
@@ -124,7 +148,6 @@ if ( ! function_exists('_exception_handler'))
}
}
-
// We assume a few things about our environment ...
// --------------------------------------------------------------------
@@ -146,9 +169,10 @@ if ( ! function_exists('is_really_writable'))
if ( ! function_exists('is_loaded'))
{
- function is_loaded()
+ function &is_loaded()
{
- throw new Exception('Bad Isolation: mock up environment');
+ $loaded = array();
+ return $loaded;
}
}
diff --git a/tests/mocks/core/input.php b/tests/mocks/core/input.php
index 2a4aa4997..0d1873849 100644
--- a/tests/mocks/core/input.php
+++ b/tests/mocks/core/input.php
@@ -28,4 +28,14 @@ class Mock_Core_Input extends CI_Input {
return parent::_fetch_from_array($array, $index, $xss_clean);
}
+ /**
+ * Lie about being a CLI request
+ *
+ * We take advantage of this in libraries/Session_test
+ */
+ public function is_cli_request()
+ {
+ return FALSE;
+ }
+
} \ No newline at end of file
diff --git a/tests/mocks/core/loader.php b/tests/mocks/core/loader.php
deleted file mode 100644
index 53d88d55b..000000000
--- a/tests/mocks/core/loader.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-
-class Mock_Core_Loader extends CI_Loader {
-
- /**
- * Since we use paths to load up models, views, etc, we need the ability to
- * mock up the file system so when core tests are run, we aren't mucking
- * in the application directory. this will give finer grained control over
- * these tests. So yeah, while this looks odd, I need to overwrite protected
- * class vars in the loader. So here we go...
- *
- * @covers CI_Loader::__construct()
- */
- public function __construct()
- {
- vfsStreamWrapper::register();
- vfsStreamWrapper::setRoot(new vfsStreamDirectory('application'));
-
- $this->models_dir = vfsStream::newDirectory('models')->at(vfsStreamWrapper::getRoot());
- $this->libs_dir = vfsStream::newDirectory('libraries')->at(vfsStreamWrapper::getRoot());
- $this->helpers_dir = vfsStream::newDirectory('helpers')->at(vfsStreamWrapper::getRoot());
- $this->views_dir = vfsStream::newDirectory('views')->at(vfsStreamWrapper::getRoot());
-
- $this->_ci_ob_level = ob_get_level();
- $this->_ci_library_paths = array(vfsStream::url('application').'/', BASEPATH);
- $this->_ci_helper_paths = array(vfsStream::url('application').'/', BASEPATH);
- $this->_ci_model_paths = array(vfsStream::url('application').'/');
- $this->_ci_view_paths = array(vfsStream::url('application').'/views/' => TRUE);
- }
-
-} \ No newline at end of file
diff --git a/tests/mocks/database/config/mysqli.php b/tests/mocks/database/config/mysqli.php
new file mode 100644
index 000000000..5dd08abb2
--- /dev/null
+++ b/tests/mocks/database/config/mysqli.php
@@ -0,0 +1,34 @@
+<?php
+
+return array(
+
+ // Typical Database configuration
+ 'mysqli' => array(
+ 'dsn' => '',
+ 'hostname' => 'localhost',
+ 'username' => 'travis',
+ 'password' => '',
+ 'database' => 'ci_test',
+ 'dbdriver' => 'mysqli'
+ ),
+
+ // Database configuration with failover
+ 'mysqli_failover' => array(
+ 'dsn' => '',
+ 'hostname' => 'localhost',
+ 'username' => 'not_travis',
+ 'password' => 'wrong password',
+ 'database' => 'not_ci_test',
+ 'dbdriver' => 'mysqli',
+ 'failover' => array(
+ array(
+ 'dsn' => '',
+ 'hostname' => 'localhost',
+ 'username' => 'travis',
+ 'password' => '',
+ 'database' => 'ci_test',
+ 'dbdriver' => 'mysqli',
+ )
+ )
+ )
+); \ No newline at end of file
diff --git a/tests/mocks/database/config/pdo/mysql.php b/tests/mocks/database/config/pdo/mysql.php
index fefe0d624..96608f787 100644
--- a/tests/mocks/database/config/pdo/mysql.php
+++ b/tests/mocks/database/config/pdo/mysql.php
@@ -4,13 +4,13 @@ return array(
// Typical Database configuration
'pdo/mysql' => array(
- 'dsn' => '',
+ 'dsn' => 'mysql:host=localhost;dbname=ci_test',
'hostname' => 'localhost',
'username' => 'travis',
'password' => '',
'database' => 'ci_test',
'dbdriver' => 'pdo',
- 'pdodriver' => 'mysql'
+ 'subdriver' => 'mysql'
),
// Database configuration with failover
@@ -21,16 +21,16 @@ return array(
'password' => 'wrong password',
'database' => 'not_ci_test',
'dbdriver' => 'pdo',
- 'pdodriver' => 'mysql',
+ 'subdriver' => 'mysql',
'failover' => array(
array(
- 'dsn' => '',
+ 'dsn' => 'mysql:host=localhost;dbname=ci_test',
'hostname' => 'localhost',
'username' => 'travis',
'password' => '',
'database' => 'ci_test',
'dbdriver' => 'pdo',
- 'pdodriver' => 'mysql'
+ 'subdriver' => 'mysql'
)
)
)
diff --git a/tests/mocks/database/config/pdo/pgsql.php b/tests/mocks/database/config/pdo/pgsql.php
index ddd638c8a..e55e3ea77 100644
--- a/tests/mocks/database/config/pdo/pgsql.php
+++ b/tests/mocks/database/config/pdo/pgsql.php
@@ -10,7 +10,7 @@ return array(
'password' => '',
'database' => 'ci_test',
'dbdriver' => 'pdo',
- 'pdodriver' => 'pgsql'
+ 'subdriver' => 'pgsql'
),
// Database configuration with failover
@@ -21,7 +21,7 @@ return array(
'password' => 'wrong password',
'database' => 'not_ci_test',
'dbdriver' => 'pdo',
- 'pdodriver' => 'pgsql',
+ 'subdriver' => 'pgsql',
'failover' => array(
array(
'dsn' => 'pgsql:host=localhost;port=5432;dbname=ci_test;',
@@ -30,7 +30,7 @@ return array(
'password' => '',
'database' => 'ci_test',
'dbdriver' => 'pdo',
- 'pdodriver' => 'pgsql'
+ 'subdriver' => 'pgsql'
)
)
)
diff --git a/tests/mocks/database/config/pdo/sqlite.php b/tests/mocks/database/config/pdo/sqlite.php
index 36461843d..1bf56b3ac 100644
--- a/tests/mocks/database/config/pdo/sqlite.php
+++ b/tests/mocks/database/config/pdo/sqlite.php
@@ -10,7 +10,7 @@ return array(
'password' => 'sqlite',
'database' => 'sqlite',
'dbdriver' => 'pdo',
- 'pdodriver' => 'sqlite'
+ 'subdriver' => 'sqlite'
),
// Database configuration with failover
@@ -21,7 +21,7 @@ return array(
'password' => 'sqlite',
'database' => 'sqlite',
'dbdriver' => 'pdo',
- 'pdodriver' => 'sqlite',
+ 'subdriver' => 'sqlite',
'failover' => array(
array(
'dsn' => 'sqlite:/'.realpath(__DIR__.'/../..').'/ci_test.sqlite',
@@ -30,7 +30,7 @@ return array(
'password' => 'sqlite',
'database' => 'sqlite',
'dbdriver' => 'pdo',
- 'pdodriver' => 'sqlite'
+ 'subdriver' => 'sqlite'
)
)
)
diff --git a/tests/mocks/database/db.php b/tests/mocks/database/db.php
index 30504bba6..7e0030e15 100644
--- a/tests/mocks/database/db.php
+++ b/tests/mocks/database/db.php
@@ -8,6 +8,16 @@ class Mock_Database_DB {
private $config = array();
/**
+ * @var string DB driver name
+ */
+ private static $dbdriver = '';
+
+ /**
+ * @var string DB sub-driver name
+ */
+ private static $subdriver = '';
+
+ /**
* Prepare database configuration skeleton
*
* @param array DB configuration to set
@@ -31,6 +41,12 @@ class Mock_Database_DB {
throw new InvalidArgumentException('Group '.$group.' not exists');
}
+ self::$dbdriver = $this->config[$group]['dbdriver'];
+ if (isset($this->config[$group]['subdriver']))
+ {
+ self::$subdriver = $this->config[$group]['subdriver'];
+ }
+
$params = array(
'dbprefix' => '',
'pconnect' => FALSE,
@@ -45,17 +61,17 @@ class Mock_Database_DB {
);
$config = array_merge($this->config[$group], $params);
- $dsnstring = ( ! empty($config['dsn'])) ? $config['dsn'] : FALSE;
- $pdodriver = ( ! empty($config['pdodriver'])) ? $config['pdodriver'] : FALSE;
- $failover = ( ! empty($config['failover'])) ? $config['failover'] : FALSE;
+ $dsnstring = empty($config['dsn']) ? FALSE : $config['dsn'];
+ $subdriver = empty($config['subdriver']) ? FALSE: $config['subdriver'];
+ $failover = empty($config['failover']) ? FALSE : $config['failover'];
$dsn = $config['dbdriver'].'://'.$config['username'].':'.$config['password']
- .'@'.$config['hostname'].'/'.$config['database'];
+ .'@'.$config['hostname'].'/'.$config['database'];
// Build the parameter
$other_params = array_slice($config, 6);
if ($dsnstring) $other_params['dsn'] = $dsnstring;
- if ($pdodriver) $other_params['pdodriver'] = $pdodriver;
+ if ($subdriver) $other_params['subdriver'] = $subdriver;
if ($failover) $other_params['failover'] = $failover;
return $dsn.'?'.http_build_query($other_params);
@@ -83,7 +99,32 @@ class Mock_Database_DB {
*/
public static function DB($group, $query_builder = FALSE)
{
- include_once(BASEPATH.'database/DB.php');
+ // Create dummy driver and builder files to "load" - the mocks have
+ // already triggered autoloading of the real files
+ $case = CI_TestCase::instance();
+ $driver = self::$dbdriver;
+ $subdriver = self::$subdriver;
+ $case->ci_vfs_create(array(
+ 'DB_driver.php' => '',
+ 'DB_forge.php' => '',
+ 'DB_query_builder.php' => ''
+ ), '', $case->ci_base_root, 'database');
+ if (file_exists(SYSTEM_PATH.'database/drivers/'.$driver.'/'.$driver.'_driver.php'))
+ {
+ $case->ci_vfs_create(array(
+ $driver.'_driver.php' => '',
+ $driver.'_forge.php' => ''
+ ), '', $case->ci_base_root, 'database/drivers/'.$driver);
+ }
+ if ($subdriver)
+ {
+ $case->ci_vfs_create(array(
+ $driver.'_'.$subdriver.'_driver.php' => '',
+ $driver.'_'.$subdriver.'_forge.php' => ''
+ ), '', $case->ci_base_root, 'database/drivers/'.$driver.'/subdrivers');
+ }
+
+ include_once(SYSTEM_PATH.'database/DB.php');
try
{
diff --git a/tests/mocks/database/db/driver.php b/tests/mocks/database/db/driver.php
index 65ac2c4cc..2cf54b97b 100644
--- a/tests/mocks/database/db/driver.php
+++ b/tests/mocks/database/db/driver.php
@@ -34,6 +34,7 @@ class Mock_Database_DB_Driver extends CI_DB_driver {
return call_user_func_array(array($this->ci_db_driver, $method), $arguments);
}
+
}
class CI_DB extends Mock_Database_DB_QueryBuilder {} \ No newline at end of file
diff --git a/tests/mocks/database/drivers/mysqli.php b/tests/mocks/database/drivers/mysqli.php
new file mode 100644
index 000000000..73c35b609
--- /dev/null
+++ b/tests/mocks/database/drivers/mysqli.php
@@ -0,0 +1,17 @@
+<?php
+
+class Mock_Database_Drivers_Mysqli extends Mock_Database_DB_Driver {
+
+ /**
+ * Instantiate the database driver
+ *
+ * @param string DB Driver class name
+ * @param array DB configuration to set
+ * @return void
+ */
+ public function __construct($config = array())
+ {
+ parent::__construct('CI_DB_mysqli_driver', $config);
+ }
+
+} \ No newline at end of file
diff --git a/tests/mocks/database/schema/skeleton.php b/tests/mocks/database/schema/skeleton.php
index 18e1ddd4d..e5c536090 100644
--- a/tests/mocks/database/schema/skeleton.php
+++ b/tests/mocks/database/schema/skeleton.php
@@ -30,7 +30,7 @@ class Mock_Database_Schema_Skeleton {
CI_TestCase::instance()->ci_instance_var('db', $db);
- $loader = new Mock_Core_Loader();
+ $loader = new CI_Loader();
$loader->dbforge();
$forge = CI_TestCase::instance()->ci_instance_var('dbforge');
@@ -69,7 +69,7 @@ class Mock_Database_Schema_Skeleton {
)
));
static::$forge->add_key('id', TRUE);
- static::$forge->create_table('user', (strpos(static::$driver, 'pgsql') === FALSE));
+ static::$forge->create_table('user', TRUE);
// Job Table
static::$forge->add_field(array(
@@ -86,7 +86,7 @@ class Mock_Database_Schema_Skeleton {
)
));
static::$forge->add_key('id', TRUE);
- static::$forge->create_table('job', (strpos(static::$driver, 'pgsql') === FALSE));
+ static::$forge->create_table('job', TRUE);
// Misc Table
static::$forge->add_field(array(
@@ -103,7 +103,7 @@ class Mock_Database_Schema_Skeleton {
)
));
static::$forge->add_key('id', TRUE);
- static::$forge->create_table('misc', (strpos(static::$driver, 'pgsql') === FALSE));
+ static::$forge->create_table('misc', TRUE);
}
/**
@@ -129,7 +129,8 @@ class Mock_Database_Schema_Skeleton {
),
'misc' => array(
array('id' => 1, 'key' => '\\xxxfoo456', 'value' => 'Entry with \\xxx'),
- array('id' => 2, 'key' => '\\%foo456', 'value' => 'Entry with \\%')
+ array('id' => 2, 'key' => '\\%foo456', 'value' => 'Entry with \\%'),
+ array('id' => 3, 'key' => 'spaces and tabs', 'value' => ' One two three tab')
)
);
diff --git a/tests/mocks/libraries/driver.php b/tests/mocks/libraries/driver.php
new file mode 100644
index 000000000..633194345
--- /dev/null
+++ b/tests/mocks/libraries/driver.php
@@ -0,0 +1,27 @@
+<?php
+
+/**
+ * Mock library to subclass Driver for testing
+ */
+class Mock_Libraries_Driver extends CI_Driver_Library {
+ /**
+ * Set valid drivers list
+ */
+ public function driver_list($drivers = NULL)
+ {
+ if (empty($drivers))
+ {
+ return $this->valid_drivers;
+ }
+
+ $this->valid_drivers = (array) $drivers;
+ }
+
+ /**
+ * Get library name
+ */
+ public function get_name()
+ {
+ return $this->lib_name;
+ }
+} \ No newline at end of file
diff --git a/tests/mocks/libraries/session.php b/tests/mocks/libraries/session.php
new file mode 100644
index 000000000..562033bbf
--- /dev/null
+++ b/tests/mocks/libraries/session.php
@@ -0,0 +1,36 @@
+<?php
+
+/**
+ * Mock library to add testing features to Session driver library
+ */
+class Mock_Libraries_Session extends CI_Session {
+ /**
+ * Simulate new page load
+ */
+ public function reload()
+ {
+ $this->_flashdata_sweep();
+ $this->_flashdata_mark();
+ $this->_tempdata_sweep();
+ }
+}
+
+/**
+ * Mock cookie driver to overload cookie setting
+ */
+class Mock_Libraries_Session_cookie extends CI_Session_cookie {
+ /**
+ * Overload _setcookie to manage $_COOKIE values, since actual cookies can't be set in unit testing
+ */
+ protected function _setcookie($name, $value = '', $expire = 0, $path = '', $domain = '', $secure = FALSE, $httponly = FALSE)
+ {
+ if (empty($value) OR $expire <= time())
+ {
+ unset($_COOKIE[$name]);
+ }
+ else
+ {
+ $_COOKIE[$name] = $value;
+ }
+ }
+} \ No newline at end of file
diff --git a/tests/mocks/libraries/upload.php b/tests/mocks/libraries/upload.php
new file mode 100644
index 000000000..988723e45
--- /dev/null
+++ b/tests/mocks/libraries/upload.php
@@ -0,0 +1,3 @@
+<?php
+
+class Mock_Libraries_Upload extends CI_Upload {} \ No newline at end of file
diff --git a/tests/mocks/uploads/ci_logo.gif b/tests/mocks/uploads/ci_logo.gif
new file mode 100644
index 000000000..073ec14b4
--- /dev/null
+++ b/tests/mocks/uploads/ci_logo.gif
Binary files differ
diff --git a/tests/phpunit.xml b/tests/phpunit.xml
index 56cb8841c..96c3af9bb 100644
--- a/tests/phpunit.xml
+++ b/tests/phpunit.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
-<phpunit
+<phpunit
bootstrap="./Bootstrap.php"
colors="true"
convertNoticesToExceptions="true"
@@ -16,10 +16,11 @@
<directory suffix="test.php">./codeigniter/libraries</directory>
</testsuite>
</testsuites>
- <filters>
+ <filter>
<blacklist>
<directory suffix=".php">PEAR_INSTALL_DIR</directory>
<directory suffix=".php">PHP_LIBDIR</directory>
+ <directory suffix=".php">../vendor</directory>
</blacklist>
- </filters>
+ </filter>
</phpunit> \ No newline at end of file
diff --git a/tests/travis/mysql.phpunit.xml b/tests/travis/mysql.phpunit.xml
index 38c8eba48..06d4a011b 100644
--- a/tests/travis/mysql.phpunit.xml
+++ b/tests/travis/mysql.phpunit.xml
@@ -18,7 +18,7 @@
</testsuite>
</testsuites>
<filter>
- <whitelist addUncoveredFilesFromWhitelist="true">
+ <whitelist addUncoveredFilesFromWhitelist="false">
<directory suffix=".php">../../system</directory>
</whitelist>
</filter>
diff --git a/tests/travis/mysqli.phpunit.xml b/tests/travis/mysqli.phpunit.xml
new file mode 100644
index 000000000..1364f8bfa
--- /dev/null
+++ b/tests/travis/mysqli.phpunit.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<phpunit
+ bootstrap="../Bootstrap.php"
+ colors="true"
+ convertNoticesToExceptions="true"
+ convertWarningsToExceptions="true"
+ stopOnError="false"
+ stopOnFailure="false"
+ stopOnIncomplete="false"
+ stopOnSkipped="false">
+ <php>
+ <const name="DB_DRIVER" value="mysqli"/>
+ </php>
+ <testsuites>
+ <testsuite name="CodeIgniter Core Test Suite">
+ <directory suffix="test.php">../codeigniter</directory>
+ </testsuite>
+ </testsuites>
+ <filter>
+ <whitelist addUncoveredFilesFromWhitelist="false">
+ <directory suffix=".php">../../system</directory>
+ </whitelist>
+ </filter>
+</phpunit> \ No newline at end of file
diff --git a/tests/travis/pdo/mysql.phpunit.xml b/tests/travis/pdo/mysql.phpunit.xml
index c3113a66f..7121edc45 100644
--- a/tests/travis/pdo/mysql.phpunit.xml
+++ b/tests/travis/pdo/mysql.phpunit.xml
@@ -18,7 +18,7 @@
</testsuite>
</testsuites>
<filter>
- <whitelist addUncoveredFilesFromWhitelist="true">
+ <whitelist addUncoveredFilesFromWhitelist="false">
<directory suffix=".php">../../../system</directory>
</whitelist>
</filter>
diff --git a/tests/travis/pdo/pgsql.phpunit.xml b/tests/travis/pdo/pgsql.phpunit.xml
index 232025523..df3ff986e 100644
--- a/tests/travis/pdo/pgsql.phpunit.xml
+++ b/tests/travis/pdo/pgsql.phpunit.xml
@@ -18,7 +18,7 @@
</testsuite>
</testsuites>
<filter>
- <whitelist addUncoveredFilesFromWhitelist="true">
+ <whitelist addUncoveredFilesFromWhitelist="false">
<directory suffix=".php">../../../system</directory>
</whitelist>
</filter>
diff --git a/tests/travis/pdo/sqlite.phpunit.xml b/tests/travis/pdo/sqlite.phpunit.xml
index 3d1256721..7d867f6d1 100644
--- a/tests/travis/pdo/sqlite.phpunit.xml
+++ b/tests/travis/pdo/sqlite.phpunit.xml
@@ -18,7 +18,7 @@
</testsuite>
</testsuites>
<filter>
- <whitelist addUncoveredFilesFromWhitelist="true">
+ <whitelist addUncoveredFilesFromWhitelist="false">
<directory suffix=".php">../../../system</directory>
</whitelist>
</filter>
diff --git a/tests/travis/pgsql.phpunit.xml b/tests/travis/pgsql.phpunit.xml
index 51e433d76..bfddbf6b5 100644
--- a/tests/travis/pgsql.phpunit.xml
+++ b/tests/travis/pgsql.phpunit.xml
@@ -18,7 +18,7 @@
</testsuite>
</testsuites>
<filter>
- <whitelist addUncoveredFilesFromWhitelist="true">
+ <whitelist addUncoveredFilesFromWhitelist="false">
<directory suffix=".php">../../system</directory>
</whitelist>
</filter>
diff --git a/tests/travis/sqlite.phpunit.xml b/tests/travis/sqlite.phpunit.xml
index 701165734..75c946aee 100644
--- a/tests/travis/sqlite.phpunit.xml
+++ b/tests/travis/sqlite.phpunit.xml
@@ -18,7 +18,7 @@
</testsuite>
</testsuites>
<filter>
- <whitelist addUncoveredFilesFromWhitelist="true">
+ <whitelist addUncoveredFilesFromWhitelist="false">
<directory suffix=".php">../../system</directory>
</whitelist>
</filter>