<?php
namespace predictionio\tests\Unit;

use GuzzleHttp\Client;
use GuzzleHttp\Handler\MockHandler;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Middleware;
use GuzzleHttp\Psr7\Request;
use GuzzleHttp\Psr7\Response;
use predictionio\EventClient;

class EventClientTest extends \PHPUnit_Framework_TestCase {
  /** @var  EventClient $eventClient */
  protected $eventClient;
  protected $container = [];

  protected function setUp() {
    $history=Middleware::History($this->container);
    $mock=new MockHandler([new Response(200)]);
    $handler=HandlerStack::create($mock);
    $handler->push($history);
    $this->eventClient=new EventClient(
        "j4jIdbq59JsF2f4CXwwkIiVHNFnyNvWXqMqXxcIbQDqFRz5K0fe9e3QfqjKwvW3O");
    $existingOptions = $this->eventClient->client->getConfig();
    $existingOptions['handler'] = $handler;
    $mockClient=new Client($existingOptions);
    $this->eventClient->client = $mockClient;
  }

  public function testSetUser() {
    $this->eventClient->setUser(1,array('age'=>20));
    $result=array_shift($this->container);
    /** @var Request $request */
    $request=$result['request'];
    $body=json_decode($request->getBody(), true);

    $this->assertEquals('$set',$body['event']);
    $this->assertEquals('user',$body['entityType']);
    $this->assertEquals(1,$body['entityId']);
    $this->assertEquals(20,$body['properties']['age']);
    $this->assertNotNull($body['eventTime']);
    $this->assertEquals('POST',$request->getMethod());
    $this->assertEquals('http://localhost:7070/events.json?accessKey=j4jIdbq59JsF2f4CXwwkIiVHNFnyNvWXqMqXxcIbQDqFRz5K0fe9e3QfqjKwvW3O',$request->getUri());
  }

  public function testSetUserWithEventTime() {
    $eventTime='1982-09-25T01:23:45+0800';

    $this->eventClient->setUser(1,array('age'=>20), $eventTime);
    $result=array_shift($this->container);
    /** @var Request $request */
    $request=$result['request'];
    $body=json_decode($request->getBody(), true);

    $this->assertEquals('$set',$body['event']);
    $this->assertEquals($eventTime, $body['eventTime']);
  }

  public function testUnsetUser() {
    $this->eventClient->unsetUser(1,array('age'=>20));
    $result=array_shift($this->container);
    /** @var Request $request */
    $request=$result['request'];
    $body=json_decode($request->getBody(), true);

    $this->assertEquals('$unset',$body['event']);
    $this->assertEquals('user',$body['entityType']);
    $this->assertEquals(1,$body['entityId']);
    $this->assertEquals(20,$body['properties']['age']);
    $this->assertNotNull($body['eventTime']);
    $this->assertEquals('POST',$request->getMethod());
    $this->assertEquals('http://localhost:7070/events.json?accessKey=j4jIdbq59JsF2f4CXwwkIiVHNFnyNvWXqMqXxcIbQDqFRz5K0fe9e3QfqjKwvW3O',$request->getUri());
  }

  public function testUnsetUserWithEventTime() {
    $eventTime='1982-09-25T01:23:45+0800';

    $this->eventClient->unsetUser(1,array('age'=>20), $eventTime);
    $result=array_shift($this->container);
    /** @var Request $request */
    $request=$result['request'];
    $body=json_decode($request->getBody(), true);

    $this->assertEquals('$unset',$body['event']);
    $this->assertEquals($eventTime, $body['eventTime']);
  }

  /**
   * @expectedException \predictionio\PredictionIOAPIError
   */
  public function testUnsetUserWithoutProperties() {
    $this->eventClient->unsetUser(1, array());
  }
  
  public function testDeleteUser() {
    $this->eventClient->deleteUser(1);
    $result=array_shift($this->container);
    /** @var Request $request */
    $request=$result['request'];
    $body=json_decode($request->getBody(), true);

    $this->assertEquals('$delete',$body['event']);
    $this->assertEquals('user',$body['entityType']);
    $this->assertEquals(1,$body['entityId']);
    $this->assertNotNull($body['eventTime']);
    $this->assertEquals('POST',$request->getMethod());
    $this->assertEquals('http://localhost:7070/events.json?accessKey=j4jIdbq59JsF2f4CXwwkIiVHNFnyNvWXqMqXxcIbQDqFRz5K0fe9e3QfqjKwvW3O',$request->getUri());
  }

