]> CyberLeo.Net >> Repos - Github/sugarcrm.git/blob - tests/PHPUnit/Extensions/Database/TestCase.php
Added unit tests.
[Github/sugarcrm.git] / tests / PHPUnit / Extensions / Database / TestCase.php
1 <?php
2 /**
3  * PHPUnit
4  *
5  * Copyright (c) 2002-2009, Sebastian Bergmann <sb@sebastian-bergmann.de>.
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  *
12  *   * Redistributions of source code must retain the above copyright
13  *     notice, this list of conditions and the following disclaimer.
14  *
15  *   * Redistributions in binary form must reproduce the above copyright
16  *     notice, this list of conditions and the following disclaimer in
17  *     the documentation and/or other materials provided with the
18  *     distribution.
19  *
20  *   * Neither the name of Sebastian Bergmann nor the names of his
21  *     contributors may be used to endorse or promote products derived
22  *     from this software without specific prior written permission.
23  *
24  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
27  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
28  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
29  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
30  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
31  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
32  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
34  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35  * POSSIBILITY OF SUCH DAMAGE.
36  *
37  * @category   Testing
38  * @package    PHPUnit
39  * @author     Mike Lively <m@digitalsandwich.com>
40  * @copyright  2002-2009 Sebastian Bergmann <sb@sebastian-bergmann.de>
41  * @license    http://www.opensource.org/licenses/bsd-license.php  BSD License
42
43  * @link       http://www.phpunit.de/
44  * @since      File available since Release 3.2.0
45  */
46
47 require_once 'PHPUnit/Framework.php';
48 require_once 'PHPUnit/Util/Filter.php';
49
50 require_once 'PHPUnit/Extensions/Database/DefaultTester.php';
51 require_once 'PHPUnit/Extensions/Database/DB/DefaultDatabaseConnection.php';
52 require_once 'PHPUnit/Extensions/Database/Operation/Factory.php';
53 require_once 'PHPUnit/Extensions/Database/Constraint/TableIsEqual.php';
54 require_once 'PHPUnit/Extensions/Database/Constraint/DataSetIsEqual.php';
55
56 PHPUnit_Util_Filter::addFileToFilter(__FILE__, 'PHPUNIT');
57
58 /**
59  * A TestCase extension that provides functionality for testing and asserting
60  * against a real database.
61  *
62  * @category   Testing
63  * @package    PHPUnit
64  * @author     Mike Lively <m@digitalsandwich.com>
65  * @copyright  2009 Mike Lively <m@digitalsandwich.com>
66  * @license    http://www.opensource.org/licenses/bsd-license.php  BSD License
67  * @version    Release: 3.3.17
68  * @link       http://www.phpunit.de/
69  * @since      Class available since Release 3.2.0
70  */
71 abstract class PHPUnit_Extensions_Database_TestCase extends PHPUnit_Framework_TestCase
72 {
73
74     /**
75      * @var PHPUnit_Extensions_Database_ITester
76      */
77     protected $databaseTester;
78
79     /**
80      * Closes the specified connection.
81      *
82      * @param PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection
83      */
84     protected function closeConnection(PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection)
85     {
86         $this->getDatabaseTester()->closeConnection($connection);
87     }
88
89     /**
90      * Returns the test database connection.
91      *
92      * @return PHPUnit_Extensions_Database_DB_IDatabaseConnection
93      */
94     protected abstract function getConnection();
95
96     /**
97      * Gets the IDatabaseTester for this testCase. If the IDatabaseTester is
98      * not set yet, this method calls newDatabaseTester() to obtain a new
99      * instance.
100      *
101      * @return PHPUnit_Extensions_Database_ITester
102      */
103     protected function getDatabaseTester()
104     {
105         if (empty($this->databaseTester)) {
106             $this->databaseTester = $this->newDatabaseTester();
107         }
108
109         return $this->databaseTester;
110     }
111
112     /**
113      * Returns the test dataset.
114      *
115      * @return PHPUnit_Extensions_Database_DataSet_IDataSet
116      */
117     protected abstract function getDataSet();
118
119     /**
120      * Returns the database operation executed in test setup.
121      *
122      * @return PHPUnit_Extensions_Database_Operation_DatabaseOperation
123      */
124     protected function getSetUpOperation()
125     {
126         return PHPUnit_Extensions_Database_Operation_Factory::CLEAN_INSERT();
127     }
128
129     /**
130      * Returns the database operation executed in test cleanup.
131      *
132      * @return PHPUnit_Extensions_Database_Operation_DatabaseOperation
133      */
134     protected function getTearDownOperation()
135     {
136         return PHPUnit_Extensions_Database_Operation_Factory::NONE();
137     }
138
139     /**
140      * Creates a IDatabaseTester for this testCase.
141      *
142      * @return PHPUnit_Extensions_Database_ITester
143      */
144     protected function newDatabaseTester()
145     {
146         return new PHPUnit_Extensions_Database_DefaultTester($this->getConnection());
147     }
148
149     /**
150      * Creates a new DefaultDatabaseConnection using the given PDO connection
151      * and database schema name.
152      *
153      * @param PDO $connection
154      * @param string $schema
155      * @return PHPUnit_Extensions_Database_DB_DefaultDatabaseConnection
156      */
157     protected function createDefaultDBConnection(PDO $connection, $schema)
158     {
159         return new PHPUnit_Extensions_Database_DB_DefaultDatabaseConnection($connection, $schema);
160     }
161
162     /**
163      * Creates a new FlatXmlDataSet with the given $xmlFile. (absolute path.)
164      *
165      * @param string $xmlFile
166      * @return PHPUnit_Extensions_Database_DataSet_FlatXmlDataSet
167      */
168     protected function createFlatXMLDataSet($xmlFile)
169     {
170         require_once 'PHPUnit/Extensions/Database/DataSet/FlatXmlDataSet.php';
171         return new PHPUnit_Extensions_Database_DataSet_FlatXmlDataSet($xmlFile);
172     }
173
174     /**
175      * Creates a new XMLDataSet with the given $xmlFile. (absolute path.)
176      *
177      * @param string $xmlFile
178      * @return PHPUnit_Extensions_Database_DataSet_XmlDataSet
179      */
180     protected function createXMLDataSet($xmlFile)
181     {
182         require_once 'PHPUnit/Extensions/Database/DataSet/XmlDataSet.php';
183         return new PHPUnit_Extensions_Database_DataSet_XmlDataSet($xmlFile);
184     }
185
186     /**
187      * Returns an operation factory instance that can be used to instantiate
188      * new operations.
189      *
190      * @return PHPUnit_Extensions_Database_Operation_Factory
191      */
192     protected function getOperations()
193     {
194         require_once 'PHPUnit/Extensions/Database/Operation/Factory.php';
195         return new PHPUnit_Extensions_Database_Operation_Factory();
196     }
197
198     /**
199      * Performs operation returned by getSetUpOperation().
200      */
201     protected function setUp()
202     {
203         parent::setUp();
204
205         $this->getDatabaseTester()->setSetUpOperation($this->getSetUpOperation());
206         $this->getDatabaseTester()->setDataSet($this->getDataSet());
207         $this->getDatabaseTester()->onSetUp();
208     }
209
210     /**
211      * Performs operation returned by getSetUpOperation().
212      */
213     protected function tearDown()
214     {
215         $this->getDatabaseTester()->setTearDownOperation($this->getTearDownOperation());
216         $this->getDatabaseTester()->setDataSet($this->getDataSet());
217         $this->getDatabaseTester()->onTearDown();
218
219         /**
220          * Destroy the tester after the test is run to keep DB connections
221          * from piling up.
222          */
223         $this->databaseTester = NULL;
224     }
225
226     /**
227      * Asserts that two given tables are equal.
228      *
229      * @param PHPUnit_Extensions_Database_DataSet_ITable $expected
230      * @param PHPUnit_Extensions_Database_DataSet_ITable $actual
231      * @param string $message
232      */
233     public static function assertTablesEqual(PHPUnit_Extensions_Database_DataSet_ITable $expected, PHPUnit_Extensions_Database_DataSet_ITable $actual, $message = '')
234     {
235         $constraint = new PHPUnit_Extensions_Database_Constraint_TableIsEqual($expected);
236
237         self::assertThat($actual, $constraint, $message);
238     }
239
240     /**
241      * Asserts that two given datasets are equal.
242      *
243      * @param PHPUnit_Extensions_Database_DataSet_ITable $expected
244      * @param PHPUnit_Extensions_Database_DataSet_ITable $actual
245      * @param string $message
246      */
247     public static function assertDataSetsEqual(PHPUnit_Extensions_Database_DataSet_IDataSet $expected, PHPUnit_Extensions_Database_DataSet_IDataSet $actual, $message = '')
248     {
249         $constraint = new PHPUnit_Extensions_Database_Constraint_DataSetIsEqual($expected);
250
251         self::assertThat($actual, $constraint, $message);
252     }
253 }
254 ?>