Skip to content

Commit

Permalink
fixing circular dependency & add ability to pass request options to c…
Browse files Browse the repository at this point in the history
…onnecting clients
  • Loading branch information
frets1700 committed Jul 9, 2020
1 parent 7079403 commit 83466dd
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 29 deletions.
15 changes: 6 additions & 9 deletions src/Calendar.php
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ public function __construct(string $token, array $args = [])
{
$this->token = $token;
$this->logger = $args['logger'] ?? null;
$this->setRequestHandler($args['request']);
$this->setRequestHandler($args['request'], $args['connectionClientOptions'] ?? []);
$this->reader = $args['reader'] ?? null;
}

Expand All @@ -53,11 +53,8 @@ public function sync(array $params = []) : void

public function push(array $params = []) : void
{
if ($this->batch) {
$this->batch($params);
} else {
$this->push($params);
}
// TODO: add individual sync later
$this->batch($params);
}

protected function batch(array $params = []) : void
Expand Down Expand Up @@ -126,14 +123,14 @@ protected function getEntity(array $event) : ReaderEntityInterface
return $this->getReader()->hydrate($event);
}

private function setRequestHandler(?Request $requestHandler): void
private function setRequestHandler(?Request $requestHandler, array $connectionClientOptions = []): void
{
if ($requestHandler === null) {
$requestHandler = new Request($this->token, [
'requestOptions' => function(string $url, RequestType $methodType, array $args = []) {
'requestOptions' => function (string $url, RequestType $methodType, array $args = []) {
return new RequestOptions($url, $methodType, $args);
},
'connection' => new Connection($this->logger)
'connection' => new Connection($this->logger, $connectionClientOptions)
]);
}

Expand Down
35 changes: 23 additions & 12 deletions src/Http/Connection.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,10 @@
use GuzzleHttp\Handler\CurlMultiHandler;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Middleware;
use function GuzzleHttp\Promise\settle;
use GuzzleHttp\Psr7\Request;
use GuzzleHttp\Psr7\Response;
use GuzzleHttp\RequestOptions as GuzzleRequestOptions;
use Psr\Http\Message\ResponseInterface;
use Psr\Log\LoggerInterface;
use Symplicity\Outlook\Exception\ConnectionException;
Expand All @@ -27,13 +29,16 @@ class Connection implements ConnectionInterface
public const MAX_RETRIES = 3;

private $logger;
private $clientOptions;

protected $responses;

protected static $eventInfo = [];

public function __construct(?LoggerInterface $logger)
public function __construct(?LoggerInterface $logger, array $clientOptions = [])
{
$this->logger = $logger;
$this->clientOptions = $clientOptions;
}

public function get(string $url, RequestOptionsInterface $requestOptions, array $args = []) : ResponseInterface
Expand Down Expand Up @@ -95,7 +100,7 @@ public function batch(RequestOptionsInterface $requestOptions)
);
}

$responses = \GuzzleHttp\Promise\settle($promises)->wait();
$responses = settle($promises)->wait();
$this->setResponses($responses);
return $this->responses;
}
Expand Down Expand Up @@ -128,7 +133,7 @@ public function batchDelete(RequestOptionsInterface $requestOptions)
);
}

$responses = \GuzzleHttp\Promise\settle($promises)->wait();
$responses = settle($promises)->wait();
$this->setResponses($responses);
return $this->responses;
}
Expand All @@ -146,11 +151,8 @@ public function setResponses(array $responses)
public function createClientWithRetryHandler() : ClientInterface
{
$stack = $this->getRetryHandler();
$client = new Client([
'handler' => $stack
]);

return $client;
$options = $this->getClientOptions() + ['handler' => $stack];
return new Client($options);
}

protected function getRetryHandler() : HandlerStack
Expand All @@ -162,14 +164,23 @@ protected function getRetryHandler() : HandlerStack

public function createClient() : ClientInterface
{
$client = new Client();
return $client;
return new Client($this->getClientOptions());
}

