From 06a38e9383718470221118388da24ce9c527bb71 Mon Sep 17 00:00:00 2001 From: Mike Koch Date: Sat, 11 Mar 2017 23:43:46 -0500 Subject: [PATCH] Autoassign logic is finished --- api/BusinessLogic/Security/UserContext.php | 37 +++++- api/BusinessLogic/Tickets/Autoassigner.php | 11 +- api/DataAccess/Security/UserGateway.php | 4 + .../Tickets/AutoassignerTest.php | 111 ++++++++++++++++++ 4 files changed, 156 insertions(+), 7 deletions(-) diff --git a/api/BusinessLogic/Security/UserContext.php b/api/BusinessLogic/Security/UserContext.php index 1f781023..30baf47b 100644 --- a/api/BusinessLogic/Security/UserContext.php +++ b/api/BusinessLogic/Security/UserContext.php @@ -4,30 +4,55 @@ namespace BusinessLogic\Security; class UserContext { + /* @var $id int */ public $id; + + /* @var $username string */ public $username; + + /* @var $admin bool */ public $admin; + + /* @var $name string */ public $name; + + /* @var $email string */ public $email; + + /* @var $signature string */ public $signature; + + /* @var $language string|null */ public $language; + + /* @var $categories int[] */ public $categories; + + /* @var $permissions string[] */ public $permissions; - /** - * @var UserContextPreferences - */ + /* @var UserContextPreferences */ public $preferences; - /** - * @var UserContextNotifications - */ + /* @var UserContextNotifications */ public $notificationSettings; + + /* @var $autoAssign bool */ public $autoAssign; + + /* @var $ratingNegative int */ public $ratingNegative; + + /* @var $ratingPositive int */ public $ratingPositive; + + /* @var $rating float */ public $rating; + + /* @var $totalNumberOfReplies int */ public $totalNumberOfReplies; + + /* @var $active bool */ public $active; /** diff --git a/api/BusinessLogic/Tickets/Autoassigner.php b/api/BusinessLogic/Tickets/Autoassigner.php index 4b8f654c..4ff6fabd 100644 --- a/api/BusinessLogic/Tickets/Autoassigner.php +++ b/api/BusinessLogic/Tickets/Autoassigner.php @@ -31,7 +31,16 @@ class Autoassigner { $potentialUsers = $this->userGateway->getUsersByNumberOfOpenTickets($heskSettings); + foreach ($potentialUsers as $potentialUser) { + if ($potentialUser->admin || + (in_array($categoryId, $potentialUser->categories) && + in_array('can_view_tickets', $potentialUser->permissions) && + in_array('can_reply_tickets', $potentialUser->permissions))) { + return $potentialUser; + } + } - return $potentialUsers[0]; + + return null; } } \ No newline at end of file diff --git a/api/DataAccess/Security/UserGateway.php b/api/DataAccess/Security/UserGateway.php index b32053b0..341f3e31 100644 --- a/api/DataAccess/Security/UserGateway.php +++ b/api/DataAccess/Security/UserGateway.php @@ -63,6 +63,10 @@ class UserGateway extends CommonDao { return $row['email']; } + /** + * @param $heskSettings array + * @return UserContext[] + */ function getUsersByNumberOfOpenTickets($heskSettings) { $this->init(); diff --git a/api/Tests/BusinessLogic/Tickets/AutoassignerTest.php b/api/Tests/BusinessLogic/Tickets/AutoassignerTest.php index 215adfee..1962395b 100644 --- a/api/Tests/BusinessLogic/Tickets/AutoassignerTest.php +++ b/api/Tests/BusinessLogic/Tickets/AutoassignerTest.php @@ -47,14 +47,20 @@ class AutoassignerTest extends TestCase { self::assertThat($owner, self::isNull()); } + function getPermissionsForUser() { + return array('can_view_tickets', 'can_reply_tickets'); + } + function testItReturnsTheUsersWithLeastOpenTickets() { //-- Arrange $userWithNoOpenTickets = new UserContext(); $userWithNoOpenTickets->id = 1; $userWithNoOpenTickets->categories = array(1); + $userWithNoOpenTickets->permissions = $this->getPermissionsForUser(); $userWithOneOpenTicket = new UserContext(); $userWithOneOpenTicket->id = 2; $userWithOneOpenTicket->categories = array(1); + $userWithOneOpenTicket->permissions = $this->getPermissionsForUser(); $usersToReturn = array( $userWithNoOpenTickets, $userWithOneOpenTicket @@ -70,4 +76,109 @@ class AutoassignerTest extends TestCase { //-- Assert self::assertThat($actual, self::equalTo($userWithNoOpenTickets)); } + + function testItOnlyReturnsUsersWhoCanAccessTheCategory() { + //-- Arrange + $userWithNoOpenTickets = new UserContext(); + $userWithNoOpenTickets->id = 1; + $userWithNoOpenTickets->categories = array(1); + $userWithNoOpenTickets->permissions = $this->getPermissionsForUser(); + $userWithOneOpenTicket = new UserContext(); + $userWithOneOpenTicket->id = 2; + $userWithOneOpenTicket->categories = array(2); + $userWithOneOpenTicket->permissions = $this->getPermissionsForUser(); + $usersToReturn = array( + $userWithNoOpenTickets, + $userWithOneOpenTicket + ); + + $this->userGateway->method('getUsersByNumberOfOpenTickets') + ->with($this->heskSettings) + ->willReturn($usersToReturn); + + //-- Act + $actual = $this->autoassigner->getNextUserForTicket(2, $this->heskSettings); + + //-- Assert + self::assertThat($actual, self::equalTo($userWithOneOpenTicket)); + } + + function testItReturnsAdminUsers() { + //-- Arrange + $userWithNoOpenTickets = new UserContext(); + $userWithNoOpenTickets->id = 1; + $userWithNoOpenTickets->categories = array(1); + $userWithNoOpenTickets->permissions = $this->getPermissionsForUser(); + $userWithNoOpenTickets->admin = true; + $userWithOneOpenTicket = new UserContext(); + $userWithOneOpenTicket->id = 2; + $userWithOneOpenTicket->categories = array(2); + $userWithOneOpenTicket->permissions = $this->getPermissionsForUser(); + $usersToReturn = array( + $userWithNoOpenTickets, + $userWithOneOpenTicket + ); + + $this->userGateway->method('getUsersByNumberOfOpenTickets') + ->with($this->heskSettings) + ->willReturn($usersToReturn); + + //-- Act + $actual = $this->autoassigner->getNextUserForTicket(2, $this->heskSettings); + + //-- Assert + self::assertThat($actual, self::equalTo($userWithNoOpenTickets)); + } + + function testItOnlyReturnsUsersWhoCanViewAndRespondToTickets() { + //-- Arrange + $userWithNoOpenTickets = new UserContext(); + $userWithNoOpenTickets->id = 1; + $userWithNoOpenTickets->categories = array(1); + $userWithNoOpenTickets->permissions = array(); + $userWithOneOpenTicket = new UserContext(); + $userWithOneOpenTicket->id = 2; + $userWithOneOpenTicket->categories = array(1); + $userWithOneOpenTicket->permissions = $this->getPermissionsForUser(); + $usersToReturn = array( + $userWithNoOpenTickets, + $userWithOneOpenTicket + ); + + $this->userGateway->method('getUsersByNumberOfOpenTickets') + ->with($this->heskSettings) + ->willReturn($usersToReturn); + + //-- Act + $actual = $this->autoassigner->getNextUserForTicket(1, $this->heskSettings); + + //-- Assert + self::assertThat($actual, self::equalTo($userWithOneOpenTicket)); + } + + function testItReturnsNullWhenNoOneCanHandleTheTicket() { + //-- Arrange + $userWithNoOpenTickets = new UserContext(); + $userWithNoOpenTickets->id = 1; + $userWithNoOpenTickets->categories = array(1); + $userWithNoOpenTickets->permissions = $this->getPermissionsForUser(); + $userWithOneOpenTicket = new UserContext(); + $userWithOneOpenTicket->id = 2; + $userWithOneOpenTicket->categories = array(1); + $userWithOneOpenTicket->permissions = $this->getPermissionsForUser(); + $usersToReturn = array( + $userWithNoOpenTickets, + $userWithOneOpenTicket + ); + + $this->userGateway->method('getUsersByNumberOfOpenTickets') + ->with($this->heskSettings) + ->willReturn($usersToReturn); + + //-- Act + $actual = $this->autoassigner->getNextUserForTicket(2, $this->heskSettings); + + //-- Assert + self::assertThat($actual, self::isNull()); + } }