From 47ab6419ad2cea2b5ba52dd7c64168458d422327 Mon Sep 17 00:00:00 2001 From: Ryan Smith <0ryansmith1994@gmail.com> Date: Wed, 8 Apr 2015 17:36:11 +0100 Subject: [PATCH 1/3] Begins to add tests for aggregation. --- app/controllers/api/Statements.php | 4 +- app/locker/request/Request.php | 7 +- .../API/{ExportTest.php => ExportsTest.php} | 2 +- .../API/{ReportTest.php => ReportsTest.php} | 2 +- .../{ResourceTest.php => ResourcesTest.php} | 2 +- app/tests/API/StatementsTest.php | 79 +++++++++++++++++++ app/tests/Fixtures/pipeline.json | 1 + 7 files changed, 90 insertions(+), 7 deletions(-) rename app/tests/API/{ExportTest.php => ExportsTest.php} (97%) rename app/tests/API/{ReportTest.php => ReportsTest.php} (96%) rename app/tests/API/{ResourceTest.php => ResourcesTest.php} (98%) create mode 100644 app/tests/API/StatementsTest.php create mode 100644 app/tests/Fixtures/pipeline.json diff --git a/app/controllers/api/Statements.php b/app/controllers/api/Statements.php index 7d5dce7d33..f31f58aa4b 100644 --- a/app/controllers/api/Statements.php +++ b/app/controllers/api/Statements.php @@ -32,10 +32,12 @@ public function where() { * @return Aggregate http://php.net/manual/en/mongocollection.aggregate.php#refsect1-mongocollection.aggregate-examples */ public function aggregate() { + \Log::info(\Input::all()); + \Log::info(\LockerRequest::getParam('pipeline')); $pipeline = json_decode( \LockerRequest::getParam('pipeline'), true - ) ?: [['match' => []]]; + ) ?: [['$match' => ['active' => true]]]; return \Response::json($this->query->aggregate($this->lrs->_id, $pipeline)); } diff --git a/app/locker/request/Request.php b/app/locker/request/Request.php index 7cbbacdd98..36860cf6a7 100644 --- a/app/locker/request/Request.php +++ b/app/locker/request/Request.php @@ -17,6 +17,7 @@ class Request { public function getParams() { // If no params were cached, get them. if ($this->params === null || count($this->params) < 1) { + \Log::info(\Input::all()); $requestParams = \Request::all(); $payloadParams = $this->getPayloadParams(); @@ -27,7 +28,7 @@ public function getParams() { $this->params = $requestParams; } } - + // Return the cached params. return $this->params; } @@ -138,7 +139,7 @@ private function getAuth() { $auth = explode(' ', $this->getParam(self::authParam)); $decoded = base64_decode($auth[1]); $auth_parts = explode(':', $decoded); - + $result[self::authUser] = $auth_parts[0]; $result[self::authPass] = $auth_parts[1]; } @@ -151,4 +152,4 @@ private function getAuth() { return $result; } -} \ No newline at end of file +} diff --git a/app/tests/API/ExportTest.php b/app/tests/API/ExportsTest.php similarity index 97% rename from app/tests/API/ExportTest.php rename to app/tests/API/ExportsTest.php index 2f635a6a44..2355ae025d 100644 --- a/app/tests/API/ExportTest.php +++ b/app/tests/API/ExportsTest.php @@ -1,7 +1,7 @@ pipeline ?: file_get_contents(__DIR__ . '/../Fixtures/pipeline.json'); + } + + protected function requestStatementsAPI($method = 'GET', $url = '', $params = []) { + $headers = $this->getHeaders($this->lrs->api); + Route::enableFilters(); + return $this->call($method, $url.'?'.http_build_query($params), [ + 'X-Experience-API-Version' => '1.0.1' + ], [], $headers, ''); + } + + public function testAggregate() { + $response = $this->requestStatementsAPI('GET', static::$endpoint.'/aggregate', [ + 'pipeline' => $this->getPipeline() + ]); + + // Checks that the response is correct. + $this->assertEquals(200, $response->getStatusCode(), 'Incorrect status code.'); + $this->assertEquals(true, method_exists($response, 'getContent'), 'Incorrect response.'); + + // Checks that the content is correct. + $content = json_decode($response->getContent()); + $this->assertEquals(true, is_object($content), 'Incorrect content.'); + $this->assertEquals(true, isset($content->result), 'No result.'); + $this->assertEquals(true, is_array($content->result), 'Incorrect result.'); + $this->assertEquals(static::$statements, count($content->result), 'Incorrect number of results.'); + $this->assertEquals(true, is_object($content->result[0]), 'Incorrect projection.'); + $this->assertEquals(true, isset($content->result[0]->statement), 'No statement.'); + $this->assertEquals(true, is_object($content->result[0]->statement), 'Incorrect statement.'); + $this->assertEquals(true, isset($content->result[0]->statement->actor), 'No actor.'); + $this->assertEquals(true, isset($content->ok), 'No ok.'); + $this->assertEquals(true, is_numeric($content->ok), 'Incorrect ok.'); + } + + public function testAggregateTime() { + $response = $this->requestStatementsAPI('GET', static::$endpoint.'/aggregate/time', [ + 'match' => '{"active": true}' + ]); + + // Checks that the response is correct. + $this->assertEquals(200, $response->getStatusCode(), 'Incorrect status code.'); + } + + public function testAggregateObject() { + $response = $this->requestStatementsAPI('GET', static::$endpoint.'/aggregate/object', [ + 'match' => '{"active": true}' + ]); + + // Checks that the response is correct. + $this->assertEquals(200, $response->getStatusCode(), 'Incorrect status code.'); + } + + public function testWhere() { + $response = $this->requestStatementsAPI('GET', static::$endpoint.'/where', [ + 'filter' => '[[{"active", true}]]', + 'limit' => 1, + 'page' => 1 + ]); + + // Checks that the response is correct. + $this->assertEquals(200, $response->getStatusCode(), 'Incorrect status code.'); + } + + public function tearDown() { + parent::tearDown(); + } +} diff --git a/app/tests/Fixtures/pipeline.json b/app/tests/Fixtures/pipeline.json new file mode 100644 index 0000000000..dcbeec71d0 --- /dev/null +++ b/app/tests/Fixtures/pipeline.json @@ -0,0 +1 @@ +[{"$match":{"active":true}},{"$project":{"_id":0,"statement":1}}] From 4d24682e12f4970e28bb4354205b9f74a1a9d6a0 Mon Sep 17 00:00:00 2001 From: Ryan Smith <0ryansmith1994@gmail.com> Date: Thu, 9 Apr 2015 10:30:53 +0100 Subject: [PATCH 2/3] Fixes aggregation tests. --- app/controllers/api/Statements.php | 2 -- app/locker/request/Request.php | 3 +-- app/tests/API/StatementsTest.php | 6 ++---- app/tests/API/TestCase.php | 5 +++-- 4 files changed, 6 insertions(+), 10 deletions(-) diff --git a/app/controllers/api/Statements.php b/app/controllers/api/Statements.php index f31f58aa4b..2311748e8e 100644 --- a/app/controllers/api/Statements.php +++ b/app/controllers/api/Statements.php @@ -32,8 +32,6 @@ public function where() { * @return Aggregate http://php.net/manual/en/mongocollection.aggregate.php#refsect1-mongocollection.aggregate-examples */ public function aggregate() { - \Log::info(\Input::all()); - \Log::info(\LockerRequest::getParam('pipeline')); $pipeline = json_decode( \LockerRequest::getParam('pipeline'), true diff --git a/app/locker/request/Request.php b/app/locker/request/Request.php index 36860cf6a7..94c6882f39 100644 --- a/app/locker/request/Request.php +++ b/app/locker/request/Request.php @@ -16,8 +16,7 @@ class Request { */ public function getParams() { // If no params were cached, get them. - if ($this->params === null || count($this->params) < 1) { - \Log::info(\Input::all()); + if ($this->params === null || count($this->params) < 1 || \App::environment() === 'testing') { $requestParams = \Request::all(); $payloadParams = $this->getPayloadParams(); diff --git a/app/tests/API/StatementsTest.php b/app/tests/API/StatementsTest.php index 34b62a1b20..1395fc787e 100644 --- a/app/tests/API/StatementsTest.php +++ b/app/tests/API/StatementsTest.php @@ -14,11 +14,9 @@ protected function getPipeline() { } protected function requestStatementsAPI($method = 'GET', $url = '', $params = []) { - $headers = $this->getHeaders($this->lrs->api); + $server = $this->getHeaders($this->lrs->api); Route::enableFilters(); - return $this->call($method, $url.'?'.http_build_query($params), [ - 'X-Experience-API-Version' => '1.0.1' - ], [], $headers, ''); + return $this->call($method, $url, $params, [], $server, ''); } public function testAggregate() { diff --git a/app/tests/API/TestCase.php b/app/tests/API/TestCase.php index df3aff4536..351d54a182 100644 --- a/app/tests/API/TestCase.php +++ b/app/tests/API/TestCase.php @@ -89,9 +89,10 @@ protected function getHeaders($auth) { } protected function requestAPI($method = 'GET', $url = '', $content = '') { - $headers = $this->getHeaders($this->lrs->api); + $server = $this->getHeaders($this->lrs->api); + $server['HTTP_X-Experience-API-Version'] = '1.0.1'; Route::enableFilters(); - return $this->call($method, $url, ['X-Experience-API-Version' => '1.0.1'], [], $headers, $content); + return $this->call($method, $url, [], [], $server, $content); } protected function getStatement() { From 2357c2fdf00ce8e98a817c45a1c273eac300b8ce Mon Sep 17 00:00:00 2001 From: Ryan Smith <0ryansmith1994@gmail.com> Date: Thu, 9 Apr 2015 11:00:25 +0100 Subject: [PATCH 3/3] Increases assertions. --- .../Query/EloquentQueryRepository.php | 6 +- app/tests/API/StatementsTest.php | 88 +++++++++++++++++-- 2 files changed, 86 insertions(+), 8 deletions(-) diff --git a/app/locker/repository/Query/EloquentQueryRepository.php b/app/locker/repository/Query/EloquentQueryRepository.php index 740661af37..65d9f99d76 100644 --- a/app/locker/repository/Query/EloquentQueryRepository.php +++ b/app/locker/repository/Query/EloquentQueryRepository.php @@ -86,13 +86,13 @@ public function aggregateObject($lrsId, array $match) { '$match' => $match ], [ '$group' => [ - '_id' => '', - 'data' => ['$addToSet' => ''], + '_id' => '$statement.object.id', + 'data' => ['$addToSet' => '$statement'], 'count' => ['$sum' => 1], ] ], [ '$project' => [ - '_id' => 0, + '_id' => 1, 'data' => 1, 'count' => 1 ] diff --git a/app/tests/API/StatementsTest.php b/app/tests/API/StatementsTest.php index 1395fc787e..199f6964f7 100644 --- a/app/tests/API/StatementsTest.php +++ b/app/tests/API/StatementsTest.php @@ -30,16 +30,17 @@ public function testAggregate() { // Checks that the content is correct. $content = json_decode($response->getContent()); - $this->assertEquals(true, is_object($content), 'Incorrect content.'); + $this->assertEquals(true, is_object($content), 'Incorrect content type.'); $this->assertEquals(true, isset($content->result), 'No result.'); - $this->assertEquals(true, is_array($content->result), 'Incorrect result.'); + $this->assertEquals(true, is_array($content->result), 'Incorrect result type.'); $this->assertEquals(static::$statements, count($content->result), 'Incorrect number of results.'); - $this->assertEquals(true, is_object($content->result[0]), 'Incorrect projection.'); + $this->assertEquals(true, is_object($content->result[0]), 'Incorrect projection type.'); $this->assertEquals(true, isset($content->result[0]->statement), 'No statement.'); - $this->assertEquals(true, is_object($content->result[0]->statement), 'Incorrect statement.'); + $this->assertEquals(true, is_object($content->result[0]->statement), 'Incorrect statement type.'); $this->assertEquals(true, isset($content->result[0]->statement->actor), 'No actor.'); $this->assertEquals(true, isset($content->ok), 'No ok.'); - $this->assertEquals(true, is_numeric($content->ok), 'Incorrect ok.'); + $this->assertEquals(true, is_numeric($content->ok), 'Incorrect ok type.'); + $this->assertEquals(1, $content->ok, 'Incorrect ok.'); } public function testAggregateTime() { @@ -49,6 +50,23 @@ public function testAggregateTime() { // Checks that the response is correct. $this->assertEquals(200, $response->getStatusCode(), 'Incorrect status code.'); + $this->assertEquals(true, method_exists($response, 'getContent'), 'Incorrect response.'); + + // Checks that the content is correct. + $content = json_decode($response->getContent()); + $this->assertEquals(true, is_object($content), 'Incorrect content type.'); + $this->assertEquals(true, isset($content->result), 'No result.'); + $this->assertEquals(true, is_array($content->result), 'Incorrect result type.'); + $this->assertEquals(1, count($content->result), 'Incorrect number of results.'); + $this->assertEquals(true, is_object($content->result[0]), 'Incorrect projection type.'); + $this->assertEquals(true, isset($content->result[0]->count), 'No count.'); + $this->assertEquals(true, is_numeric($content->result[0]->count), 'Incorrect count type.'); + $this->assertEquals(static::$statements, is_numeric($content->result[0]->count), 'Incorrect count.'); + $this->assertEquals(true, isset($content->result[0]->date), 'No date.'); + $this->assertEquals(true, is_array($content->result[0]->date), 'Incorrect date type.'); + $this->assertEquals(true, isset($content->ok), 'No ok.'); + $this->assertEquals(true, is_numeric($content->ok), 'Incorrect ok type.'); + $this->assertEquals(1, $content->ok, 'Incorrect ok.'); } public function testAggregateObject() { @@ -58,6 +76,28 @@ public function testAggregateObject() { // Checks that the response is correct. $this->assertEquals(200, $response->getStatusCode(), 'Incorrect status code.'); + $this->assertEquals(true, method_exists($response, 'getContent'), 'Incorrect response.'); + + // Checks that the content is correct. + $content = json_decode($response->getContent()); + $this->assertEquals(true, is_object($content), 'Incorrect content type.'); + $this->assertEquals(true, isset($content->result), 'No result.'); + $this->assertEquals(true, is_array($content->result), 'Incorrect result type.'); + $this->assertEquals(1, count($content->result), 'Incorrect number of results.'); + $this->assertEquals(true, is_object($content->result[0]), 'Incorrect projection type.'); + $this->assertEquals(true, isset($content->result[0]->count), 'No count.'); + $this->assertEquals(true, is_numeric($content->result[0]->count), 'Incorrect count type.'); + $this->assertEquals(static::$statements, is_numeric($content->result[0]->count), 'Incorrect count.'); + $this->assertEquals(true, isset($content->result[0]->data), 'No data.'); + $this->assertEquals(true, is_array($content->result[0]->data), 'Incorrect data type.'); + $this->assertEquals(static::$statements, count($content->result[0]->data), 'Incorrect data.'); + $this->assertEquals(true, isset($content->result[0]->data[0]), 'Incorrect data item.'); + $this->assertEquals(true, is_object($content->result[0]->data[0]), 'Incorrect data item type.'); + $this->assertEquals(true, isset($content->result[0]->data[0]->actor), 'No actor.'); + $this->assertEquals(true, is_object($content->result[0]->data[0]->actor), 'Incorrect actor type.'); + $this->assertEquals(true, isset($content->ok), 'No ok.'); + $this->assertEquals(true, is_numeric($content->ok), 'Incorrect ok type.'); + $this->assertEquals(1, $content->ok, 'Incorrect ok.'); } public function testWhere() { @@ -69,6 +109,44 @@ public function testWhere() { // Checks that the response is correct. $this->assertEquals(200, $response->getStatusCode(), 'Incorrect status code.'); + $this->assertEquals(true, method_exists($response, 'getContent'), 'Incorrect response.'); + + // Checks that the content is correct. + $content = json_decode($response->getContent()); + $this->assertEquals(true, is_object($content), 'Incorrect content type.'); + + // Checks set props. + $this->assertEquals(true, isset($content->total), 'No total.'); + $this->assertEquals(true, isset($content->per_page), 'No per_page.'); + $this->assertEquals(true, isset($content->current_page), 'No current_page.'); + $this->assertEquals(true, isset($content->last_page), 'No last_page.'); + $this->assertEquals(true, isset($content->from), 'No from.'); + $this->assertEquals(true, isset($content->to), 'No to.'); + $this->assertEquals(true, isset($content->data), 'No data.'); + + // Checks prop types. + $this->assertEquals(true, is_numeric($content->total), 'Incorrect total type.'); + $this->assertEquals(true, is_numeric($content->per_page), 'Incorrect per_page type.'); + $this->assertEquals(true, is_numeric($content->current_page), 'Incorrect current_page type.'); + $this->assertEquals(true, is_numeric($content->last_page), 'Incorrect last_page type.'); + $this->assertEquals(true, is_numeric($content->from), 'Incorrect from type.'); + $this->assertEquals(true, is_numeric($content->to), 'Incorrect to type.'); + $this->assertEquals(true, is_array($content->data), 'Incorrect data type.'); + + // Checks prop content. + $this->assertEquals(static::$statements, $content->total, 'Incorrect total value.'); + $this->assertEquals(1, $content->per_page, 'Incorrect per_page value.'); + $this->assertEquals(1, $content->current_page, 'Incorrect current_page value.'); + $this->assertEquals(static::$statements, $content->last_page, 'Incorrect last_page value.'); + $this->assertEquals(1, $content->from, 'Incorrect from value.'); + $this->assertEquals(1, $content->to, 'Incorrect to value.'); + $this->assertEquals(1, count($content->data), 'Incorrect data count.'); + $this->assertEquals(true, isset($content->data[0]), 'No data item.'); + $this->assertEquals(true, is_object($content->data[0]), 'Incorrect data item type.'); + $this->assertEquals(true, isset($content->data[0]->statement), 'No statement.'); + $this->assertEquals(true, is_object($content->data[0]->statement), 'Incorrect statement type.'); + $this->assertEquals(true, isset($content->data[0]->statement->actor), 'No actor.'); + $this->assertEquals(true, is_object($content->data[0]->statement->actor), 'Incorrect actor type.'); } public function tearDown() {