protected function getClientOptions(): array
{
return [
GuzzleRequestOptions::CONNECT_TIMEOUT => $this->clientOptions['connect_timeout'] ?? 4,
GuzzleRequestOptions::TIMEOUT => $this->clientOptions['timeout'] ?? 4,
GuzzleRequestOptions::VERIFY => $this->clientOptions['verify'] ?? true,
GuzzleRequestOptions::HTTP_ERRORS => $this->clientOptions['http_errors'] ?? true
];
}

public function createRetryHandler() : callable
{
$logger = $this->logger;
return function(
return function (
$retries,
Request $request,
Response $response = null,
Expand Down Expand Up @@ -211,7 +222,7 @@ public function createRetryHandler() : callable

public function retryDelay() : callable
{
return function($numberOfRetries) {
return function ($numberOfRetries) {
return 1000 * $numberOfRetries;
};
}
Expand Down
21 changes: 13 additions & 8 deletions tests/CalendarTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

declare(strict_types=1);


namespace Symplicity\Outlook\Tests;

use GuzzleHttp\Client;
Expand All @@ -12,15 +11,13 @@
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Promise\PromiseInterface;
use GuzzleHttp\Psr7\Response;
use PHPUnit\Framework\TestCase;
use Symplicity\Outlook\Interfaces\Entity\ReaderEntityInterface;
use function GuzzleHttp\Psr7\stream_for;
use Monolog\Handler\NullHandler;
use Monolog\Logger;
use PHPUnit\Framework\TestCase;
use Symplicity\Outlook\Calendar;
use Symplicity\Outlook\Entities\Occurrence;
use Symplicity\Outlook\Entities\Delete;
use Symplicity\Outlook\Entities\ODateTime;
use Symplicity\Outlook\Entities\Reader;
use Symplicity\Outlook\Entities\ResponseBody;
use Symplicity\Outlook\Entities\Writer;
use Symplicity\Outlook\Http\Connection;
Expand Down Expand Up @@ -60,6 +57,7 @@ public function setUp() : void
public function testSync()
{
$mock = new MockHandler([
new Response(200),
new Response(200),
new RequestException('Error Communicating with Server', new \GuzzleHttp\Psr7\Request('GET', 'test'), new Response(500, ['X-Foo' => 'Bar'])),
new Response(200, [], stream_for($this->getStream())),
Expand All @@ -70,7 +68,7 @@ public function testSync()
$client = new Client(['handler' => $handler]);

$this->connection->expects($this->exactly(2))->method('createClientWithRetryHandler')->willReturn($client);
$this->connection->expects($this->once())->method('createClient')->willReturn($client);
$this->connection->expects($this->exactly(2))->method('createClient')->willReturn($client);

$this->stub->isBatchRequest();
$this->stub->expects($this->once())->method('getLocalEvents')->willReturn([
Expand All @@ -82,18 +80,21 @@ public function testSync()
->setBody(new ResponseBody(['ContentType' => 'HTML', 'Content' => 'foo']))
->setStartDate(new ODateTime(new \DateTime('2019-02-04 16:40:36'), 'Eastern Standard Time'))
->setEndDate(new ODateTime(new \DateTime('2019-02-04 16:50:36'), 'Eastern Standard Time')),
(new Delete('x9AAAAAAENAACCFz_gODC8RYDOifTpl-x9AAAGNCqaAAA=', 'fooBar')),
(new Writer())
->setId('foo')
->setSubject('test')
->method(new RequestType(RequestType::Get))
->setInternalEventType('1')
->setBody(new ResponseBody(['ContentType' => 'HTML', 'Content' => 'foo']))
->setStartDate(new ODateTime(new \DateTime('2019-02-04 16:40:36'), 'Eastern Standard Time'))
->setEndDate(new ODateTime(new \DateTime('2019-02-04 16:50:36'), 'Eastern Standard Time'))
->setEndDate(new ODateTime(new \DateTime('2019-02-04 16:50:36'), 'Eastern Standard Time')),
(new \stdClass())
]);

$this->stub->expects($this->exactly(1))->method('handlePoolResponses')->with($this->equalTo($this->fulFilledResponse()));
$this->stub->expects($this->exactly(8))->method('saveEventLocal');
$this->stub->expects($this->exactly(2))->method('deleteEventLocal');

$this->stub->sync([
'endPoint' => 'me/calendarview',
Expand All @@ -114,12 +115,16 @@ public function fulFilledResponse()
'foo' => [
'response' => new BatchResponse(['state' => PromiseInterface::REJECTED, 'reason' => new ServerException('Error Communicating with Server', new \GuzzleHttp\Psr7\Request('POST', 'test'), new Response(500, ['X-Foo' => 'Bar']))]),
'item' => \GuzzleHttp\json_decode('{"Subject":"test","Body":{"ContentType":"HTML","Content":"foo"},"Start":{"DateTime":"2019-02-04T16:40:36","TimeZone":"Eastern Standard Time"},"End":{"DateTime":"2019-02-04T16:50:36","TimeZone":"Eastern Standard Time"},"Location":{"DisplayName":null},"Recurrence":null,"eventType":"1","Sensitivity":"Personal","IsAllDay": false}', true)
],
'fooBar' => [
'response' => new BatchResponse(['state' => PromiseInterface::FULFILLED, 'value' => new Response(200, [])]),
'item' => \GuzzleHttp\json_decode('{"guid":"x9AAAAAAENAACCFz_gODC8RYDOifTpl-x9AAAGNCqaAAA=","eventType":null,"delete":true}', true)
]
];
}

public function getStream() : string
{
return '{"@odata.context":"https:\/\/outlook.office.com\/api\/v2.0\/$metadata#Me\/CalendarView","value":[{"@odata.id":"https:\/\/outlook.office.com\/api\/v2.0\/Users(\'foo\')\/Events(\'x9AAAAAAENAACCFz_gODC8RYDOifTpl-x9AAAGNCqaAAA=\')","@odata.etag":"W\/\"ghc\/foo\/\/pA==\"","Id":"AAMkAGM3YjRjZThiLWE4NjQtNDQ5Yi04ZWIyLTViMDUwZTdkYjE1MABGAAAAAABBP8UbNVDQTYPvokpe3hOiBwCCFz_gODC8RYDOifTpl-x9AAAAAAENAACCFz_gODC8RYDOifTpl-x9AAAGNCqaAAA=","CreatedDateTime":"2019-02-01T18:05:03.7354577-05:00","LastModifiedDateTime":"2019-02-04T23:58:49.478552-05:00","ChangeKey":"foo\/\/pA==","Categories":[],"OriginalStartTimeZone":"Eastern Standard Time","OriginalEndTimeZone":"Eastern Standard Time","iCalUId":"foo","ReminderMinutesBeforeStart":15,"IsReminderOn":true,"HasAttachments":false,"Subject":"FooBar","BodyPreview":"CCCCCCC","Importance":"Normal","Sensitivity":"Normal","IsAllDay":true,"IsCancelled":false,"IsOrganizer":false,"ResponseRequested":true,"SeriesMasterId":null,"ShowAs":"Free","Type":"SeriesMaster","WebLink":"https:\/\/outlook.office365.com\/owa\/?itemid=foo%3D&exvsurl=1&path=\/calendar\/item","OnlineMeetingUrl":null,"ResponseStatus":{"Response":"Accepted","Time":"2019-02-01T18:05:25.680242-05:00"},"Body":{"ContentType":"HTML","Content":"test"},"Start":{"DateTime":"2019-02-25T00:00:00.0000000","TimeZone":"Eastern Standard Time"},"End":{"DateTime":"2019-02-26T00:00:00.0000000","TimeZone":"Eastern Standard Time"},"Location":{"DisplayName":"Bar","LocationUri":"","LocationType":"Default","UniqueId":"3f105ea4-0f49-494d-8d8a-a25a5618eb06","UniqueIdType":"LocationStore","Address":{"Type":"Unknown","Street":"","City":"Bar","State":"fooRegion","CountryOrRegion":"India","PostalCode":""},"Coordinates":{"Latitude":27.6031,"Longitude":88.6468}},"Locations":[{"DisplayName":"Bar","LocationUri":"","LocationType":"Default","UniqueId":"3f105ea4-0f49-494d-8d8a-a25a5618eb06","UniqueIdType":"LocationStore","Address":{"Type":"Unknown","Street":"","City":"Bar","State":"fooRegion","CountryOrRegion":"US","PostalCode":""},"Coordinates":{"Latitude":32.6031,"Longitude":999.6468}}],"Recurrence":{"Pattern":{"Type":"Daily","Interval":1,"Month":0,"DayOfMonth":0,"FirstDayOfWeek":"Sunday","Index":"First"},"Range":{"Type":"EndDate","StartDate":"2019-02-25","EndDate":"2019-02-28","RecurrenceTimeZone":"Eastern Standard Time","NumberOfOccurrences":0}},"Attendees":[{"Type":"Required","Status":{"Response":"None","Time":"0001-01-01T00:00:00Z"},"EmailAddress":{"Name":"Outlook Test","Address":"[email protected]"}},{"Type":"Required","Status":{"Response":"Accepted","Time":"0001-01-01T00:00:00Z"},"EmailAddress":{"Name":"Insight Test","Address":"test"}}],"Organizer":{"EmailAddress":{"Name":"Outlook Test","Address":"[email protected]"}}},{"@odata.id":"https:\/\/outlook.office.com\/api\/v2.0\/Users(\'129f7fa4-61ce-4b9f\')\/Events(\'AAMkAGM3YjRjZThiLWE4NjQtNDQ5Yi04ZWIyLTViMDUwZTdkYjE1MAFRAAgI1==\')","@odata.etag":"W\/\"DwAAABYAAACCFz+gODC8RYDOifTpl\/x9AAAHn\/+k\"","Id":"AAMkAGM3YjRjZThiLWE4NjQtNDQ=","SeriesMasterId":"AAMkAGM3YjRjZThiLWE4NjQtNDQ5Yi04ZWIyLTViMDUwZTdkYjE1MABGAAAAAABBP8UbNVDQTYPvokpe3hOiBwCCFz_gODC8RYDOifTpl-x9AAAAAAENAACCFz_gODC8RYDOifTpl-x9AAAGNCqaAAA=","Type":"Occurrence","Start":{"DateTime":"2019-02-25T00:00:00.0000000","TimeZone":"Eastern Standard Time"},"End":{"DateTime":"2019-02-26T00:00:00.0000000","TimeZone":"Eastern Standard Time"}},{"@odata.id":"https:\/\/outlook.office.com\/api\/v2.0\/Users(\'129f7fa4-61ce-4b9f-\')\/Events(\'AAMkAGM3YjRjZThiLWE4NjQtNDQ5Yi04ZWIyLTViMDUwZTdkYjE1MAFRAAgI1pxGhEEAAEYAAAAAQT-FGzVQ0E2D76JKXt4TogcAghc-oDgwvEWAzon06Zf8fQAAAAABDQAAghc-\')","@odata.etag":"W\/\"DwAAABYAAACCFz+gODC8RYDOifTpl\/x9AAAHn\/+k\"","Id":"AAMkAGM3YjRjZThiLWE4NjQtNDQ5Yi04ZWIyLT=","SeriesMasterId":"AAMkAGM3YjRjZThiLWE4NjQtNDQ5Yi04ZWIyLTViMDUwZTdkYjE1MABGAAAAA=","Type":"Occurrence","Start":{"DateTime":"2019-02-27T00:00:00.0000000","TimeZone":"Eastern Standard Time"},"End":{"DateTime":"2019-02-28T00:00:00.0000000","TimeZone":"Eastern Standard Time"}},{"@odata.id":"https:\/\/outlook.office.com\/api\/v2.0\/Users(\'129f7fa4-61ce-4b9\')\/Events(\'AAMkAGM3YjRjZThiLWE4NjQtNDQ5Yi04ZWIyLTViMDUwZTdkYjE==\')","@odata.etag":"W\/\"DwAAABYAAACCFz+gODC8RYDOifTpl\/x9AAAHn\/+k\"","Id":"AAMkAGM3YjRjZThiLWE4NjQtNDQ5Yi04ZWIyLTViMDUwZTdkYjE1MAFRAAgI1p0PrqrAEA==","SeriesMasterId":"AAMkAGM3YjRjZThiLWE4NjQtNDQ5Yi04ZWIAAA=","Type":"Occurrence","Start":{"DateTime":"2019-02-28T00:00:00.0000000","TimeZone":"Eastern Standard Time"},"End":{"DateTime":"2019-03-01T00:00:00.0000000","TimeZone":"Eastern Standard Time"}}],"@odata.deltaLink":"https:\/\/outlook.office.com\/api\/v2.0\/me\/calendarview?startDateTime=2019-02-24T00%3a00%3a00&endDateTime=2019-03-10T00%3a00%3a00&%24deltatoken=FgM6J9OmX_H0AAAehQ74BAAAA"}';
return '{"@odata.context":"https:\/\/outlook.office.com\/api\/v2.0\/$metadata#Me\/CalendarView","value":[{"@odata.id":"https:\/\/outlook.office.com\/api\/v2.0\/Users(\'foo\')\/Events(\'x9AAAAAAENAACCFz_gODC8RYDOifTpl-x9AAAGNCqaAAA=\')","@odata.etag":"W\/\"ghc\/foo\/\/pA==\"","Id":"AAMkAGM3YjRjZThiLWE4NjQtNDQ5Yi04ZWIyLTViMDUwZTdkYjE1MABGAAAAAABBP8UbNVDQTYPvokpe3hOiBwCCFz_gODC8RYDOifTpl-x9AAAAAAENAACCFz_gODC8RYDOifTpl-x9AAAGNCqaAAA=","CreatedDateTime":"2019-02-01T18:05:03.7354577-05:00","LastModifiedDateTime":"2019-02-04T23:58:49.478552-05:00","ChangeKey":"foo\/\/pA==","Categories":[],"OriginalStartTimeZone":"Eastern Standard Time","OriginalEndTimeZone":"Eastern Standard Time","iCalUId":"foo","ReminderMinutesBeforeStart":15,"IsReminderOn":true,"HasAttachments":false,"Subject":"FooBar","BodyPreview":"CCCCCCC","Importance":"Normal","Sensitivity":"Normal","IsAllDay":true,"IsCancelled":false,"IsOrganizer":false,"ResponseRequested":true,"SeriesMasterId":null,"ShowAs":"Free","Type":"SeriesMaster","WebLink":"https:\/\/outlook.office365.com\/owa\/?itemid=foo%3D&exvsurl=1&path=\/calendar\/item","OnlineMeetingUrl":null,"ResponseStatus":{"Response":"Accepted","Time":"2019-02-01T18:05:25.680242-05:00"},"Body":{"ContentType":"HTML","Content":"test"},"Start":{"DateTime":"2019-02-25T00:00:00.0000000","TimeZone":"Eastern Standard Time"},"End":{"DateTime":"2019-02-26T00:00:00.0000000","TimeZone":"Eastern Standard Time"},"Location":{"DisplayName":"Bar","LocationUri":"","LocationType":"Default","UniqueId":"3f105ea4-0f49-494d-8d8a-a25a5618eb06","UniqueIdType":"LocationStore","Address":{"Type":"Unknown","Street":"","City":"Bar","State":"fooRegion","CountryOrRegion":"India","PostalCode":""},"Coordinates":{"Latitude":27.6031,"Longitude":88.6468}},"Locations":[{"DisplayName":"Bar","LocationUri":"","LocationType":"Default","UniqueId":"3f105ea4-0f49-494d-8d8a-a25a5618eb06","UniqueIdType":"LocationStore","Address":{"Type":"Unknown","Street":"","City":"Bar","State":"fooRegion","CountryOrRegion":"US","PostalCode":""},"Coordinates":{"Latitude":32.6031,"Longitude":999.6468}}],"Recurrence":{"Pattern":{"Type":"Daily","Interval":1,"Month":0,"DayOfMonth":0,"FirstDayOfWeek":"Sunday","Index":"First"},"Range":{"Type":"EndDate","StartDate":"2019-02-25","EndDate":"2019-02-28","RecurrenceTimeZone":"Eastern Standard Time","NumberOfOccurrences":0}},"Attendees":[{"Type":"Required","Status":{"Response":"None","Time":"0001-01-01T00:00:00Z"},"EmailAddress":{"Name":"Outlook Test","Address":"[email protected]"}},{"Type":"Required","Status":{"Response":"Accepted","Time":"0001-01-01T00:00:00Z"},"EmailAddress":{"Name":"Insight Test","Address":"test"}}],"Organizer":{"EmailAddress":{"Name":"Outlook Test","Address":"[email protected]"}}},{"@odata.id":"https:\/\/outlook.office.com\/api\/v2.0\/Users(\'129f7fa4-61ce-4b9f\')\/Events(\'AAMkAGM3YjRjZThiLWE4NjQtNDQ5Yi04ZWIyLTViMDUwZTdkYjE1MAFRAAgI1==\')","@odata.etag":"W\/\"DwAAABYAAACCFz+gODC8RYDOifTpl\/x9AAAHn\/+k\"","Id":"AAMkAGM3YjRjZThiLWE4NjQtNDQ=","SeriesMasterId":"AAMkAGM3YjRjZThiLWE4NjQtNDQ5Yi04ZWIyLTViMDUwZTdkYjE1MABGAAAAAABBP8UbNVDQTYPvokpe3hOiBwCCFz_gODC8RYDOifTpl-x9AAAAAAENAACCFz_gODC8RYDOifTpl-x9AAAGNCqaAAA=","Type":"Occurrence","Start":{"DateTime":"2019-02-25T00:00:00.0000000","TimeZone":"Eastern Standard Time"},"End":{"DateTime":"2019-02-26T00:00:00.0000000","TimeZone":"Eastern Standard Time"}},{"@odata.id":"https:\/\/outlook.office.com\/api\/v2.0\/Users(\'129f7fa4-61ce-4b9f-\')\/Events(\'AAMkAGM3YjRjZThiLWE4NjQtNDQ5Yi04ZWIyLTViMDUwZTdkYjE1MAFRAAgI1pxGhEEAAEYAAAAAQT-FGzVQ0E2D76JKXt4TogcAghc-oDgwvEWAzon06Zf8fQAAAAABDQAAghc-\')","@odata.etag":"W\/\"DwAAABYAAACCFz+gODC8RYDOifTpl\/x9AAAHn\/+k\"","Id":"AAMkAGM3YjRjZThiLWE4NjQtNDQ5Yi04ZWIyLT=","SeriesMasterId":"AAMkAGM3YjRjZThiLWE4NjQtNDQ5Yi04ZWIyLTViMDUwZTdkYjE1MABGAAAAA=","Type":"Occurrence","Start":{"DateTime":"2019-02-27T00:00:00.0000000","TimeZone":"Eastern Standard Time"},"End":{"DateTime":"2019-02-28T00:00:00.0000000","TimeZone":"Eastern Standard Time"}},{"@odata.id":"https:\/\/outlook.office.com\/api\/v2.0\/Users(\'129f7fa4-61ce-4b9\')\/Events(\'AAMkAGM3YjRjZThiLWE4NjQtNDQ5Yi04ZWIyLTViMDUwZTdkYjE==\')","@odata.etag":"W\/\"DwAAABYAAACCFz+gODC8RYDOifTpl\/x9AAAHn\/+k\"","Id":"AAMkAGM3YjRjZThiLWE4NjQtNDQ5Yi04ZWIyLTViMDUwZTdkYjE1MAFRAAgI1p0PrqrAEA==","SeriesMasterId":"AAMkAGM3YjRjZThiLWE4NjQtNDQ5Yi04ZWIAAA=","Type":"Occurrence","Start":{"DateTime":"2019-02-28T00:00:00.0000000","TimeZone":"Eastern Standard Time"},"End":{"DateTime":"2019-03-01T00:00:00.0000000","TimeZone":"Eastern Standard Time"}}, {"@odata.context":"https:\/\/outlook.office.com\/api\/v2.0\/$metadata#Me\/CalendarView\/$deletedEntity","id":"CalendarView(\'bcccdef=\')","reason":"deleted"}],"@odata.deltaLink":"https:\/\/outlook.office.com\/api\/v2.0\/me\/calendarview?startDateTime=2019-02-24T00%3a00%3a00&endDateTime=2019-03-10T00%3a00%3a00&%24deltatoken=FgM6J9OmX_H0AAAehQ74BAAAA"}';
}
}

0 comments on commit 83466dd

Please sign in to comment.