From c12a7028d1829ba5345bc353c9cb78f6be99dc4d Mon Sep 17 00:00:00 2001 From: JonahL Date: Wed, 26 Jan 2022 16:27:40 -0500 Subject: [PATCH 1/7] PODB-411: Initial work on adding new methods. --- src/Interfaces/ILtiServiceConnector.php | 8 ++++++++ src/LtiAbstractService.php | 10 ++++++++++ src/LtiAssignmentsGradesService.php | 23 +++++++++++++++++++++++ src/LtiServiceConnector.php | 13 +++++++++++++ 4 files changed, 54 insertions(+) diff --git a/src/Interfaces/ILtiServiceConnector.php b/src/Interfaces/ILtiServiceConnector.php index 62124e96..93a7e0d9 100644 --- a/src/Interfaces/ILtiServiceConnector.php +++ b/src/Interfaces/ILtiServiceConnector.php @@ -3,6 +3,7 @@ namespace Packback\Lti1p3\Interfaces; use GuzzleHttp\Psr7\Response; +use Packback\Lti1p3\LtiLineitem; interface ILtiServiceConnector { @@ -26,5 +27,12 @@ public function getAll( string $key ): array; + public function get( + ILtiRegistration $registration, + array $scopes, + IServiceRequest $request, + string $key + ): LtiLineitem; + public function setDebuggingMode(bool $enable): void; } diff --git a/src/LtiAbstractService.php b/src/LtiAbstractService.php index 952544c8..41312a9f 100644 --- a/src/LtiAbstractService.php +++ b/src/LtiAbstractService.php @@ -54,4 +54,14 @@ protected function getAll(IServiceRequest $request, string $key = null): array $key ); } + + protected function get(IServiceRequest $request, string $key = null): LtiLineitem + { + return $this->serviceConnector->get( + $this->registration, + $this->getScope(), + $request, + $key + ); + } } diff --git a/src/LtiAssignmentsGradesService.php b/src/LtiAssignmentsGradesService.php index 347f5c6f..e29ae8d1 100644 --- a/src/LtiAssignmentsGradesService.php +++ b/src/LtiAssignmentsGradesService.php @@ -116,6 +116,29 @@ public function getLineItems(): array return $lineitems; } + public function getLineItem(string $id): LtiLineitem + { + if (!in_array(LtiConstants::AGS_SCOPE_LINEITEM, $this->getScope())) { + throw new LtiException('Missing required scope', 1); + } + + $request = new ServiceRequest(LtiServiceConnector::METHOD_GET, $this->getServiceData()['lineitem']); + $request->setAccept(static::CONTENTTYPE_LINEITEM); + + $lineItem = $this->get($request); + + return $lineItem; + } + +// public function deleteLineItem(LtiLineitem $item): LtiLineitem +// { +// if (!in_array(LtiConstants::AGS_SCOPE_LINEITEM, $this->getScope())) { +// throw new LtiException('Missing required scope', 1); +// } +// +// $request = new ServiceRequest(LtiServiceConnector::METHOD_DELETE, $this->getServiceData()['lineitem']); +// } + private function ensureLineItemExists(LtiLineitem $lineitem = null): LtiLineitem { // If no line item is passed in, attempt to use the one associated with diff --git a/src/LtiServiceConnector.php b/src/LtiServiceConnector.php index 691b581a..04db8301 100644 --- a/src/LtiServiceConnector.php +++ b/src/LtiServiceConnector.php @@ -2,6 +2,7 @@ namespace Packback\Lti1p3; +use Couchbase\BaseException; use Firebase\JWT\JWT; use GuzzleHttp\Client; use GuzzleHttp\Exception\ClientException; @@ -17,6 +18,7 @@ class LtiServiceConnector implements ILtiServiceConnector public const METHOD_GET = 'GET'; public const METHOD_POST = 'POST'; + public const METHOD_DELETE = 'DELETE'; private $cache; private $client; @@ -172,6 +174,17 @@ public function getAll( return $results; } + public function get(ILtiRegistration $registration, array $scopes, IServiceRequest $request, string $key = null): LtiLineitem + { + throw new \Exception('Not implemented'); +// if ($request->getMethod() !== static::METHOD_GET) { +// throw new \Exception('An invalid method was specified by an LTI service requesting all items.'); +// } +// +// $response = $this->makeServiceRequest($registration, $scopes, $request); +// $result = $response['body'] ?? []; + } + private function getAccessTokenCacheKey(ILtiRegistration $registration, array $scopes) { sort($scopes); From fff68f2e5f3974be2b8c0ef3e75c6631d412ea48 Mon Sep 17 00:00:00 2001 From: JonahL Date: Fri, 28 Jan 2022 13:07:40 -0500 Subject: [PATCH 2/7] PODB-411: Add getLineItem to library --- src/Interfaces/ILtiServiceConnector.php | 3 +-- src/LtiAbstractService.php | 5 ++--- src/LtiAssignmentsGradesService.php | 13 ++----------- src/LtiServiceConnector.php | 18 ++++++++---------- 4 files changed, 13 insertions(+), 26 deletions(-) diff --git a/src/Interfaces/ILtiServiceConnector.php b/src/Interfaces/ILtiServiceConnector.php index 93a7e0d9..0cf5f2a9 100644 --- a/src/Interfaces/ILtiServiceConnector.php +++ b/src/Interfaces/ILtiServiceConnector.php @@ -30,8 +30,7 @@ public function getAll( public function get( ILtiRegistration $registration, array $scopes, - IServiceRequest $request, - string $key + IServiceRequest $request ): LtiLineitem; public function setDebuggingMode(bool $enable): void; diff --git a/src/LtiAbstractService.php b/src/LtiAbstractService.php index 41312a9f..5be29670 100644 --- a/src/LtiAbstractService.php +++ b/src/LtiAbstractService.php @@ -55,13 +55,12 @@ protected function getAll(IServiceRequest $request, string $key = null): array ); } - protected function get(IServiceRequest $request, string $key = null): LtiLineitem + protected function get(IServiceRequest $request): LtiLineitem { return $this->serviceConnector->get( $this->registration, $this->getScope(), - $request, - $key + $request ); } } diff --git a/src/LtiAssignmentsGradesService.php b/src/LtiAssignmentsGradesService.php index e29ae8d1..110dccbb 100644 --- a/src/LtiAssignmentsGradesService.php +++ b/src/LtiAssignmentsGradesService.php @@ -116,13 +116,13 @@ public function getLineItems(): array return $lineitems; } - public function getLineItem(string $id): LtiLineitem + public function getLineItem(string $url): LtiLineitem { if (!in_array(LtiConstants::AGS_SCOPE_LINEITEM, $this->getScope())) { throw new LtiException('Missing required scope', 1); } - $request = new ServiceRequest(LtiServiceConnector::METHOD_GET, $this->getServiceData()['lineitem']); + $request = new ServiceRequest(LtiServiceConnector::METHOD_GET, $url); $request->setAccept(static::CONTENTTYPE_LINEITEM); $lineItem = $this->get($request); @@ -130,15 +130,6 @@ public function getLineItem(string $id): LtiLineitem return $lineItem; } -// public function deleteLineItem(LtiLineitem $item): LtiLineitem -// { -// if (!in_array(LtiConstants::AGS_SCOPE_LINEITEM, $this->getScope())) { -// throw new LtiException('Missing required scope', 1); -// } -// -// $request = new ServiceRequest(LtiServiceConnector::METHOD_DELETE, $this->getServiceData()['lineitem']); -// } - private function ensureLineItemExists(LtiLineitem $lineitem = null): LtiLineitem { // If no line item is passed in, attempt to use the one associated with diff --git a/src/LtiServiceConnector.php b/src/LtiServiceConnector.php index 04db8301..16f6c4b4 100644 --- a/src/LtiServiceConnector.php +++ b/src/LtiServiceConnector.php @@ -2,7 +2,6 @@ namespace Packback\Lti1p3; -use Couchbase\BaseException; use Firebase\JWT\JWT; use GuzzleHttp\Client; use GuzzleHttp\Exception\ClientException; @@ -174,15 +173,14 @@ public function getAll( return $results; } - public function get(ILtiRegistration $registration, array $scopes, IServiceRequest $request, string $key = null): LtiLineitem - { - throw new \Exception('Not implemented'); -// if ($request->getMethod() !== static::METHOD_GET) { -// throw new \Exception('An invalid method was specified by an LTI service requesting all items.'); -// } -// -// $response = $this->makeServiceRequest($registration, $scopes, $request); -// $result = $response['body'] ?? []; + public function get( + ILtiRegistration $registration, + array $scopes, + IServiceRequest $request + ): LtiLineitem { + $response = $this->makeServiceRequest($registration, $scopes, $request); + + return new LtiLineitem($response['body']); } private function getAccessTokenCacheKey(ILtiRegistration $registration, array $scopes) From af44ab1f0aa2e8d7c692c7d80373c6c43200480c Mon Sep 17 00:00:00 2001 From: JonahL Date: Fri, 28 Jan 2022 15:18:25 -0500 Subject: [PATCH 3/7] PODB-411: Added test --- src/LtiServiceConnector.php | 5 +++- tests/LtiServiceConnectorTest.php | 47 +++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/src/LtiServiceConnector.php b/src/LtiServiceConnector.php index 16f6c4b4..cc90ba77 100644 --- a/src/LtiServiceConnector.php +++ b/src/LtiServiceConnector.php @@ -178,8 +178,11 @@ public function get( array $scopes, IServiceRequest $request ): LtiLineitem { - $response = $this->makeServiceRequest($registration, $scopes, $request); + if ($request->getMethod() !== static::METHOD_GET) { + throw new \Exception('An invalid method was specified by an LTI service requesting one item.'); + } + $response = $this->makeServiceRequest($registration, $scopes, $request); return new LtiLineitem($response['body']); } diff --git a/tests/LtiServiceConnectorTest.php b/tests/LtiServiceConnectorTest.php index bab58c2c..71274ca1 100644 --- a/tests/LtiServiceConnectorTest.php +++ b/tests/LtiServiceConnectorTest.php @@ -9,6 +9,7 @@ use Packback\Lti1p3\Interfaces\ICache; use Packback\Lti1p3\Interfaces\ILtiRegistration; use Packback\Lti1p3\Interfaces\IServiceRequest; +use Packback\Lti1p3\LtiLineitem; use Packback\Lti1p3\LtiRegistration; use Packback\Lti1p3\LtiServiceConnector; use Psr\Http\Message\StreamInterface; @@ -326,6 +327,52 @@ public function testItGetsAll() $this->assertEquals($expected, $result); } + public function testItGetsSingleLineItem() + { + $method = LtiServiceConnector::METHOD_GET; + $ltiLineitemData = [ + 'id' => 'testId' + ]; + + $responseBody = json_encode($ltiLineitemData); + $expected = new LtiLineitem($ltiLineitemData); + + // Sets the access token on one request + $this->registration->shouldReceive('getClientId') + ->once()->andReturn('client_id'); + $this->registration->shouldReceive('getIssuer') + ->once()->andReturn('issuer'); + $this->cache->shouldReceive('getAccessToken') + ->once()->andReturn($this->token); + $this->request->shouldReceive('setAccessToken') + ->once()->andReturn($this->request); + + $this->request->shouldReceive('getMethod') + ->twice()->andReturn($method); + $this->request->shouldReceive('getUrl') + ->once()->andReturn($this->url); + $this->request->shouldReceive('getPayload') + ->once()->andReturn($this->requestPayload); + + // one response + $this->client->shouldReceive('request') + ->with($method, $this->url, $this->requestPayload) + ->once()->andReturn($this->response); + $this->response->shouldReceive('getBody') + ->once()->andReturn($this->streamInterface); + $this->streamInterface->shouldReceive('__toString') + ->once()->andReturn($responseBody); + $this->response->shouldReceive('getStatusCode') + ->once()->andReturn($this->responseStatus); + + $this->response->shouldReceive('getHeaders') + ->once()->andReturn($this->responseHeaders); + + $result = $this->connector->get($this->registration, $this->scopes, $this->request); + + $this->assertEquals($expected, $result); + } + private function mockMakeRequest() { // It makes another request From a8d1ed1ee7ccb9785fdc44cabfbd2e7d4acff738 Mon Sep 17 00:00:00 2001 From: JonahL Date: Fri, 28 Jan 2022 15:20:12 -0500 Subject: [PATCH 4/7] PODB-411: Fixed linting --- src/LtiServiceConnector.php | 1 + tests/LtiServiceConnectorTest.php | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/LtiServiceConnector.php b/src/LtiServiceConnector.php index cc90ba77..09103863 100644 --- a/src/LtiServiceConnector.php +++ b/src/LtiServiceConnector.php @@ -183,6 +183,7 @@ public function get( } $response = $this->makeServiceRequest($registration, $scopes, $request); + return new LtiLineitem($response['body']); } diff --git a/tests/LtiServiceConnectorTest.php b/tests/LtiServiceConnectorTest.php index 71274ca1..daee33ae 100644 --- a/tests/LtiServiceConnectorTest.php +++ b/tests/LtiServiceConnectorTest.php @@ -331,7 +331,7 @@ public function testItGetsSingleLineItem() { $method = LtiServiceConnector::METHOD_GET; $ltiLineitemData = [ - 'id' => 'testId' + 'id' => 'testId', ]; $responseBody = json_encode($ltiLineitemData); From 18431376aab8f73f7041bd5d9db11d1f9ba0e0d8 Mon Sep 17 00:00:00 2001 From: JonahL Date: Mon, 31 Jan 2022 11:35:56 -0500 Subject: [PATCH 5/7] PODB-411: Feedback response. --- src/Interfaces/ILtiServiceConnector.php | 7 ---- src/LtiAbstractService.php | 9 ----- src/LtiAssignmentsGradesService.php | 6 +-- src/LtiServiceConnector.php | 15 -------- tests/LtiAssignmentsGradesServiceTest.php | 27 +++++++++++++ tests/LtiServiceConnectorTest.php | 47 ----------------------- 6 files changed, 29 insertions(+), 82 deletions(-) diff --git a/src/Interfaces/ILtiServiceConnector.php b/src/Interfaces/ILtiServiceConnector.php index 0cf5f2a9..62124e96 100644 --- a/src/Interfaces/ILtiServiceConnector.php +++ b/src/Interfaces/ILtiServiceConnector.php @@ -3,7 +3,6 @@ namespace Packback\Lti1p3\Interfaces; use GuzzleHttp\Psr7\Response; -use Packback\Lti1p3\LtiLineitem; interface ILtiServiceConnector { @@ -27,11 +26,5 @@ public function getAll( string $key ): array; - public function get( - ILtiRegistration $registration, - array $scopes, - IServiceRequest $request - ): LtiLineitem; - public function setDebuggingMode(bool $enable): void; } diff --git a/src/LtiAbstractService.php b/src/LtiAbstractService.php index 5be29670..952544c8 100644 --- a/src/LtiAbstractService.php +++ b/src/LtiAbstractService.php @@ -54,13 +54,4 @@ protected function getAll(IServiceRequest $request, string $key = null): array $key ); } - - protected function get(IServiceRequest $request): LtiLineitem - { - return $this->serviceConnector->get( - $this->registration, - $this->getScope(), - $request - ); - } } diff --git a/src/LtiAssignmentsGradesService.php b/src/LtiAssignmentsGradesService.php index 110dccbb..559e931c 100644 --- a/src/LtiAssignmentsGradesService.php +++ b/src/LtiAssignmentsGradesService.php @@ -116,7 +116,7 @@ public function getLineItems(): array return $lineitems; } - public function getLineItem(string $url): LtiLineitem + public function getLineItem(string $url): array { if (!in_array(LtiConstants::AGS_SCOPE_LINEITEM, $this->getScope())) { throw new LtiException('Missing required scope', 1); @@ -125,9 +125,7 @@ public function getLineItem(string $url): LtiLineitem $request = new ServiceRequest(LtiServiceConnector::METHOD_GET, $url); $request->setAccept(static::CONTENTTYPE_LINEITEM); - $lineItem = $this->get($request); - - return $lineItem; + return $this->makeServiceRequest($request)['body']; } private function ensureLineItemExists(LtiLineitem $lineitem = null): LtiLineitem diff --git a/src/LtiServiceConnector.php b/src/LtiServiceConnector.php index 09103863..691b581a 100644 --- a/src/LtiServiceConnector.php +++ b/src/LtiServiceConnector.php @@ -17,7 +17,6 @@ class LtiServiceConnector implements ILtiServiceConnector public const METHOD_GET = 'GET'; public const METHOD_POST = 'POST'; - public const METHOD_DELETE = 'DELETE'; private $cache; private $client; @@ -173,20 +172,6 @@ public function getAll( return $results; } - public function get( - ILtiRegistration $registration, - array $scopes, - IServiceRequest $request - ): LtiLineitem { - if ($request->getMethod() !== static::METHOD_GET) { - throw new \Exception('An invalid method was specified by an LTI service requesting one item.'); - } - - $response = $this->makeServiceRequest($registration, $scopes, $request); - - return new LtiLineitem($response['body']); - } - private function getAccessTokenCacheKey(ILtiRegistration $registration, array $scopes) { sort($scopes); diff --git a/tests/LtiAssignmentsGradesServiceTest.php b/tests/LtiAssignmentsGradesServiceTest.php index 1924a600..15e33237 100644 --- a/tests/LtiAssignmentsGradesServiceTest.php +++ b/tests/LtiAssignmentsGradesServiceTest.php @@ -6,6 +6,7 @@ use Packback\Lti1p3\Interfaces\ILtiRegistration; use Packback\Lti1p3\Interfaces\ILtiServiceConnector; use Packback\Lti1p3\LtiAssignmentsGradesService; +use Packback\Lti1p3\LtiConstants; class LtiAssignmentsGradesServiceTest extends TestCase { @@ -22,6 +23,32 @@ public function testItInstantiates() $this->assertInstanceOf(LtiAssignmentsGradesService::class, $service); } + public function testItGetsSingleLineItem() + { + $ltiLineitemData = [ + 'id' => 'testId', + ]; + + $serviceData = [ + 'scope' => [LtiConstants::AGS_SCOPE_LINEITEM], + ]; + + $service = new LtiAssignmentsGradesService($this->connector, $this->registration, $serviceData); + + $response = [ + 'body' => $ltiLineitemData, + ]; + + $this->connector->shouldReceive('makeServiceRequest') + ->once()->andReturn($response); + + $expected = $ltiLineitemData; + + $result = $service->getLineItem('someUrl'); + + $this->assertEquals($expected, $result); + } + /* * @todo Test this */ diff --git a/tests/LtiServiceConnectorTest.php b/tests/LtiServiceConnectorTest.php index daee33ae..bab58c2c 100644 --- a/tests/LtiServiceConnectorTest.php +++ b/tests/LtiServiceConnectorTest.php @@ -9,7 +9,6 @@ use Packback\Lti1p3\Interfaces\ICache; use Packback\Lti1p3\Interfaces\ILtiRegistration; use Packback\Lti1p3\Interfaces\IServiceRequest; -use Packback\Lti1p3\LtiLineitem; use Packback\Lti1p3\LtiRegistration; use Packback\Lti1p3\LtiServiceConnector; use Psr\Http\Message\StreamInterface; @@ -327,52 +326,6 @@ public function testItGetsAll() $this->assertEquals($expected, $result); } - public function testItGetsSingleLineItem() - { - $method = LtiServiceConnector::METHOD_GET; - $ltiLineitemData = [ - 'id' => 'testId', - ]; - - $responseBody = json_encode($ltiLineitemData); - $expected = new LtiLineitem($ltiLineitemData); - - // Sets the access token on one request - $this->registration->shouldReceive('getClientId') - ->once()->andReturn('client_id'); - $this->registration->shouldReceive('getIssuer') - ->once()->andReturn('issuer'); - $this->cache->shouldReceive('getAccessToken') - ->once()->andReturn($this->token); - $this->request->shouldReceive('setAccessToken') - ->once()->andReturn($this->request); - - $this->request->shouldReceive('getMethod') - ->twice()->andReturn($method); - $this->request->shouldReceive('getUrl') - ->once()->andReturn($this->url); - $this->request->shouldReceive('getPayload') - ->once()->andReturn($this->requestPayload); - - // one response - $this->client->shouldReceive('request') - ->with($method, $this->url, $this->requestPayload) - ->once()->andReturn($this->response); - $this->response->shouldReceive('getBody') - ->once()->andReturn($this->streamInterface); - $this->streamInterface->shouldReceive('__toString') - ->once()->andReturn($responseBody); - $this->response->shouldReceive('getStatusCode') - ->once()->andReturn($this->responseStatus); - - $this->response->shouldReceive('getHeaders') - ->once()->andReturn($this->responseHeaders); - - $result = $this->connector->get($this->registration, $this->scopes, $this->request); - - $this->assertEquals($expected, $result); - } - private function mockMakeRequest() { // It makes another request From ffadf4ad57057ee8ab9fcddd90f2fbef7ff4bc7b Mon Sep 17 00:00:00 2001 From: JonahL Date: Mon, 31 Jan 2022 15:29:37 -0500 Subject: [PATCH 6/7] PODB-411: updated getlineitem to return an Ltilineitem object. --- src/LtiAssignmentsGradesService.php | 5 +++-- tests/LtiAssignmentsGradesServiceTest.php | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/LtiAssignmentsGradesService.php b/src/LtiAssignmentsGradesService.php index 559e931c..ebe09af9 100644 --- a/src/LtiAssignmentsGradesService.php +++ b/src/LtiAssignmentsGradesService.php @@ -116,7 +116,7 @@ public function getLineItems(): array return $lineitems; } - public function getLineItem(string $url): array + public function getLineItem(string $url): LtiLineitem { if (!in_array(LtiConstants::AGS_SCOPE_LINEITEM, $this->getScope())) { throw new LtiException('Missing required scope', 1); @@ -125,7 +125,8 @@ public function getLineItem(string $url): array $request = new ServiceRequest(LtiServiceConnector::METHOD_GET, $url); $request->setAccept(static::CONTENTTYPE_LINEITEM); - return $this->makeServiceRequest($request)['body']; + $response = $this->makeServiceRequest($request)['body']; + return new LtiLineitem($response); } private function ensureLineItemExists(LtiLineitem $lineitem = null): LtiLineitem diff --git a/tests/LtiAssignmentsGradesServiceTest.php b/tests/LtiAssignmentsGradesServiceTest.php index 15e33237..7ddfe610 100644 --- a/tests/LtiAssignmentsGradesServiceTest.php +++ b/tests/LtiAssignmentsGradesServiceTest.php @@ -7,6 +7,7 @@ use Packback\Lti1p3\Interfaces\ILtiServiceConnector; use Packback\Lti1p3\LtiAssignmentsGradesService; use Packback\Lti1p3\LtiConstants; +use Packback\Lti1p3\LtiLineitem; class LtiAssignmentsGradesServiceTest extends TestCase { @@ -42,7 +43,7 @@ public function testItGetsSingleLineItem() $this->connector->shouldReceive('makeServiceRequest') ->once()->andReturn($response); - $expected = $ltiLineitemData; + $expected = new LtiLineitem($ltiLineitemData); $result = $service->getLineItem('someUrl'); From 043fb4a563868398cb81fa8958eca777e7457461 Mon Sep 17 00:00:00 2001 From: JonahL Date: Mon, 31 Jan 2022 15:31:19 -0500 Subject: [PATCH 7/7] PODB-411: Fixed linting --- src/LtiAssignmentsGradesService.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/LtiAssignmentsGradesService.php b/src/LtiAssignmentsGradesService.php index ebe09af9..7d45c4c3 100644 --- a/src/LtiAssignmentsGradesService.php +++ b/src/LtiAssignmentsGradesService.php @@ -126,6 +126,7 @@ public function getLineItem(string $url): LtiLineitem $request->setAccept(static::CONTENTTYPE_LINEITEM); $response = $this->makeServiceRequest($request)['body']; + return new LtiLineitem($response); }