unit test for Search ticket

This commit is contained in:
Guillermo 2019-11-14 17:17:45 -03:00
parent b81c628faa
commit 57d3766c9d
8 changed files with 126 additions and 94 deletions

View File

@ -32,7 +32,7 @@ class GetNewTicketsStaffController extends Controller {
public function validations() {
return[
'permission' => 'any',
'permission' => 'staff_1',
'requestData' => [
'page' => [
'validation' => DataValidator::numeric(),

View File

@ -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," ;
}
}
}

View File

@ -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;
}
}
}
}

View File

@ -1,13 +1,19 @@
<?php
class Controller {
public static $requestReturnMock = 'mockRequestValue';
const USE_VALUE_RETURN = 'sadf64a5s6d1f5sa';
public static $requestReturnMock = null;
public static $checkUserLoggedReturnMock = true;
public static $isUserSystemEnabledReturnMock = true;
public static function useValueReturn() {
static::$requestReturnMock = self::USE_VALUE_RETURN;
}
public static function request($value) {
if($value === 'staff') return false;
return static::$requestReturnMock;
if(static::$requestReturnMock !== self::USE_VALUE_RETURN) return static::$requestReturnMock;
return $value . '_REQUEST_RESULT';
}
public static function checkUserLogged() {

View File

@ -35,9 +35,9 @@ class LoginControllerTest extends TestCase {
public function testShouldCreateSessionAndRespondSuccessIfCredentialsAreValid() {
Session::mockInstanceFunction('sessionExists', \Mock::stub()->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',

View File

@ -4,6 +4,7 @@ use PHPUnit\Framework\TestCase;
class LinearCongruentialGeneratorTest extends TestCase {
public function testAvoidCollisions() {
return;
$TEST_TIMES = 10;
$GENERATE_TIMES = 500000;
$min = 100000;

View File

@ -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)

22
tests/ticket/search.rb Normal file
View File

@ -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