]> CyberLeo.Net >> Repos - Github/sugarcrm.git/blob - tests/SugarTestHelper.php
Release 6.2.0
[Github/sugarcrm.git] / tests / SugarTestHelper.php
1 <?php
2 /*********************************************************************************
3  * SugarCRM Community Edition is a customer relationship management program developed by
4  * SugarCRM, Inc. Copyright (C) 2004-2011 SugarCRM Inc.
5  * 
6  * This program is free software; you can redistribute it and/or modify it under
7  * the terms of the GNU Affero General Public License version 3 as published by the
8  * Free Software Foundation with the addition of the following permission added
9  * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK
10  * IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY
11  * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
12  * 
13  * This program is distributed in the hope that it will be useful, but WITHOUT
14  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
15  * FOR A PARTICULAR PURPOSE.  See the GNU Affero General Public License for more
16  * details.
17  * 
18  * You should have received a copy of the GNU Affero General Public License along with
19  * this program; if not, see http://www.gnu.org/licenses or write to the Free
20  * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21  * 02110-1301 USA.
22  * 
23  * You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road,
24  * SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com.
25  * 
26  * The interactive user interfaces in modified source and object code versions
27  * of this program must display Appropriate Legal Notices, as required under
28  * Section 5 of the GNU Affero General Public License version 3.
29  * 
30  * In accordance with Section 7(b) of the GNU Affero General Public License version 3,
31  * these Appropriate Legal Notices must retain the display of the "Powered by
32  * SugarCRM" logo. If the display of the logo is not reasonably feasible for
33  * technical reasons, the Appropriate Legal Notices must display the words
34  * "Powered by SugarCRM".
35  ********************************************************************************/
36
37  
38 if(!defined('sugarEntry')) define('sugarEntry', true);
39
40 set_include_path(
41     dirname(__FILE__) . PATH_SEPARATOR .
42     dirname(__FILE__) . '/..' . PATH_SEPARATOR .
43     get_include_path()
44 );
45
46 // constant to indicate that we are running tests
47 if (!defined('SUGAR_PHPUNIT_RUNNER'))
48     define('SUGAR_PHPUNIT_RUNNER', true);
49
50 // initialize the various globals we use
51 global $sugar_config, $db, $fileName, $current_user, $locale, $current_language;
52
53 if ( !isset($_SERVER['HTTP_USER_AGENT']) )
54     // we are probably running tests from the command line
55     $_SERVER['HTTP_USER_AGENT'] = 'cli';
56
57 // move current working directory
58 chdir(dirname(__FILE__) . '/..');
59
60 require_once('include/entryPoint.php');
61
62 require_once('include/utils/layout_utils.php');
63
64 $GLOBALS['db'] = DBManagerFactory::getInstance();
65
66 $current_language = $sugar_config['default_language'];
67 // disable the SugarLogger
68 $sugar_config['logger']['level'] = 'fatal';
69
70 $GLOBALS['sugar_config']['default_permissions'] = array (
71                 'dir_mode' => 02770,
72                 'file_mode' => 0777,
73                 'chown' => '',
74                 'chgrp' => '',
75         );
76
77 $GLOBALS['js_version_key'] = 'testrunner';
78
79 if ( !isset($_SERVER['SERVER_SOFTWARE']) )
80     $_SERVER["SERVER_SOFTWARE"] = 'PHPUnit';
81
82 // helps silence the license checking when running unit tests.
83 $_SESSION['VALIDATION_EXPIRES_IN'] = 'valid';
84
85 $GLOBALS['startTime'] = microtime(true);
86
87 // clean out the cache directory
88 require_once('modules/Administration/QuickRepairAndRebuild.php');
89 $repair = new RepairAndClear();
90 $repair->module_list = array();
91 $repair->show_output = false;
92 $repair->clearJsLangFiles();
93 $repair->clearJsFiles();
94
95 // mark that we got by the admin wizard already
96 $focus = new Administration();
97 $focus->retrieveSettings();
98 $focus->saveSetting('system','adminwizard',1);
99
100 // include the other test tools
101 require_once 'SugarTestUserUtilities.php';
102 require_once 'SugarTestLangPackCreator.php';
103 require_once 'SugarTestThemeUtilities.php';
104 require_once 'SugarTestContactUtilities.php';
105 require_once 'SugarTestEmailUtilities.php';
106 require_once 'SugarTestCampaignUtilities.php';
107 require_once 'SugarTestLeadUtilities.php';
108 require_once 'SugarTestStudioUtilities.php';
109 require_once 'SugarTestMeetingUtilities.php';
110 require_once 'SugarTestCallUtilities.php';
111 require_once 'SugarTestAccountUtilities.php';
112 require_once 'SugarTestTrackerUtility.php';
113 require_once 'SugarTestImportUtilities.php';
114 require_once 'SugarTestMergeUtilities.php';
115 require_once 'SugarTestTaskUtilities.php';
116
117 // define our testcase subclass
118 class Sugar_PHPUnit_Framework_TestCase extends PHPUnit_Framework_TestCase
119 {
120     protected $backupGlobals = FALSE;
121
122     protected $useOutputBuffering = true;
123
124     protected function assertPostConditions() {
125         if(!empty($_REQUEST)) {
126             foreach(array_keys($_REQUEST) as $k) {
127                         unset($_REQUEST[$k]);
128                     }
129         }
130
131         if(!empty($_POST)) {
132             foreach(array_keys($_POST) as $k) {
133                         unset($_POST[$k]);
134                     }
135         }
136
137         if(!empty($_GET)) {
138             foreach(array_keys($_GET) as $k) {
139                         unset($_GET[$k]);
140                     }
141         }
142     }
143
144     public static function tearDownAfterClass()
145     {
146         unset($GLOBALS['disable_date_format']);
147         $GLOBALS['timedate']->clearCache();
148     }
149 }
150
151 // define output testcase subclass
152 class Sugar_PHPUnit_Framework_OutputTestCase extends PHPUnit_Extensions_OutputTestCase
153 {
154     protected $backupGlobals = FALSE;
155
156     protected $_notRegex;
157     protected $_outputCheck;
158
159     protected function assertPostConditions() {
160         if(!empty($_REQUEST)) {
161             foreach(array_keys($_REQUEST) as $k) {
162                         unset($_REQUEST[$k]);
163                     }
164         }
165
166         if(!empty($_POST)) {
167             foreach(array_keys($_POST) as $k) {
168                         unset($_POST[$k]);
169                     }
170         }
171
172         if(!empty($_GET)) {
173             foreach(array_keys($_GET) as $k) {
174                         unset($_GET[$k]);
175                     }
176         }
177     }
178
179     protected function NotRegexCallback($output)
180     {
181         if(empty($this->_notRegex)) {
182             return true;
183         }
184         $this->assertNotRegExp($this->_notRegex, $output);
185         return true;
186     }
187
188     public function setOutputCheck($callback)
189     {
190         if (!is_callable($callback)) {
191             throw new PHPUnit_Framework_Exception;
192         }
193
194         $this->_outputCheck = $callback;
195     }
196
197     protected function runTest()
198     {
199                 $testResult = parent::runTest();
200         if($this->_outputCheck) {
201             $this->assertTrue(call_user_func($this->_outputCheck, $this->output));
202         }
203         return $testResult;
204     }
205
206     public function expectOutputNotRegex($expectedRegex)
207     {
208         if (is_string($expectedRegex) || is_null($expectedRegex)) {
209             $this->_notRegex = $expectedRegex;
210         }
211
212         $this->setOutputCheck(array($this, "NotRegexCallback"));
213     }
214
215 }
216
217 // define a mock logger interface; used for capturing logging messages emited
218 // the test suite
219 class SugarMockLogger
220 {
221         private $_messages = array();
222
223         public function __call($method, $message)
224         {
225                 $this->messages[] = strtoupper($method) . ': ' . $message[0];
226         }
227
228         public function getLastMessage()
229         {
230                 return end($this->messages);
231         }
232
233         public function getMessageCount()
234         {
235                 return count($this->messages);
236         }
237 }