/**
  * @dataProvider bulkSetterProvider
  */
 public function testSetAll(array $data, $success = true)
 {
     $keys = array_keys($data);
     $getters = array();
     foreach ($keys as $key) {
         $getters[$key] = 'get' . implode('', array_map('ucfirst', explode('_', $key)));
     }
     $data = (object) $data;
     // cast to object
     if ($success !== true) {
         //not successful, probably expecting exceptions to be thrown:
         try {
             $constructor = new Ticket($data);
         } catch (\Exception $e) {
             $this->assertEquals($success, get_class($e));
         }
         $ticket = new Ticket();
         try {
             $ticket->setAll($data);
         } catch (\Exception $e) {
             $this->assertEquals($success, get_class($e));
         }
         $this->setExpectedException($success);
         $ticket->setAll($data);
         return;
     }
     $constructor = new Ticket($data);
     $ticket = new Ticket($data);
     $this->assertEquals($constructor->toJsonData(), $ticket->toJsonData(), sprintf('expected %s and %s to match, but it would seem they do not', $ticket->toJsonData(), $constructor->toJsonData()));
     foreach ($data as $key => $value) {
         $getter = $getters[$key];
         $this->assertEquals($value, $ticket->{$getter}(), sprintf('TICKET: Expected %s (via %s->%s) to be "%s", instead say "%s"', $key, get_class($ticket), $getter, $value, $ticket->{$getter}()));
         $this->assertEquals($value, $constructor->{$getter}(), sprintf('CONSTRUCTOR: Expected %s (via %s->%s) to be "%s", instead say "%s"', $key, get_class($constructor), $getter, $value, $constructor->{$getter}()));
     }
 }
 /**
  * Test ticket by id method => uses tickets.json data
  */
 public function testSingleTicket()
 {
     $ticket = new TicketM($this->data->singleTicket);
     $target = new TicketM(array('displayId' => $ticket->getDisplayId()));
     $this->restMock->method('restCall')->willReturn(json_encode($this->data->singleTicket));
     $this->restMock->getTicketById($target->getDisplayId(), $target);
     $this->assertTrue(count($ticket->getNotes()) === count($target->getNotes()));
     $this->assertEquals($ticket, $target);
     $this->assertTrue($ticket->getDescription() === $target->getDescription());
     $this->assertTrue($ticket->getSubject() === $target->getSubject());
     $this->assertTrue($ticket->getStatus() === $target->getStatus());
     $this->assertTrue($ticket->getStatusName() === $target->getStatusName());
     $this->assertTrue($ticket->getId() === $target->getId());
     $this->assertTrue($ticket->getDeleted() === $target->getDeleted());
     $this->assertEquals($ticket->toJsonData(), $target->toJsonData());
     if ($ticket->getNotes()) {
         $this->assertNotEmpty($target->getNotes());
         $expected = $ticket->getNotes();
         $notes = $target->getNotes();
         /** @var Freshdesk\Model\Note $note */
         foreach ($notes as $k => $note) {
             $this->assertInstanceOf(get_class($expected[$k]), $note);
             $this->assertTrue($expected[$k]->getDeleted() === $note->getDeleted());
             $this->assertEquals($expected[$k]->toJsonData(), $note->toJsonData());
         }
     }
 }
 /**
  * Assign given ticket to responder by id
  * @param TicketM $ticket
  * @param int $responder
  * @return TicketM
  * @throws \InvalidArgumentException
  */
 public function assignTicket(TicketM $ticket, $responder)
 {
     if (!is_numeric($responder) || $responder < 1) {
         throw new \InvalidArgumentException(sprintf('Failed to assign ticket #%d to "%s", responder must be a positive numeric value', $ticket->getDisplayId(), $responder));
     }
     $url = sprintf('/helpdesk/tickets/%d/assign.json?responder_id=%d', $ticket->getDisplayId(), (int) $responder);
     $response = json_decode($this->restCall($url, self::METHOD_PUT));
     if (is_array($response)) {
         //again, the docs on freshdesk.com/api are unclear. This call seems to be returning an array
         $response = $response[0];
     }
     return $ticket->setAll($response);
 }