0009768: Use ModelConfig for Timetracker models
[tine20] / tests / tine20 / Timetracker / FilterTest.php
1 <?php
2 /**
3  * Tine 2.0 - http://www.tine20.org
4  * 
5  * this tests some filters
6  * 
7  * @package     Timetracker
8  * @license     http://www.gnu.org/licenses/agpl.html
9  * @copyright   Copyright (c) 2012-2015 Metaways Infosystems GmbH (http://www.metaways.de)
10  * @author      Alexander Stintzing <a.stintzing@metaways.de>
11  */
12
13 /**
14  * Test helper
15  */
16 require_once dirname(dirname(__FILE__)) . DIRECTORY_SEPARATOR . 'TestHelper.php';
17
18 /**
19  * Test class for Tinebase_Group
20  */
21 class Timetracker_FilterTest extends Timetracker_AbstractTest
22 {
23     /**
24      * @var Timetracker_Controller_Timeaccount
25      */
26     protected $_timeaccountController = array();
27     
28     /**
29      * objects
30      *
31      * @var array
32      */
33     protected $_objects = array();
34     
35     /**
36      * Runs the test methods of this class.
37      *
38      * @access public
39      * @static
40      */
41     public static function main()
42     {
43         $suite  = new PHPUnit_Framework_TestSuite('Tine 2.0 Timetracker Filter Tests');
44         PHPUnit_TextUI_TestRunner::run($suite);
45     }
46
47     /**
48      * Sets up the fixture.
49      * This method is called before a test is executed.
50      *
51      * @access protected
52      */
53     protected function setUp()
54     {
55         parent::setUp();
56         $this->_timeaccountController = Timetracker_Controller_Timeaccount::getInstance();
57     }
58     
59     /************ test functions follow **************/
60
61     /**
62      * test timeaccount - sales contract filter
63      * also tests Tinebase_Model_Filter_ExplicitRelatedRecord
64      */
65     public function testTimeaccountContractFilter()
66     {
67         $this->_getTimeaccount(array('title' => 'TA1', 'number' => 12345, 'description' => 'UnitTest'), true);
68         $ta1 = $this->_timeaccountController->get($this->_lastCreatedRecord['id']);
69         
70         $this->_getTimeaccount(array('title' => 'TA2', 'number' => 12346, 'description' => 'UnitTest'), true);
71         $ta2 = $this->_timeaccountController->get($this->_lastCreatedRecord['id']);
72         
73         $cId = Tinebase_Container::getInstance()->getDefaultContainer('Sales_Model_Contract')->getId();
74         $contract = Sales_Controller_Contract::getInstance()->create(new Sales_Model_Contract(
75             array('title' => 'testRelateTimeaccount', 'number' => Tinebase_Record_Abstract::generateUID(), 'container_id' => $cId)
76         ));
77         $ta1->relations = array($this->_getRelation($contract, $ta1));
78         $this->_timeaccountController->update($ta1);
79         
80         // search by contract
81         $f = new Timetracker_Model_TimeaccountFilter(array(array('field' => 'contract', 'operator' => 'AND', 'value' =>
82             array(array('field' => ':id', 'operator' => 'equals', 'value' => $contract->getId()))
83         )));
84
85         $filterArray = $f->toArray();
86         $this->assertEquals($contract->getId(), $filterArray[0]['value'][0]['value']['id']);
87         
88         $result = $this->_timeaccountController->search($f);
89         $this->assertEquals(1, $result->count());
90         $this->assertEquals('TA1', $result->getFirstRecord()->title);
91         
92         // test empty filter (without contract)
93         $f = new Timetracker_Model_TimeaccountFilter(array(
94             array('field' => 'contract', 'operator' => 'AND', 'value' =>
95             array(array('field' => ':id', 'operator' => 'equals', 'value' => null))
96         ),
97             array('field' => 'description', 'operator' => 'equals', 'value' => 'UnitTest')
98         ));
99
100         $result = $this->_timeaccountController->search($f);
101
102         $this->assertEquals(1, $result->count(), 'Only one record should have been found!');
103         $this->assertEquals('TA2', $result->getFirstRecord()->title);
104         
105         // test generic relation filter
106         $f = new Timetracker_Model_TimeaccountFilter(array(array('field' => 'foreignRecord', 'operator' => 'AND', 'value' =>
107             array('appName' => 'Sales', 'linkType' => 'relation', 'modelName' => 'Contract',
108                 'filters' => array('field' => 'query', 'operator' => 'contains', 'value' => 'TA1'))
109         )));
110         $result = $this->_timeaccountController->search($f);
111         $this->assertEquals(1, $result->count());
112         $this->assertEquals('TA1', $result->getFirstRecord()->title);
113         
114         // test "not" operator
115         $f = new Timetracker_Model_TimeaccountFilter(array(
116             array('field' => 'contract', 'operator' => 'AND', 'value' =>
117                 array(array('field' => ':id', 'operator' => 'not', 'value' => $contract->getId()))
118             ),
119             array('field' => 'description', 'operator' => 'equals', 'value' => 'UnitTest')
120         ));
121         
122         $result = $this->_timeaccountController->search($f);
123         
124         // TODO is this correct? do we expect the timaccount without contract to be missing from results?
125         $this->assertEquals(0, $result->count(), 'No record should be found');
126     }
127
128     /**
129      * returns timeaccount-contract relation
130      * @param Sales_Model_Contract $contract
131      * @param Timetracker_Model_Timeaccount $timeaccount
132      */
133     protected function _getRelation($contract, $timeaccount)
134     {
135         $r = new Tinebase_Model_Relation();
136         $ra = array(
137             'own_model' => 'Timetracker_Model_Timeaccount',
138             'own_backend' => 'Sql',
139             'own_id' => $timeaccount->getId(),
140             'related_degree' => 'sibling',
141             'remark' => 'phpunit test',
142             'related_model' => 'Sales_Model_Contract',
143             'related_backend' => 'Sql',
144             'related_id' => $contract->getId(),
145             'type' => 'CONTRACT');
146         $r->setFromArray($ra);
147         return $r;
148     }
149     
150     /**
151      * tests the corret handling of the usertimezone in the date filter
152      */
153     public function testDateIntervalFilter()
154     {
155         $taController = Timetracker_Controller_Timeaccount::getInstance();
156         $tsController = Timetracker_Controller_Timesheet::getInstance();
157         $dateString = '2014-07-14 00:15:00';
158         
159         $date = new Tinebase_DateTime($dateString, Tinebase_Core::getUserTimezone());
160         
161         $ta = $taController->create(new Timetracker_Model_Timeaccount(array('number' => '123', 'title' => 'test')));
162         $r = new Timetracker_Model_Timesheet(array(
163             'timeaccount_id' => $ta->getId(), 
164             'account_id' => Tinebase_Core::getUser()->getId(),
165             'description' => 'lazy boring',
166             'start_date' => $date,
167             'duration' => 30,
168         ));
169         
170         $r->setTimezone('UTC');
171         
172         $ts = $tsController->create($r);
173         
174         $filter = new Timetracker_Model_TimesheetFilter(array());
175         $dateFilter = new Tinebase_Model_Filter_DateMock(
176             array('field' => 'start_date', 'operator' => "within", "value" => "weekThis")
177         );
178         
179         $dateFilter::$testDate = $date;
180         
181         $filter->addFilter($dateFilter);
182         
183         $results = $tsController->search($filter);
184         
185         $this->assertEquals(1, $results->count());
186     }
187 }