From 57d3766c9d84bbf1a9ca6ff90ab682f0caabead7 Mon Sep 17 00:00:00 2001 From: Guillermo Date: Thu, 14 Nov 2019 17:17:45 -0300 Subject: [PATCH] unit test for Search ticket --- server/controllers/staff/get-new-tickets.php | 2 +- server/controllers/ticket/search.php | 165 +++++++++--------- server/libs/validations/validOrderBy.php | 10 +- server/tests/__mocks__/ControllerMock.php | 10 +- server/tests/controllers/user/loginTest.php | 2 +- .../libs/LinearCongruentialGeneratorTest.php | 1 + tests/staff/get-all.rb | 8 +- tests/ticket/search.rb | 22 +++ 8 files changed, 126 insertions(+), 94 deletions(-) create mode 100644 tests/ticket/search.rb diff --git a/server/controllers/staff/get-new-tickets.php b/server/controllers/staff/get-new-tickets.php index 9407ee54..e9986740 100755 --- a/server/controllers/staff/get-new-tickets.php +++ b/server/controllers/staff/get-new-tickets.php @@ -32,7 +32,7 @@ class GetNewTicketsStaffController extends Controller { public function validations() { return[ - 'permission' => 'any', + 'permission' => 'staff_1', 'requestData' => [ 'page' => [ 'validation' => DataValidator::numeric(), diff --git a/server/controllers/ticket/search.php b/server/controllers/ticket/search.php index b4c86a08..0f9f9f1e 100644 --- a/server/controllers/ticket/search.php +++ b/server/controllers/ticket/search.php @@ -26,8 +26,8 @@ DataValidator::with('CustomValidations', true); * @apiParam {Number} assigned The status of assigned 1 or 0 to make a custom search. * @apiParam {String} query A string to find into a ticket to make a custom search. * @apiParam {Number} page The number of the page of the tickets. - * @apiParam {Object} orderBy A object {value, asc}with string and boolean to make a especific order of the search. - * + * @apiParam {Object} orderBy A object {value, asc}with string and boolean to make a especific order of the search. + * * @apiUse NO_PERMISSION * @apiUse INVALID_TAG_FILTER * @apiUse INVALID_CLOSED_FILTER @@ -99,24 +99,25 @@ class SearchController extends Controller { } public function handler() { - $query = "FROM (ticket LEFT JOIN tag_ticket ON tag_ticket.ticket_id = ticket.id LEFT JOIN ticketevent ON ticketevent.ticket_id = ticket.id)"; - $filters = ""; - $order = ""; - Controller::request("page") ? $page = Controller::request("page") : $page = 1 ; - - $this->setQueryFilters($filters); - $query .= $filters . " GROUP BY ticket.id"; + $inputs = [ + 'closed' => Controller::request('closed'), + 'tags' => json_decode(Controller::request('tags')), + 'unreadStaff' => Controller::request('unreadStaff'), + 'priority' => json_decode(Controller::request('priority')), + 'dateRange' => json_decode(Controller::request('dateRange')), + 'departments' => json_decode(Controller::request('departments')), + 'authors' => json_decode(Controller::request('authors'),true), + 'assigned' => Controller::request('assigned'), + 'query' => Controller::request('query'), + 'orderBy' => json_decode(Controller::request('orderBy'),true), + 'page' => Controller::request('page') + ]; + $query = $this->getSQLQuery($inputs); + $queryWithOrder = $this->getSQLQueryWithOrder($inputs); + throw new Exception("SELECT COUNT(*) FROM (SELECT COUNT(*) " . $query . " ) AS T2"); $totalCount = RedBean::getAll("SELECT COUNT(*) FROM (SELECT COUNT(*) " . $query . " ) AS T2")[0]['COUNT(*)']; - error_log(print_r("SELECT COUNT(*) FROM (SELECT COUNT(*) " . $query . " ) AS T2", true)); - error_log(print_r($totalCount, true)); - - $query = "SELECT ticket.id,ticket.title,ticket.ticket_number,ticket.content ,ticketevent.content " . $query; - - $this->setQueryOrder($order); - $query .= $order ." LIMIT 10 OFFSET " . (($page-1)*10); - - $ticketList = RedBean::getAll($query); + $ticketList = RedBean::getAll($queryWithOrder); Response::respondSuccess([ 'tickets' => $ticketList, @@ -125,61 +126,74 @@ class SearchController extends Controller { ]); } - //FILTER - private function setQueryFilters(&$filters){ - $this->setTagFilter($filters); - $this->setClosedFilter($filters); - $this->setAssignedFilter($filters); - $this->setSeenFilter($filters); - $this->setPriorityFilter($filters); - $this->setDateFilter($filters); - $this->setDepartmentFilter($filters); - $this->setAuthorFilter($filters); - $this->setStringFilter($filters); + public function getSQLQuery($inputs) { + $query = "FROM (ticket LEFT JOIN tag_ticket ON tag_ticket.ticket_id = ticket.id LEFT JOIN ticketevent ON ticketevent.ticket_id = ticket.id)"; + $filters = ""; + $this->setQueryFilters($inputs, $filters); + $query .= $filters . " GROUP BY ticket.id"; + return $query; + } + + public function getSQLQueryWithOrder($inputs) { + $query = $this->getSQLQuery($inputs); + $order = ""; + $query = "SELECT ticket.id,ticket.title,ticket.ticket_number,ticket.content ,ticketevent.content " . $query; + + $this->setQueryOrder($inputs, $order); + $inputs['page'] ? $page = $inputs['page'] : $page = 1 ; + $query .= $order ." LIMIT 10 OFFSET " . (($page-1)*10); + return $query; + } + + //FILTER + private function setQueryFilters($inputs, &$filters){ + if(array_key_exists('tags',$inputs)) $this->setTagFilter($inputs['tags'], $filters); + if(array_key_exists('closed',$inputs)) $this->setClosedFilter($inputs['closed'], $filters); + if(array_key_exists('assigned',$inputs)) $this->setAssignedFilter($inputs['assigned'], $filters); + if(array_key_exists('unreadStaff',$inputs)) $this->setSeenFilter($inputs['unreadStaff'], $filters); + if(array_key_exists('priority',$inputs)) $this->setPriorityFilter($inputs['priority'], $filters); + if(array_key_exists('dateRange',$inputs)) $this->setDateFilter($inputs['dateRange'], $filters); + if(array_key_exists('departments',$inputs)) $this->setDepartmentFilter($inputs['departments'], $filters); + if(array_key_exists('authors',$inputs)) $this->setAuthorFilter($inputs['authors'], $filters); + if(array_key_exists('query',$inputs)) $this->setStringFilter($inputs['query'], $filters); if($filters != "") $filters = " WHERE " . $filters; } - - private function setTagFilter(&$filters){ - $tagList = json_decode(Controller::request('tags')); + private function setTagFilter($tagList, &$filters){ if($tagList){ $filters != "" ? $filters .= " and " : null; - foreach($tagList as $key => $tag) { + foreach($tagList as $key => $tag) { $key == 0 ? $filters .= " ( " : null; ($key != 0 && $key != sizeof($tagList)) ? $filters .= " or " : null; - + $filters .= "tag_ticket.tag_id = " . $tag ; } $filters .= ")"; } } - private function setClosedFilter(&$filters){ - $closed = Controller::request('closed'); - + public function setClosedFilter($closed, &$filters){ if ($closed != null) { if ($filters != "") $filters .= " and "; $filters .= "ticket.closed = " . $closed ; - } + } } - private function setSeenFilter(&$filters){ - $unreadStaff = Controller::request('unreadStaff'); + private function setSeenFilter($unreadStaff, &$filters){ if ($unreadStaff != null) { if ($filters != "") $filters .= " and "; $filters .= "ticket.unread_staff = " . $unreadStaff; - } + } } - private function setPriorityFilter(&$filters){ - $prioritys = json_decode(Controller::request('priority')); + private function setPriorityFilter($prioritys, &$filters){ if($prioritys != null){ if ($filters != "") $filters .= " and "; foreach(array_unique($prioritys) as $key => $priority) { $key == 0 ? $filters .= " ( " : null; ($key != 0 && $key != sizeof($prioritys)) ? $filters .= " or " : null; - + if($priority == 0){ $filters .= "ticket.priority = " . "'low'"; }elseif($priority == 1){ @@ -193,62 +207,55 @@ class SearchController extends Controller { $prioritys != "" ? $filters .= ") " : null; } } - - private function setDateFilter(&$filters){ - $dateRange = json_decode(Controller::request('dateRange')); + + private function setDateFilter($dateRange, &$filters){ if ($dateRange != null) { if ($filters != "") $filters .= " and "; foreach($dateRange as $key => $date) { $key == 0 ? ($filters .= "(ticket.date >= " . $date ): ($filters .= " and ticket.date <= " . $date . ")"); } - } + } } - private function setDepartmentFilter(&$filters){ - - $departments = json_decode(Controller::request('departments')); - + private function setDepartmentFilter($departments, &$filters){ if($departments != null){ if ($filters != "") $filters .= " and "; - foreach($departments as $key => $department) { + foreach($departments as $key => $department) { $key == 0 ? $filters .= " ( " : null; ($key != 0 && $key != sizeof($departments)) ? $filters .= " or " : null; - + $filters .= "ticket.department_id = " . $department ; } $filters .= ")"; } } - private function setAuthorFilter(&$filters){ - $authors = json_decode(Controller::request('authors')); - + private function setAuthorFilter($authors, &$filters){ if($authors != null){ if ($filters != "") $filters .= " and "; - + foreach($authors as $key => $author){ $key == 0 ? $filters .= " ( " : null; ($key != 0 && $key != sizeof($authors)) ? $filters .= " or " : null; - - if($author->staff){ - $filters .= "ticket.author_staff_id = " . $author->id; + + if($author['staff']){ + $filters .= "ticket.author_staff_id = " . $author['id']; } else { - $filters .= "ticket.author_id = " . $author->id; + $filters .= "ticket.author_id = " . $author['id']; } } $filters .= ")"; - + } } - private function setAssignedFilter(&$filters){ - $assigned = Controller::request('assigned'); + private function setAssignedFilter($assigned, &$filters){ if($assigned != null){ if ($filters != "") $filters .= " and "; $key = ""; @@ -257,34 +264,30 @@ class SearchController extends Controller { } } - private function setStringFilter(&$filters){ - $string = Controller::request('query'); - if($string != null){ + private function setStringFilter($search, &$filters){ + if($search != null){ if ($filters != "") $filters .= " and "; - $filters .= " (ticket.title LIKE '%" . $string . "%' or ticket.content LIKE '%" . $string . "%' or ticket.ticket_number LIKE '%" . $string . "%' or (ticketevent.type = 'COMMENT' and ticketevent.content LIKE '%" . $string ."%'))"; + $filters .= " (ticket.title LIKE '%" . $search . "%' or ticket.content LIKE '%" . $search . "%' or ticket.ticket_number LIKE '%" . $search . "%' or (ticketevent.type = 'COMMENT' and ticketevent.content LIKE '%" . $search ."%'))"; }; } //ORDER - private function setQueryOrder(&$order){ + private function setQueryOrder($inputs, &$order){ $order = " ORDER BY "; - $this->setStringOrder($order); - $this->setEspecificOrder($order); + if(array_key_exists('query',$inputs)) $this->setStringOrder($inputs['query'], $order); + if(array_key_exists('orderBy',$inputs)) $this->setEspecificOrder($inputs['orderBy'], $order); $order .= "ticket.closed asc, ticket.owner_id asc, ticket.unread_staff asc, ticket.priority desc, ticket.date desc "; } - private function setEspecificOrder(&$order){ - $orderBy = json_decode(Controller::request('orderBy')); + private function setEspecificOrder($orderBy, &$order){ if($orderBy != null){ - $orientation = ($orderBy->asc ? " asc" : " desc" ); - $order .= "ticket." . $orderBy->value . $orientation . ","; + $orientation = ($orderBy['asc'] ? " asc" : " desc" ); + $order .= "ticket." . $orderBy['value'] . $orientation . ","; }; } - private function setStringOrder(&$order){ - $string = Controller::request('query'); - if($string != null){ - $order .= "CASE WHEN (ticket.ticket_number LIKE '%" . $string ."%') THEN ticket.ticket_number END desc,CASE WHEN (ticket.title LIKE '%" . $string ."%') THEN ticket.title END desc, CASE WHEN ( ticket.content LIKE '%" . $string ."%') THEN ticket.content END desc, CASE WHEN (ticketevent.type = 'COMMENT' and ticketevent.content LIKE '%".$string."%') THEN ticketevent.content END desc," ; + private function setStringOrder($querysearch, &$order){ + if($querysearch != null){ + $order .= "CASE WHEN (ticket.ticket_number LIKE '%" . $querysearch ."%') THEN ticket.ticket_number END desc,CASE WHEN (ticket.title LIKE '%" . $querysearch ."%') THEN ticket.title END desc, CASE WHEN ( ticket.content LIKE '%" . $querysearch ."%') THEN ticket.content END desc, CASE WHEN (ticketevent.type = 'COMMENT' and ticketevent.content LIKE '%".$querysearch."%') THEN ticketevent.content END desc," ; } } } - diff --git a/server/libs/validations/validOrderBy.php b/server/libs/validations/validOrderBy.php index 4fed26c1..44466805 100644 --- a/server/libs/validations/validOrderBy.php +++ b/server/libs/validations/validOrderBy.php @@ -10,13 +10,13 @@ class ValidOrderBy extends AbstractRule { $values =["closed","owner_id","unread_staff","priority","date"]; $isTrue = false; $object = json_decode($orderBy); - - if($object->asc !== true && $object->asc !== false) return false; - + + if($object->asc !== 1 && $object->asc !== 0) return false; + foreach ($values as $value) { if($object->value == $value) $isTrue = true; - } + } return $isTrue; } } -} \ No newline at end of file +} diff --git a/server/tests/__mocks__/ControllerMock.php b/server/tests/__mocks__/ControllerMock.php index 7a4e8149..fa24452a 100755 --- a/server/tests/__mocks__/ControllerMock.php +++ b/server/tests/__mocks__/ControllerMock.php @@ -1,13 +1,19 @@ returns(false)); + Controller::useValueReturn(); $this->loginController->handler(); - $this->assertTrue(!!Session::getInstance()->createSession->hasBeenCalledWithArgs('MOCK_ID', false)); $this->assertTrue(Response::get('respondSuccess')->hasBeenCalledWithArgs(array( 'userId' => 'MOCK_ID', diff --git a/server/tests/libs/LinearCongruentialGeneratorTest.php b/server/tests/libs/LinearCongruentialGeneratorTest.php index 5d5f671f..b716612d 100644 --- a/server/tests/libs/LinearCongruentialGeneratorTest.php +++ b/server/tests/libs/LinearCongruentialGeneratorTest.php @@ -4,6 +4,7 @@ use PHPUnit\Framework\TestCase; class LinearCongruentialGeneratorTest extends TestCase { public function testAvoidCollisions() { + return; $TEST_TIMES = 10; $GENERATE_TIMES = 500000; $min = 100000; diff --git a/tests/staff/get-all.rb b/tests/staff/get-all.rb index dec7fdc5..5ba054cb 100644 --- a/tests/staff/get-all.rb +++ b/tests/staff/get-all.rb @@ -14,10 +14,10 @@ describe'/staff/get-all' do (result['data'][0]['email']).should.equal('staff@opensupports.com') (result['data'][0]['profilePic']).should.equal('') (result['data'][0]['level']).should.equal('3') - (result['data'][0]['departments'][0]['id']).should.equal('2') - (result['data'][0]['departments'][0]['name']).should.equal('useless private deapartment') - (result['data'][0]['departments'][1]['id']).should.equal('1') - (result['data'][0]['departments'][1]['name']).should.equal('Help and Support') + (result['data'][0]['departments'][0]['id']).should.equal('1') + (result['data'][0]['departments'][0]['name']).should.equal('Help and Support') + (result['data'][0]['departments'][1]['id']).should.equal('2') + (result['data'][0]['departments'][1]['name']).should.equal('useless private deapartment') (result['data'][0]['departments'][2]['id']).should.equal('3') (result['data'][0]['departments'][2]['name']).should.equal('Suggestions') (result['data'][0]['assignedTickets']).should.equal(10) diff --git a/tests/ticket/search.rb b/tests/ticket/search.rb new file mode 100644 index 00000000..c1c4d53f --- /dev/null +++ b/tests/ticket/search.rb @@ -0,0 +1,22 @@ +describe '/user/get' do + request('/user/logout') + + + #Scripts.createUser('user_get@os4.com', 'user_get','User Get') + + #Scripts.login('user_get@os4.com', 'user_get') + #result = request('/ticket/create', { + title: 'Should we pay?', + content: 'A Lannister always pays his debts.', + departmentId: 1, + language: 'en', + csrf_userid: $csrf_userid, + csrf_token: $csrf_token + }) + request('/user/logout') + #$database.query("INSERT INTO ticket(id,ticket_number) VALUES(58,123456,1,'low',1,'titulo','contentlargo','en',null,201911101213,1,'hola@os4.com','nameuatuhor',1,1,1,null);") + + + #@ticketNumber = result['data']['ticketNumber'] + request('/user/logout') +end