98 lines
3.7 KiB
PHP
98 lines
3.7 KiB
PHP
|
<?php
|
||
|
/**
|
||
|
* @author Daniel J. Summers <daniel@bitbadger.solutions>
|
||
|
* @license MIT
|
||
|
*/
|
||
|
|
||
|
declare(strict_types=1);
|
||
|
|
||
|
use BitBadger\PDODocument\{Count, Custom, DocumentException, Query};
|
||
|
use BitBadger\PDODocument\Mapper\{CountMapper, DocumentMapper};
|
||
|
use Test\Integration\PostgreSQL\ThrowawayDb;
|
||
|
use Test\Integration\TestDocument;
|
||
|
|
||
|
pest()->group('integration', 'postgresql');
|
||
|
|
||
|
describe('::runQuery()', function () {
|
||
|
test('runs a valid query successfully', function () {
|
||
|
$stmt = &Custom::runQuery('SELECT data FROM ' . ThrowawayDb::TABLE . ' LIMIT 1', []);
|
||
|
try {
|
||
|
expect($stmt)->not->toBeNull();
|
||
|
} finally {
|
||
|
$stmt = null;
|
||
|
}
|
||
|
});
|
||
|
test('fails with an invalid query', function () {
|
||
|
$stmt = null;
|
||
|
try {
|
||
|
expect(function () use (&$stmt) { $stmt = &Custom::runQuery('GRAB stuff FROM over_there UNTIL done', []); })
|
||
|
->toThrow(DocumentException::class);
|
||
|
} finally {
|
||
|
$stmt = null;
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe('::list()', function () {
|
||
|
test('returns non-empty list when data found', function () {
|
||
|
$list = Custom::list(Query::selectFromTable(ThrowawayDb::TABLE), [], new DocumentMapper(TestDocument::class));
|
||
|
expect($list)->not->toBeNull();
|
||
|
$count = 0;
|
||
|
foreach ($list->items as $ignored) $count++;
|
||
|
expect($count)->toBe(5);
|
||
|
});
|
||
|
test('returns empty list when no data found', function () {
|
||
|
expect(Custom::list(
|
||
|
Query::selectFromTable(ThrowawayDb::TABLE) . " WHERE (data->>'num_value')::numeric > :value",
|
||
|
[':value' => 100], new DocumentMapper(TestDocument::class)))
|
||
|
->not->toBeNull()
|
||
|
->hasItems->toBeFalse();
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe('::array()', function () {
|
||
|
test('returns non-empty array when data found', function () {
|
||
|
expect(Custom::array(Query::selectFromTable(ThrowawayDb::TABLE) . " WHERE data->>'sub' IS NOT NULL", [],
|
||
|
new DocumentMapper(TestDocument::class)))
|
||
|
->not->toBeNull()
|
||
|
->toHaveCount(2);
|
||
|
});
|
||
|
test('returns empty array when no data found', function () {
|
||
|
expect(Custom::array(Query::selectFromTable(ThrowawayDb::TABLE) . " WHERE data->>'value' = :value",
|
||
|
[':value' => 'not there'], new DocumentMapper(TestDocument::class)))
|
||
|
->not->toBeNull()
|
||
|
->toBeEmpty();
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe('::single()', function () {
|
||
|
test('returns a document when one is found', function () {
|
||
|
$doc = Custom::single('SELECT data FROM ' . ThrowawayDb::TABLE . " WHERE data->>'id' = :id", [':id' => 'one'],
|
||
|
new DocumentMapper(TestDocument::class));
|
||
|
expect($doc)->isSome->toBeTrue()->and($doc->value)->id->toBe('one');
|
||
|
});
|
||
|
test('returns no document when one is not found', function () {
|
||
|
expect(Custom::single('SELECT data FROM ' . ThrowawayDb::TABLE . " WHERE data->>'id' = :id",
|
||
|
[':id' => 'eighty'], new DocumentMapper(TestDocument::class)))
|
||
|
->isNone->toBeTrue();
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe('::nonQuery()', function () {
|
||
|
test('works when documents match the WHERE clause', function () {
|
||
|
Custom::nonQuery('DELETE FROM ' . ThrowawayDb::TABLE, []);
|
||
|
expect(Count::all(ThrowawayDb::TABLE))->toBe(0);
|
||
|
});
|
||
|
test('works when no documents match the WHERE clause', function () {
|
||
|
Custom::nonQuery('DELETE FROM ' . ThrowawayDb::TABLE . " WHERE (data->>'num_value')::numeric > :value",
|
||
|
[':value' => 100]);
|
||
|
expect(Count::all(ThrowawayDb::TABLE))->toBe(5);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe('::scalar()', function () {
|
||
|
test('returns a scalar value', function () {
|
||
|
expect(Custom::scalar("SELECT 5 AS it", [], new CountMapper()))->toBe(5);
|
||
|
});
|
||
|
});
|