Skip to content

Adds tests for aggregation API. #580

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Apr 10, 2015
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion app/controllers/api/Statements.php
Original file line number Diff line number Diff line change
@@ -35,7 +35,7 @@ public function aggregate() {
$pipeline = json_decode(
\LockerRequest::getParam('pipeline'),
true
) ?: [['match' => []]];
) ?: [['$match' => ['active' => true]]];
return \Response::json($this->query->aggregate($this->lrs->_id, $pipeline));
}

6 changes: 3 additions & 3 deletions app/locker/repository/Query/EloquentQueryRepository.php
Original file line number Diff line number Diff line change
@@ -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
]
8 changes: 4 additions & 4 deletions app/locker/request/Request.php
Original file line number Diff line number Diff line change
@@ -16,7 +16,7 @@ class Request {
*/
public function getParams() {
// If no params were cached, get them.
if ($this->params === null || count($this->params) < 1) {
if ($this->params === null || count($this->params) < 1 || \App::environment() === 'testing') {
$requestParams = \Request::all();
$payloadParams = $this->getPayloadParams();

@@ -27,7 +27,7 @@ public function getParams() {
$this->params = $requestParams;
}
}

// Return the cached params.
return $this->params;
}
@@ -138,7 +138,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 +151,4 @@ private function getAuth() {

return $result;
}
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<?php namespace Tests\API;
use \Report as Report;

class ExportTest extends ResourceTestCase {
class ExportsTest extends ResourcesTestCase {
static protected $endpoint = '/api/v1/exports';
static protected $model_class = '\Export';
protected $data = [
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?php namespace Tests\API;

class ReportTest extends ResourceTestCase {
class ReportsTest extends ResourcesTestCase {
static protected $endpoint = '/api/v1/reports';
static protected $model_class = '\Report';
protected $data = [
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<?php namespace Tests\API;
use \Illuminate\Http\JsonResponse as JsonResponse;

abstract class ResourceTestCase extends TestCase {
abstract class ResourcesTestCase extends TestCase {
static protected $model_class = '...';
protected $data = [];
protected $model = null;
155 changes: 155 additions & 0 deletions app/tests/API/StatementsTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
<?php namespace Tests\API;
use \Route as Route;

class StatementsTest extends TestCase {
static protected $endpoint = '/api/v1/statements';
protected $pipeline = null;

public function setup() {
parent::setup();
}

protected function getPipeline() {
return $this->pipeline ?: file_get_contents(__DIR__ . '/../Fixtures/pipeline.json');
}

protected function requestStatementsAPI($method = 'GET', $url = '', $params = []) {
$server = $this->getHeaders($this->lrs->api);
Route::enableFilters();
return $this->call($method, $url, $params, [], $server, '');
}

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 type.');
$this->assertEquals(true, isset($content->result), 'No 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 type.');
$this->assertEquals(true, isset($content->result[0]->statement), 'No 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 type.');
$this->assertEquals(1, $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.');
$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() {
$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.');
$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() {
$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.');
$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() {
parent::tearDown();
}
}
5 changes: 3 additions & 2 deletions app/tests/API/TestCase.php
Original file line number Diff line number Diff line change
@@ -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() {
1 change: 1 addition & 0 deletions app/tests/Fixtures/pipeline.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
[{"$match":{"active":true}},{"$project":{"_id":0,"statement":1}}]