  public function testDeleteUserWithEventTime() {
    $eventTime='1982-09-25T01:23:45+0800';

    $this->eventClient->deleteUser(1, $eventTime);
    $result=array_shift($this->container);
    /** @var Request $request */
    $request=$result['request'];
    $body=json_decode($request->getBody(), true);

    $this->assertEquals('$delete',$body['event']);
    $this->assertEquals($eventTime, $body['eventTime']);
  }

  public function testSetItem() {
    $this->eventClient->setItem(1,array('type'=>'book'));
    $result=array_shift($this->container);
    /** @var Request $request */
    $request=$result['request'];
    $body=json_decode($request->getBody(), true);

    $this->assertEquals('$set',$body['event']);
    $this->assertEquals('item',$body['entityType']);
    $this->assertEquals(1,$body['entityId']);
    $this->assertEquals('book',$body['properties']['type']);
    $this->assertNotNull($body['eventTime']);
    $this->assertEquals('POST',$request->getMethod());
    $this->assertEquals('http://localhost:7070/events.json?accessKey=j4jIdbq59JsF2f4CXwwkIiVHNFnyNvWXqMqXxcIbQDqFRz5K0fe9e3QfqjKwvW3O',$request->getUri());
  }

  public function testSetItemWithEventTime() {
    $eventTime='1982-09-25T01:23:45+0800';

    $this->eventClient->setItem(1,array('type'=>'book'), $eventTime);
    $result=array_shift($this->container);
    /** @var Request $request */
    $request=$result['request'];
    $body=json_decode($request->getBody(), true);

    $this->assertEquals('$set',$body['event']);
    $this->assertEquals($eventTime, $body['eventTime']);
  }

  public function testUnsetItem() {
    $this->eventClient->unsetItem(1,array('type'=>'book'));
    $result=array_shift($this->container);
    /** @var Request $request */
    $request=$result['request'];
    $body=json_decode($request->getBody(), true);

    $this->assertEquals('$unset',$body['event']);
    $this->assertEquals('item',$body['entityType']);
    $this->assertEquals(1,$body['entityId']);
    $this->assertEquals('book',$body['properties']['type']);
    $this->assertNotNull($body['eventTime']);
    $this->assertEquals('POST',$request->getMethod());
    $this->assertEquals('http://localhost:7070/events.json?accessKey=j4jIdbq59JsF2f4CXwwkIiVHNFnyNvWXqMqXxcIbQDqFRz5K0fe9e3QfqjKwvW3O',$request->getUri());
  }

  public function testUnsetItemWithEventTime() {
    $eventTime='1982-09-25T01:23:45+0800';

    $this->eventClient->unsetItem(1,array('type'=>'book'), $eventTime);
    $result=array_shift($this->container);
    /** @var Request $request */
    $request=$result['request'];
    $body=json_decode($request->getBody(), true);

    $this->assertEquals('$unset',$body['event']);
    $this->assertEquals($eventTime, $body['eventTime']);
  }

  /**
   * @expectedException \predictionio\PredictionIOAPIError
   */
  public function testUnsetItemWithoutProperties() {
    $this->eventClient->unsetItem(1, array());
  }

  public function testDeleteItem() {
    $this->eventClient->deleteItem(1);
    $result=array_shift($this->container);
    /** @var Request $request */
    $request=$result['request'];
    $body=json_decode($request->getBody(), true);

    $this->assertEquals('$delete',$body['event']);
    $this->assertEquals('item',$body['entityType']);
    $this->assertEquals(1,$body['entityId']);
    $this->assertNotNull($body['eventTime']);
    $this->assertEquals('POST',$request->getMethod());
    $this->assertEquals('http://localhost:7070/events.json?accessKey=j4jIdbq59JsF2f4CXwwkIiVHNFnyNvWXqMqXxcIbQDqFRz5K0fe9e3QfqjKwvW3O',$request->getUri());
  }

