From 66ff297103a3bff1cb2cce327824d06b022672b6 Mon Sep 17 00:00:00 2001 From: Steven Date: Mon, 22 Aug 2022 19:12:30 +0000 Subject: [PATCH] Refactor Queries Validation --- app/controllers/api/databases.php | 16 ++- app/controllers/api/users.php | 5 +- .../Database/Validator/IndexedQueries.php | 14 +- .../Utopia/Database/Validator/Queries.php | 69 ++++++---- .../Database/Validator/Queries/Collection.php | 38 +++++- .../Database/Validator/Queries/Users.php | 6 +- .../Utopia/Database/Validator/Query/Base.php | 70 ++++++++++ .../Database/Validator/Query/Cursor.php | 14 +- .../Database/Validator/Query/Filter.php | 14 +- .../Utopia/Database/Validator/Query/Limit.php | 46 +------ .../Database/Validator/Query/Offset.php | 46 +------ .../Utopia/Database/Validator/Query/Order.php | 15 ++- .../Database/Validator/IndexedQueriesTest.php | 121 ++++++++++++++++++ .../Validator/Queries/CollectionTest.php | 43 +++++++ .../LimitOffsetCursorFilterOrderQueryTest.php | 94 -------------- .../LimitOffsetCursorFilterQueryTest.php | 88 ------------- .../Queries/LimitOffsetCursorQueryTest.php | 74 ----------- .../Queries/LimitOffsetQueryTest.php | 74 ----------- .../Database/Validator/Queries/UsersTest.php | 40 ++++++ .../Utopia/Database/Validator/QueriesTest.php | 76 +++++++++++ .../Database/Validator/Query/CursorTest.php | 41 ++++++ .../Database/Validator/Query/FilterTest.php | 59 +++++++++ .../Database/Validator/Query/LimitTest.php | 37 ++++++ .../Database/Validator/Query/OffsetTest.php | 41 ++++++ .../Database/Validator/Query/OrderTest.php | 54 ++++++++ 25 files changed, 716 insertions(+), 479 deletions(-) create mode 100644 src/Appwrite/Utopia/Database/Validator/Query/Base.php create mode 100644 tests/unit/Utopia/Database/Validator/IndexedQueriesTest.php create mode 100644 tests/unit/Utopia/Database/Validator/Queries/CollectionTest.php delete mode 100644 tests/unit/Utopia/Database/Validator/Queries/LimitOffsetCursorFilterOrderQueryTest.php delete mode 100644 tests/unit/Utopia/Database/Validator/Queries/LimitOffsetCursorFilterQueryTest.php delete mode 100644 tests/unit/Utopia/Database/Validator/Queries/LimitOffsetCursorQueryTest.php delete mode 100644 tests/unit/Utopia/Database/Validator/Queries/LimitOffsetQueryTest.php create mode 100644 tests/unit/Utopia/Database/Validator/Queries/UsersTest.php create mode 100644 tests/unit/Utopia/Database/Validator/QueriesTest.php create mode 100644 tests/unit/Utopia/Database/Validator/Query/CursorTest.php create mode 100644 tests/unit/Utopia/Database/Validator/Query/FilterTest.php create mode 100644 tests/unit/Utopia/Database/Validator/Query/LimitTest.php create mode 100644 tests/unit/Utopia/Database/Validator/Query/OffsetTest.php create mode 100644 tests/unit/Utopia/Database/Validator/Query/OrderTest.php diff --git a/app/controllers/api/databases.php b/app/controllers/api/databases.php index 7efd9fac8e..372c8eea95 100644 --- a/app/controllers/api/databases.php +++ b/app/controllers/api/databases.php @@ -38,7 +38,11 @@ use Appwrite\Network\Validator\IP; use Appwrite\Network\Validator\URL; use Appwrite\Utopia\Database\Validator\CustomId; use Appwrite\Utopia\Database\Validator\IndexedQueries; -use Appwrite\Utopia\Database\Validator\Queries\LimitOffsetCursorFilterOrderQuery; +use Appwrite\Utopia\Database\Validator\Query\Cursor as CursorQueryValidator; +use Appwrite\Utopia\Database\Validator\Query\Filter as FilterQueryValidator; +use Appwrite\Utopia\Database\Validator\Query\Limit as LimitQueryValidator; +use Appwrite\Utopia\Database\Validator\Query\Offset as OffsetQueryValidator; +use Appwrite\Utopia\Database\Validator\Query\Order as OrderQueryValidator; use Appwrite\Utopia\Response; use Appwrite\Detector\Detector; use Appwrite\Event\Database as EventDatabase; @@ -2048,7 +2052,15 @@ App::get('/v1/databases/:databaseId/collections/:collectionId/documents') ]), ] ); - $validator = new IndexedQueries(new LimitOffsetCursorFilterOrderQuery(attributes: $attributes), $attributes, $collection->getAttribute('indexes', [])); + $validator = new IndexedQueries( + $attributes, + $collection->getAttribute('indexes', []), + new CursorQueryValidator(), + new FilterQueryValidator($attributes), + new LimitQueryValidator(), + new OffsetQueryValidator(), + new OrderQueryValidator(), + ); if (!$validator->isValid($queries)) { throw new Exception(Exception::GENERAL_QUERY_INVALID, $validator->getDescription()); } diff --git a/app/controllers/api/users.php b/app/controllers/api/users.php index 87a8959f91..3856faeee0 100644 --- a/app/controllers/api/users.php +++ b/app/controllers/api/users.php @@ -11,7 +11,8 @@ use Appwrite\Stats\Stats; use Appwrite\Utopia\Database\Validator\CustomId; use Appwrite\Utopia\Database\Validator\Queries; use Appwrite\Utopia\Database\Validator\Queries\Users; -use Appwrite\Utopia\Database\Validator\Queries\LimitOffsetQuery; +use Appwrite\Utopia\Database\Validator\Query\Limit; +use Appwrite\Utopia\Database\Validator\Query\Offset; use Appwrite\Utopia\Response; use Utopia\App; use Utopia\Audit\Audit; @@ -574,7 +575,7 @@ App::get('/v1/users/:userId/logs') ->label('sdk.response.type', Response::CONTENT_TYPE_JSON) ->label('sdk.response.model', Response::MODEL_LOG_LIST) ->param('userId', '', new UID(), 'User ID.') - ->param('queries', [], new Queries(new LimitOffsetQuery()), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/databases#querying-documents). Only supported methods are limit and offset', true) + ->param('queries', [], new Queries(new Limit(), new Offset()), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/databases#querying-documents). Only supported methods are limit and offset', true) ->inject('response') ->inject('dbForProject') ->inject('locale') diff --git a/src/Appwrite/Utopia/Database/Validator/IndexedQueries.php b/src/Appwrite/Utopia/Database/Validator/IndexedQueries.php index f1f3e62eb9..1cc0429018 100644 --- a/src/Appwrite/Utopia/Database/Validator/IndexedQueries.php +++ b/src/Appwrite/Utopia/Database/Validator/IndexedQueries.php @@ -2,11 +2,10 @@ namespace Appwrite\Utopia\Database\Validator; -use Appwrite\Utopia\Database\Validator\Queries; +use Appwrite\Utopia\Database\Validator\Query\Base; use Utopia\Database\Database; use Utopia\Database\Document; use Utopia\Database\Query; -use Utopia\Database\Validator\Query as QueryValidator; class IndexedQueries extends Queries { @@ -25,18 +24,13 @@ class IndexedQueries extends Queries * * This Queries Validator filters indexes for only available indexes * - * @param QueryValidator $validator * @param Document[] $attributes * @param Document[] $indexes + * @param Base ...$validators * @param bool $strict */ - public function __construct($validator, $attributes = [], $indexes = []) + public function __construct($attributes = [], $indexes = [], Base ...$validators) { - // Remove failed/stuck/processing indexes - $availableIndexes = \array_filter($indexes, function ($index) { - return $index->getAttribute('status') === 'available'; - }); - $this->attributes = $attributes; $this->indexes[] = new Document([ @@ -58,7 +52,7 @@ class IndexedQueries extends Queries $this->indexes[] = $index; } - parent::__construct($validator); + parent::__construct(...$validators); } /** diff --git a/src/Appwrite/Utopia/Database/Validator/Queries.php b/src/Appwrite/Utopia/Database/Validator/Queries.php index 826f783c4d..ec77971496 100644 --- a/src/Appwrite/Utopia/Database/Validator/Queries.php +++ b/src/Appwrite/Utopia/Database/Validator/Queries.php @@ -2,9 +2,8 @@ namespace Appwrite\Utopia\Database\Validator; +use Appwrite\Utopia\Database\Validator\Query\Base; use Utopia\Validator; -use Utopia\Database\Document; -use Utopia\Database\Validator\Query as QueryValidator; use Utopia\Database\Query; class Queries extends Validator @@ -15,22 +14,18 @@ class Queries extends Validator protected $message = 'Invalid queries'; /** - * @var QueryValidator + * @var Base[] */ - protected $validator; + protected $validators; /** * Queries constructor * - * @param $validators - a list of validators + * @param Base ...$validators a list of validators */ - public function __construct(Limit $limit = null, Offset $offset = null, Order $order = null, Cursor $cursor = null, Filter $filter = null) + public function __construct(Base ...$validators) { - $this->limit = $limit; - $this->offset = $offset; - $this->order = $order; - $this->filter = $filter; - $this->cursor = $cursor; + $this->validators = $validators; } /** @@ -58,7 +53,6 @@ class Queries extends Validator */ public function isValid($value): bool { - $queries = []; foreach ($value as $query) { if (!$query instanceof Query) { try { @@ -70,23 +64,52 @@ class Queries extends Validator } $method = $query->getMethod(); + $methodType = ''; switch ($method) { case Query::TYPE_LIMIT: - $validator = $this->limit; + $methodType = Base::METHOD_TYPE_LIMIT; + break; case Query::TYPE_OFFSET: - $validator = $this->offset; - case Query::TYPE_ORDER: - $validator = $this->order; + $methodType = Base::METHOD_TYPE_OFFSET; + break; + case Query::TYPE_CURSORAFTER: + case Query::TYPE_CURSORBEFORE: + $methodType = Base::METHOD_TYPE_CURSOR; + break; + case Query::TYPE_ORDERASC: + case Query::TYPE_ORDERDESC: + $methodType = Base::METHOD_TYPE_ORDER; + break; + case Query::TYPE_EQUAL: + case Query::TYPE_NOTEQUAL: + case Query::TYPE_LESSER: + case Query::TYPE_LESSEREQUAL: + case Query::TYPE_GREATER: + case Query::TYPE_GREATEREQUAL: + case Query::TYPE_SEARCH: + $methodType = Base::METHOD_TYPE_FILTER; + break; default: - return false; - } - - if ($validator && !$validator->isValid($query)) { - $this->message = 'Query not valid: ' . $this->validator->getDescription(); - return false; + break; } - $queries[] = $query; + $methodIsValid = false; + foreach ($this->validators as $validator) { + if ($validator->getMethodType() !== $methodType) { + continue; + } + if (!$validator->isValid($query)) { + $this->message = 'Query not valid: ' . $validator->getDescription(); + return false; + } + + $methodIsValid = true; + } + + if (!$methodIsValid) { + $this->message = 'Query method not valid: ' . $method; + return false; + } } return true; diff --git a/src/Appwrite/Utopia/Database/Validator/Queries/Collection.php b/src/Appwrite/Utopia/Database/Validator/Queries/Collection.php index dffaabee6d..0c29ecd2ff 100644 --- a/src/Appwrite/Utopia/Database/Validator/Queries/Collection.php +++ b/src/Appwrite/Utopia/Database/Validator/Queries/Collection.php @@ -2,13 +2,17 @@ namespace Appwrite\Utopia\Database\Validator\Queries; +use Appwrite\Utopia\Database\Validator\IndexedQueries; +use Appwrite\Utopia\Database\Validator\Query\Limit; +use Appwrite\Utopia\Database\Validator\Query\Offset; +use Appwrite\Utopia\Database\Validator\Query\Cursor; +use Appwrite\Utopia\Database\Validator\Query\Filter; +use Appwrite\Utopia\Database\Validator\Query\Order; use Utopia\Config\Config; use Utopia\Database\Database; use Utopia\Database\Document; -use Utopia\Database\Validator\Queries as QueriesValidator; -use Utopia\Database\Validator\Query as QueryValidator; -class Collection extends QueriesValidator +class Collection extends IndexedQueries { /** * Expression constructor @@ -39,6 +43,22 @@ class Collection extends QueriesValidator ]); } + $attributes[] = new Document([ + 'key' => '$id', + 'type' => Database::VAR_STRING, + 'array' => false, + ]); + $attributes[] = new Document([ + '$id' => '$createdAt', + 'type' => Database::VAR_DATETIME, + 'array' => false, + ]); + $attributes[] = new Document([ + '$id' => '$updatedAt', + 'type' => Database::VAR_DATETIME, + 'array' => false, + ]); + $indexes = []; foreach ($allowedAttributes as $attribute) { $indexes[] = new Document([ @@ -53,6 +73,14 @@ class Collection extends QueriesValidator 'attributes' => ['search'] ]); - parent::__construct(new QueryValidator($attributes), $attributes, $indexes, true); + $validators = [ + new Limit(), + new Offset(), + new Cursor(), + new Filter($attributes), + new Order($attributes), + ]; + + parent::__construct($attributes, $indexes, ...$validators); } -} \ No newline at end of file +} diff --git a/src/Appwrite/Utopia/Database/Validator/Queries/Users.php b/src/Appwrite/Utopia/Database/Validator/Queries/Users.php index b61ec9c086..ffe30f1209 100644 --- a/src/Appwrite/Utopia/Database/Validator/Queries/Users.php +++ b/src/Appwrite/Utopia/Database/Validator/Queries/Users.php @@ -7,9 +7,6 @@ use Appwrite\Utopia\Database\Validator\Queries\Collection; class Users extends Collection { public const ALLOWED_ATTRIBUTES = [ - '$id', - '$createdAt', - '$updatedAt', 'name', 'email', 'phone', @@ -18,6 +15,7 @@ class Users extends Collection 'registration', 'emailVerification', 'phoneVerification', + 'search', ]; /** @@ -28,4 +26,4 @@ class Users extends Collection { parent::__construct('users', self::ALLOWED_ATTRIBUTES); } -} \ No newline at end of file +} diff --git a/src/Appwrite/Utopia/Database/Validator/Query/Base.php b/src/Appwrite/Utopia/Database/Validator/Query/Base.php new file mode 100644 index 0000000000..b23d594ea7 --- /dev/null +++ b/src/Appwrite/Utopia/Database/Validator/Query/Base.php @@ -0,0 +1,70 @@ +message; + } + + /** + * Is array + * + * Function will return true if object is array. + * + * @return bool + */ + public function isArray(): bool + { + return false; + } + + /** + * Get Type + * + * Returns validator type. + * + * @return string + */ + public function getType(): string + { + return self::TYPE_OBJECT; + } + + /** + * Is valid. + * + * @param Query $value + * + * @return bool + */ + abstract public function isValid($query): bool; + + /** + * Returns what type of query this Validator is for + */ + abstract public function getMethodType(): string; +} diff --git a/src/Appwrite/Utopia/Database/Validator/Query/Cursor.php b/src/Appwrite/Utopia/Database/Validator/Query/Cursor.php index 0fb77ee0b6..42bff08a1d 100644 --- a/src/Appwrite/Utopia/Database/Validator/Query/Cursor.php +++ b/src/Appwrite/Utopia/Database/Validator/Query/Cursor.php @@ -2,17 +2,12 @@ namespace Appwrite\Utopia\Database\Validator\Query; -use Utopia\Validator; +use Appwrite\Utopia\Database\Validator\Query\Base; use Utopia\Database\Query; use Utopia\Database\Validator\UID; -class Cursor extends Validator +class Cursor extends Base { - /** - * @var string - */ - protected $message = 'Invalid query'; - /** * Is valid. * @@ -41,4 +36,9 @@ class Cursor extends Validator return false; } + + public function getMethodType(): string + { + return self::METHOD_TYPE_CURSOR; + } } diff --git a/src/Appwrite/Utopia/Database/Validator/Query/Filter.php b/src/Appwrite/Utopia/Database/Validator/Query/Filter.php index e32b3aab66..096d036907 100644 --- a/src/Appwrite/Utopia/Database/Validator/Query/Filter.php +++ b/src/Appwrite/Utopia/Database/Validator/Query/Filter.php @@ -2,11 +2,11 @@ namespace Appwrite\Utopia\Database\Validator\Query; -use Utopia\Validator; +use Appwrite\Utopia\Database\Validator\Query\Base; use Utopia\Database\Database; use Utopia\Database\Query; -class Filter extends Validator +class Filter extends Base { /** * @var string @@ -92,11 +92,6 @@ class Filter extends Validator $attribute = $query->getAttribute(); switch ($method) { - // Do we support contains ? - // case Query::TYPE_CONTAINS: - // $values = $query->getValues(); - // return $this->isValidContains($attribute, $values); - case Query::TYPE_EQUAL: case Query::TYPE_NOTEQUAL: case Query::TYPE_LESSER: @@ -111,4 +106,9 @@ class Filter extends Validator return false; } } + + public function getMethodType(): string + { + return self::METHOD_TYPE_FILTER; + } } diff --git a/src/Appwrite/Utopia/Database/Validator/Query/Limit.php b/src/Appwrite/Utopia/Database/Validator/Query/Limit.php index 63f681f7d9..232df93666 100644 --- a/src/Appwrite/Utopia/Database/Validator/Query/Limit.php +++ b/src/Appwrite/Utopia/Database/Validator/Query/Limit.php @@ -2,17 +2,12 @@ namespace Appwrite\Utopia\Database\Validator\Query; +use Appwrite\Utopia\Database\Validator\Query\Base; use Utopia\Database\Query; use Utopia\Validator\Range; -use Utopia\Validator; -class Limit extends Validator +class Limit extends Base { - /** - * @var string - */ - protected $message = 'Invalid query'; - protected int $maxLimit; /** @@ -25,18 +20,6 @@ class Limit extends Validator $this->maxLimit = $maxLimit; } - /** - * Get Description. - * - * Returns validator description - * - * @return string - */ - public function getDescription(): string - { - return $this->message; - } - protected function isValidLimit($limit): bool { $validator = new Range(0, $this->maxLimit); @@ -62,7 +45,7 @@ class Limit extends Validator // Validate method $method = $query->getMethod(); - if ($method !== Query::LIMIT) { + if ($method !== Query::TYPE_LIMIT) { $this->message = 'Query method invalid: ' . $method; return false; } @@ -71,27 +54,8 @@ class Limit extends Validator return $this->isValidLimit($limit); } - /** - * Is array - * - * Function will return true if object is array. - * - * @return bool - */ - public function isArray(): bool + public function getMethodType(): string { - return false; - } - - /** - * Get Type - * - * Returns validator type. - * - * @return string - */ - public function getType(): string - { - return self::TYPE_OBJECT; + return self::METHOD_TYPE_LIMIT; } } diff --git a/src/Appwrite/Utopia/Database/Validator/Query/Offset.php b/src/Appwrite/Utopia/Database/Validator/Query/Offset.php index a319c91502..9f832a7c62 100644 --- a/src/Appwrite/Utopia/Database/Validator/Query/Offset.php +++ b/src/Appwrite/Utopia/Database/Validator/Query/Offset.php @@ -2,17 +2,12 @@ namespace Appwrite\Utopia\Database\Validator\Query; +use Appwrite\Utopia\Database\Validator\Query\Base; use Utopia\Database\Query; use Utopia\Validator\Range; -use Utopia\Validator; -class Offset extends Validator +class Offset extends Base { - /** - * @var string - */ - protected $message = 'Invalid query'; - protected int $maxOffset; /** @@ -25,18 +20,6 @@ class Offset extends Validator $this->maxOffset = $maxOffset; } - /** - * Get Description. - * - * Returns validator description - * - * @return string - */ - public function getDescription(): string - { - return $this->message; - } - protected function isValidOffset($offset): bool { $validator = new Range(0, $this->maxOffset); @@ -61,7 +44,7 @@ class Offset extends Validator { // Validate method $method = $query->getMethod(); - + if ($method !== Query::TYPE_OFFSET) { $this->message = 'Query method invalid: ' . $method; return false; @@ -71,27 +54,8 @@ class Offset extends Validator return $this->isValidOffset($offset); } - /** - * Is array - * - * Function will return true if object is array. - * - * @return bool - */ - public function isArray(): bool + public function getMethodType(): string { - return false; - } - - /** - * Get Type - * - * Returns validator type. - * - * @return string - */ - public function getType(): string - { - return self::TYPE_OBJECT; + return self::METHOD_TYPE_OFFSET; } } diff --git a/src/Appwrite/Utopia/Database/Validator/Query/Order.php b/src/Appwrite/Utopia/Database/Validator/Query/Order.php index 9ee40fa117..0c12d7ac44 100644 --- a/src/Appwrite/Utopia/Database/Validator/Query/Order.php +++ b/src/Appwrite/Utopia/Database/Validator/Query/Order.php @@ -2,16 +2,12 @@ namespace Appwrite\Utopia\Database\Validator\Query; +use Appwrite\Utopia\Database\Validator\Query\Base; use Utopia\Database\Query; use Utopia\Validator; -class Order extends Validator +class Order extends Base { - /** - * @var string - */ - protected $message = 'Invalid query'; - /** * @var array */ @@ -62,6 +58,11 @@ class Order extends Validator return $this->isValidAttribute($attribute); } - return parent::isValid($query); + return false; + } + + public function getMethodType(): string + { + return self::METHOD_TYPE_ORDER; } } diff --git a/tests/unit/Utopia/Database/Validator/IndexedQueriesTest.php b/tests/unit/Utopia/Database/Validator/IndexedQueriesTest.php new file mode 100644 index 0000000000..52375004ca --- /dev/null +++ b/tests/unit/Utopia/Database/Validator/IndexedQueriesTest.php @@ -0,0 +1,121 @@ +assertEquals(true, $validator->isValid([])); + } + + public function testInvalidQuery(): void + { + $validator = new IndexedQueries(); + + $this->assertEquals(false, $validator->isValid(["this.is.invalid"])); + } + + public function testInvalidMethod(): void + { + $validator = new IndexedQueries(); + $this->assertEquals(false, $validator->isValid(['equal("attr", "value")'])); + + $validator = new IndexedQueries([], [], new Limit()); + $this->assertEquals(false, $validator->isValid(['equal("attr", "value")'])); + } + + public function testInvalidValue(): void + { + $validator = new IndexedQueries([], [], new Limit()); + $this->assertEquals(false, $validator->isValid(['limit(-1)'])); + } + + public function testValid(): void + { + $attributes = [ + new Document([ + 'key' => 'name', + 'type' => Database::VAR_STRING, + 'array' => false, + ]), + ]; + $indexes = [ + new Document([ + 'status' => 'available', + 'type' => Database::INDEX_KEY, + 'attributes' => ['name'], + ]), + new Document([ + 'status' => 'available', + 'type' => Database::INDEX_FULLTEXT, + 'attributes' => ['name'], + ]), + ]; + $validator = new IndexedQueries( + $attributes, + $indexes, + new Cursor(), + new Filter($attributes), + new Limit(), + new Offset(), + new Order($attributes), + ); + $this->assertEquals(true, $validator->isValid(['cursorAfter("asdf")']), $validator->getDescription()); + $this->assertEquals(true, $validator->isValid(['equal("name", "value")']), $validator->getDescription()); + $this->assertEquals(true, $validator->isValid(['limit(10)']), $validator->getDescription()); + $this->assertEquals(true, $validator->isValid(['offset(10)']), $validator->getDescription()); + $this->assertEquals(true, $validator->isValid(['orderAsc("name")']), $validator->getDescription()); + $this->assertEquals(true, $validator->isValid(['search("name", "value")']), $validator->getDescription()); + } + + public function testMissingIndex(): void + { + $attributes = [ + new Document([ + 'key' => 'name', + 'type' => Database::VAR_STRING, + 'array' => false, + ]), + ]; + $indexes = [ + new Document([ + 'status' => 'available', + 'type' => Database::INDEX_KEY, + 'attributes' => ['name'], + ]), + ]; + $validator = new IndexedQueries( + $attributes, + $indexes, + new Cursor(), + new Filter($attributes), + new Limit(), + new Offset(), + new Order($attributes), + ); + $this->assertEquals(false, $validator->isValid(['equal("dne", "value")']), $validator->getDescription()); + $this->assertEquals(false, $validator->isValid(['orderAsc("dne")']), $validator->getDescription()); + $this->assertEquals(false, $validator->isValid(['search("name", "value")']), $validator->getDescription()); + } +} diff --git a/tests/unit/Utopia/Database/Validator/Queries/CollectionTest.php b/tests/unit/Utopia/Database/Validator/Queries/CollectionTest.php new file mode 100644 index 0000000000..198fc2895d --- /dev/null +++ b/tests/unit/Utopia/Database/Validator/Queries/CollectionTest.php @@ -0,0 +1,43 @@ +assertEquals($validator->isValid([]), true); + } + + public function testValid(): void + { + $validator = new Collection('users', ['name', 'search']); + $this->assertEquals(true, $validator->isValid(['cursorAfter("asdf")']), $validator->getDescription()); + $this->assertEquals(true, $validator->isValid(['equal("name", "value")']), $validator->getDescription()); + $this->assertEquals(true, $validator->isValid(['limit(10)']), $validator->getDescription()); + $this->assertEquals(true, $validator->isValid(['offset(10)']), $validator->getDescription()); + $this->assertEquals(true, $validator->isValid(['orderAsc("name")']), $validator->getDescription()); + $this->assertEquals(true, $validator->isValid(['search("search", "value")']), $validator->getDescription()); + } + + public function testMissingIndex(): void + { + $validator = new Collection('users', ['name']); + $this->assertEquals(false, $validator->isValid(['equal("dne", "value")']), $validator->getDescription()); + $this->assertEquals(false, $validator->isValid(['orderAsc("dne")']), $validator->getDescription()); + $this->assertEquals(false, $validator->isValid(['search("search", "value")']), $validator->getDescription()); + } +} diff --git a/tests/unit/Utopia/Database/Validator/Queries/LimitOffsetCursorFilterOrderQueryTest.php b/tests/unit/Utopia/Database/Validator/Queries/LimitOffsetCursorFilterOrderQueryTest.php deleted file mode 100644 index c46911b30e..0000000000 --- a/tests/unit/Utopia/Database/Validator/Queries/LimitOffsetCursorFilterOrderQueryTest.php +++ /dev/null @@ -1,94 +0,0 @@ -validator = new LimitOffsetCursorFilterOrderQuery( - attributes: [ - new Document([ - 'key' => 'attr', - 'type' => Database::VAR_STRING, - 'array' => false, - ]), - ], - ); - } - - public function tearDown(): void - { - } - - public function testValue(): void - { - // Test for Success - $this->assertEquals($this->validator->isValid(Query::limit(1)), true, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::limit(0)), true, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::limit(100)), true, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::offset(1)), true, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::offset(0)), true, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::offset(5000)), true, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(new Query(Query::TYPE_CURSORAFTER, values: ['asdf'])), true, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(new Query(Query::TYPE_CURSORBEFORE, values: ['asdf'])), true, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::equal('attr', ['v'])), true, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::orderAsc('attr')), true, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::orderAsc('')), true, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::orderDesc('attr')), true, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::orderDesc('')), true, $this->validator->getDescription()); - - // Test for Failure - $this->assertEquals($this->validator->isValid(Query::limit(-1)), false, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::limit(101)), false, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::offset(-1)), false, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::offset(5001)), false, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::equal('dne', ['v'])), false, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::equal('', ['v'])), false, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::orderDesc('dne')), false, $this->validator->getDescription()); - } - - public function testValues(): void - { - - $validator = new Queries($this->validator); - - // Test for Success - $this->assertEquals($validator->isValid(['limit(1)']), true, $validator->getDescription()); - $this->assertEquals($validator->isValid(['limit(0)']), true, $validator->getDescription()); - $this->assertEquals($validator->isValid(['limit(100)']), true, $validator->getDescription()); - $this->assertEquals($validator->isValid(['offset(1)']), true, $validator->getDescription()); - $this->assertEquals($validator->isValid(['offset(0)']), true, $validator->getDescription()); - $this->assertEquals($validator->isValid(['offset(5000)']), true, $validator->getDescription()); - $this->assertEquals($validator->isValid(['limit(25)', 'offset(25)']), true, $validator->getDescription()); - $this->assertEquals($validator->isValid(['cursorAfter("asdf")']), true, $validator->getDescription()); - $this->assertEquals($validator->isValid(['cursorBefore("asdf")']), true, $validator->getDescription()); - $this->assertEquals($validator->isValid(['equal("attr", "v")']), true, $validator->getDescription()); - $this->assertEquals($validator->isValid(['orderAsc("attr")']), true, $validator->getDescription()); - $this->assertEquals($validator->isValid(['orderAsc("")']), true, $validator->getDescription()); - $this->assertEquals($validator->isValid(['orderDesc("attr")']), true, $validator->getDescription()); - $this->assertEquals($validator->isValid(['orderDesc("")']), true, $validator->getDescription()); - - // Test for Failure - $this->assertEquals($validator->isValid(['limit(-1)']), false, $validator->getDescription()); - $this->assertEquals($validator->isValid(['limit(101)']), false, $validator->getDescription()); - $this->assertEquals($validator->isValid(['offset(-1)']), false, $validator->getDescription()); - $this->assertEquals($validator->isValid(['offset(5001)']), false, $validator->getDescription()); - $this->assertEquals($validator->isValid(['equal("dne", "v")']), false, $validator->getDescription()); - $this->assertEquals($validator->isValid(['equal("", "v")']), false, $validator->getDescription()); - $this->assertEquals($validator->isValid(['orderDesc("dne")']), false, $validator->getDescription()); - } -} diff --git a/tests/unit/Utopia/Database/Validator/Queries/LimitOffsetCursorFilterQueryTest.php b/tests/unit/Utopia/Database/Validator/Queries/LimitOffsetCursorFilterQueryTest.php deleted file mode 100644 index 1ae43ae37f..0000000000 --- a/tests/unit/Utopia/Database/Validator/Queries/LimitOffsetCursorFilterQueryTest.php +++ /dev/null @@ -1,88 +0,0 @@ -validator = new LimitOffsetCursorFilterQuery( - attributes: [ - new Document([ - 'key' => 'attr', - 'type' => Database::VAR_STRING, - 'array' => false, - ]), - ], - ); - } - - public function tearDown(): void - { - } - - public function testValue(): void - { - // Test for Success - $this->assertEquals($this->validator->isValid(Query::limit(1)), true, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::limit(0)), true, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::limit(100)), true, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::offset(1)), true, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::offset(0)), true, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::offset(5000)), true, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(new Query(Query::TYPE_CURSORAFTER, values: ['asdf'])), true, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(new Query(Query::TYPE_CURSORBEFORE, values: ['asdf'])), true, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::equal('attr', ['v'])), true, $this->validator->getDescription()); - - // Test for Failure - $this->assertEquals($this->validator->isValid(Query::limit(-1)), false, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::limit(101)), false, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::offset(-1)), false, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::offset(5001)), false, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::orderAsc('attr')), false, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::orderDesc('attr')), false, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::equal('dne', ['v'])), false, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::equal('', ['v'])), false, $this->validator->getDescription()); - } - - public function testValues(): void - { - - $validator = new Queries($this->validator); - - // Test for Success - $this->assertEquals($validator->isValid(['limit(1)']), true, $validator->getDescription()); - $this->assertEquals($validator->isValid(['limit(0)']), true, $validator->getDescription()); - $this->assertEquals($validator->isValid(['limit(100)']), true, $validator->getDescription()); - $this->assertEquals($validator->isValid(['offset(1)']), true, $validator->getDescription()); - $this->assertEquals($validator->isValid(['offset(0)']), true, $validator->getDescription()); - $this->assertEquals($validator->isValid(['offset(5000)']), true, $validator->getDescription()); - $this->assertEquals($validator->isValid(['limit(25)', 'offset(25)']), true, $validator->getDescription()); - $this->assertEquals($validator->isValid(['cursorAfter("asdf")']), true, $validator->getDescription()); - $this->assertEquals($validator->isValid(['cursorBefore("asdf")']), true, $validator->getDescription()); - $this->assertEquals($validator->isValid(['equal("attr", "v")']), true, $validator->getDescription()); - - // Test for Failure - $this->assertEquals($validator->isValid(['limit(-1)']), false, $validator->getDescription()); - $this->assertEquals($validator->isValid(['limit(101)']), false, $validator->getDescription()); - $this->assertEquals($validator->isValid(['offset(-1)']), false, $validator->getDescription()); - $this->assertEquals($validator->isValid(['offset(5001)']), false, $validator->getDescription()); - $this->assertEquals($validator->isValid(['orderAsc("attr")']), false, $validator->getDescription()); - $this->assertEquals($validator->isValid(['orderDesc("attr")']), false, $validator->getDescription()); - $this->assertEquals($validator->isValid(['equal("dne", "v")']), false, $validator->getDescription()); - $this->assertEquals($validator->isValid(['equal("", "v")']), false, $validator->getDescription()); - } -} diff --git a/tests/unit/Utopia/Database/Validator/Queries/LimitOffsetCursorQueryTest.php b/tests/unit/Utopia/Database/Validator/Queries/LimitOffsetCursorQueryTest.php deleted file mode 100644 index 77e6a1e257..0000000000 --- a/tests/unit/Utopia/Database/Validator/Queries/LimitOffsetCursorQueryTest.php +++ /dev/null @@ -1,74 +0,0 @@ -validator = new LimitOffsetCursorQuery(); - } - - public function tearDown(): void - { - } - - public function testValue(): void - { - // Test for Success - $this->assertEquals($this->validator->isValid(Query::limit(1)), true, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::limit(0)), true, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::limit(100)), true, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::offset(1)), true, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::offset(0)), true, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::offset(5000)), true, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(new Query(Query::TYPE_CURSORAFTER, values: ['asdf'])), true, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(new Query(Query::TYPE_CURSORBEFORE, values: ['asdf'])), true, $this->validator->getDescription()); - - // Test for Failure - $this->assertEquals($this->validator->isValid(Query::limit(-1)), false, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::limit(101)), false, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::offset(-1)), false, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::offset(5001)), false, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::equal('attr', ['v'])), false, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::orderAsc('attr')), false, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::orderDesc('attr')), false, $this->validator->getDescription()); - } - - public function testValues(): void - { - - $validator = new Queries($this->validator); - - // Test for Success - $this->assertEquals($validator->isValid(['limit(1)']), true, $validator->getDescription()); - $this->assertEquals($validator->isValid(['limit(0)']), true, $validator->getDescription()); - $this->assertEquals($validator->isValid(['limit(100)']), true, $validator->getDescription()); - $this->assertEquals($validator->isValid(['offset(1)']), true, $validator->getDescription()); - $this->assertEquals($validator->isValid(['offset(0)']), true, $validator->getDescription()); - $this->assertEquals($validator->isValid(['offset(5000)']), true, $validator->getDescription()); - $this->assertEquals($validator->isValid(['limit(25)', 'offset(25)']), true, $validator->getDescription()); - $this->assertEquals($validator->isValid(['cursorAfter("asdf")']), true, $validator->getDescription()); - $this->assertEquals($validator->isValid(['cursorBefore("asdf")']), true, $validator->getDescription()); - - // Test for Failure - $this->assertEquals($validator->isValid(['limit(-1)']), false, $validator->getDescription()); - $this->assertEquals($validator->isValid(['limit(101)']), false, $validator->getDescription()); - $this->assertEquals($validator->isValid(['offset(-1)']), false, $validator->getDescription()); - $this->assertEquals($validator->isValid(['offset(5001)']), false, $validator->getDescription()); - $this->assertEquals($validator->isValid(['equal("attr", "v")']), false, $validator->getDescription()); - $this->assertEquals($validator->isValid(['orderAsc("attr")']), false, $validator->getDescription()); - $this->assertEquals($validator->isValid(['orderDesc("attr")']), false, $validator->getDescription()); - } -} diff --git a/tests/unit/Utopia/Database/Validator/Queries/LimitOffsetQueryTest.php b/tests/unit/Utopia/Database/Validator/Queries/LimitOffsetQueryTest.php deleted file mode 100644 index 724a1e5939..0000000000 --- a/tests/unit/Utopia/Database/Validator/Queries/LimitOffsetQueryTest.php +++ /dev/null @@ -1,74 +0,0 @@ -validator = new LimitOffsetQuery(); - } - - public function tearDown(): void - { - } - - public function testValue(): void - { - // Test for Success - $this->assertEquals($this->validator->isValid(Query::limit(1)), true, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::limit(0)), true, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::limit(100)), true, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::offset(1)), true, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::offset(0)), true, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::offset(5000)), true, $this->validator->getDescription()); - - // Test for Failure - $this->assertEquals($this->validator->isValid(Query::limit(-1)), false, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::limit(101)), false, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::offset(-1)), false, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::offset(5001)), false, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(new Query(Query::TYPE_CURSORAFTER, values: ['asdf'])), false, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(new Query(Query::TYPE_CURSORBEFORE, values: ['asdf'])), false, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::equal('attr', ['v'])), false, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::orderAsc('attr')), false, $this->validator->getDescription()); - $this->assertEquals($this->validator->isValid(Query::orderDesc('attr')), false, $this->validator->getDescription()); - } - - public function testValues(): void - { - - $validator = new Queries($this->validator); - - // Test for Success - $this->assertEquals($validator->isValid(['limit(1)']), true, $validator->getDescription()); - $this->assertEquals($validator->isValid(['limit(0)']), true, $validator->getDescription()); - $this->assertEquals($validator->isValid(['limit(100)']), true, $validator->getDescription()); - $this->assertEquals($validator->isValid(['offset(1)']), true, $validator->getDescription()); - $this->assertEquals($validator->isValid(['offset(0)']), true, $validator->getDescription()); - $this->assertEquals($validator->isValid(['offset(5000)']), true, $validator->getDescription()); - $this->assertEquals($validator->isValid(['limit(25)', 'offset(25)']), true, $validator->getDescription()); - - // Test for Failure - $this->assertEquals($validator->isValid(['limit(-1)']), false, $validator->getDescription()); - $this->assertEquals($validator->isValid(['limit(101)']), false, $validator->getDescription()); - $this->assertEquals($validator->isValid(['offset(-1)']), false, $validator->getDescription()); - $this->assertEquals($validator->isValid(['offset(5001)']), false, $validator->getDescription()); - $this->assertEquals($validator->isValid(['cursorAfter("asdf")']), false, $validator->getDescription()); - $this->assertEquals($validator->isValid(['cursorBefore("asdf")']), false, $validator->getDescription()); - $this->assertEquals($validator->isValid(['equal("attr", "v")']), false, $validator->getDescription()); - $this->assertEquals($validator->isValid(['orderAsc("attr")']), false, $validator->getDescription()); - $this->assertEquals($validator->isValid(['orderDesc("attr")']), false, $validator->getDescription()); - } -} diff --git a/tests/unit/Utopia/Database/Validator/Queries/UsersTest.php b/tests/unit/Utopia/Database/Validator/Queries/UsersTest.php new file mode 100644 index 0000000000..24a818c128 --- /dev/null +++ b/tests/unit/Utopia/Database/Validator/Queries/UsersTest.php @@ -0,0 +1,40 @@ +assertEquals(true, $validator->isValid([]), $validator->getDescription()); + $this->assertEquals(true, $validator->isValid(['equal("name", "value")']), $validator->getDescription()); + $this->assertEquals(true, $validator->isValid(['equal("email", "value")']), $validator->getDescription()); + $this->assertEquals(true, $validator->isValid(['equal("phone", "value")']), $validator->getDescription()); + $this->assertEquals(true, $validator->isValid(['greaterThan("passwordUpdate", "2020-10-15 06:38")']), $validator->getDescription()); + $this->assertEquals(true, $validator->isValid(['greaterThan("registration", "2020-10-15 06:38")']), $validator->getDescription()); + $this->assertEquals(true, $validator->isValid(['equal("emailVerification", true)']), $validator->getDescription()); + $this->assertEquals(true, $validator->isValid(['equal("phoneVerification", true)']), $validator->getDescription()); + $this->assertEquals(true, $validator->isValid(['search("search", "value")']), $validator->getDescription()); + + /** + * Test for Failure + */ + $this->assertEquals(false, $validator->isValid(['equal("password", "value")']), $validator->getDescription()); + } +} diff --git a/tests/unit/Utopia/Database/Validator/QueriesTest.php b/tests/unit/Utopia/Database/Validator/QueriesTest.php new file mode 100644 index 0000000000..55e04c2b84 --- /dev/null +++ b/tests/unit/Utopia/Database/Validator/QueriesTest.php @@ -0,0 +1,76 @@ +assertEquals(true, $validator->isValid([])); + } + + public function testInvalidQuery(): void + { + $validator = new Queries(); + + $this->assertEquals(false, $validator->isValid(["this.is.invalid"])); + } + + public function testInvalidMethod(): void + { + $validator = new Queries(); + $this->assertEquals(false, $validator->isValid(['equal("attr", "value")'])); + + $validator = new Queries(new Limit()); + $this->assertEquals(false, $validator->isValid(['equal("attr", "value")'])); + } + + public function testInvalidValue(): void + { + $validator = new Queries(new Limit()); + $this->assertEquals(false, $validator->isValid(['limit(-1)'])); + } + + public function testValid(): void + { + $attributes = [ + new Document([ + 'key' => 'name', + 'type' => Database::VAR_STRING, + 'array' => false, + ]) + ]; + $validator = new Queries( + new Cursor(), + new Filter($attributes), + new Limit(), + new Offset(), + new Order($attributes), + ); + $this->assertEquals(true, $validator->isValid(['cursorAfter("asdf")']), $validator->getDescription()); + $this->assertEquals(true, $validator->isValid(['equal("name", "value")']), $validator->getDescription()); + $this->assertEquals(true, $validator->isValid(['limit(10)']), $validator->getDescription()); + $this->assertEquals(true, $validator->isValid(['offset(10)']), $validator->getDescription()); + $this->assertEquals(true, $validator->isValid(['orderAsc("name")']), $validator->getDescription()); + } +} diff --git a/tests/unit/Utopia/Database/Validator/Query/CursorTest.php b/tests/unit/Utopia/Database/Validator/Query/CursorTest.php new file mode 100644 index 0000000000..0afc8baddd --- /dev/null +++ b/tests/unit/Utopia/Database/Validator/Query/CursorTest.php @@ -0,0 +1,41 @@ +validator = new Cursor(); + } + + public function tearDown(): void + { + } + + public function testValue(): void + { + // Test for Success + $this->assertEquals($this->validator->isValid(new Query(Query::TYPE_CURSORAFTER, values: ['asdf'])), true, $this->validator->getDescription()); + $this->assertEquals($this->validator->isValid(new Query(Query::TYPE_CURSORBEFORE, values: ['asdf'])), true, $this->validator->getDescription()); + + // Test for Failure + $this->assertEquals($this->validator->isValid(Query::limit(-1)), false, $this->validator->getDescription()); + $this->assertEquals($this->validator->isValid(Query::limit(101)), false, $this->validator->getDescription()); + $this->assertEquals($this->validator->isValid(Query::offset(-1)), false, $this->validator->getDescription()); + $this->assertEquals($this->validator->isValid(Query::offset(5001)), false, $this->validator->getDescription()); + $this->assertEquals($this->validator->isValid(Query::equal('attr', ['v'])), false, $this->validator->getDescription()); + $this->assertEquals($this->validator->isValid(Query::orderAsc('attr')), false, $this->validator->getDescription()); + $this->assertEquals($this->validator->isValid(Query::orderDesc('attr')), false, $this->validator->getDescription()); + } +} diff --git a/tests/unit/Utopia/Database/Validator/Query/FilterTest.php b/tests/unit/Utopia/Database/Validator/Query/FilterTest.php new file mode 100644 index 0000000000..8f2f1d44ba --- /dev/null +++ b/tests/unit/Utopia/Database/Validator/Query/FilterTest.php @@ -0,0 +1,59 @@ +validator = new Filter( + attributes: [ + new Document([ + 'key' => 'attr', + 'type' => Database::VAR_STRING, + 'array' => false, + ]), + ], + ); + } + + public function tearDown(): void + { + } + + public function testValue(): void + { + // Test for Success + $this->assertEquals($this->validator->isValid(Query::equal('attr', ['v'])), true, $this->validator->getDescription()); + + // Test for Failure + $this->assertEquals($this->validator->isValid(Query::limit(1)), false, $this->validator->getDescription()); + $this->assertEquals($this->validator->isValid(Query::limit(0)), false, $this->validator->getDescription()); + $this->assertEquals($this->validator->isValid(Query::limit(100)), false, $this->validator->getDescription()); + $this->assertEquals($this->validator->isValid(Query::limit(-1)), false, $this->validator->getDescription()); + $this->assertEquals($this->validator->isValid(Query::limit(101)), false, $this->validator->getDescription()); + $this->assertEquals($this->validator->isValid(Query::offset(1)), false, $this->validator->getDescription()); + $this->assertEquals($this->validator->isValid(Query::offset(0)), false, $this->validator->getDescription()); + $this->assertEquals($this->validator->isValid(Query::offset(5000)), false, $this->validator->getDescription()); + $this->assertEquals($this->validator->isValid(Query::offset(-1)), false, $this->validator->getDescription()); + $this->assertEquals($this->validator->isValid(Query::offset(5001)), false, $this->validator->getDescription()); + $this->assertEquals($this->validator->isValid(Query::equal('dne', ['v'])), false, $this->validator->getDescription()); + $this->assertEquals($this->validator->isValid(Query::equal('', ['v'])), false, $this->validator->getDescription()); + $this->assertEquals($this->validator->isValid(Query::orderAsc('attr')), false, $this->validator->getDescription()); + $this->assertEquals($this->validator->isValid(Query::orderDesc('attr')), false, $this->validator->getDescription()); + $this->assertEquals($this->validator->isValid(new Query(Query::TYPE_CURSORAFTER, values: ['asdf'])), false, $this->validator->getDescription()); + $this->assertEquals($this->validator->isValid(new Query(Query::TYPE_CURSORBEFORE, values: ['asdf'])), false, $this->validator->getDescription()); + } +} diff --git a/tests/unit/Utopia/Database/Validator/Query/LimitTest.php b/tests/unit/Utopia/Database/Validator/Query/LimitTest.php new file mode 100644 index 0000000000..e37cb49624 --- /dev/null +++ b/tests/unit/Utopia/Database/Validator/Query/LimitTest.php @@ -0,0 +1,37 @@ +validator = new Limit(); + } + + public function tearDown(): void + { + } + + public function testValue(): void + { + // Test for Success + $this->assertEquals($this->validator->isValid(Query::limit(1)), true, $this->validator->getDescription()); + $this->assertEquals($this->validator->isValid(Query::limit(0)), true, $this->validator->getDescription()); + $this->assertEquals($this->validator->isValid(Query::limit(100)), true, $this->validator->getDescription()); + + // Test for Failure + $this->assertEquals($this->validator->isValid(Query::limit(-1)), false, $this->validator->getDescription()); + $this->assertEquals($this->validator->isValid(Query::limit(101)), false, $this->validator->getDescription()); + } +} diff --git a/tests/unit/Utopia/Database/Validator/Query/OffsetTest.php b/tests/unit/Utopia/Database/Validator/Query/OffsetTest.php new file mode 100644 index 0000000000..8f7010c718 --- /dev/null +++ b/tests/unit/Utopia/Database/Validator/Query/OffsetTest.php @@ -0,0 +1,41 @@ +validator = new Offset(); + } + + public function tearDown(): void + { + } + + public function testValue(): void + { + // Test for Success + $this->assertEquals($this->validator->isValid(Query::offset(1)), true, $this->validator->getDescription()); + $this->assertEquals($this->validator->isValid(Query::offset(0)), true, $this->validator->getDescription()); + $this->assertEquals($this->validator->isValid(Query::offset(5000)), true, $this->validator->getDescription()); + + // Test for Failure + $this->assertEquals($this->validator->isValid(Query::offset(-1)), false, $this->validator->getDescription()); + $this->assertEquals($this->validator->isValid(Query::offset(5001)), false, $this->validator->getDescription()); + $this->assertEquals($this->validator->isValid(Query::equal('attr', ['v'])), false, $this->validator->getDescription()); + $this->assertEquals($this->validator->isValid(Query::orderAsc('attr')), false, $this->validator->getDescription()); + $this->assertEquals($this->validator->isValid(Query::orderDesc('attr')), false, $this->validator->getDescription()); + $this->assertEquals($this->validator->isValid(Query::limit(100)), false, $this->validator->getDescription()); + } +} diff --git a/tests/unit/Utopia/Database/Validator/Query/OrderTest.php b/tests/unit/Utopia/Database/Validator/Query/OrderTest.php new file mode 100644 index 0000000000..e60b7ce9b9 --- /dev/null +++ b/tests/unit/Utopia/Database/Validator/Query/OrderTest.php @@ -0,0 +1,54 @@ +validator = new Order( + attributes: [ + new Document([ + 'key' => 'attr', + 'type' => Database::VAR_STRING, + 'array' => false, + ]), + ], + ); + } + + public function tearDown(): void + { + } + + public function testValue(): void + { + // Test for Success + $this->assertEquals($this->validator->isValid(Query::orderAsc('attr')), true, $this->validator->getDescription()); + $this->assertEquals($this->validator->isValid(Query::orderAsc('')), true, $this->validator->getDescription()); + $this->assertEquals($this->validator->isValid(Query::orderDesc('attr')), true, $this->validator->getDescription()); + $this->assertEquals($this->validator->isValid(Query::orderDesc('')), true, $this->validator->getDescription()); + + // Test for Failure + $this->assertEquals($this->validator->isValid(Query::limit(-1)), false, $this->validator->getDescription()); + $this->assertEquals($this->validator->isValid(Query::limit(101)), false, $this->validator->getDescription()); + $this->assertEquals($this->validator->isValid(Query::offset(-1)), false, $this->validator->getDescription()); + $this->assertEquals($this->validator->isValid(Query::offset(5001)), false, $this->validator->getDescription()); + $this->assertEquals($this->validator->isValid(Query::equal('attr', ['v'])), false, $this->validator->getDescription()); + $this->assertEquals($this->validator->isValid(Query::equal('dne', ['v'])), false, $this->validator->getDescription()); + $this->assertEquals($this->validator->isValid(Query::equal('', ['v'])), false, $this->validator->getDescription()); + $this->assertEquals($this->validator->isValid(Query::orderDesc('dne')), false, $this->validator->getDescription()); + } +}