* @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 () { expect(Custom::single('SELECT data FROM ' . ThrowawayDb::TABLE . " WHERE data->>'id' = :id", [':id' => 'one'], new DocumentMapper(TestDocument::class))) ->isSome()->toBeTrue() ->get()->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); }); });