  public function testDeleteItemWithEventTime() {
    $eventTime='1982-09-25T01:23:45+0800';

    $this->eventClient->deleteItem(1, $eventTime);
    $result=array_shift($this->container);
    /** @var Request $request */
    $request=$result['request'];
    $body=json_decode($request->getBody(), true);

    $this->assertEquals('$delete',$body['event']);
    $this->assertEquals($eventTime, $body['eventTime']);
  }

  public function testRecordAction() {
    $this->eventClient->recordUserActionOnItem('view',1,888, array('count'=>2));
    $result=array_shift($this->container);
    /** @var Request $request */
    $request=$result['request'];
    $body=json_decode($request->getBody(), true);

    $this->assertEquals('view',$body['event']);
    $this->assertEquals('user',$body['entityType']);
    $this->assertEquals(1,$body['entityId']);
    $this->assertEquals('item',$body['targetEntityType']);
    $this->assertEquals(888,$body['targetEntityId']);
    $this->assertEquals(2,$body['properties']['count']);
    $this->assertNotNull($body['eventTime']);
    $this->assertEquals('POST',$request->getMethod());
    $this->assertEquals('http://localhost:7070/events.json?accessKey=j4jIdbq59JsF2f4CXwwkIiVHNFnyNvWXqMqXxcIbQDqFRz5K0fe9e3QfqjKwvW3O',$request->getUri());
  }

  public function testRecordActionWithEventTime() {
    $eventTime='1982-09-25T01:23:45+0800';

    $this->eventClient->recordUserActionOnItem('view',1, 8, array(),$eventTime);
    $result=array_shift($this->container);
    /** @var Request $request */
    $request=$result['request'];
    $body=json_decode($request->getBody(), true);

    $this->assertEquals('view',$body['event']);
    $this->assertEquals($eventTime, $body['eventTime']);
  }

  public function testCreateEvent() {
    $this->eventClient->createEvent(array(
                        'event' => 'my_event',
                        'entityType' => 'user',
                        'entityId' => 'uid',
                        'properties' => array('prop1'=>1,
                                              'prop2'=>'value2',
                                              'prop3'=>array(1,2,3),
                                              'prop4'=>true,
                                              'prop5'=>array('a','b','c'),
                                              'prop6'=>4.56
                                        ),
                        'eventTime' => '2004-12-13T21:39:45.618-07:00'
                       ));
    $result=array_shift($this->container);
    /** @var Request $request */
    $request=$result['request'];
    $body=json_decode($request->getBody(), true);

    $this->assertEquals('my_event',$body['event']);
    $this->assertEquals('user',$body['entityType']);
    $this->assertEquals('uid',$body['entityId']);
    $this->assertEquals(1,$body['properties']['prop1']);
    $this->assertEquals('value2',$body['properties']['prop2']);
    $this->assertEquals(array(1,2,3),$body['properties']['prop3']);
    $this->assertEquals(true,$body['properties']['prop4']);
    $this->assertEquals(array('a','b','c'),$body['properties']['prop5']);
    $this->assertEquals(4.56,$body['properties']['prop6']);
    $this->assertEquals('2004-12-13T21:39:45.618-07:00',$body['eventTime']);
    $this->assertEquals('POST',$request->getMethod());
    $this->assertEquals('http://localhost:7070/events.json?accessKey=j4jIdbq59JsF2f4CXwwkIiVHNFnyNvWXqMqXxcIbQDqFRz5K0fe9e3QfqjKwvW3O',$request->getUri());
  }

  public function testGetEvent() {
    $this->eventClient->getEvent('event_id');
    $result=array_shift($this->container);
    /** @var Request $request */
    $request=$result['request'];
    $body=json_decode($request->getBody(), true);

    $this->assertEquals('GET',$request->getMethod());
    $this->assertEquals('http://localhost:7070/events/event_id.json?accessKey=j4jIdbq59JsF2f4CXwwkIiVHNFnyNvWXqMqXxcIbQDqFRz5K0fe9e3QfqjKwvW3O',
                $request->getUri());
  }




}
?>

