Skip to content

Commit cd86f31

Browse files
committed
Add tests for count()
1 parent bdc0f08 commit cd86f31

File tree

4 files changed

+111
-3
lines changed

4 files changed

+111
-3
lines changed

src/Kitar/Dynamodb/Query/Builder.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -399,7 +399,7 @@ public function count($columns = '*') {
399399
// reset columns selection
400400
$this->select([])->selectAttributes('COUNT');
401401

402-
return (int) $this->process('clientQuery', 'processCount');
402+
return $this->process('clientQuery', 'processCount');
403403
}
404404

405405
/**

src/Kitar/Dynamodb/Query/Processor.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,11 @@ public function processCount(Result $awsResponse, $modelClass = null) {
5252
return $response;
5353
}
5454

55-
if (! empty($response['Count'])) {
56-
return $response['Count'];
55+
if (! empty($response['Count']) && is_numeric($response['Count'])) {
56+
return (int) $response['Count'];
5757
}
58+
59+
return null;
5860
}
5961

6062
public function processSingleItem(Result $awsResponse, $modelClass = null)

tests/Query/BuilderTest.php

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1227,4 +1227,77 @@ public function it_returns_prefixed_builder()
12271227
$result['params']['TableName']
12281228
);
12291229
}
1230+
1231+
/** @test */
1232+
public function it_can_process_count_without_conditions()
1233+
{
1234+
$method = 'clientQuery';
1235+
$params = [
1236+
'TableName' => 'ProductCatalog',
1237+
'Select' => 'COUNT'
1238+
];
1239+
$processor = 'processCount';
1240+
1241+
$query = $this->newQuery('ProductCatalog')->count();
1242+
1243+
$this->assertEquals($method, $query['method']);
1244+
$this->assertEquals($params, $query['params']);
1245+
$this->assertEquals($processor, $query['processor']);
1246+
}
1247+
1248+
/** @test */
1249+
public function it_can_process_count_with_key_condition()
1250+
{
1251+
$method = 'clientQuery';
1252+
$params = [
1253+
'TableName' => 'ProductCatalog',
1254+
'Select' => 'COUNT',
1255+
'KeyConditionExpression' => '#1 = :1',
1256+
'ExpressionAttributeNames' => [
1257+
'#1' => 'Id'
1258+
],
1259+
'ExpressionAttributeValues' => [
1260+
':1' => [
1261+
'N' => '101'
1262+
]
1263+
]
1264+
];
1265+
$processor = 'processCount';
1266+
1267+
$query = $this->newQuery('ProductCatalog')
1268+
->keyCondition('Id', '=', 101)
1269+
->count();
1270+
1271+
$this->assertEquals($method, $query['method']);
1272+
$this->assertEquals($params, $query['params']);
1273+
$this->assertEquals($processor, $query['processor']);
1274+
}
1275+
1276+
/** @test */
1277+
public function it_can_process_count_with_filter()
1278+
{
1279+
$method = 'clientQuery';
1280+
$params = [
1281+
'TableName' => 'Thread',
1282+
'Select' => 'COUNT',
1283+
'FilterExpression' => '#1 = :1',
1284+
'ExpressionAttributeNames' => [
1285+
'#1' => 'ForumName'
1286+
],
1287+
'ExpressionAttributeValues' => [
1288+
':1' => [
1289+
'S' => 'Amazon DynamoDB'
1290+
]
1291+
]
1292+
];
1293+
$processor = 'processCount';
1294+
1295+
$query = $this->newQuery('Thread')
1296+
->filter('ForumName', '=', 'Amazon DynamoDB')
1297+
->count();
1298+
1299+
$this->assertEquals($method, $query['method']);
1300+
$this->assertEquals($params, $query['params']);
1301+
$this->assertEquals($processor, $query['processor']);
1302+
}
12301303
}

tests/Query/ProcessorTest.php

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ class ProcessorTest extends TestCase
2828
'batch_get_items_processed' => '{"Responses":{"Thread":[{"Replies":0,"Answered":0,"Views":0,"ForumName":"Amazon DynamoDB","Subject":"DynamoDB Thread 1"},{"Replies":0,"Answered":0,"Views":0,"ForumName":"Amazon DynamoDB","Subject":"DynamoDB Thread 2"}]},"UnprocessedKeys":[],"@metadata":{"statusCode":200,"effectiveUri":"https:\/\/dynamodb.ap-northeast-1.amazonaws.com","transferStats":{"http":[[]]}}}',
2929
'batch_get_items_empty_result' => '{"Responses":{"Thread":[]},"UnprocessedKeys":[],"@metadata":{"statusCode":200,"effectiveUri":"https:\/\/dynamodb.ap-northeast-1.amazonaws.com","transferStats":{"http":[[]]}}}',
3030
'batch_get_items_empty_processed' => '{"Responses":{"Thread":[]},"UnprocessedKeys":[],"@metadata":{"statusCode":200,"effectiveUri":"https:\/\/dynamodb.ap-northeast-1.amazonaws.com","transferStats":{"http":[[]]}}}',
31+
'count_result_with_valid_count' => '{"Count":5,"ScannedCount":5,"@metadata":{"statusCode":200,"effectiveUri":"https:\/\/dynamodb.ap-northeast-1.amazonaws.com"}}',
32+
'count_result_without_count' => '{"ScannedCount":0,"@metadata":{"statusCode":200,"effectiveUri":"https:\/\/dynamodb.ap-northeast-1.amazonaws.com"}}',
33+
'count_result_with_zero_count' => '{"Count":0,"ScannedCount":0,"@metadata":{"statusCode":200,"effectiveUri":"https:\/\/dynamodb.ap-northeast-1.amazonaws.com"}}',
3134
];
3235

3336
protected function setUp() :void
@@ -161,4 +164,34 @@ public function it_can_convert_batch_get_results_to_model_instance()
161164
], $item->toArray());
162165
$this->assertEquals(200, $item->meta()['@metadata']['statusCode']);
163166
}
167+
168+
/** @test */
169+
public function it_can_process_count_result_with_valid_count()
170+
{
171+
$awsResult = new Result(json_decode($this->mocks['count_result_with_valid_count'], true));
172+
173+
$count = $this->processor->processCount($awsResult, User::class);
174+
175+
$this->assertEquals(5, $count);
176+
}
177+
178+
/** @test */
179+
public function it_can_process_count_result_with_no_count()
180+
{
181+
$awsResult = new Result(json_decode($this->mocks['count_result_without_count'], true));
182+
183+
$count = $this->processor->processCount($awsResult, User::class);
184+
185+
$this->assertNull($count);
186+
}
187+
188+
/** @test */
189+
public function it_can_process_count_result_with_zero_count()
190+
{
191+
$awsResult = new Result(json_decode($this->mocks['count_result_with_zero_count'], true));
192+
193+
$count = $this->processor->processCount($awsResult, User::class);
194+
195+
$this->assertEquals(0, $count);
196+
}
164197
}

0 commit comments

Comments
 (0)