848981377a482cb5a474c4d42a65f56759e6de79
[tine20] / tests / tine20 / Addressbook / Backend / SqlTest.php
1 <?php
2 /**
3  * Tine 2.0 - http://www.tine20.org
4  * 
5  * @package     Addressbook
6  * @license     http://www.gnu.org/licenses/agpl.html
7  * @copyright   Copyright (c) 2008 Metaways Infosystems GmbH (http://www.metaways.de)
8  * @author      Lars Kneschke <l.kneschke@metaways.de>
9  */
10
11
12 /**
13  * Test helper
14  */
15 require_once dirname(dirname(dirname(__FILE__))) . DIRECTORY_SEPARATOR . 'TestHelper.php';
16
17 if (!defined('PHPUnit_MAIN_METHOD')) {
18     define('PHPUnit_MAIN_METHOD', 'Addressbook_Backend_SqlTest::main');
19 }
20
21 /**
22  * Test class for Tinebase_User
23  */
24 class Addressbook_Backend_SqlTest extends PHPUnit_Framework_TestCase
25 {
26     /**
27      * Backend
28      *
29      * @var Addressbook_Backend_Sql
30      */
31     protected $_backend;
32     
33     /**
34      * 
35      * @var Tinebase_Model_Container
36      */
37     protected $_container;
38     
39     /**
40      * Runs the test methods of this class.
41      *
42      * @access public
43      * @static
44      */
45     public static function main()
46     {
47         $suite  = new PHPUnit_Framework_TestSuite('Tine 2.0 Addressbook SQL Backend Tests');
48         PHPUnit_TextUI_TestRunner::run($suite);
49     }
50
51     /**
52      * Sets up the fixture.
53      * This method is called before a test is executed.
54      *
55      * @access protected
56      */
57     protected function setUp()
58     {
59         Tinebase_TransactionManager::getInstance()->startTransaction(Tinebase_Core::getDb());\r
60         
61         $this->_backend = Addressbook_Backend_Factory::factory(Addressbook_Backend_Factory::SQL);
62         
63         $personalContainer = Tinebase_Container::getInstance()->getPersonalContainer(
64             Zend_Registry::get('currentAccount'), 
65             'Addressbook', 
66             Zend_Registry::get('currentAccount'), 
67             Tinebase_Model_Grants::GRANT_EDIT
68         );
69         
70         $this->_container = $personalContainer[0];
71
72     }
73
74     /**
75      * Tears down the fixture
76      * This method is called after a test is executed.
77      *
78      * @access protected
79      */
80     protected function tearDown()
81     {
82         Tinebase_TransactionManager::getInstance()->rollBack();
83     }
84     
85
86     /**
87      * try to add a contact
88      * 
89      * @return Addressbook_Model_Contact
90      */
91     public function testCreateContact()
92     {
93         $contact = $this->_backend->create(self::getTestContact($this->_container));
94         
95         $this->assertTrue(!empty($contact->id));
96         
97         return $contact;
98     }
99     
100     /**
101      * try to add a contact
102      * 
103      * @return Addressbook_Model_Contact
104      */
105     public function testCreateSpecialNameContact()
106     {
107         $contact = $this->_backend->create(self::getTestSpecialNameContact($this->_container));
108         
109         $this->assertTrue(!empty($contact->id));
110         
111         return $contact;
112     }    
113
114     /**
115      * try to get a contact
116      * 
117      * @return Addressbook_Model_Contact
118      */
119     public function testGetContact()
120     {
121         $contact = $this->testCreateContact();
122        
123         $updateContact = $this->_backend->get($contact->getId());
124         
125         $this->assertTrue($updateContact instanceof Addressbook_Model_Contact);
126         $this->assertEquals($contact->getId(), $updateContact->getId());
127         $this->assertEquals($contact->adr_one_locality, $updateContact->adr_one_locality);
128         
129         return $contact;
130     }
131     
132     
133     /**\r
134      * try to check the id of the contact\r
135      */\r
136     public function testgetByUserId()\r
137     {\r
138         Tinebase_Core::getUser()->accountId;\r
139          
140         $contact = $this->_backend->getByUserId(Tinebase_Core::getUser()->accountId);\r
141     \r
142         $this->assertTrue($contact instanceof Addressbook_Model_Contact);\r
143     
144         $this->setExpectedException('Addressbook_Exception_NotFound');\r
145         
146         $this->_backend->getByUserId('invalid_id');
147         \r
148     }
149      
150     
151     /**
152      * test search results
153      * 
154      * @return Addressbook_Model_Contact
155      */
156     public function testSearchContact()
157     {
158         $contact = $this->testCreateContact();
159         
160         $filter = new Addressbook_Model_ContactFilter(array(
161             array(
162                 'field' => 'container_id', 
163                 'operator' => 'equals', 
164                 'value' => $contact->container_id
165                     
166         )));
167         
168         $contacts = $this->_backend->search($filter);
169         
170         
171         $this->assertTrue(count($contacts) >= 1, 'empty search');
172         $this->assertTrue( in_array($contact->getId(), $contacts->getId()) );
173         
174         $this->assertTrue((bool) $contact->jpegphoto, 'contact image is not detected');
175         
176         return $contact;
177     }
178     
179     /**
180      * test search results
181      * 
182      * @return Addressbook_Model_Contact
183      */
184     public function testSearchSpecialNameContact()
185     {
186         $contact = $this->testCreateSpecialNameContact();
187         
188         $filter = new Addressbook_Model_ContactFilter(array(
189             array(
190                 'field' => 'container_id',     'operator' => 'equals',         'value' => $contact->container_id,
191                 'field' => 'n_family',         'operator' => 'equalsspecial',  'value' => 'Horvat-Čuka'
192             )
193         ));
194         
195         $contacts = $this->_backend->search($filter);
196         $this->assertTrue(count($contacts) >= 1, 'empty search');
197         
198         $filter = new Addressbook_Model_ContactFilter(array(
199             array(
200                 'field' => 'container_id',     'operator' => 'equals',         'value' => $contact->container_id,
201                 'field' => 'n_given',          'operator' => 'equalsspecial',  'value' => 'Ana Maria'
202             )
203         ));
204         
205         $contacts = $this->_backend->search($filter);
206         $this->assertTrue(count($contacts) >= 1, 'empty search');
207     }    
208     
209     /**
210      * test if image is in contact
211      * 
212      * 
213      */
214     public function testImage()
215     {
216         $contact = $this->testCreateContact();
217         
218         $image = $this->_backend->getImage($contact->getId());
219         $tmpPath = tempnam(Tinebase_Core::getTempDir(), 'tine20_tmp_gd');
220         file_put_contents($tmpPath, $image);
221         
222         $this->assertFileEquals(dirname(__FILE__) . '/../../Tinebase/ImageHelper/phpunit-logo.gif', $tmpPath);
223         
224         unset($tmpPath);
225     }
226     
227     /**
228      * try to update a contact
229      * 
230      *@ return Addressbook_Model_Contact
231      */
232     public function testUpdateContact()
233     {
234         $contact = $this->testCreateContact();
235            
236         $contact->n_family = 'Toptas';
237         
238         $contact = $this->_backend->update($contact);
239         
240         $this->assertEquals('Toptas', $contact->n_family, 'family name mismatch');
241   
242         
243         return $contact;
244     }
245     
246     /**
247      * try to remove image
248      *
249      * API change 2009-04-26, image must now be queried separatly
250      */
251     public function testRemoveImage()
252     {
253         $contact = $this->testCreateContact();
254         
255         $contact->jpegphoto = '';
256         $updatedContact = $this->_backend->update($contact);
257         
258         $this->assertEquals('', $updatedContact->jpegphoto);
259     }
260     
261     /**
262      * try to delete a contact and its id
263      *
264      */
265     public function testDeleteContact()
266     {
267         $contact = $this->testCreateContact();
268         
269         $this->_backend->delete($contact->getId());
270         
271         $this->setExpectedException('Tinebase_Exception_NotFound');   
272         $contact = $this->_backend->get($contact->getId());
273     }
274     
275     /**
276      * create test contact
277      * 
278      * @return Addressbook_Model_Contact
279      */
280     public static function getTestContact(Tinebase_Model_Container $container)
281     {
282         $contact = new Addressbook_Model_Contact(array(\r
283             'adr_one_countryname'   => 'DE',\r
284             'adr_one_locality'      => 'Hamburg',\r
285             'adr_one_postalcode'    => '24xxx',\r
286             'adr_one_region'        => 'Hamburg',\r
287             'adr_one_street'        => 'Pickhuben 4',\r
288             'adr_one_street2'       => 'no second street',\r
289             'adr_two_countryname'   => 'DE',\r
290             'adr_two_locality'      => 'Hamburg',\r
291             'adr_two_postalcode'    => '24xxx',\r
292             'adr_two_region'        => 'Hamburg',\r
293             'adr_two_street'        => 'Pickhuben 4',\r
294             'adr_two_street2'       => 'no second street2',\r
295             'assistent'             => 'Cornelius Weiß',\r
296             'bday'                  => '1975-01-02 03:04:05', // new Tinebase_DateTime???\r
297             'email'                 => 'unittests@tine20.org',\r
298             'email_home'            => 'unittests@tine20.org',\r
299             'jpegphoto'             => file_get_contents(dirname(__FILE__) . '/../../Tinebase/ImageHelper/phpunit-logo.gif'),\r
300             'note'                  => 'Bla Bla Bla',\r
301             'container_id'          => $container->id,\r
302             'role'                  => 'Role',\r
303             'title'                 => 'Title',\r
304             'url'                   => 'http://www.tine20.org',\r
305             'url_home'              => 'http://www.tine20.com',\r
306             'n_family'              => 'Kneschke',\r
307             'n_fileas'              => 'Kneschke, Lars',\r
308             'n_given'               => 'Lars',\r
309             'n_middle'              => 'no middle name',\r
310             'n_prefix'              => 'no prefix',\r
311             'n_suffix'              => 'no suffix',\r
312             'org_name'              => 'Metaways Infosystems GmbH',\r
313             'org_unit'              => 'Tine 2.0',\r
314             'tel_assistent'         => '+49TELASSISTENT',\r
315             'tel_car'               => '+49TELCAR',\r
316             'tel_cell'              => '+49TELCELL',\r
317             'tel_cell_private'      => '+49TELCELLPRIVATE',\r
318             'tel_fax'               => '+49TELFAX',\r
319             'tel_fax_home'          => '+49TELFAXHOME',\r
320             'tel_home'              => '+49TELHOME',\r
321             'tel_pager'             => '+49TELPAGER',\r
322             'tel_work'              => '+49TELWORK',\r
323         ));
324
325         return $contact;
326     }     
327  
328     /**
329      * create test contact
330      * 
331      * @return Addressbook_Model_Contact
332      */
333     public static function getTestSpecialNameContact(Tinebase_Model_Container $container)
334     {
335         $contact = new Addressbook_Model_Contact(array(
336             'adr_one_countryname'   => 'HR',
337             'adr_one_locality'      => 'Šibenik',
338             'adr_one_postalcode'    => '2200',
339             'adr_one_region'        => 'Bilice',
340             'adr_one_street'        => 'Snajperska 4',
341             'adr_one_street2'       => 'no second street',
342             'adr_two_countryname'   => 'HR',
343             'adr_two_locality'      => 'Zagreb',
344             'adr_two_postalcode'    => '10xxx',
345             'adr_two_region'        => 'Zagreb',
346             'adr_two_street'        => 'Pick 4',
347             'adr_two_street2'       => 'no second street2',
348             'assistent'             => 'Cornelius Weiß',
349             'bday'                  => '1975-01-02 03:04:05', // new Tinebase_DateTime???
350             'email'                 => 'unittests2@tine20.org',
351             'email_home'            => 'unittests2@tine20.org',
352             'jpegphoto'             => '',
353             'note'                  => 'Bla Bla Bla',
354             'container_id'          => $container->id,
355             'role'                  => 'Role',
356             'title'                 => 'Title',
357             'url'                   => 'http://www.tine20.org',
358             'url_home'              => 'http://www.tine20.com',
359             'n_family'              => 'Horvat Čuka',
360             'n_fileas'              => 'Horvat Čuka, Ana-Maria',
361             'n_given'               => 'Ana-Maria',
362             'n_middle'              => 'no middle name',
363             'n_prefix'              => 'no prefix',
364             'n_suffix'              => 'no suffix',
365             'org_name'              => 'Metaways Infosystems GmbH',
366             'org_unit'              => 'Tine 2.0',
367             'tel_assistent'         => '+385TELASSISTENT',
368             'tel_car'               => '+385TELCAR',
369             'tel_cell'              => '+385TELCELL',
370             'tel_cell_private'      => '+385TELCELLPRIVATE',
371             'tel_fax'               => '+385TELFAX',
372             'tel_fax_home'          => '+385TELFAXHOME',
373             'tel_home'              => '+385TELHOME',
374             'tel_pager'             => '+385TELPAGER',
375             'tel_work'              => '+385TELWORK',
376         ));
377         return $contact;
378     }
379 }        
380
381 if (PHPUnit_MAIN_METHOD == 'Addressbook_Backend_SqlTest::main') {
382     Addressbook_Backend_SqlTest::main();
383 }