# Do not merge to default until this is blank #

- Clean up naming conventions
- Figure out config stuff
- Figure out database testing



# -------------- CodeIgniter Testing (4/20/2011) -------------- #


# Introduction:

This is the preliminary CodeIgniter testing documentation. It
will cover both internal as well as external APIs and the reasoning
behind their implemenation, where appropriate. As with all CodeIgniter
documentation, this file should maintain a mostly human readable
format to facilitate clean api design. [see http://arrenbrecht.ch/testing/]

*FIRST PUBLIC DRAFT: EVERYTHING IS SUBJECT TO CHANGE*

# Test Suites:

CodeIgniter bootstraps a request very directly, with very flat class
hierarchy. As a result, there is no main CodeIgniter class until the
controller is instantiated.

This has forced the core classes to be relatively decoupled, which is
a good thing. However, it makes that portion of code relatively hard
to test.

Right now that means we'll probably have two core test suites, along
with a base for application and package tests. That gives us:

1. Bootstrap Test	- test common.php and sanity check codeigniter.php		[in planning]
2. System Test		- test core components in relative isolation			[in development]
3. Application Test	- bootstrapping for application/tests					[not started]
4. Package Test		- bootstrapping for <package>/tests						[not started]


## 1. Bootstrap Test

Testing common.php should be pretty simple. Include the file, and test the
functions. May require some tweaking so that we can grab the statics from all
methods (see is_loaded()). Testing the actual CodeIgniter.php file will most
likely be an output test for the default view, with some object checking after
the file runs. Needs consideration.


## 2. System Test

Testing the core system relies on being able to isolate the core components
as much as possible. A few of them access other core classes as globals. These
should be mocked up and easy to manipulate.

All functions in common.php should be a minimal implementation, or and mapped
to a method in the test's parent class to gives us full control of their output.


### CodeIgniterTestCase Documentation


Test cases should extend CodeIgniterTestCase. This internally
extends PHPUnit_Framework_TestCase, so you have access to all
of your usual PHPUnit methods.

We need to provide a simple way to modify the globals and the
common function output. We also need to be able to mock up
the super object as we please.

Current API is *not stable*. Names and implementations will change.

$this->ci_instance($obj)
	set the object to use as the "super object", in a lot
	of cases this will be a simple stdClass with the attributes
	you need it to have.

$this->ci_set_instance_var($name, $val)
	add an attribute to the super object. This is useful if you
	set up a simple instance in setUp and then need to add different
	class mockups to your super object.

$this->ci_core_class($name)
	Get the _class name_ of a core class, so that you can instantiate
	it. The variable is returned by reference and is tied to the correct
	$GLOBALS key. For example:
	$cfg =& $this->ci_core_class('cfg'); // returns 'CI_Config'
	$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.


## 3. Application Test:

Not sure yet, needs to handle:
- Libraries
- Helpers
- Models
- MY_* files
- Controllers (uh...?)
- Views? (watir, selenium, cucumber?)

- Database Testing


## 4. Package Test:

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)