From 69c97a71476e4eaa6c629022fcd4ec7f36d4ec0d Mon Sep 17 00:00:00 2001 From: Pascal Kriete Date: Wed, 20 Apr 2011 21:44:54 -0400 Subject: Adding early bootstrap ideas for core test suite --- tests/Bootstrap.php | 21 ++++ tests/codeigniter/Setup_test.php | 13 +++ tests/codeigniter/core/Config_test.php | 107 ++++++++++++++++++ tests/codeigniter/core/Lang_test.php | 31 +++++ tests/codeigniter/core/Loader_test.php | 144 ++++++++++++++++++++++++ tests/codeigniter/helpers/Array_helper_test.php | 49 ++++++++ tests/codeigniter/libraries/Parser_test.php | 125 ++++++++++++++++++++ tests/lib/ci_testcase.php | 110 ++++++++++++++++++ tests/lib/common.php | 120 ++++++++++++++++++++ tests/phpunit.xml | 17 +++ 10 files changed, 737 insertions(+) create mode 100644 tests/Bootstrap.php create mode 100644 tests/codeigniter/Setup_test.php create mode 100644 tests/codeigniter/core/Config_test.php create mode 100644 tests/codeigniter/core/Lang_test.php create mode 100644 tests/codeigniter/core/Loader_test.php create mode 100644 tests/codeigniter/helpers/Array_helper_test.php create mode 100644 tests/codeigniter/libraries/Parser_test.php create mode 100644 tests/lib/ci_testcase.php create mode 100644 tests/lib/common.php create mode 100644 tests/phpunit.xml diff --git a/tests/Bootstrap.php b/tests/Bootstrap.php new file mode 100644 index 000000000..ca63ff788 --- /dev/null +++ b/tests/Bootstrap.php @@ -0,0 +1,21 @@ +markTestIncomplete('not implemented'); + // ensure that our bootstrapped test environment + // is a good representation of an isolated CI install + //die('here'); + } + +} \ No newline at end of file diff --git a/tests/codeigniter/core/Config_test.php b/tests/codeigniter/core/Config_test.php new file mode 100644 index 000000000..628fc630b --- /dev/null +++ b/tests/codeigniter/core/Config_test.php @@ -0,0 +1,107 @@ +ci_core_class('cfg'); + + $stub = $this->getMock($cls, NULL, array(), '', FALSE); + + //I would prefer this, but it currently + // does not work as when you try to pass + // null to setMethods it fails on an internal + // function call that expects an array =( + /* + $stub = $this->getMockBuilder($cls) + ->disableOriginalConstructor() + ->setMethods(null) + ->getMock(); + */ + + + // set predictable config values + $stub->config = array( + 'index_page' => 'index.php', + 'base_url' => 'http://example.com/', + 'subclass_prefix' => 'MY_' + ); + + $this->config = $stub; + } + + // -------------------------------------------------------------------- + + public function testItem() + { + $this->assertEquals('http://example.com/', $this->config->item('base_url')); + + // Bad Config value + $this->assertFalse($this->config->item('no_good_item')); + + // Index + $this->assertFalse($this->config->item('no_good_item', 'bad_index')); + $this->assertFalse($this->config->item('no_good_item', 'default')); + } + + // -------------------------------------------------------------------- + + public function testSetItem() + { + $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')); + } + + // -------------------------------------------------------------------- + + public function testSlashItem() + { + // 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('MY_/', $this->config->slash_item('subclass_prefix')); + } + + // -------------------------------------------------------------------- + + public function testSiteUrl() + { + $this->assertEquals('http://example.com/index.php', $this->config->site_url()); + + $base_url = $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'))); + + $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->config->set_item('base_url', $base_url); + + $this->assertEquals('http://example.com/index.php?test', $this->config->site_url('test')); + + // back to home base + $this->config->set_item('enable_query_strings', $q_string); + } + + // -------------------------------------------------------------------- + + public function testSystemUrl() + { + $this->assertEquals('http://example.com/system/', $this->config->system_url()); + } + +} \ No newline at end of file diff --git a/tests/codeigniter/core/Lang_test.php b/tests/codeigniter/core/Lang_test.php new file mode 100644 index 000000000..82e279a52 --- /dev/null +++ b/tests/codeigniter/core/Lang_test.php @@ -0,0 +1,31 @@ +ci_core_class('lang'); + $this->lang = new $cls; + } + + // -------------------------------------------------------------------- + + public function testLoad() + { + // get_config needs work + $this->markTestIncomplete('get_config needs work'); + //$this->assertTrue($this->lang->load('profiler')); + } + + // -------------------------------------------------------------------- + + public function testLine() + { + $this->markTestIncomplete('get_config needs work'); + + $this->assertEquals('URI STRING', $this->lang->line('profiler_uri_string')); + } + +} \ No newline at end of file diff --git a/tests/codeigniter/core/Loader_test.php b/tests/codeigniter/core/Loader_test.php new file mode 100644 index 000000000..fd9c63216 --- /dev/null +++ b/tests/codeigniter/core/Loader_test.php @@ -0,0 +1,144 @@ +ci_core_class('load'); + $this->_loader = new $cls; + + // mock up a ci instance + $this->ci_obj = new StdClass; + + // Fix get_instance() + CodeIgniterTestCase::$test_instance =& $this; + $this->ci_instance($this->ci_obj); + } + + // -------------------------------------------------------------------- + + public function testLibrary() + { + // 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)); + + // Add the mock to our stdClass + $this->ci_set_instance_var('config', $config); + + // Test loading as an array. + $this->assertEquals(NULL, $this->_loader->library(array('table'))); + $this->assertTrue(class_exists('CI_Table'), 'Table class exists'); + $this->assertAttributeInstanceOf('CI_Table', 'table', $this->ci_obj); + + // Test no lib given + $this->assertEquals(FALSE, $this->_loader->library()); + + // Test a string given to params + $this->assertEquals(NULL, $this->_loader->library('table', ' ')); + } + + // -------------------------------------------------------------------- + + public function testModels() + { + // Test loading as an array. + $this->assertEquals(NULL, $this->_loader->model(array('foobar'))); + + // Test no model given + $this->assertEquals(FALSE, $this->_loader->model('')); + + // Test a string given to params + $this->assertEquals(NULL, $this->_loader->model('foobar', ' ')); + } + + // -------------------------------------------------------------------- + + public function testDatabase() + { + $this->assertEquals(NULL, $this->_loader->database()); + $this->assertEquals(NULL, $this->_loader->dbutil()); + } + + // -------------------------------------------------------------------- + + public function testView() + { + // I'm not entirely sure this is the proper way to handle this. + // So, let's revist it, m'kay? + try + { + $this->_loader->view('foo'); + } + catch (Exception $expected) + { + return; + } + } + + // -------------------------------------------------------------------- + + public function testFile() + { + // I'm not entirely sure this is the proper way to handle this. + // So, let's revist it, m'kay? + try + { + $this->_loader->file('foo'); + } + catch (Exception $expected) + { + return; + } + } + + // -------------------------------------------------------------------- + + public function testVars() + { + $vars = array( + 'foo' => 'bar' + ); + + $this->assertEquals(NULL, $this->_loader->vars($vars)); + $this->assertEquals(NULL, $this->_loader->vars('foo', 'bar')); + } + + // -------------------------------------------------------------------- + + public function testHelper() + { + $this->assertEquals(NULL, $this->_loader->helper('array')); + $this->assertEquals(NULL, $this->_loader->helper('bad')); + } + + // -------------------------------------------------------------------- + + public function testHelpers() + { + $this->assertEquals(NULL, $this->_loader->helpers(array('file', 'array', 'string'))); + } + + // -------------------------------------------------------------------- + + // public function testLanguage() + // { + // $this->assertEquals(NULL, $this->_loader->language('test')); + // } + + // -------------------------------------------------------------------- + + public function testLoadConfig() + { + $this->assertEquals(NULL, $this->_loader->config('config', FALSE, TRUE)); + } + + + +} \ No newline at end of file diff --git a/tests/codeigniter/helpers/Array_helper_test.php b/tests/codeigniter/helpers/Array_helper_test.php new file mode 100644 index 000000000..bbefdb49d --- /dev/null +++ b/tests/codeigniter/helpers/Array_helper_test.php @@ -0,0 +1,49 @@ +my_array = array( + 'foo' => 'bar', + 'sally' => 'jim', + 'maggie' => 'bessie', + 'herb' => 'cook' + ); + } + + // ------------------------------------------------------------------------ + + public function testElementWithExistingItem() + { + $this->assertEquals(FALSE, element('testing', $this->my_array)); + + $this->assertEquals('not set', element('testing', $this->my_array, 'not set')); + + $this->assertEquals('bar', element('foo', $this->my_array)); + } + + // ------------------------------------------------------------------------ + + public function testRandomElement() + { + // Send a string, not an array to random_element + $this->assertEquals('my string', random_element('my string')); + + // Test sending an array + $this->assertEquals(TRUE, in_array(random_element($this->my_array), $this->my_array)); + } + + // ------------------------------------------------------------------------ + + public function testElements() + { + $this->assertEquals(TRUE, is_array(elements('test', $this->my_array))); + $this->assertEquals(TRUE, is_array(elements('foo', $this->my_array))); + } + +} \ No newline at end of file diff --git a/tests/codeigniter/libraries/Parser_test.php b/tests/codeigniter/libraries/Parser_test.php new file mode 100644 index 000000000..a8de108f0 --- /dev/null +++ b/tests/codeigniter/libraries/Parser_test.php @@ -0,0 +1,125 @@ +load->library('parser'); + self::$cls = get_class($CI->parser); + } + + // -------------------------------------------------------------------- + + public function setUp() + { + $cls = self::$cls; + $this->parser = new $cls; + } + // -------------------------------------------------------------------- + + public function testSetDelimiters() + { + // Make sure default delimiters are there + $this->assertEquals('{', $this->parser->l_delim); + $this->assertEquals('}', $this->parser->r_delim); + + // Change them to square brackets + $this->parser->set_delimiters('[', ']'); + + // Make sure they changed + $this->assertEquals('[', $this->parser->l_delim); + $this->assertEquals(']', $this->parser->r_delim); + + // Reset them + $this->parser->set_delimiters(); + + // Make sure default delimiters are there + $this->assertEquals('{', $this->parser->l_delim); + $this->assertEquals('}', $this->parser->r_delim); + } + + // -------------------------------------------------------------------- + + public function testParseSimpleString() + { + $data = array( + 'title' => 'Page Title', + 'body' => 'Lorem ipsum dolor sit amet.' + ); + + $template = "{title}\n{body}"; + + $result = implode("\n", $data); + + $this->assertEquals($result, $this->parser->parse_string($template, $data, TRUE)); + } + + // -------------------------------------------------------------------- + + public function testParse() + { + $this->_parse_no_template(); + $this->_parse_var_pair(); + $this->_mismatched_var_pair(); + } + + // -------------------------------------------------------------------- + + private function _parse_no_template() + { + $this->assertFalse($this->parser->parse_string('', '', TRUE)); + } + + // -------------------------------------------------------------------- + + private function _parse_var_pair() + { + $data = array( + 'title' => 'Super Heroes', + 'powers' => array( + array( + 'invisibility' => 'yes', + 'flying' => 'no'), + ) + ); + + $template = "{title}\n{powers}{invisibility}\n{flying}{/powers}"; + + $result = "Super Heroes\nyes\nno"; + + $this->assertEquals($result, $this->parser->parse_string($template, $data, TRUE)); + } + + // -------------------------------------------------------------------- + + private function _mismatched_var_pair() + { + $data = array( + 'title' => 'Super Heroes', + 'powers' => array( + array( + 'invisibility' => 'yes', + 'flying' => 'no'), + ) + ); + + $template = "{title}\n{powers}{invisibility}\n{flying}"; + + $result = "Super Heroes\n{powers}{invisibility}\n{flying}"; + + $this->assertEquals($result, $this->parser->parse_string($template, $data, TRUE)); + } + + // -------------------------------------------------------------------- + + // -------------------------------------------------------------------- + + // -------------------------------------------------------------------- + +} \ No newline at end of file diff --git a/tests/lib/ci_testcase.php b/tests/lib/ci_testcase.php new file mode 100644 index 000000000..a8a272db2 --- /dev/null +++ b/tests/lib/ci_testcase.php @@ -0,0 +1,110 @@ + 'bm', + 'config' => 'cfg', + 'hooks' => 'ext', + 'utf8' => 'uni', + 'router' => 'rtr', + 'output' => 'out', + 'security' => 'sec', + 'input' => 'in', + 'lang' => 'lang', + + // @todo the loader is an edge case + 'loader' => 'load' + ); + + function __construct() + { + parent::__construct(); + } + + // -------------------------------------------------------------------- + + // Change what get_instance returns + function ci_instance($obj) + { + $this->ci_instance = $obj; + } + + // -------------------------------------------------------------------- + + function ci_set_instance_var($name, $obj) + { + $this->ci_instance->$name =& $obj; + } + + // -------------------------------------------------------------------- + + // Set a class to a mock before it is loaded + function ci_library($name) + { + + } + + // -------------------------------------------------------------------- + + /** + * Grab a core class + * + * Loads the correct core class without extensions + * and returns a reference to the class name in the + * globals array with the correct key. This way the + * test can modify the variable it assigns to and + * still maintain the global. + */ + function &ci_core_class($name) + { + $name = strtolower($name); + + if (isset(self::$global_map[$name])) + { + $class_name = ucfirst($name); + $global_name = self::$global_map[$name]; + } + elseif (in_array($name, self::$global_map)) + { + $class_name = ucfirst(array_search($name, self::$global_map)); + $global_name = $name; + } + else + { + throw new Exception('Not a valid core class.'); + } + + if ( ! class_exists('CI_'.$class_name)) + { + require_once BASEPATH.'core/'.$class_name.'.php'; + } + + $GLOBALS[strtoupper($global_name)] = 'CI_'.$class_name; + return $GLOBALS[strtoupper($global_name)]; + } + + // -------------------------------------------------------------------- + + // convenience function for global mocks + function ci_set_core_class($name, $obj) + { + $orig =& $this->ci_core_class($name); + $orig = $obj; + } + + // -------------------------------------------------------------------- + + static function ci_config($item) + { + return ''; + } +} + +// EOF \ No newline at end of file diff --git a/tests/lib/common.php b/tests/lib/common.php new file mode 100644 index 000000000..482721a9a --- /dev/null +++ b/tests/lib/common.php @@ -0,0 +1,120 @@ +ci_instance; +} + +// Config Stuff | @todo High priority! +// -------------------------------------------------------------------- + +function get_config() { die('implement me'); } + +function config_item($item) +{ + return CodeIgniterTestCase::ci_config($item); +} + +// -------------------------------------------------------------------- + +function load_class($class, $directory = 'libraries', $prefix = 'CI_') +{ + if ($directory != 'core' OR $prefix != 'CI_') + { + throw new Exception('Not Implemented: Non-core load_class()'); + } + + $test = CodeIgniterTestCase::$test_instance; + + $obj =& $test->ci_core_class($class); + + if (is_string($obj)) + { + throw new Exception('Bad Isolation: Use ci_set_core_class to set '.$class.''); + } + + return $obj; +} + +// This is sort of meh. Should probably be mocked up with +// controllable output, so that we can test some of our +// security code. The function itself will be tested in the +// bootstrap testsuite. +// -------------------------------------------------------------------- + +function remove_invisible_characters($str, $url_encoded = TRUE) +{ + $non_displayables = array(); + + // every control character except newline (dec 10) + // carriage return (dec 13), and horizontal tab (dec 09) + + if ($url_encoded) + { + $non_displayables[] = '/%0[0-8bcef]/'; // url encoded 00-08, 11, 12, 14, 15 + $non_displayables[] = '/%1[0-9a-f]/'; // url encoded 16-31 + } + + $non_displayables[] = '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S'; // 00-08, 11, 12, 14-31, 127 + + do + { + $str = preg_replace($non_displayables, '', $str, -1, $count); + } + while ($count); + + return $str; +} + + +// Clean up error messages +// -------------------------------------------------------------------- + +function show_error($message, $status_code = 500, $heading = 'An Error Was Encountered') +{ + throw new Exception('CI Error: '.$message); +} + +function show_404($page = '', $log_error = TRUE) +{ + throw new Exception('CI Error: 404'); +} + +function _exception_handler($severity, $message, $filepath, $line) +{ + throw new Exception('CI Exception: '.$message.' | '.$filepath.' | '.$line); +} + + +// We assume a few things about our environment ... +// -------------------------------------------------------------------- + +function is_php($version = '5.0.0') +{ + return ! (version_compare(PHP_VERSION, $version) < 0); +} + +function is_really_writable($file) +{ + return is_writable($file); +} + +function is_loaded() +{ + throw new Exception('Bad Isolation: mock up environment'); +} + +function log_message($level = 'error', $message, $php_error = FALSE) +{ + return TRUE; +} + +function set_status_header($code = 200, $text = '') +{ + return TRUE; +} + +// EOF \ No newline at end of file diff --git a/tests/phpunit.xml b/tests/phpunit.xml new file mode 100644 index 000000000..9e5e10d59 --- /dev/null +++ b/tests/phpunit.xml @@ -0,0 +1,17 @@ + + + + + + codeigniter/Setup_test.php + codeigniter/core + + + + + \ No newline at end of file -- cgit v1.2.3-24-g4f1b