diff --git a/airtime_mvc/application/services/ShowService.php b/airtime_mvc/application/services/ShowService.php index 183af4723..d23eb2066 100644 --- a/airtime_mvc/application/services/ShowService.php +++ b/airtime_mvc/application/services/ShowService.php @@ -1379,8 +1379,9 @@ SQL; * @param $ccShow * @param $showData */ - private function setCcShow($showData) + public function setCcShow($showData) { + Logging::info($showData); if (!$this->isUpdate) { $ccShow = new CcShow(); } else { diff --git a/airtime_mvc/tests/application/bootstrap.php b/airtime_mvc/tests/application/bootstrap.php index e69de29bb..0db02c69f 100644 --- a/airtime_mvc/tests/application/bootstrap.php +++ b/airtime_mvc/tests/application/bootstrap.php @@ -0,0 +1,19 @@ +bootstrap = array($this, 'appBootstrap'); + parent::setUp(); + } + + public function appBootstrap() + { + $this->application = new Zend_Application(APPLICATION_ENV, APPLICATION_PATH .'/configs/application.ini'); + $this->application->bootstrap(); + } + + public function getConnection() + { + if ($this->_connectionMock == null) { + $config = new Zend_Config_Ini(APPLICATION_PATH . '/configs/application.ini', 'production'); + $connection = Zend_Db::factory($config->db); + + $this->_connectionMock = $this->createZendDbConnection( + $connection, + 'airtimeunittests' + ); + Zend_Db_Table_Abstract::setDefaultAdapter($connection); + } + return $this->_connectionMock; + } + + /* Defines how the initial state of the database should look before each test is executed + * Called once during setUp() and gets recreated for each new test + */ + public function getDataSet() + { + return $this->createXmlDataSet( + dirname(__FILE__) . '/files/cc_show_seed.xml' + ); + } + + public function testCcShowInsertedIntoDatabase() + { + $showService = new Application_Service_ShowService(); + + $data = array( + "add_show_id" => -1, + "add_show_name" => "test show", + "add_show_description" => null, + "add_show_url" => null, + "add_show_genre" => null, + "add_show_color" => "ffffff", + "add_show_background_color" => "364492", + "cb_airtime_auth" => 0, + "cb_custom_auth" => 0, + "custom_username" => null, + "custom_password" => null, + "add_show_linked" => 0 + ); + + $showService->setCcShow($data); + + $ds = new Zend_Test_PHPUnit_Db_DataSet_QueryDataSet( + $this->getConnection() + ); + $ds->addTable('cc_show', 'select * from cc_show'); + + $this->assertDataSetsEqual( + $this->createXmlDataSet(dirname(__FILE__)."/files/cc_show_insertIntoAssertion.xml"), + $ds + ); + } +} \ No newline at end of file diff --git a/airtime_mvc/tests/application/models/files/cc_show_insertIntoAssertion.xml b/airtime_mvc/tests/application/models/files/cc_show_insertIntoAssertion.xml new file mode 100644 index 000000000..e69de29bb diff --git a/airtime_mvc/tests/application/models/files/cc_show_seed.xml b/airtime_mvc/tests/application/models/files/cc_show_seed.xml new file mode 100644 index 000000000..e69de29bb diff --git a/airtime_mvc/tests/library/Zend/Application.php b/airtime_mvc/tests/library/Zend/Application.php new file mode 100644 index 000000000..ecc18c642 --- /dev/null +++ b/airtime_mvc/tests/library/Zend/Application.php @@ -0,0 +1,417 @@ +_environment = (string) $environment; + + require_once 'Zend/Loader/Autoloader.php'; + $this->_autoloader = Zend_Loader_Autoloader::getInstance(); + + if (null !== $options) { + if (is_string($options)) { + $options = $this->_loadConfig($options); + } elseif ($options instanceof Zend_Config) { + $options = $options->toArray(); + } elseif (!is_array($options)) { + throw new Zend_Application_Exception('Invalid options provided; must be location of config file, a config object, or an array'); + } + + $this->setOptions($options); + } + } + + /** + * Retrieve current environment + * + * @return string + */ + public function getEnvironment() + { + return $this->_environment; + } + + /** + * Retrieve autoloader instance + * + * @return Zend_Loader_Autoloader + */ + public function getAutoloader() + { + return $this->_autoloader; + } + + /** + * Set application options + * + * @param array $options + * @throws Zend_Application_Exception When no bootstrap path is provided + * @throws Zend_Application_Exception When invalid bootstrap information are provided + * @return Zend_Application + */ + public function setOptions(array $options) + { + if (!empty($options['config'])) { + if (is_array($options['config'])) { + $_options = array(); + foreach ($options['config'] as $tmp) { + $_options = $this->mergeOptions($_options, $this->_loadConfig($tmp)); + } + $options = $this->mergeOptions($_options, $options); + } else { + $options = $this->mergeOptions($this->_loadConfig($options['config']), $options); + } + } + + $this->_options = $options; + + $options = array_change_key_case($options, CASE_LOWER); + + $this->_optionKeys = array_keys($options); + + if (!empty($options['phpsettings'])) { + $this->setPhpSettings($options['phpsettings']); + } + + if (!empty($options['includepaths'])) { + $this->setIncludePaths($options['includepaths']); + } + + if (!empty($options['autoloadernamespaces'])) { + $this->setAutoloaderNamespaces($options['autoloadernamespaces']); + } + + if (!empty($options['autoloaderzfpath'])) { + $autoloader = $this->getAutoloader(); + if (method_exists($autoloader, 'setZfPath')) { + $zfPath = $options['autoloaderzfpath']; + $zfVersion = !empty($options['autoloaderzfversion']) + ? $options['autoloaderzfversion'] + : 'latest'; + $autoloader->setZfPath($zfPath, $zfVersion); + } + } + + if (!empty($options['bootstrap'])) { + $bootstrap = $options['bootstrap']; + + if (is_string($bootstrap)) { + $this->setBootstrap($bootstrap); + } elseif (is_array($bootstrap)) { + if (empty($bootstrap['path'])) { + throw new Zend_Application_Exception('No bootstrap path provided'); + } + + $path = $bootstrap['path']; + $class = null; + + if (!empty($bootstrap['class'])) { + $class = $bootstrap['class']; + } + + $this->setBootstrap($path, $class); + } else { + throw new Zend_Application_Exception('Invalid bootstrap information provided'); + } + } + + return $this; + } + + /** + * Retrieve application options (for caching) + * + * @return array + */ + public function getOptions() + { + return $this->_options; + } + + /** + * Is an option present? + * + * @param string $key + * @return bool + */ + public function hasOption($key) + { + return in_array(strtolower($key), $this->_optionKeys); + } + + /** + * Retrieve a single option + * + * @param string $key + * @return mixed + */ + public function getOption($key) + { + if ($this->hasOption($key)) { + $options = $this->getOptions(); + $options = array_change_key_case($options, CASE_LOWER); + return $options[strtolower($key)]; + } + return null; + } + + /** + * Merge options recursively + * + * @param array $array1 + * @param mixed $array2 + * @return array + */ + public function mergeOptions(array $array1, $array2 = null) + { + if (is_array($array2)) { + foreach ($array2 as $key => $val) { + if (is_array($array2[$key])) { + $array1[$key] = (array_key_exists($key, $array1) && is_array($array1[$key])) + ? $this->mergeOptions($array1[$key], $array2[$key]) + : $array2[$key]; + } else { + $array1[$key] = $val; + } + } + } + return $array1; + } + + /** + * Set PHP configuration settings + * + * @param array $settings + * @param string $prefix Key prefix to prepend to array values (used to map . separated INI values) + * @return Zend_Application + */ + public function setPhpSettings(array $settings, $prefix = '') + { + foreach ($settings as $key => $value) { + $key = empty($prefix) ? $key : $prefix . $key; + if (is_scalar($value)) { + ini_set($key, $value); + } elseif (is_array($value)) { + $this->setPhpSettings($value, $key . '.'); + } + } + + return $this; + } + + /** + * Set include path + * + * @param array $paths + * @return Zend_Application + */ + public function setIncludePaths(array $paths) + { + $path = implode(PATH_SEPARATOR, $paths); + set_include_path($path . PATH_SEPARATOR . get_include_path()); + return $this; + } + + /** + * Set autoloader namespaces + * + * @param array $namespaces + * @return Zend_Application + */ + public function setAutoloaderNamespaces(array $namespaces) + { + $autoloader = $this->getAutoloader(); + + foreach ($namespaces as $namespace) { + $autoloader->registerNamespace($namespace); + } + + return $this; + } + + /** + * Set bootstrap path/class + * + * @param string $path + * @param string $class + * @return Zend_Application + */ + public function setBootstrap($path, $class = null) + { + // setOptions() can potentially send a null value; specify default + // here + if (null === $class) { + $class = 'Bootstrap'; + } + + if (!class_exists($class, false)) { + require_once $path; + if (!class_exists($class, false)) { + throw new Zend_Application_Exception('Bootstrap class not found'); + } + } + $this->_bootstrap = new $class($this); + + if (!$this->_bootstrap instanceof Zend_Application_Bootstrap_Bootstrapper) { + throw new Zend_Application_Exception('Bootstrap class does not implement Zend_Application_Bootstrap_Bootstrapper'); + } + + return $this; + } + + /** + * Get bootstrap object + * + * @return Zend_Application_Bootstrap_BootstrapAbstract + */ + public function getBootstrap() + { + if (null === $this->_bootstrap) { + $this->_bootstrap = new Zend_Application_Bootstrap_Bootstrap($this); + } + return $this->_bootstrap; + } + + /** + * Bootstrap application + * + * @param null|string|array $resource + * @return Zend_Application + */ + public function bootstrap($resource = null) + { + $this->getBootstrap()->bootstrap($resource); + return $this; + } + + /** + * Run the application + * + * @return void + */ + public function run() + { + $this->getBootstrap()->run(); + } + + /** + * Load configuration file of options + * + * @param string $file + * @throws Zend_Application_Exception When invalid configuration file is provided + * @return array + */ + protected function _loadConfig($file) + { + $environment = $this->getEnvironment(); + $suffix = pathinfo($file, PATHINFO_EXTENSION); + $suffix = ($suffix === 'dist') + ? pathinfo(basename($file, ".$suffix"), PATHINFO_EXTENSION) + : $suffix; + + switch (strtolower($suffix)) { + case 'ini': + $config = new Zend_Config_Ini($file, $environment); + break; + + case 'xml': + $config = new Zend_Config_Xml($file, $environment); + break; + + case 'json': + $config = new Zend_Config_Json($file, $environment); + break; + + case 'yaml': + case 'yml': + $config = new Zend_Config_Yaml($file, $environment); + break; + + case 'php': + case 'inc': + $config = include $file; + if (!is_array($config)) { + throw new Zend_Application_Exception('Invalid configuration file provided; PHP file does not return array value'); + } + return $config; + break; + + default: + throw new Zend_Application_Exception('Invalid configuration file provided; unknown config type'); + } + + return $config->toArray(); + } +} diff --git a/airtime_mvc/tests/library/Zend/Test/PHPUnit/Constraint/DomQuery.php b/airtime_mvc/tests/library/Zend/Test/PHPUnit/Constraint/DomQuery.php new file mode 100644 index 000000000..042fec863 --- /dev/null +++ b/airtime_mvc/tests/library/Zend/Test/PHPUnit/Constraint/DomQuery.php @@ -0,0 +1,425 @@ +_path = $path; + } + + /** + * Indicate negative match + * + * @param bool $flag + * @return void + */ + public function setNegate($flag = true) + { + $this->_negate = $flag; + } + + /** + * Whether or not path is a straight XPath expression + * + * @param bool $flag + * @return Zend_Test_PHPUnit_Constraint_DomQuery + */ + public function setUseXpath($flag = true) + { + $this->_useXpath = (bool) $flag; + return $this; + } + + /** + * Evaluate an object to see if it fits the constraints + * + * @param string $other String to examine + * @param null|string Assertion type + * @return bool + */ + public function evaluate($other, $assertType = null) + { + if (strstr($assertType, 'Not')) { + $this->setNegate(true); + $assertType = str_replace('Not', '', $assertType); + } + + if (strstr($assertType, 'Xpath')) { + $this->setUseXpath(true); + $assertType = str_replace('Xpath', 'Query', $assertType); + } + + if (!in_array($assertType, $this->_assertTypes)) { + require_once 'Zend/Test/PHPUnit/Constraint/Exception.php'; + throw new Zend_Test_PHPUnit_Constraint_Exception(sprintf('Invalid assertion type "%s" provided to %s constraint', $assertType, __CLASS__)); + } + + $this->_assertType = $assertType; + + $method = $this->_useXpath ? 'queryXpath' : 'query'; + $domQuery = new Zend_Dom_Query($other); + $domQuery->registerXpathNamespaces($this->_xpathNamespaces); + $result = $domQuery->$method($this->_path); + $argv = func_get_args(); + $argc = func_num_args(); + + switch ($assertType) { + case self::ASSERT_CONTENT_CONTAINS: + if (3 > $argc) { + require_once 'Zend/Test/PHPUnit/Constraint/Exception.php'; + throw new Zend_Test_PHPUnit_Constraint_Exception('No content provided against which to match'); + } + $this->_content = $content = $argv[2]; + return ($this->_negate) + ? $this->_notMatchContent($result, $content) + : $this->_matchContent($result, $content); + case self::ASSERT_CONTENT_REGEX: + if (3 > $argc) { + require_once 'Zend/Test/PHPUnit/Constraint/Exception.php'; + throw new Zend_Test_PHPUnit_Constraint_Exception('No pattern provided against which to match'); + } + $this->_content = $content = $argv[2]; + return ($this->_negate) + ? $this->_notRegexContent($result, $content) + : $this->_regexContent($result, $content); + case self::ASSERT_CONTENT_COUNT: + case self::ASSERT_CONTENT_COUNT_MIN: + case self::ASSERT_CONTENT_COUNT_MAX: + if (3 > $argc) { + require_once 'Zend/Test/PHPUnit/Constraint/Exception.php'; + throw new Zend_Test_PHPUnit_Constraint_Exception('No count provided against which to compare'); + } + $this->_content = $content = $argv[2]; + return $this->_countContent($result, $content, $assertType); + case self::ASSERT_QUERY: + default: + if ($this->_negate) { + return (0 == count($result)); + } else { + return (0 != count($result)); + } + } + } + + /** + * Report Failure + * + * @see PHPUnit_Framework_Constraint for implementation details + * @param mixed $other CSS selector path + * @param string $description + * @param bool $not + * @return void + * @throws PHPUnit_Framework_ExpectationFailedException + */ + public function fail($other, $description, $not = false) + { + require_once 'Zend/Test/PHPUnit/Constraint/Exception.php'; + switch ($this->_assertType) { + case self::ASSERT_CONTENT_CONTAINS: + $failure = 'Failed asserting node denoted by %s CONTAINS content "%s"'; + if ($this->_negate) { + $failure = 'Failed asserting node DENOTED BY %s DOES NOT CONTAIN content "%s"'; + } + $failure = sprintf($failure, $other, $this->_content); + break; + case self::ASSERT_CONTENT_REGEX: + $failure = 'Failed asserting node denoted by %s CONTAINS content MATCHING "%s"'; + if ($this->_negate) { + $failure = 'Failed asserting node DENOTED BY %s DOES NOT CONTAIN content MATCHING "%s"'; + } + $failure = sprintf($failure, $other, $this->_content); + break; + case self::ASSERT_CONTENT_COUNT: + $failure = 'Failed asserting node DENOTED BY %s OCCURS EXACTLY %d times'; + if ($this->_negate) { + $failure = 'Failed asserting node DENOTED BY %s DOES NOT OCCUR EXACTLY %d times'; + } + $failure = sprintf($failure, $other, $this->_content); + break; + case self::ASSERT_CONTENT_COUNT_MIN: + $failure = 'Failed asserting node DENOTED BY %s OCCURS AT LEAST %d times'; + $failure = sprintf($failure, $other, $this->_content); + break; + case self::ASSERT_CONTENT_COUNT_MAX: + $failure = 'Failed asserting node DENOTED BY %s OCCURS AT MOST %d times'; + $failure = sprintf($failure, $other, $this->_content); + break; + case self::ASSERT_QUERY: + default: + $failure = 'Failed asserting node DENOTED BY %s EXISTS'; + if ($this->_negate) { + $failure = 'Failed asserting node DENOTED BY %s DOES NOT EXIST'; + } + $failure = sprintf($failure, $other); + break; + } + + if (!empty($description)) { + $failure = $description . "\n" . $failure; + } + + throw new Zend_Test_PHPUnit_Constraint_Exception($failure); + } + + /** + * Complete implementation + * + * @return string + */ + public function toString() + { + return ''; + } + + /** + * Register XPath namespaces + * + * @param array $xpathNamespaces + * @return void + */ + public function registerXpathNamespaces($xpathNamespaces) + { + $this->_xpathNamespaces = $xpathNamespaces; + } + + /** + * Check to see if content is matched in selected nodes + * + * @param Zend_Dom_Query_Result $result + * @param string $match Content to match + * @return bool + */ + protected function _matchContent($result, $match) + { + $match = (string) $match; + + if (0 == count($result)) { + return false; + } + + foreach ($result as $node) { + $content = $this->_getNodeContent($node); + if (strstr($content, $match)) { + return true; + } + } + + return false; + } + + /** + * Check to see if content is NOT matched in selected nodes + * + * @param Zend_Dom_Query_Result $result + * @param string $match + * @return bool + */ + protected function _notMatchContent($result, $match) + { + if (0 == count($result)) { + return true; + } + + foreach ($result as $node) { + $content = $this->_getNodeContent($node); + if (strstr($content, $match)) { + return false; + } + } + + return true; + } + + /** + * Check to see if content is matched by regex in selected nodes + * + * @param Zend_Dom_Query_Result $result + * @param string $pattern + * @return bool + */ + protected function _regexContent($result, $pattern) + { + if (0 == count($result)) { + return false; + } + + foreach ($result as $node) { + $content = $this->_getNodeContent($node); + if (preg_match($pattern, $content)) { + return true; + } + } + + return false; + } + + /** + * Check to see if content is NOT matched by regex in selected nodes + * + * @param Zend_Dom_Query_Result $result + * @param string $pattern + * @return bool + */ + protected function _notRegexContent($result, $pattern) + { + if (0 == count($result)) { + return true; + } + + foreach ($result as $node) { + $content = $this->_getNodeContent($node); + if (preg_match($pattern, $content)) { + return false; + } + } + + return true; + } + + /** + * Determine if content count matches criteria + * + * @param Zend_Dom_Query_Result $result + * @param int $test Value against which to test + * @param string $type assertion type + * @return boolean + */ + protected function _countContent($result, $test, $type) + { + $count = count($result); + + switch ($type) { + case self::ASSERT_CONTENT_COUNT: + return ($this->_negate) + ? ($test != $count) + : ($test == $count); + case self::ASSERT_CONTENT_COUNT_MIN: + return ($count >= $test); + case self::ASSERT_CONTENT_COUNT_MAX: + return ($count <= $test); + default: + return false; + } + } + + /** + * Get node content, minus node markup tags + * + * @param DOMNode $node + * @return string + */ + protected function _getNodeContent(DOMNode $node) + { + if ($node instanceof DOMAttr) { + return $node->value; + } else { + $doc = $node->ownerDocument; + $content = $doc->saveXML($node); + $tag = $node->nodeName; + $regex = '|]*>|'; + return preg_replace($regex, '', $content); + } + } +} diff --git a/airtime_mvc/tests/library/Zend/Test/PHPUnit/Constraint/Exception.php b/airtime_mvc/tests/library/Zend/Test/PHPUnit/Constraint/Exception.php new file mode 100644 index 000000000..794f0812e --- /dev/null +++ b/airtime_mvc/tests/library/Zend/Test/PHPUnit/Constraint/Exception.php @@ -0,0 +1,38 @@ +_negate = $flag; + } + + /** + * Evaluate an object to see if it fits the constraints + * + * @param string $other String to examine + * @param null|string Assertion type + * @return bool + */ + public function evaluate($other, $assertType = null) + { + if (!$other instanceof Zend_Controller_Response_Abstract) { + require_once 'Zend/Test/PHPUnit/Constraint/Exception.php'; + throw new Zend_Test_PHPUnit_Constraint_Exception('Redirect constraint assertions require a response object'); + } + + if (strstr($assertType, 'Not')) { + $this->setNegate(true); + $assertType = str_replace('Not', '', $assertType); + } + + if (!in_array($assertType, $this->_assertTypes)) { + require_once 'Zend/Test/PHPUnit/Constraint/Exception.php'; + throw new Zend_Test_PHPUnit_Constraint_Exception(sprintf('Invalid assertion type "%s" provided to %s constraint', $assertType, __CLASS__)); + } + + $this->_assertType = $assertType; + + $response = $other; + $argv = func_get_args(); + $argc = func_num_args(); + + switch ($assertType) { + case self::ASSERT_REDIRECT_TO: + if (3 > $argc) { + require_once 'Zend/Test/PHPUnit/Constraint/Exception.php'; + throw new Zend_Test_PHPUnit_Constraint_Exception('No redirect URL provided against which to match'); + } + $this->_match = $match = $argv[2]; + return ($this->_negate) + ? $this->_notMatch($response, $match) + : $this->_match($response, $match); + case self::ASSERT_REDIRECT_REGEX: + if (3 > $argc) { + require_once 'Zend/Test/PHPUnit/Constraint/Exception.php'; + throw new Zend_Test_PHPUnit_Constraint_Exception('No pattern provided against which to match redirect'); + } + $this->_match = $match = $argv[2]; + return ($this->_negate) + ? $this->_notRegex($response, $match) + : $this->_regex($response, $match); + case self::ASSERT_REDIRECT: + default: + return ($this->_negate) ? !$response->isRedirect() : $response->isRedirect(); + } + } + + /** + * Report Failure + * + * @see PHPUnit_Framework_Constraint for implementation details + * @param mixed $other + * @param string $description Additional message to display + * @param bool $not + * @return void + * @throws PHPUnit_Framework_ExpectationFailedException + */ + public function fail($other, $description, $not = false) + { + require_once 'Zend/Test/PHPUnit/Constraint/Exception.php'; + switch ($this->_assertType) { + case self::ASSERT_REDIRECT_TO: + $failure = 'Failed asserting response redirects to "%s"'; + if ($this->_negate) { + $failure = 'Failed asserting response DOES NOT redirect to "%s"'; + } + $failure = sprintf($failure, $this->_match); + break; + case self::ASSERT_REDIRECT_REGEX: + $failure = 'Failed asserting response redirects to URL MATCHING "%s"'; + if ($this->_negate) { + $failure = 'Failed asserting response DOES NOT redirect to URL MATCHING "%s"'; + } + $failure = sprintf($failure, $this->_match); + break; + case self::ASSERT_REDIRECT: + default: + $failure = 'Failed asserting response is a redirect'; + if ($this->_negate) { + $failure = 'Failed asserting response is NOT a redirect'; + } + break; + } + + if (!empty($description)) { + $failure = $description . "\n" . $failure; + } + + throw new Zend_Test_PHPUnit_Constraint_Exception($failure); + } + + /** + * Complete implementation + * + * @return string + */ + public function toString() + { + return ''; + } + + /** + * Check to see if content is matched in selected nodes + * + * @param Zend_Controller_Response_HttpTestCase $response + * @param string $match Content to match + * @return bool + */ + protected function _match($response, $match) + { + if (!$response->isRedirect()) { + return false; + } + + $headers = $response->sendHeaders(); + $redirect = $headers['location']; + $redirect = str_replace('Location: ', '', $redirect); + + return ($redirect == $match); + } + + /** + * Check to see if content is NOT matched in selected nodes + * + * @param Zend_Controller_Response_HttpTestCase $response + * @param string $match + * @return bool + */ + protected function _notMatch($response, $match) + { + if (!$response->isRedirect()) { + return true; + } + + $headers = $response->sendHeaders(); + $redirect = $headers['location']; + $redirect = str_replace('Location: ', '', $redirect); + + return ($redirect != $match); + } + + /** + * Check to see if content is matched by regex in selected nodes + * + * @param Zend_Controller_Response_HttpTestCase $response + * @param string $pattern + * @return bool + */ + protected function _regex($response, $pattern) + { + if (!$response->isRedirect()) { + return false; + } + + $headers = $response->sendHeaders(); + $redirect = $headers['location']; + $redirect = str_replace('Location: ', '', $redirect); + + return preg_match($pattern, $redirect); + } + + /** + * Check to see if content is NOT matched by regex in selected nodes + * + * @param Zend_Controller_Response_HttpTestCase $response + * @param string $pattern + * @return bool + */ + protected function _notRegex($response, $pattern) + { + if (!$response->isRedirect()) { + return true; + } + + $headers = $response->sendHeaders(); + $redirect = $headers['location']; + $redirect = str_replace('Location: ', '', $redirect); + + return !preg_match($pattern, $redirect); + } +} diff --git a/airtime_mvc/tests/library/Zend/Test/PHPUnit/Constraint/ResponseHeader.php b/airtime_mvc/tests/library/Zend/Test/PHPUnit/Constraint/ResponseHeader.php new file mode 100644 index 000000000..a609f6582 --- /dev/null +++ b/airtime_mvc/tests/library/Zend/Test/PHPUnit/Constraint/ResponseHeader.php @@ -0,0 +1,400 @@ +_negate = $flag; + } + + /** + * Evaluate an object to see if it fits the constraints + * + * @param Zend_Controller_Response_Abstract $other String to examine + * @param null|string Assertion type + * @return bool + */ + public function evaluate($other, $assertType = null) + { + if (!$other instanceof Zend_Controller_Response_Abstract) { + require_once 'Zend/Test/PHPUnit/Constraint/Exception.php'; + throw new Zend_Test_PHPUnit_Constraint_Exception('Header constraint assertions require a response object'); + } + + if (strstr($assertType, 'Not')) { + $this->setNegate(true); + $assertType = str_replace('Not', '', $assertType); + } + + if (!in_array($assertType, $this->_assertTypes)) { + require_once 'Zend/Test/PHPUnit/Constraint/Exception.php'; + throw new Zend_Test_PHPUnit_Constraint_Exception(sprintf('Invalid assertion type "%s" provided to %s constraint', $assertType, __CLASS__)); + } + + $this->_assertType = $assertType; + + $response = $other; + $argv = func_get_args(); + $argc = func_num_args(); + + switch ($assertType) { + case self::ASSERT_RESPONSE_CODE: + if (3 > $argc) { + require_once 'Zend/Test/PHPUnit/Constraint/Exception.php'; + throw new Zend_Test_PHPUnit_Constraint_Exception('No response code provided against which to match'); + } + $this->_code = $code = $argv[2]; + return ($this->_negate) + ? $this->_notCode($response, $code) + : $this->_code($response, $code); + case self::ASSERT_HEADER: + if (3 > $argc) { + require_once 'Zend/Test/PHPUnit/Constraint/Exception.php'; + throw new Zend_Test_PHPUnit_Constraint_Exception('No header provided against which to match'); + } + $this->_header = $header = $argv[2]; + return ($this->_negate) + ? $this->_notHeader($response, $header) + : $this->_header($response, $header); + case self::ASSERT_HEADER_CONTAINS: + if (4 > $argc) { + require_once 'Zend/Test/PHPUnit/Constraint/Exception.php'; + throw new Zend_Test_PHPUnit_Constraint_Exception('Both a header name and content to match are required for ' . __FUNCTION__); + } + $this->_header = $header = $argv[2]; + $this->_match = $match = $argv[3]; + return ($this->_negate) + ? $this->_notHeaderContains($response, $header, $match) + : $this->_headerContains($response, $header, $match); + case self::ASSERT_HEADER_REGEX: + if (4 > $argc) { + require_once 'Zend/Test/PHPUnit/Constraint/Exception.php'; + throw new Zend_Test_PHPUnit_Constraint_Exception('Both a header name and content to match are required for ' . __FUNCTION__); + } + $this->_header = $header = $argv[2]; + $this->_match = $match = $argv[3]; + return ($this->_negate) + ? $this->_notHeaderRegex($response, $header, $match) + : $this->_headerRegex($response, $header, $match); + default: + require_once 'Zend/Test/PHPUnit/Constraint/Exception.php'; + throw new Zend_Test_PHPUnit_Constraint_Exception('Invalid assertion type ' . __FUNCTION__); + } + } + + /** + * Report Failure + * + * @see PHPUnit_Framework_Constraint for implementation details + * @param mixed $other + * @param string $description Additional message to display + * @param bool $not + * @return void + * @throws PHPUnit_Framework_ExpectationFailedException + */ + public function fail($other, $description, $not = false) + { + require_once 'Zend/Test/PHPUnit/Constraint/Exception.php'; + switch ($this->_assertType) { + case self::ASSERT_RESPONSE_CODE: + $failure = 'Failed asserting response code "%s"'; + if ($this->_negate) { + $failure = 'Failed asserting response code IS NOT "%s"'; + } + $failure = sprintf($failure, $this->_code); + break; + case self::ASSERT_HEADER: + $failure = 'Failed asserting response header "%s" found'; + if ($this->_negate) { + $failure = 'Failed asserting response response header "%s" WAS NOT found'; + } + $failure = sprintf($failure, $this->_header); + break; + case self::ASSERT_HEADER_CONTAINS: + $failure = 'Failed asserting response header "%s" exists and contains "%s"'; + if ($this->_negate) { + $failure = 'Failed asserting response header "%s" DOES NOT CONTAIN "%s"'; + } + $failure = sprintf($failure, $this->_header, $this->_match); + break; + case self::ASSERT_HEADER_REGEX: + $failure = 'Failed asserting response header "%s" exists and matches regex "%s"'; + if ($this->_negate) { + $failure = 'Failed asserting response header "%s" DOES NOT MATCH regex "%s"'; + } + $failure = sprintf($failure, $this->_header, $this->_match); + break; + default: + throw new Zend_Test_PHPUnit_Constraint_Exception('Invalid assertion type ' . __FUNCTION__); + } + + if (!empty($description)) { + $failure = $description . "\n" . $failure; + } + + throw new Zend_Test_PHPUnit_Constraint_Exception($failure); + } + + /** + * Complete implementation + * + * @return string + */ + public function toString() + { + return ''; + } + + /** + * Compare response code for positive match + * + * @param Zend_Controller_Response_Abstract $response + * @param int $code + * @return bool + */ + protected function _code(Zend_Controller_Response_Abstract $response, $code) + { + $test = $this->_getCode($response); + return ($test == $code); + } + + /** + * Compare response code for negative match + * + * @param Zend_Controller_Response_Abstract $response + * @param int $code + * @return bool + */ + protected function _notCode(Zend_Controller_Response_Abstract $response, $code) + { + $test = $this->_getCode($response); + return ($test != $code); + } + + /** + * Retrieve response code + * + * @param Zend_Controller_Response_Abstract $response + * @return int + */ + protected function _getCode(Zend_Controller_Response_Abstract $response) + { + $test = $response->getHttpResponseCode(); + if (null === $test) { + $test = 200; + } + return $test; + } + + /** + * Positive check for response header presence + * + * @param Zend_Controller_Response_Abstract $response + * @param string $header + * @return bool + */ + protected function _header(Zend_Controller_Response_Abstract $response, $header) + { + return (null !== $this->_getHeader($response, $header)); + } + + /** + * Negative check for response header presence + * + * @param Zend_Controller_Response_Abstract $response + * @param string $header + * @return bool + */ + protected function _notHeader(Zend_Controller_Response_Abstract $response, $header) + { + return (null === $this->_getHeader($response, $header)); + } + + /** + * Retrieve response header + * + * @param Zend_Controller_Response_Abstract $response + * @param string $header + * @return string|null + */ + protected function _getHeader(Zend_Controller_Response_Abstract $response, $header) + { + $headers = $response->sendHeaders(); + $header = strtolower($header); + if (array_key_exists($header, $headers)) { + return $headers[$header]; + } + return null; + } + + /** + * Positive check for header contents matching pattern + * + * @param Zend_Controller_Response_Abstract $response + * @param string $header + * @param string $match + * @return bool + */ + protected function _headerContains(Zend_Controller_Response_Abstract $response, $header, $match) + { + if (null === ($fullHeader = $this->_getHeader($response, $header))) { + return false; + } + + $contents = str_replace($header . ': ', '', $fullHeader); + + return (strstr($contents, $match)); + } + + /** + * Negative check for header contents matching pattern + * + * @param Zend_Controller_Response_Abstract $response + * @param string $header + * @param string $match + * @return bool + */ + protected function _notHeaderContains(Zend_Controller_Response_Abstract $response, $header, $match) + { + if (null === ($fullHeader = $this->_getHeader($response, $header))) { + return true; + } + + $contents = str_replace($header . ': ', '', $fullHeader); + + return (!strstr($contents, $match)); + } + + /** + * Positive check for header contents matching regex + * + * @param Zend_Controller_Response_Abstract $response + * @param string $header + * @param string $pattern + * @return bool + */ + protected function _headerRegex(Zend_Controller_Response_Abstract $response, $header, $pattern) + { + if (null === ($fullHeader = $this->_getHeader($response, $header))) { + return false; + } + + $contents = str_replace($header . ': ', '', $fullHeader); + + return preg_match($pattern, $contents); + } + + /** + * Negative check for header contents matching regex + * + * @param Zend_Controller_Response_Abstract $response + * @param string $header + * @param string $pattern + * @return bool + */ + protected function _notHeaderRegex(Zend_Controller_Response_Abstract $response, $header, $pattern) + { + if (null === ($fullHeader = $this->_getHeader($response, $header))) { + return true; + } + + $contents = str_replace($header . ': ', '', $fullHeader); + + return !preg_match($pattern, $contents); + } +} diff --git a/airtime_mvc/tests/library/Zend/Test/PHPUnit/ControllerTestCase.php b/airtime_mvc/tests/library/Zend/Test/PHPUnit/ControllerTestCase.php new file mode 100644 index 000000000..43ad74ad3 --- /dev/null +++ b/airtime_mvc/tests/library/Zend/Test/PHPUnit/ControllerTestCase.php @@ -0,0 +1,1217 @@ +=')) ? 'PHPUnit/Autoload.php' : 'PHPUnit/Framework.php'; + +/** @see Zend_Controller_Front */ +require_once 'Zend/Controller/Front.php'; + +/** @see Zend_Controller_Action_HelperBroker */ +require_once 'Zend/Controller/Action/HelperBroker.php'; + +/** @see Zend_Layout */ +require_once 'Zend/Layout.php'; + +/** @see Zend_Session */ +require_once 'Zend/Session.php'; + +/** @see Zend_Registry */ +require_once 'Zend/Registry.php'; + +/** + * Functional testing scaffold for MVC applications + * + * @uses PHPUnit_Framework_TestCase + * @category Zend + * @package Zend_Test + * @subpackage PHPUnit + * @copyright Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ +abstract class Zend_Test_PHPUnit_ControllerTestCase extends PHPUnit_Framework_TestCase +{ + /** + * @var mixed Bootstrap file path or callback + */ + public $bootstrap; + + /** + * @var Zend_Controller_Front + */ + protected $_frontController; + + /** + * @var Zend_Dom_Query + */ + protected $_query; + + /** + * @var Zend_Controller_Request_Abstract + */ + protected $_request; + + /** + * @var Zend_Controller_Response_Abstract + */ + protected $_response; + + /** + * XPath namespaces + * @var array + */ + protected $_xpathNamespaces = array(); + + /** + * Overloading: prevent overloading to special properties + * + * @param string $name + * @param mixed $value + * @return void + */ + public function __set($name, $value) + { + if (in_array($name, array('request', 'response', 'frontController'))) { + require_once 'Zend/Exception.php'; + throw new Zend_Exception(sprintf('Setting %s object manually is not allowed', $name)); + } + $this->$name = $value; + } + + /** + * Overloading for common properties + * + * Provides overloading for request, response, and frontController objects. + * + * @param mixed $name + * @return void + */ + public function __get($name) + { + switch ($name) { + case 'request': + return $this->getRequest(); + case 'response': + return $this->getResponse(); + case 'frontController': + return $this->getFrontController(); + } + + return null; + } + + /** + * Set up MVC app + * + * Calls {@link bootstrap()} by default + * + * @return void + */ + protected function setUp() + { + $this->bootstrap(); + } + + /** + * Bootstrap the front controller + * + * Resets the front controller, and then bootstraps it. + * + * If {@link $bootstrap} is a callback, executes it; if it is a file, it include's + * it. When done, sets the test case request and response objects into the + * front controller. + * + * @return void + */ + final public function bootstrap() + { + $this->reset(); + if (null !== $this->bootstrap) { + if ($this->bootstrap instanceof Zend_Application) { + $this->bootstrap->bootstrap(); + $this->_frontController = $this->bootstrap->getBootstrap()->getResource('frontcontroller'); + } elseif (is_callable($this->bootstrap)) { + call_user_func($this->bootstrap); + } elseif (is_string($this->bootstrap)) { + require_once 'Zend/Loader.php'; + if (Zend_Loader::isReadable($this->bootstrap)) { + include $this->bootstrap; + } + } + } + $this->frontController + ->setRequest($this->getRequest()) + ->setResponse($this->getResponse()); + } + + /** + * Dispatch the MVC + * + * If a URL is provided, sets it as the request URI in the request object. + * Then sets test case request and response objects in front controller, + * disables throwing exceptions, and disables returning the response. + * Finally, dispatches the front controller. + * + * @param string|null $url + * @return void + */ + public function dispatch($url = null) + { + // redirector should not exit + $redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector'); + $redirector->setExit(false); + + // json helper should not exit + $json = Zend_Controller_Action_HelperBroker::getStaticHelper('json'); + $json->suppressExit = true; + + $request = $this->getRequest(); + if (null !== $url) { + $request->setRequestUri($url); + } + $request->setPathInfo(null); + + $controller = $this->getFrontController(); + $this->frontController + ->setRequest($request) + ->setResponse($this->getResponse()) + ->throwExceptions(false) + ->returnResponse(false); + + if ($this->bootstrap instanceof Zend_Application) { + $this->bootstrap->run(); + } else { + $this->frontController->dispatch(); + } + } + + /** + * Reset MVC state + * + * Creates new request/response objects, resets the front controller + * instance, and resets the action helper broker. + * + * @todo Need to update Zend_Layout to add a resetInstance() method + * @return void + */ + public function reset() + { + $_SESSION = array(); + $_GET = array(); + $_POST = array(); + $_COOKIE = array(); + $this->resetRequest(); + $this->resetResponse(); + Zend_Layout::resetMvcInstance(); + Zend_Controller_Action_HelperBroker::resetHelpers(); + $this->frontController->resetInstance(); + Zend_Session::$_unitTestEnabled = true; + } + + /** + * Rest all view placeholders + * + * @return void + */ + protected function _resetPlaceholders() + { + $registry = Zend_Registry::getInstance(); + $remove = array(); + foreach ($registry as $key => $value) { + if (strstr($key, '_View_')) { + $remove[] = $key; + } + } + + foreach ($remove as $key) { + unset($registry[$key]); + } + } + + /** + * Reset the request object + * + * Useful for test cases that need to test multiple trips to the server. + * + * @return Zend_Test_PHPUnit_ControllerTestCase + */ + public function resetRequest() + { + if ($this->_request instanceof Zend_Controller_Request_HttpTestCase) { + $this->_request->clearQuery() + ->clearPost(); + } + $this->_request = null; + return $this; + } + + /** + * Reset the response object + * + * Useful for test cases that need to test multiple trips to the server. + * + * @return Zend_Test_PHPUnit_ControllerTestCase + */ + public function resetResponse() + { + $this->_response = null; + $this->_resetPlaceholders(); + return $this; + } + + /** + * Assert against DOM selection + * + * @param string $path CSS selector path + * @param string $message + * @return void + */ + public function assertQuery($path, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path); + $content = $this->response->outputBody(); + if (!$constraint->evaluate($content, __FUNCTION__)) { + $constraint->fail($path, $message); + } + } + + /** + * Assert against DOM selection + * + * @param string $path CSS selector path + * @param string $message + * @return void + */ + public function assertNotQuery($path, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path); + $content = $this->response->outputBody(); + if (!$constraint->evaluate($content, __FUNCTION__)) { + $constraint->fail($path, $message); + } + } + + /** + * Assert against DOM selection; node should contain content + * + * @param string $path CSS selector path + * @param string $match content that should be contained in matched nodes + * @param string $message + * @return void + */ + public function assertQueryContentContains($path, $match, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path); + $content = $this->response->outputBody(); + if (!$constraint->evaluate($content, __FUNCTION__, $match)) { + $constraint->fail($path, $message); + } + } + + /** + * Assert against DOM selection; node should NOT contain content + * + * @param string $path CSS selector path + * @param string $match content that should NOT be contained in matched nodes + * @param string $message + * @return void + */ + public function assertNotQueryContentContains($path, $match, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path); + $content = $this->response->outputBody(); + if (!$constraint->evaluate($content, __FUNCTION__, $match)) { + $constraint->fail($path, $message); + } + } + + /** + * Assert against DOM selection; node should match content + * + * @param string $path CSS selector path + * @param string $pattern Pattern that should be contained in matched nodes + * @param string $message + * @return void + */ + public function assertQueryContentRegex($path, $pattern, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path); + $content = $this->response->outputBody(); + if (!$constraint->evaluate($content, __FUNCTION__, $pattern)) { + $constraint->fail($path, $message); + } + } + + /** + * Assert against DOM selection; node should NOT match content + * + * @param string $path CSS selector path + * @param string $pattern pattern that should NOT be contained in matched nodes + * @param string $message + * @return void + */ + public function assertNotQueryContentRegex($path, $pattern, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path); + $content = $this->response->outputBody(); + if (!$constraint->evaluate($content, __FUNCTION__, $pattern)) { + $constraint->fail($path, $message); + } + } + + /** + * Assert against DOM selection; should contain exact number of nodes + * + * @param string $path CSS selector path + * @param string $count Number of nodes that should match + * @param string $message + * @return void + */ + public function assertQueryCount($path, $count, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path); + $content = $this->response->outputBody(); + if (!$constraint->evaluate($content, __FUNCTION__, $count)) { + $constraint->fail($path, $message); + } + } + + /** + * Assert against DOM selection; should NOT contain exact number of nodes + * + * @param string $path CSS selector path + * @param string $count Number of nodes that should NOT match + * @param string $message + * @return void + */ + public function assertNotQueryCount($path, $count, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path); + $content = $this->response->outputBody(); + if (!$constraint->evaluate($content, __FUNCTION__, $count)) { + $constraint->fail($path, $message); + } + } + + /** + * Assert against DOM selection; should contain at least this number of nodes + * + * @param string $path CSS selector path + * @param string $count Minimum number of nodes that should match + * @param string $message + * @return void + */ + public function assertQueryCountMin($path, $count, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path); + $content = $this->response->outputBody(); + if (!$constraint->evaluate($content, __FUNCTION__, $count)) { + $constraint->fail($path, $message); + } + } + + /** + * Assert against DOM selection; should contain no more than this number of nodes + * + * @param string $path CSS selector path + * @param string $count Maximum number of nodes that should match + * @param string $message + * @return void + */ + public function assertQueryCountMax($path, $count, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path); + $content = $this->response->outputBody(); + if (!$constraint->evaluate($content, __FUNCTION__, $count)) { + $constraint->fail($path, $message); + } + } + + /** + * Register XPath namespaces + * + * @param array $xpathNamespaces + * @return void + */ + public function registerXpathNamespaces($xpathNamespaces) + { + $this->_xpathNamespaces = $xpathNamespaces; + } + + /** + * Assert against XPath selection + * + * @param string $path XPath path + * @param string $message + * @return void + */ + public function assertXpath($path, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path); + $constraint->registerXpathNamespaces($this->_xpathNamespaces); + $content = $this->response->outputBody(); + if (!$constraint->evaluate($content, __FUNCTION__)) { + $constraint->fail($path, $message); + } + } + + /** + * Assert against XPath selection + * + * @param string $path XPath path + * @param string $message + * @return void + */ + public function assertNotXpath($path, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path); + $constraint->registerXpathNamespaces($this->_xpathNamespaces); + $content = $this->response->outputBody(); + if (!$constraint->evaluate($content, __FUNCTION__)) { + $constraint->fail($path, $message); + } + } + + /** + * Assert against XPath selection; node should contain content + * + * @param string $path XPath path + * @param string $match content that should be contained in matched nodes + * @param string $message + * @return void + */ + public function assertXpathContentContains($path, $match, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path); + $constraint->registerXpathNamespaces($this->_xpathNamespaces); + $content = $this->response->outputBody(); + if (!$constraint->evaluate($content, __FUNCTION__, $match)) { + $constraint->fail($path, $message); + } + } + + /** + * Assert against XPath selection; node should NOT contain content + * + * @param string $path XPath path + * @param string $match content that should NOT be contained in matched nodes + * @param string $message + * @return void + */ + public function assertNotXpathContentContains($path, $match, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path); + $constraint->registerXpathNamespaces($this->_xpathNamespaces); + $content = $this->response->outputBody(); + if (!$constraint->evaluate($content, __FUNCTION__, $match)) { + $constraint->fail($path, $message); + } + } + + /** + * Assert against XPath selection; node should match content + * + * @param string $path XPath path + * @param string $pattern Pattern that should be contained in matched nodes + * @param string $message + * @return void + */ + public function assertXpathContentRegex($path, $pattern, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path); + $constraint->registerXpathNamespaces($this->_xpathNamespaces); + $content = $this->response->outputBody(); + if (!$constraint->evaluate($content, __FUNCTION__, $pattern)) { + $constraint->fail($path, $message); + } + } + + /** + * Assert against XPath selection; node should NOT match content + * + * @param string $path XPath path + * @param string $pattern pattern that should NOT be contained in matched nodes + * @param string $message + * @return void + */ + public function assertNotXpathContentRegex($path, $pattern, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path); + $constraint->registerXpathNamespaces($this->_xpathNamespaces); + $content = $this->response->outputBody(); + if (!$constraint->evaluate($content, __FUNCTION__, $pattern)) { + $constraint->fail($path, $message); + } + } + + /** + * Assert against XPath selection; should contain exact number of nodes + * + * @param string $path XPath path + * @param string $count Number of nodes that should match + * @param string $message + * @return void + */ + public function assertXpathCount($path, $count, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path); + $constraint->registerXpathNamespaces($this->_xpathNamespaces); + $content = $this->response->outputBody(); + if (!$constraint->evaluate($content, __FUNCTION__, $count)) { + $constraint->fail($path, $message); + } + } + + /** + * Assert against XPath selection; should NOT contain exact number of nodes + * + * @param string $path XPath path + * @param string $count Number of nodes that should NOT match + * @param string $message + * @return void + */ + public function assertNotXpathCount($path, $count, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path); + $constraint->registerXpathNamespaces($this->_xpathNamespaces); + $content = $this->response->outputBody(); + if (!$constraint->evaluate($content, __FUNCTION__, $count)) { + $constraint->fail($path, $message); + } + } + + /** + * Assert against XPath selection; should contain at least this number of nodes + * + * @param string $path XPath path + * @param string $count Minimum number of nodes that should match + * @param string $message + * @return void + */ + public function assertXpathCountMin($path, $count, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path); + $constraint->registerXpathNamespaces($this->_xpathNamespaces); + $content = $this->response->outputBody(); + if (!$constraint->evaluate($content, __FUNCTION__, $count)) { + $constraint->fail($path, $message); + } + } + + /** + * Assert against XPath selection; should contain no more than this number of nodes + * + * @param string $path XPath path + * @param string $count Maximum number of nodes that should match + * @param string $message + * @return void + */ + public function assertXpathCountMax($path, $count, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path); + $constraint->registerXpathNamespaces($this->_xpathNamespaces); + $content = $this->response->outputBody(); + if (!$constraint->evaluate($content, __FUNCTION__, $count)) { + $constraint->fail($path, $message); + } + } + + /** + * Assert that response is a redirect + * + * @param string $message + * @return void + */ + public function assertRedirect($message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/Redirect.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_Redirect(); + $response = $this->response; + if (!$constraint->evaluate($response, __FUNCTION__)) { + $constraint->fail($response, $message); + } + } + + /** + * Assert that response is NOT a redirect + * + * @param string $message + * @return void + */ + public function assertNotRedirect($message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/Redirect.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_Redirect(); + $response = $this->response; + if (!$constraint->evaluate($response, __FUNCTION__)) { + $constraint->fail($response, $message); + } + } + + /** + * Assert that response redirects to given URL + * + * @param string $url + * @param string $message + * @return void + */ + public function assertRedirectTo($url, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/Redirect.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_Redirect(); + $response = $this->response; + if (!$constraint->evaluate($response, __FUNCTION__, $url)) { + $constraint->fail($response, $message); + } + } + + /** + * Assert that response does not redirect to given URL + * + * @param string $url + * @param string $message + * @return void + */ + public function assertNotRedirectTo($url, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/Redirect.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_Redirect(); + $response = $this->response; + if (!$constraint->evaluate($response, __FUNCTION__, $url)) { + $constraint->fail($response, $message); + } + } + + /** + * Assert that redirect location matches pattern + * + * @param string $pattern + * @param string $message + * @return void + */ + public function assertRedirectRegex($pattern, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/Redirect.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_Redirect(); + $response = $this->response; + if (!$constraint->evaluate($response, __FUNCTION__, $pattern)) { + $constraint->fail($response, $message); + } + } + + /** + * Assert that redirect location does not match pattern + * + * @param string $pattern + * @param string $message + * @return void + */ + public function assertNotRedirectRegex($pattern, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/Redirect.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_Redirect(); + $response = $this->response; + if (!$constraint->evaluate($response, __FUNCTION__, $pattern)) { + $constraint->fail($response, $message); + } + } + + /** + * Assert response code + * + * @param int $code + * @param string $message + * @return void + */ + public function assertResponseCode($code, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/ResponseHeader.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_ResponseHeader(); + $response = $this->response; + if (!$constraint->evaluate($response, __FUNCTION__, $code)) { + $constraint->fail($response, $message); + } + } + + /** + * Assert response code + * + * @param int $code + * @param string $message + * @return void + */ + public function assertNotResponseCode($code, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/ResponseHeader.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_ResponseHeader(); + $constraint->setNegate(true); + $response = $this->response; + if (!$constraint->evaluate($response, __FUNCTION__, $code)) { + $constraint->fail($response, $message); + } + } + + /** + * Assert response header exists + * + * @param string $header + * @param string $message + * @return void + */ + public function assertHeader($header, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/ResponseHeader.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_ResponseHeader(); + $response = $this->response; + if (!$constraint->evaluate($response, __FUNCTION__, $header)) { + $constraint->fail($response, $message); + } + } + + /** + * Assert response header does not exist + * + * @param string $header + * @param string $message + * @return void + */ + public function assertNotHeader($header, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/ResponseHeader.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_ResponseHeader(); + $constraint->setNegate(true); + $response = $this->response; + if (!$constraint->evaluate($response, __FUNCTION__, $header)) { + $constraint->fail($response, $message); + } + } + + /** + * Assert response header exists and contains the given string + * + * @param string $header + * @param string $match + * @param string $message + * @return void + */ + public function assertHeaderContains($header, $match, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/ResponseHeader.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_ResponseHeader(); + $response = $this->response; + if (!$constraint->evaluate($response, __FUNCTION__, $header, $match)) { + $constraint->fail($response, $message); + } + } + + /** + * Assert response header does not exist and/or does not contain the given string + * + * @param string $header + * @param string $match + * @param string $message + * @return void + */ + public function assertNotHeaderContains($header, $match, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/ResponseHeader.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_ResponseHeader(); + $constraint->setNegate(true); + $response = $this->response; + if (!$constraint->evaluate($response, __FUNCTION__, $header, $match)) { + $constraint->fail($response, $message); + } + } + + /** + * Assert response header exists and matches the given pattern + * + * @param string $header + * @param string $pattern + * @param string $message + * @return void + */ + public function assertHeaderRegex($header, $pattern, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/ResponseHeader.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_ResponseHeader(); + $response = $this->response; + if (!$constraint->evaluate($response, __FUNCTION__, $header, $pattern)) { + $constraint->fail($response, $message); + } + } + + /** + * Assert response header does not exist and/or does not match the given regex + * + * @param string $header + * @param string $pattern + * @param string $message + * @return void + */ + public function assertNotHeaderRegex($header, $pattern, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/ResponseHeader.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_ResponseHeader(); + $constraint->setNegate(true); + $response = $this->response; + if (!$constraint->evaluate($response, __FUNCTION__, $header, $pattern)) { + $constraint->fail($response, $message); + } + } + + /** + * Assert that the last handled request used the given module + * + * @param string $module + * @param string $message + * @return void + */ + public function assertModule($module, $message = '') + { + $this->_incrementAssertionCount(); + if ($module != $this->request->getModuleName()) { + $msg = sprintf('Failed asserting last module used <"%s"> was "%s"', + $this->request->getModuleName(), + $module + ); + if (!empty($message)) { + $msg = $message . "\n" . $msg; + } + $this->fail($msg); + } + } + + /** + * Assert that the last handled request did NOT use the given module + * + * @param string $module + * @param string $message + * @return void + */ + public function assertNotModule($module, $message = '') + { + $this->_incrementAssertionCount(); + if ($module == $this->request->getModuleName()) { + $msg = sprintf('Failed asserting last module used was NOT "%s"', $module); + if (!empty($message)) { + $msg = $message . "\n" . $msg; + } + $this->fail($msg); + } + } + + /** + * Assert that the last handled request used the given controller + * + * @param string $controller + * @param string $message + * @return void + */ + public function assertController($controller, $message = '') + { + $this->_incrementAssertionCount(); + if ($controller != $this->request->getControllerName()) { + $msg = sprintf('Failed asserting last controller used <"%s"> was "%s"', + $this->request->getControllerName(), + $controller + ); + if (!empty($message)) { + $msg = $message . "\n" . $msg; + } + $this->fail($msg); + } + } + + /** + * Assert that the last handled request did NOT use the given controller + * + * @param string $controller + * @param string $message + * @return void + */ + public function assertNotController($controller, $message = '') + { + $this->_incrementAssertionCount(); + if ($controller == $this->request->getControllerName()) { + $msg = sprintf('Failed asserting last controller used <"%s"> was NOT "%s"', + $this->request->getControllerName(), + $controller + ); + if (!empty($message)) { + $msg = $message . "\n" . $msg; + } + $this->fail($msg); + } + } + + /** + * Assert that the last handled request used the given action + * + * @param string $action + * @param string $message + * @return void + */ + public function assertAction($action, $message = '') + { + $this->_incrementAssertionCount(); + if ($action != $this->request->getActionName()) { + $msg = sprintf('Failed asserting last action used <"%s"> was "%s"', $this->request->getActionName(), $action); + if (!empty($message)) { + $msg = $message . "\n" . $msg; + } + $this->fail($msg); + } + } + + /** + * Assert that the last handled request did NOT use the given action + * + * @param string $action + * @param string $message + * @return void + */ + public function assertNotAction($action, $message = '') + { + $this->_incrementAssertionCount(); + if ($action == $this->request->getActionName()) { + $msg = sprintf('Failed asserting last action used <"%s"> was NOT "%s"', $this->request->getActionName(), $action); + if (!empty($message)) { + $msg = $message . "\n" . $msg; + } + $this->fail($msg); + } + } + + /** + * Assert that the specified route was used + * + * @param string $route + * @param string $message + * @return void + */ + public function assertRoute($route, $message = '') + { + $this->_incrementAssertionCount(); + $router = $this->frontController->getRouter(); + if ($route != $router->getCurrentRouteName()) { + $msg = sprintf('Failed asserting matched route was "%s", actual route is %s', + $route, + $router->getCurrentRouteName() + ); + if (!empty($message)) { + $msg = $message . "\n" . $msg; + } + $this->fail($msg); + } + } + + /** + * Assert that the route matched is NOT as specified + * + * @param string $route + * @param string $message + * @return void + */ + public function assertNotRoute($route, $message = '') + { + $this->_incrementAssertionCount(); + $router = $this->frontController->getRouter(); + if ($route == $router->getCurrentRouteName()) { + $msg = sprintf('Failed asserting route matched was NOT "%s"', $route); + if (!empty($message)) { + $msg = $message . "\n" . $msg; + } + $this->fail($msg); + } + } + + /** + * Retrieve front controller instance + * + * @return Zend_Controller_Front + */ + public function getFrontController() + { + if (null === $this->_frontController) { + $this->_frontController = Zend_Controller_Front::getInstance(); + } + return $this->_frontController; + } + + /** + * Retrieve test case request object + * + * @return Zend_Controller_Request_HttpTestCase + */ + public function getRequest() + { + if (null === $this->_request) { + require_once 'Zend/Controller/Request/HttpTestCase.php'; + $this->_request = new Zend_Controller_Request_HttpTestCase; + } + return $this->_request; + } + + /** + * Retrieve test case response object + * + * @return Zend_Controller_Response_HttpTestCase + */ + public function getResponse() + { + if (null === $this->_response) { + require_once 'Zend/Controller/Response/HttpTestCase.php'; + $this->_response = new Zend_Controller_Response_HttpTestCase; + } + return $this->_response; + } + + /** + * Retrieve DOM query object + * + * @return Zend_Dom_Query + */ + public function getQuery() + { + if (null === $this->_query) { + require_once 'Zend/Dom/Query.php'; + $this->_query = new Zend_Dom_Query; + } + return $this->_query; + } + + /** + * URL Helper + * + * @param array $urlOptions + * @param string $name + * @param bool $reset + * @param bool $encode + */ + public function url($urlOptions = array(), $name = null, $reset = false, $encode = true) + { + $frontController = $this->getFrontController(); + $router = $frontController->getRouter(); + if (!$router instanceof Zend_Controller_Router_Rewrite) { + throw new Exception('This url helper utility function only works when the router is of type Zend_Controller_Router_Rewrite'); + } + if (count($router->getRoutes()) == 0) { + $router->addDefaultRoutes(); + } + return $router->assemble($urlOptions, $name, $reset, $encode); + } + + public function urlizeOptions($urlOptions, $actionControllerModuleOnly = true) + { + $ccToDash = new Zend_Filter_Word_CamelCaseToDash(); + foreach ($urlOptions as $n => $v) { + if (in_array($n, array('action', 'controller', 'module'))) { + $urlOptions[$n] = $ccToDash->filter($v); + } + } + return $urlOptions; + } + + /** + * Increment assertion count + * + * @return void + */ + protected function _incrementAssertionCount() + { + $stack = debug_backtrace(); + foreach (debug_backtrace() as $step) { + if (isset($step['object']) + && $step['object'] instanceof PHPUnit_Framework_TestCase + ) { + if (version_compare(PHPUnit_Runner_Version::id(), '3.3.0', 'lt')) { + break; + } elseif (version_compare(PHPUnit_Runner_Version::id(), '3.3.3', 'lt')) { + $step['object']->incrementAssertionCounter(); + } else { + $step['object']->addToAssertionCount(1); + } + break; + } + } + } +} diff --git a/airtime_mvc/tests/library/Zend/Test/PHPUnit/DatabaseTestCase.php b/airtime_mvc/tests/library/Zend/Test/PHPUnit/DatabaseTestCase.php new file mode 100644 index 000000000..92b071d21 --- /dev/null +++ b/airtime_mvc/tests/library/Zend/Test/PHPUnit/DatabaseTestCase.php @@ -0,0 +1,151 @@ +getConnection()->getConnection(); + } + + /** + * Returns the database operation executed in test setup. + * + * @return PHPUnit_Extensions_Database_Operation_DatabaseOperation + */ + protected function getSetUpOperation() + { + return new PHPUnit_Extensions_Database_Operation_Composite(array( + new Zend_Test_PHPUnit_Db_Operation_Truncate(), + new Zend_Test_PHPUnit_Db_Operation_Insert(), + )); + } + + /** + * Returns the database operation executed in test cleanup. + * + * @return PHPUnit_Extensions_Database_Operation_DatabaseOperation + */ + protected function getTearDownOperation() + { + return PHPUnit_Extensions_Database_Operation_Factory::NONE(); + } + + /** + * Create a dataset based on multiple Zend_Db_Table instances + * + * @param array $tables + * @return Zend_Test_PHPUnit_Db_DataSet_DbTableDataSet + */ + protected function createDbTableDataSet(array $tables=array()) + { + $dataSet = new Zend_Test_PHPUnit_Db_DataSet_DbTableDataSet(); + foreach($tables AS $table) { + $dataSet->addTable($table); + } + return $dataSet; + } + + /** + * Create a table based on one Zend_Db_Table instance + * + * @param Zend_Db_Table_Abstract $table + * @param string $where + * @param string $order + * @param string $count + * @param string $offset + * @return Zend_Test_PHPUnit_Db_DataSet_DbTable + */ + protected function createDbTable(Zend_Db_Table_Abstract $table, $where=null, $order=null, $count=null, $offset=null) + { + return new Zend_Test_PHPUnit_Db_DataSet_DbTable($table, $where, $order, $count, $offset); + } + + /** + * Create a data table based on a Zend_Db_Table_Rowset instance + * + * @param Zend_Db_Table_Rowset_Abstract $rowset + * @param string + * @return Zend_Test_PHPUnit_Db_DataSet_DbRowset + */ + protected function createDbRowset(Zend_Db_Table_Rowset_Abstract $rowset, $tableName = null) + { + return new Zend_Test_PHPUnit_Db_DataSet_DbRowset($rowset, $tableName); + } +} \ No newline at end of file diff --git a/airtime_mvc/tests/library/Zend/Test/PHPUnit/Db/Connection.php b/airtime_mvc/tests/library/Zend/Test/PHPUnit/Db/Connection.php new file mode 100644 index 000000000..d76a53645 --- /dev/null +++ b/airtime_mvc/tests/library/Zend/Test/PHPUnit/Db/Connection.php @@ -0,0 +1,149 @@ +_connection = $db; + $this->_schema = $schema; + } + + /** + * Close this connection. + * + * @return void + */ + public function close() + { + $this->_connection->closeConnection(); + } + + /** + * Creates a table with the result of the specified SQL statement. + * + * @param string $resultName + * @param string $sql + * @return PHPUnit_Extensions_Database_DataSet_ITable + */ + public function createQueryTable($resultName, $sql) + { + return new Zend_Test_PHPUnit_Db_DataSet_QueryTable($resultName, $sql, $this); + } + + /** + * Returns a Zend_Db Connection + * + * @return Zend_Db_Adapter_Abstract + */ + public function getConnection() + { + return $this->_connection; + } + + /** + * Returns a database metadata object that can be used to retrieve table + * meta data from the database. + * + * @return PHPUnit_Extensions_Database_DB_IMetaData + */ + public function getMetaData() + { + if($this->_metaData === null) { + $this->_metaData = new Zend_Test_PHPUnit_Db_Metadata_Generic($this->getConnection(), $this->getSchema()); + } + return $this->_metaData; + } + + /** + * Returns the schema for the connection. + * + * @return string + */ + public function getSchema() + { + return $this->_schema; + } + + /** + * Returns the command used to truncate a table. + * + * @return string + */ + public function getTruncateCommand() + { + return "DELETE"; + } +} \ No newline at end of file diff --git a/airtime_mvc/tests/library/Zend/Test/PHPUnit/Db/DataSet/DbRowset.php b/airtime_mvc/tests/library/Zend/Test/PHPUnit/Db/DataSet/DbRowset.php new file mode 100644 index 000000000..eb51c0d7b --- /dev/null +++ b/airtime_mvc/tests/library/Zend/Test/PHPUnit/Db/DataSet/DbRowset.php @@ -0,0 +1,78 @@ +getTable(); + if($table !== null) { + $tableName = $table->info('name'); + } else { + require_once "Zend/Test/PHPUnit/Db/Exception.php"; + throw new Zend_Test_PHPUnit_Db_Exception( + 'No table name was given to Rowset Table and table name cannot be infered from the table, '. + 'because the rowset is disconnected from database.' + ); + } + } + + $this->data = $rowset->toArray(); + + $columns = array(); + if(isset($this->data[0]) > 0) { + $columns = array_keys($this->data[0]); + } else if($rowset->getTable() != null) { + $columns = $rowset->getTable()->info('cols'); + } + + $this->tableName = $tableName; + $this->tableMetaData = new PHPUnit_Extensions_Database_DataSet_DefaultTableMetaData($this->tableName, $columns); + } +} \ No newline at end of file diff --git a/airtime_mvc/tests/library/Zend/Test/PHPUnit/Db/DataSet/DbTable.php b/airtime_mvc/tests/library/Zend/Test/PHPUnit/Db/DataSet/DbTable.php new file mode 100644 index 000000000..4346f741c --- /dev/null +++ b/airtime_mvc/tests/library/Zend/Test/PHPUnit/Db/DataSet/DbTable.php @@ -0,0 +1,125 @@ +tableName = $table->info('name'); + $this->_columns = $table->info('cols'); + + $this->_table = $table; + $this->_where = $where; + $this->_order = $order; + $this->_count = $count; + $this->_offset = $offset; + } + + /** + * Lazy load data via table fetchAll() method. + * + * @return void + */ + protected function loadData() + { + if ($this->data === null) { + $this->data = $this->_table->fetchAll( + $this->_where, $this->_order, $this->_count, $this->_offset + ); + if($this->data instanceof Zend_Db_Table_Rowset_Abstract) { + $this->data = $this->data->toArray(); + } + } + } + + /** + * Create Table Metadata object + */ + protected function createTableMetaData() + { + if ($this->tableMetaData === NULL) { + $this->loadData(); + $this->tableMetaData = new PHPUnit_Extensions_Database_DataSet_DefaultTableMetaData($this->tableName, $this->_columns); + } + } +} \ No newline at end of file diff --git a/airtime_mvc/tests/library/Zend/Test/PHPUnit/Db/DataSet/DbTableDataSet.php b/airtime_mvc/tests/library/Zend/Test/PHPUnit/Db/DataSet/DbTableDataSet.php new file mode 100644 index 000000000..e660e3027 --- /dev/null +++ b/airtime_mvc/tests/library/Zend/Test/PHPUnit/Db/DataSet/DbTableDataSet.php @@ -0,0 +1,103 @@ +info('name'); + $this->tables[$tableName] = new Zend_Test_PHPUnit_Db_DataSet_DbTable($table, $where, $order, $count, $offset); + } + + /** + * Creates an iterator over the tables in the data set. If $reverse is + * true a reverse iterator will be returned. + * + * @param bool $reverse + * @return PHPUnit_Extensions_Database_DB_TableIterator + */ + protected function createIterator($reverse = FALSE) + { + return new PHPUnit_Extensions_Database_DataSet_DefaultTableIterator($this->tables, $reverse); + } + + /** + * Returns a table object for the given table. + * + * @param string $tableName + * @return PHPUnit_Extensions_Database_DB_Table + */ + public function getTable($tableName) + { + if (!isset($this->tables[$tableName])) { + throw new InvalidArgumentException("$tableName is not a table in the current database."); + } + + return $this->tables[$tableName]; + } + + /** + * Returns a list of table names for the database + * + * @return Array + */ + public function getTableNames() + { + return array_keys($this->tables); + } +} \ No newline at end of file diff --git a/airtime_mvc/tests/library/Zend/Test/PHPUnit/Db/DataSet/QueryDataSet.php b/airtime_mvc/tests/library/Zend/Test/PHPUnit/Db/DataSet/QueryDataSet.php new file mode 100644 index 000000000..8625b6e8e --- /dev/null +++ b/airtime_mvc/tests/library/Zend/Test/PHPUnit/Db/DataSet/QueryDataSet.php @@ -0,0 +1,90 @@ +databaseConnection = $databaseConnection; + } + + /** + * Add a Table dataset representation by specifiying an arbitrary select query. + * + * By default a select * will be done on the given tablename. + * + * @param string $tableName + * @param string|Zend_Db_Select $query + */ + public function addTable($tableName, $query = NULL) + { + if ($query === NULL) { + $query = $this->databaseConnection->getConnection()->select(); + $query->from($tableName, Zend_Db_Select::SQL_WILDCARD); + } + + if($query instanceof Zend_Db_Select) { + $query = $query->__toString(); + } + + $this->tables[$tableName] = new Zend_Test_PHPUnit_Db_DataSet_QueryTable($tableName, $query, $this->databaseConnection); + } +} \ No newline at end of file diff --git a/airtime_mvc/tests/library/Zend/Test/PHPUnit/Db/DataSet/QueryTable.php b/airtime_mvc/tests/library/Zend/Test/PHPUnit/Db/DataSet/QueryTable.php new file mode 100644 index 000000000..54b448283 --- /dev/null +++ b/airtime_mvc/tests/library/Zend/Test/PHPUnit/Db/DataSet/QueryTable.php @@ -0,0 +1,91 @@ +data === null) { + $stmt = $this->databaseConnection->getConnection()->query($this->query); + $this->data = $stmt->fetchAll(Zend_Db::FETCH_ASSOC); + } + } + + /** + * Create Table Metadata + */ + protected function createTableMetaData() + { + if ($this->tableMetaData === NULL) + { + $this->loadData(); + $keys = array(); + if(count($this->data) > 0) { + $keys = array_keys($this->data[0]); + } + $this->tableMetaData = new PHPUnit_Extensions_Database_DataSet_DefaultTableMetaData( + $this->tableName, $keys + ); + } + } +} \ No newline at end of file diff --git a/airtime_mvc/tests/library/Zend/Test/PHPUnit/Db/Exception.php b/airtime_mvc/tests/library/Zend/Test/PHPUnit/Db/Exception.php new file mode 100644 index 000000000..714ed0446 --- /dev/null +++ b/airtime_mvc/tests/library/Zend/Test/PHPUnit/Db/Exception.php @@ -0,0 +1,40 @@ +_connection = $db; + $this->_schema = $schema; + } + + /** + * List Tables + * + * @return array + */ + public function getTableNames() + { + return $this->_connection->listTables(); + } + + /** + * Get Table information + * + * @param string $tableName + * @return array + */ + protected function getTableDescription($tableName) + { + if(!isset($this->_tableMetadata[$tableName])) { + $this->_tableMetadata[$tableName] = $this->_connection->describeTable($tableName); + } + return $this->_tableMetadata[$tableName]; + } + + /** + * Returns an array containing the names of all the columns in the + * $tableName table, + * + * @param string $tableName + * @return array + */ + public function getTableColumns($tableName) + { + $tableMeta = $this->getTableDescription($tableName); + $columns = array_keys($tableMeta); + return $columns; + } + + /** + * Returns an array containing the names of all the primary key columns in + * the $tableName table. + * + * @param string $tableName + * @return array + */ + public function getTablePrimaryKeys($tableName) + { + $tableMeta = $this->getTableDescription($tableName); + + $primaryColumnNames = array(); + foreach($tableMeta AS $column) { + if($column['PRIMARY'] == true) { + $primaryColumnNames[] = $column['COLUMN_NAME']; + } + } + return $primaryColumnNames; + } + + /** + * Returns the name of the default schema. + * + * @return string + */ + public function getSchema() + { + return $this->_schema; + } + + /** + * Returns a quoted schema object. (table name, column name, etc) + * + * @param string $object + * @return string + */ + public function quoteSchemaObject($object) + { + return $this->_connection->quoteIdentifier($object); + } + + /** + * Returns true if the rdbms allows cascading + * + * @return bool + */ + public function allowsCascading() + { + return false; + } +} \ No newline at end of file diff --git a/airtime_mvc/tests/library/Zend/Test/PHPUnit/Db/Operation/DeleteAll.php b/airtime_mvc/tests/library/Zend/Test/PHPUnit/Db/Operation/DeleteAll.php new file mode 100644 index 000000000..2f162352d --- /dev/null +++ b/airtime_mvc/tests/library/Zend/Test/PHPUnit/Db/Operation/DeleteAll.php @@ -0,0 +1,81 @@ +getTableMetaData()->getTableName(); + $connection->getConnection()->delete($tableName); + } catch (Exception $e) { + require_once "PHPUnit/Extensions/Database/Operation/Exception.php"; + throw new PHPUnit_Extensions_Database_Operation_Exception('DELETEALL', 'DELETE FROM '.$tableName.'', array(), $table, $e->getMessage()); + } + } + } +} \ No newline at end of file diff --git a/airtime_mvc/tests/library/Zend/Test/PHPUnit/Db/Operation/Insert.php b/airtime_mvc/tests/library/Zend/Test/PHPUnit/Db/Operation/Insert.php new file mode 100644 index 000000000..c9dec6fd1 --- /dev/null +++ b/airtime_mvc/tests/library/Zend/Test/PHPUnit/Db/Operation/Insert.php @@ -0,0 +1,104 @@ +createDataSet(); + + $dsIterator = $dataSet->getIterator(); + + foreach($dsIterator as $table) { + $tableName = $table->getTableMetaData()->getTableName(); + + $db = $connection->getConnection(); + for($i = 0; $i < $table->getRowCount(); $i++) { + $values = $this->buildInsertValues($table, $i); + try { + $db->insert($tableName, $values); + } catch (Exception $e) { + throw new PHPUnit_Extensions_Database_Operation_Exception("INSERT", "INSERT INTO ".$tableName." [..]", $values, $table, $e->getMessage()); + } + } + } + } + + /** + * + * @param PHPUnit_Extensions_Database_DataSet_ITable $table + * @param int $rowNum + * @return array + */ + protected function buildInsertValues(PHPUnit_Extensions_Database_DataSet_ITable $table, $rowNum) + { + $values = array(); + foreach($table->getTableMetaData()->getColumns() as $columnName) { + $values[$columnName] = $table->getValue($rowNum, $columnName); + } + return $values; + } +} \ No newline at end of file diff --git a/airtime_mvc/tests/library/Zend/Test/PHPUnit/Db/Operation/Truncate.php b/airtime_mvc/tests/library/Zend/Test/PHPUnit/Db/Operation/Truncate.php new file mode 100644 index 000000000..3d2dffe8b --- /dev/null +++ b/airtime_mvc/tests/library/Zend/Test/PHPUnit/Db/Operation/Truncate.php @@ -0,0 +1,130 @@ +getReverseIterator() AS $table) { + try { + $tableName = $table->getTableMetaData()->getTableName(); + $this->_truncate($connection->getConnection(), $tableName); + } catch (Exception $e) { + throw new PHPUnit_Extensions_Database_Operation_Exception('TRUNCATE', 'TRUNCATE '.$tableName.'', array(), $table, $e->getMessage()); + } + } + } + + /** + * Truncate a given table. + * + * @param Zend_Db_Adapter_Abstract $db + * @param string $tableName + * @return void + */ + protected function _truncate(Zend_Db_Adapter_Abstract $db, $tableName) + { + $tableName = $db->quoteIdentifier($tableName, true); + if($db instanceof Zend_Db_Adapter_Pdo_Sqlite) { + $db->query('DELETE FROM '.$tableName); + } else if($db instanceof Zend_Db_Adapter_Db2) { + /*if(strstr(PHP_OS, "WIN")) { + $file = tempnam(sys_get_temp_dir(), "zendtestdbibm_"); + file_put_contents($file, ""); + $db->query('IMPORT FROM '.$file.' OF DEL REPLACE INTO '.$tableName); + unlink($file); + } else { + $db->query('IMPORT FROM /dev/null OF DEL REPLACE INTO '.$tableName); + }*/ + require_once "Zend/Exception.php"; + throw Zend_Exception("IBM Db2 TRUNCATE not supported."); + } else if($this->_isMssqlOrOracle($db)) { + $db->query('TRUNCATE TABLE '.$tableName); + } else if($db instanceof Zend_Db_Adapter_Pdo_Pgsql) { + $db->query('TRUNCATE '.$tableName.' CASCADE'); + } else { + $db->query('TRUNCATE '.$tableName); + } + } + + /** + * Detect if an adapter is for Mssql or Oracle Databases. + * + * @param Zend_Db_Adapter_Abstract $db + * @return bool + */ + private function _isMssqlOrOracle($db) + { + return ( + $db instanceof Zend_Db_Adapter_Pdo_Mssql || + $db instanceof Zend_Db_Adapter_Sqlsrv || + $db instanceof Zend_Db_Adapter_Pdo_Oci || + $db instanceof Zend_Db_Adapter_Oracle + ); + } +} \ No newline at end of file diff --git a/airtime_mvc/tests/library/Zend/Test/PHPUnit/Db/SimpleTester.php b/airtime_mvc/tests/library/Zend/Test/PHPUnit/Db/SimpleTester.php new file mode 100644 index 000000000..882599196 --- /dev/null +++ b/airtime_mvc/tests/library/Zend/Test/PHPUnit/Db/SimpleTester.php @@ -0,0 +1,95 @@ +connection = $connection; + $this->setUpOperation = new PHPUnit_Extensions_Database_Operation_Composite(array( + new Zend_Test_PHPUnit_Db_Operation_Truncate(), + new Zend_Test_PHPUnit_Db_Operation_Insert(), + )); + $this->tearDownOperation = PHPUnit_Extensions_Database_Operation_Factory::NONE(); + } + + /** + * Set Up the database using the given Dataset and the SetUp strategy "Truncate, then Insert" + * + * @param PHPUnit_Extensions_Database_DataSet_IDataSet $dataSet + */ + public function setUpDatabase(PHPUnit_Extensions_Database_DataSet_IDataSet $dataSet) + { + $this->setDataSet($dataSet); + $this->onSetUp(); + } +} \ No newline at end of file diff --git a/airtime_mvc/tests/phpunit.xml b/airtime_mvc/tests/phpunit.xml index 01ad1609e..9644cb9ce 100644 --- a/airtime_mvc/tests/phpunit.xml +++ b/airtime_mvc/tests/phpunit.xml @@ -1,2 +1,21 @@ - - + + + ./ + + + + + ../application/ + + ../application/ + ../application/Bootstrap.php + ../application/controllers/ErrorController.php + + + + + + + + +