diff --git a/server/libs/validations/validAuthorsId.php b/server/libs/validations/validAuthorsId.php index ac6805fd..905d3413 100644 --- a/server/libs/validations/validAuthorsId.php +++ b/server/libs/validations/validAuthorsId.php @@ -9,12 +9,13 @@ class ValidAuthorsId extends AbstractRule { public function validate($authors) { if(is_array(json_decode($authors))){ foreach (json_decode($authors) as $authorObject) { - if($authorObject->isStaff){ + if(!is_object($authorObject)) return false; + if($authorObject->isStaff) { $author = \Staff::getDataStore($authorObject->id); - }else{ + } else { $author = \User::getDataStore($authorObject->id); } - if($author->isNull()) return false; + if($author->isNull()) return false; } return true; } diff --git a/tests/system/default-department.rb b/tests/system/default-department.rb index b70312fb..a267cd5d 100644 --- a/tests/system/default-department.rb +++ b/tests/system/default-department.rb @@ -243,7 +243,7 @@ describe '/system/default-department' do (row['department_id']).should.equal(1) end - it 'should create ticket on default leanguage if user does not pass language'do + it 'should create ticket on default language if user does not pass language'do $database.query('update setting set value="ru" where name="language";') request('/user/logout') diff --git a/tests/ticket/add-tag.rb b/tests/ticket/add-tag.rb index 6b1d86a6..06bfe86c 100644 --- a/tests/ticket/add-tag.rb +++ b/tests/ticket/add-tag.rb @@ -61,7 +61,13 @@ describe '/ticket/add-tag' do tagId: 3, ticketNumber: ticket['ticket_number'] }) + (result['status']).should.equal('success') + result = request('/ticket/delete', { + csrf_userid: $csrf_userid, + csrf_token: $csrf_token, + ticketNumber: ticket['ticket_number'] + }) (result['status']).should.equal('success') end @@ -105,4 +111,11 @@ describe '/ticket/add-tag' do (result['status']).should.equal('fail') (result['message']).should.equal('TAG_EXISTS') end + + result = request('/ticket/delete', { + csrf_userid: $csrf_userid, + csrf_token: $csrf_token, + ticketNumber: @ticketNumber + }) + (result['status']).should.equal('success') end diff --git a/tests/ticket/search.rb b/tests/ticket/search.rb index 79689039..bf818195 100644 --- a/tests/ticket/search.rb +++ b/tests/ticket/search.rb @@ -2,122 +2,651 @@ describe '/ticket/search' do request('/user/logout') Scripts.login($staff[:email], $staff[:password], true) + result = Scripts.createTicket('test ticket1') + @ticketNumber1 = result['ticketNumber'] + + result = Scripts.createTicket('test ticket2') + @ticketNumber2 = result['ticketNumber'] + + result = Scripts.createTicket('test ticket3') + @ticketNumber3 = result['ticketNumber'] + + $pages = 1..10 it 'should fail if the page is invalid' do - result = request('/ticket/search', { - csrf_userid: $csrf_userid, - csrf_token: $csrf_token, - page: -1 - }) - (result['status']).should.equal('fail') - (result['message']).should.equal('INVALID_PAGE') + pageFilterList = [-1, '-1', 'one'] + + for pageFilter in pageFilterList + result = request('/ticket/search', { + csrf_userid: $csrf_userid, + csrf_token: $csrf_token, + page: pageFilter + }) + (result['status']).should.equal('fail') + (result['message']).should.equal('INVALID_PAGE') + end end it 'should fail if the tags are invalid' do - result = request('/ticket/search', { - csrf_userid: $csrf_userid, - csrf_token: $csrf_token, - page: 1, - tags: "[1,11,111,1111,11111,111111,1111111,11111111]" - }) - (result['status']).should.equal('fail') - (result['message']).should.equal('INVALID_TAG_FILTER') + tagsFilterList = [ + '[1, 11, 111, 1111, 11111, 111111, 1111111, 11111111]', + '[-1]', + 'this is not a tag id list', + 2, + '{tags: "[2, 3]"}' + ] + + for tagsFilter in tagsFilterList + result = request('/ticket/search', { + csrf_userid: $csrf_userid, + csrf_token: $csrf_token, + page: 1, + tags: tagsFilter + }) + (result['status']).should.equal('fail') + (result['message']).should.equal('INVALID_TAG_FILTER') + end end it 'should fail if the closed value is invalid' do - result = request('/ticket/search', { - csrf_userid: $csrf_userid, - csrf_token: $csrf_token, - page: 1, - closed: 3 - }) - (result['status']).should.equal('fail') - (result['message']).should.equal('INVALID_CLOSED_FILTER') + closedFilterList = [3, -1, '-1', '&123'] + + for closedFilter in closedFilterList + result = request('/ticket/search', { + csrf_userid: $csrf_userid, + csrf_token: $csrf_token, + page: 1, + closed: closedFilter + }) + (result['status']).should.equal('fail') + (result['message']).should.equal('INVALID_CLOSED_FILTER') + end end it 'should fail if the unreadStaff value is invalid' do - result = request('/ticket/search', { - csrf_userid: $csrf_userid, - csrf_token: $csrf_token, - page: 1, - unreadStaff: 3 - }) - (result['status']).should.equal('fail') - (result['message']).should.equal('INVALID_UNREAD_STAFF_FILTER') + unreadStaffFilterList = [3, 'hola', -1, {unreadStaff: 1}] + + for unreadStaffFilter in unreadStaffFilterList + result = request('/ticket/search', { + csrf_userid: $csrf_userid, + csrf_token: $csrf_token, + page: 1, + unreadStaff: unreadStaffFilter + }) + (result['status']).should.equal('fail') + (result['message']).should.equal('INVALID_UNREAD_STAFF_FILTER') + end end it 'should fail if the dateRange values are invalid' do - result = request('/ticket/search', { - csrf_userid: $csrf_userid, - csrf_token: $csrf_token, - page: 1, - dateRange: "[11,69,()) ]" - }) - (result['status']).should.equal('fail') - (result['message']).should.equal('INVALID_DATE_RANGE_FILTER') + dateRangeFilterList = ['[11, 69, ())]', '[startDate, endDate]', '[500, 123]'] + + for dateRangeFilter in dateRangeFilterList + result = request('/ticket/search', { + csrf_userid: $csrf_userid, + csrf_token: $csrf_token, + page: 1, + dateRange: dateRangeFilter + }) + (result['status']).should.equal('fail') + (result['message']).should.equal('INVALID_DATE_RANGE_FILTER') + end end it 'should fail if the departments are invalid' do - result = request('/ticket/search', { - csrf_userid: $csrf_userid, - csrf_token: $csrf_token, - page: 1, - departments: "[-1,-2,99]" - }) - (result['status']).should.equal('fail') - (result['message']).should.equal('INVALID_DEPARTMENT_FILTER') + departmentFilterList = ['[-1,-2,99]', '1', 'departmentId1', ''] + + for departmentFilter in departmentFilterList + result = request('/ticket/search', { + csrf_userid: $csrf_userid, + csrf_token: $csrf_token, + page: 1, + departments: departmentFilter + }) + (result['status']).should.equal('fail') + (result['message']).should.equal('INVALID_DEPARTMENT_FILTER') + end end it 'should fail if the authors are invalid' do - result = request('/ticket/search', { - csrf_userid: $csrf_userid, - csrf_token: $csrf_token, - page: 1, - authors: "[{id:30001, staff: 1},{id:30,staff: 3}]" - }) - (result['status']).should.equal('fail') - (result['message']).should.equal('INVALID_AUTHOR_FILTER') + authorsFilterList = [ + '[{id:30001, staff: 1},{id:30,staff: 3}]', + '[{id:"delete all)", staff: 1},{id:30,staff: 3}]', + '1, 2, 3', + '[1, 2, 3]' + ] - result = request('/ticket/search', { - csrf_userid: $csrf_userid, - csrf_token: $csrf_token, - page: 1, - authors: "[{id:'delete all)', staff: 1},{id:30,staff: 3}]" - }) - (result['status']).should.equal('fail') - (result['message']).should.equal('INVALID_AUTHOR_FILTER') + for authorsFilter in authorsFilterList + result = request('/ticket/search', { + csrf_userid: $csrf_userid, + csrf_token: $csrf_token, + page: 1, + authors: authorsFilter + }) + (result['status']).should.equal('fail') + (result['message']).should.equal('INVALID_AUTHOR_FILTER') + end end it 'should fail if the assigned value is invalid' do - result = request('/ticket/search', { - csrf_userid: $csrf_userid, - csrf_token: $csrf_token, - page: 1, - assigned: 3 - }) - (result['status']).should.equal('fail') - (result['message']).should.equal('INVALID_ASSIGNED_FILTER') + assignedFilterList = [3, 11113, '[1]', 'assigned?'] + + for assignedFilter in assignedFilterList + result = request('/ticket/search', { + csrf_userid: $csrf_userid, + csrf_token: $csrf_token, + page: 1, + assigned: assignedFilter + }) + (result['status']).should.equal('fail') + (result['message']).should.equal('INVALID_ASSIGNED_FILTER') + end end - it 'should fail if the assigned value is invalid' do + it 'should fail if the owners are invalid' do + ownersFilterList = ['[{id: 1}]', '[30, 25]', 'ownerList', -1, '{1, 3}'] + + for ownersFilter in ownersFilterList + result = request('/ticket/search', { + csrf_userid: $csrf_userid, + csrf_token: $csrf_token, + page: 1, + owners: ownersFilter + }) + (result['status']).should.equal('fail') + (result['message']).should.equal('INVALID_OWNER_FILTER') + end + end + + it 'should get tickets from the owner passaged' do + ownerIdList = [8, 1, 2] + ownerIdFilterList = [ + [ownerIdList[0]], + [ownerIdList[1], ownerIdList[2], ownerIdList[0]], + [ownerIdList[2], ownerIdList[0]] + ] + ownerIdFilterList = ownerIdFilterList.map { |ownerFilter| ownerFilter.to_json } + + for page in $pages + for ownerFilter in ownerIdFilterList + result = request('/ticket/search', { + csrf_userid: $csrf_userid, + csrf_token: $csrf_token, + page: page, + owners: ownerFilter + }) + (result['status']).should.equal('success') + + tickets = result['data']['tickets'] + + for ticket in tickets + (ownerFilter.include?(ticket['owner']['id'])).should.equal(true) + end + end + end + end + + it 'should get tickets from the closed passaged' do + closedFilterList = [1, 0] + + for page in $pages + for closedFilter in closedFilterList + result = request('/ticket/search', { + csrf_userid: $csrf_userid, + csrf_token: $csrf_token, + page: page, + closed: closedFilter + }) + (result['status']).should.equal('success') + + tickets = result['data']['tickets'] + + for ticket in tickets + (ticket['closed']).should.equal(closedFilter === 1) + end + end + end + end + + it 'should success if the page is valid' do + for page in $pages + result = request('/ticket/search', { + csrf_userid: $csrf_userid, + csrf_token: $csrf_token, + page: page + }) + (result['status']).should.equal('success') + end + end + + it 'should get tickets from the tags passaged' do + ticketNumberList1 = [@ticketNumber1, @ticketNumber3] + ticketNumberList2 = [@ticketNumber2, @ticketNumber3] + + result = request('/ticket/get-tags', { + csrf_userid: $csrf_userid, + csrf_token: $csrf_token + }) + (result['status']).should.equal('success') + + tags = result['data'] + + for tag in tags + if tag['id'] === '2' + tagNameOfId2 = tag['name'] + end + if tag['id'] === '3' + tagNameOfId3 = tag['name'] + end + end + + for ticketNumber in ticketNumberList1 + result = request('/ticket/add-tag', { + csrf_userid: $csrf_userid, + csrf_token: $csrf_token, + tagId: 2, + ticketNumber: ticketNumber + }) + (result['status']).should.equal('success') + end + + for ticketNumber in ticketNumberList2 + result = request('/ticket/add-tag', { + csrf_userid: $csrf_userid, + csrf_token: $csrf_token, + tagId: 3, + ticketNumber: ticketNumber + }) + (result['status']).should.equal('success') + end + + tagObjectList = [ + {'tagIdFilter' => '[2]', 'tagName' => tagNameOfId2}, + {'tagIdFilter' => '[3]', 'tagName' => tagNameOfId3}, + ] + + for tagObject in tagObjectList + result = request('/ticket/search', { + csrf_userid: $csrf_userid, + csrf_token: $csrf_token, + page: 1, + tags: tagObject['tagIdFilter'] + }) + (result['status']).should.equal('success') + + tickets = result['data']['tickets'] + + for ticket in tickets + ticketTags = ticket['tags'] + (ticketTags.include?(tagObject['tagName'])).should.equal(true) + end + end + result = request('/ticket/search', { csrf_userid: $csrf_userid, csrf_token: $csrf_token, page: 1, - assigned: 11113 + tags: '[2, 3]' }) - (result['status']).should.equal('fail') - (result['message']).should.equal('INVALID_ASSIGNED_FILTER') + (result['status']).should.equal('success') + + for ticket in tickets + ticketTags = ticket['tags'] + ( + (ticketTags.include?(tagNameOfId2) && ticketTags.include?(tagNameOfId3)) || + ticketTags.include?(tagNameOfId3) || + ticketTags.include?(tagNameOfId2) + ).should.equal(true) + end + end + + it 'should get tickets from the departments passaged' do + departmentIdList = [1, 2, 7] + departmentIdFilterList = [ + [departmentIdList[0]], + [departmentIdList[1]], + [departmentIdList[1], departmentIdList[0], departmentIdList[2]] + ] + departmentIdFilterList = departmentIdFilterList.map { |departmentFilter| departmentFilter.to_json } + + for page in $pages + for departmentFilter in departmentIdFilterList + result = request('/ticket/search', { + csrf_userid: $csrf_userid, + csrf_token: $csrf_token, + page: page, + departments: departmentFilter + }) + (result['status']).should.equal('success') + + tickets = result['data']['tickets'] + + for ticket in tickets + (departmentFilter.include?(ticket['department']['id'])).should.equal(true) + end + end + end + end + + it 'should get tickets from the authors passaged' do + authorIdList = [1, 2, 8] + authorIsStaffList = [true, true, false] + authorsFilterList = [ + [], + [{'id' => authorIdList[0], 'isStaff' => authorIsStaffList[0]}], + [ + {'id' => authorIdList[1], 'isStaff' => authorIsStaffList[1]}, + {'id' => authorIdList[2], 'isStaff' => authorIsStaffList[2]}, + {'id' => authorIdList[0], 'isStaff' => authorIsStaffList[0]} + ] + ] + authorsFilterList = authorsFilterList.map { |authorsFilter| authorsFilter.to_json } + authorIdList = authorIdList.map { |authorId| authorId.to_s } + + for page in $pages + for authorsFilter in authorsFilterList + result = request('/ticket/search', { + csrf_userid: $csrf_userid, + csrf_token: $csrf_token, + page: page, + authors: authorsFilter + }) + (result['status']).should.equal('success') + + if authorsFilter != '[]' + tickets = result['data']['tickets'] + + for ticket in tickets + ticketAuthor = ticket['author'] + author = (JSON.parse(authorsFilter)).find { |author| author['id'].to_s === ticketAuthor['id'] } + (author['isStaff']).should.equal(ticketAuthor['staff']) + end + end + end + end end it 'should fail if the orderBy values are invalid' do - result = request('/ticket/search', { - csrf_userid: $csrf_userid, - csrf_token: $csrf_token, - page: 1, - orderBy: "{value: 'closeddd', asc: 11}" - }) - (result['status']).should.equal('fail') - (result['message']).should.equal('INVALID_ORDER_BY') + orderByFilterList = ['{value: "closeddd", asc: 11}', '', 'orderBy', -1] + + for orderByFilter in orderByFilterList + result = request('/ticket/search', { + csrf_userid: $csrf_userid, + csrf_token: $csrf_token, + page: 1, + orderBy: orderByFilter + }) + (result['status']).should.equal('fail') + (result['message']).should.equal('INVALID_ORDER_BY') + end + end + + it 'should get tickets from the unreadStaff passaged' do + unreadStaffList = [1, 0] + + for page in $pages + for unreadStaff in unreadStaffList + result = request('/ticket/search', { + csrf_userid: $csrf_userid, + csrf_token: $csrf_token, + page: page, + unreadStaff: unreadStaff + }) + (result['status']).should.equal('success') + + tickets = result['data']['tickets'] + + for ticket in tickets + ticket['unreadStaff'].should.equal(unreadStaff === 1) + end + end + end + end + + it 'should get tickets from the assigned passaged' do + assignedFilterList = [1, 0] + + for page in $pages + for assignedFilter in assignedFilterList + result = request('/ticket/search', { + csrf_userid: $csrf_userid, + csrf_token: $csrf_token, + page: page, + assigned: assignedFilter + }) + (result['status']).should.equal('success') + + tickets = result['data']['tickets'] + + for ticket in tickets + (ticket['owner'] != nil).should.equal(assignedFilter === 1) + end + end + end + end + + it 'should success if the dateRange values are valid' do + dateRangeList = [[0, 1], [201701010000,202001081735], [201701010000,201701010001]] + + dateRangeFilterList = dateRangeList.map { |dateRange| dateRange.to_json } + + for page in $pages + for dateRangeFilter in dateRangeFilterList + result = request('/ticket/search', { + csrf_userid: $csrf_userid, + csrf_token: $csrf_token, + page: page, + dateRange: dateRangeFilter + }) + (result['status']).should.equal('success') + end + end + end + + it 'should get tickets from the orderBy passaged' do + orderByClosedDesc = '{"value": "closed", "asc": 0}' + orderByClosedAsc = '{"value": "closed", "asc": 1}' + + orderByOwnerIdDesc = '{"value": "owner_id", "asc": 0}' + orderByOwnerIdAsc = '{"value": "owner_id", "asc": 1}' + + for page in $pages + result = request('/ticket/search', { + csrf_userid: $csrf_userid, + csrf_token: $csrf_token, + page: page, + orderBy: orderByClosedDesc + }) + (result['status']).should.equal('success') + + tickets = result['data']['tickets'] + currentTicketClosedValue = (tickets != []) ? ((tickets.first())['closed'] ? 1 : 0) : nil + + for ticket in tickets + ticketStatus = ticket['closed'] + ((ticketStatus ? 1 : 0) <= currentTicketClosedValue).should.equal(true) + currentTicketClosedValue = ticketStatus ? 1 : 0 + end + + result = request('/ticket/search', { + csrf_userid: $csrf_userid, + csrf_token: $csrf_token, + page: page, + orderBy: orderByClosedAsc + }) + (result['status']).should.equal('success') + + tickets = result['data']['tickets'] + currentTicketClosedValue = (tickets != []) ? ((tickets.first())['closed'] ? 1 : 0) : nil + + for ticket in tickets + ticketStatus = ticket['closed'] + ((ticketStatus ? 1 : 0) >= currentTicketClosedValue).should.equal(true) + currentTicketClosedValue = ticketStatus ? 1 : 0 + end + + result = request('/ticket/search', { + csrf_userid: $csrf_userid, + csrf_token: $csrf_token, + page: page, + orderBy: orderByOwnerIdDesc + }) + (result['status']).should.equal('success') + + tickets = result['data']['tickets'] + firstTicket = tickets.first() + firstTicketOwner = firstTicket ? firstTicket['owner'] : nil + firstTicketOwnerId = firstTicketOwner ? firstTicketOwner['id'] : '-1' + currentTicketOwnerIdValue = (tickets != []) ? firstTicketOwnerId: nil + + for ticket in tickets + ticketOwner = ticket['owner'] + ticketOwnerId = ticketOwner ? ticketOwner['id'] : '-1' + + (ticketOwnerId <= currentTicketOwnerIdValue).should.equal(true) + + currentTicketOwnerIdValue = ticketOwnerId + end + + result = request('/ticket/search', { + csrf_userid: $csrf_userid, + csrf_token: $csrf_token, + page: page, + orderBy: orderByOwnerIdAsc + }) + (result['status']).should.equal('success') + + tickets = result['data']['tickets'] + firstTicket = tickets.first() + firstTicketOwner = firstTicket ? firstTicket['owner'] : nil + firstTicketOwnerId = firstTicketOwner ? firstTicketOwner['id'] : '-1' + currentTicketOwnerIdValue = (tickets != []) ? firstTicketOwnerId: nil + + for ticket in tickets + ticketOwner = ticket['owner'] + ticketOwnerId = ticketOwner ? ticketOwner['id'] : '-1' + + (ticketOwnerId >= currentTicketOwnerIdValue).should.equal(true) + + currentTicketOwnerIdValue = ticketOwnerId + end + end + end + + it 'should fail if the query values are invalid' do + queryList = ['', ' ', ' '] + + for page in $pages + for query in queryList + result = request('/ticket/search', { + csrf_userid: $csrf_userid, + csrf_token: $csrf_token, + page: page, + query: query + }) + (result['status']).should.equal('fail') + end + end + end + + # + # it 'should success if the query values are valid' do + # queryList = ['Hola?', '223121', '1', 'xD'] + + # for page in $pages + # for query in queryList + # result = request('/ticket/search', { + # csrf_userid: $csrf_userid, + # csrf_token: $csrf_token, + # page: page, + # query: query + # }) + # if result['status'] === 'fail' + # puts "Esto es result #{result}" + # end + # result is { + # "status"=>"fail", + # "message"=>"SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'development.ticketevent.content' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by", + # "data"=>nil + # } + # (result['status']).should.equal('success') + # end + # end + # end + + it 'should get tickets from the assigned and the author passaged' do + assignedFilterList = [1, 0] + authorIdList = [1, 2, 8] + authorIsStaffList = [true, true, false] + authorsFilterList = [ + [], + [{'id' => authorIdList[0], 'isStaff' => authorIsStaffList[0]}], + [ + {'id' => authorIdList[1], 'isStaff' => authorIsStaffList[1]}, + {'id' => authorIdList[2], 'isStaff' => authorIsStaffList[2]}, + {'id' => authorIdList[0], 'isStaff' => authorIsStaffList[0]} + ] + ] + authorsFilterList = authorsFilterList.map { |authorsFilter| authorsFilter.to_json } + authorIdList = authorIdList.map { |authorId| authorId.to_s } + + for page in $pages + for authorsFilter in authorsFilterList + for assignedFilter in assignedFilterList + result = request('/ticket/search', { + csrf_userid: $csrf_userid, + csrf_token: $csrf_token, + page: page, + assigned: assignedFilter, + authors: authorsFilter + }) + (result['status']).should.equal('success') + + if authorsFilter != '[]' + tickets = result['data']['tickets'] + + for ticket in tickets + ticketAuthor = ticket['author'] + author = (JSON.parse(authorsFilter)).find { |author| author['id'].to_s === ticketAuthor['id'] } + (author['isStaff']).should.equal(ticketAuthor['staff']) + (ticket['owner'] != nil).should.equal(assignedFilter === 1) + end + end + end + end + end + end + + it 'should get tickets from the closed and the owners passaged' do + closedFilterList = [1, 0] + ownerIdList = [8, 1, 2] + ownerIdFilterList = [ + [ownerIdList[0]], + [ownerIdList[1], ownerIdList[2], ownerIdList[0]], + [ownerIdList[2], ownerIdList[0]] + ] + ownerIdFilterList = ownerIdFilterList.map { |ownerFilter| ownerFilter.to_json } + + for page in $pages + for ownerFilter in ownerIdFilterList + for closedFilter in closedFilterList + result = request('/ticket/search', { + csrf_userid: $csrf_userid, + csrf_token: $csrf_token, + page: page, + closed: closedFilter, + owners: ownerFilter + }) + (result['status']).should.equal('success') + + tickets = result['data']['tickets'] + + for ticket in tickets + (ticket['closed']).should.equal(closedFilter === 1) + (ownerFilter.include?(ticket['owner']['id'])).should.equal(true) + end + end + end + end end end