2020-01-13 08:46:09 +00:00
< ? php
2022-06-22 10:51:49 +00:00
namespace Tests\E2E\Services\Databases ;
2020-01-13 08:46:09 +00:00
2023-02-27 07:47:20 +00:00
use Appwrite\Extend\Exception as AppwriteException ;
2024-03-06 17:34:21 +00:00
use Tests\E2E\Client ;
2020-01-13 08:46:09 +00:00
use Tests\E2E\Scopes\ProjectCustom ;
use Tests\E2E\Scopes\Scope ;
use Tests\E2E\Scopes\SideServer ;
2024-04-23 03:20:25 +00:00
use Utopia\Database\Database ;
2023-12-20 10:55:09 +00:00
use Utopia\Database\Document ;
2024-04-23 03:20:25 +00:00
use Utopia\Database\Exception ;
2022-12-14 15:42:25 +00:00
use Utopia\Database\Helpers\ID ;
2022-12-14 16:04:06 +00:00
use Utopia\Database\Helpers\Permission ;
use Utopia\Database\Helpers\Role ;
2023-12-20 10:55:09 +00:00
use Utopia\Database\Query ;
2020-01-13 08:46:09 +00:00
2022-06-22 10:51:49 +00:00
class DatabasesCustomServerTest extends Scope
2020-01-13 08:46:09 +00:00
{
2022-06-22 10:51:49 +00:00
use DatabasesBase ;
2020-01-13 08:46:09 +00:00
use ProjectCustom ;
use SideServer ;
2020-12-05 05:31:59 +00:00
2022-06-22 10:51:49 +00:00
public function testListDatabases ()
{
$test1 = $this -> client -> call ( Client :: METHOD_POST , '/databases' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
2022-08-14 10:33:36 +00:00
'databaseId' => ID :: custom ( 'first' ),
2022-06-22 10:51:49 +00:00
'name' => 'Test 1' ,
]);
2023-05-18 13:25:22 +00:00
2022-06-22 10:51:49 +00:00
$this -> assertEquals ( 201 , $test1 [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 'Test 1' , $test1 [ 'body' ][ 'name' ]);
$test2 = $this -> client -> call ( Client :: METHOD_POST , '/databases' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
2022-08-14 10:33:36 +00:00
'databaseId' => ID :: custom ( 'second' ),
2022-06-22 10:51:49 +00:00
'name' => 'Test 2' ,
]);
$this -> assertEquals ( 201 , $test2 [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 'Test 2' , $test2 [ 'body' ][ 'name' ]);
$databases = $this -> client -> call ( Client :: METHOD_GET , '/databases' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()));
$this -> assertEquals ( 2 , $databases [ 'body' ][ 'total' ]);
$this -> assertEquals ( $test1 [ 'body' ][ '$id' ], $databases [ 'body' ][ 'databases' ][ 0 ][ '$id' ]);
$this -> assertEquals ( $test2 [ 'body' ][ '$id' ], $databases [ 'body' ][ 'databases' ][ 1 ][ '$id' ]);
2022-08-24 12:43:07 +00:00
$base = array_reverse ( $databases [ 'body' ][ 'databases' ]);
$databases = $this -> client -> call ( Client :: METHOD_GET , '/databases' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
2023-12-20 10:55:09 +00:00
'queries' => [
Query :: limit ( 1 ) -> toString (),
],
2022-08-24 12:43:07 +00:00
]);
$this -> assertEquals ( 200 , $databases [ 'headers' ][ 'status-code' ]);
$this -> assertCount ( 1 , $databases [ 'body' ][ 'databases' ]);
$databases = $this -> client -> call ( Client :: METHOD_GET , '/databases' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
2023-12-20 10:55:09 +00:00
'queries' => [
Query :: offset ( 1 ) -> toString (),
],
2022-08-24 12:43:07 +00:00
]);
$this -> assertEquals ( 200 , $databases [ 'headers' ][ 'status-code' ]);
$this -> assertCount ( 1 , $databases [ 'body' ][ 'databases' ]);
$databases = $this -> client -> call ( Client :: METHOD_GET , '/databases' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
2023-12-20 10:55:09 +00:00
'queries' => [
Query :: equal ( 'name' , [ 'Test 1' , 'Test 2' ]) -> toString (),
],
2022-08-24 12:43:07 +00:00
]);
$this -> assertEquals ( 200 , $databases [ 'headers' ][ 'status-code' ]);
$this -> assertCount ( 2 , $databases [ 'body' ][ 'databases' ]);
$databases = $this -> client -> call ( Client :: METHOD_GET , '/databases' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
2023-12-20 10:55:09 +00:00
'queries' => [
Query :: equal ( 'name' , [ 'Test 2' ]) -> toString (),
],
2022-08-24 12:43:07 +00:00
]);
$this -> assertEquals ( 200 , $databases [ 'headers' ][ 'status-code' ]);
$this -> assertCount ( 1 , $databases [ 'body' ][ 'databases' ]);
$databases = $this -> client -> call ( Client :: METHOD_GET , '/databases' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
2023-12-20 10:55:09 +00:00
'queries' => [
Query :: equal ( '$id' , [ 'first' ]) -> toString (),
],
2022-08-24 12:43:07 +00:00
]);
$this -> assertEquals ( 200 , $databases [ 'headers' ][ 'status-code' ]);
$this -> assertCount ( 1 , $databases [ 'body' ][ 'databases' ]);
2022-06-22 10:51:49 +00:00
/**
* Test for Order
*/
$databases = $this -> client -> call ( Client :: METHOD_GET , '/databases' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
2023-12-20 10:55:09 +00:00
'queries' => [
Query :: orderDesc () -> toString (),
],
2022-06-22 10:51:49 +00:00
]);
$this -> assertEquals ( 2 , $databases [ 'body' ][ 'total' ]);
$this -> assertEquals ( $base [ 0 ][ '$id' ], $databases [ 'body' ][ 'databases' ][ 0 ][ '$id' ]);
$this -> assertEquals ( $base [ 1 ][ '$id' ], $databases [ 'body' ][ 'databases' ][ 1 ][ '$id' ]);
/**
* Test for After
*/
$base = $this -> client -> call ( Client :: METHOD_GET , '/databases' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()));
$databases = $this -> client -> call ( Client :: METHOD_GET , '/databases' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
2023-12-20 10:55:09 +00:00
'queries' => [
Query :: cursorAfter ( new Document ([ '$id' => $base [ 'body' ][ 'databases' ][ 0 ][ '$id' ]])) -> toString (),
],
2022-06-22 10:51:49 +00:00
]);
$this -> assertCount ( 1 , $databases [ 'body' ][ 'databases' ]);
$this -> assertEquals ( $base [ 'body' ][ 'databases' ][ 1 ][ '$id' ], $databases [ 'body' ][ 'databases' ][ 0 ][ '$id' ]);
$databases = $this -> client -> call ( Client :: METHOD_GET , '/databases' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
2023-12-20 10:55:09 +00:00
'queries' => [
Query :: cursorAfter ( new Document ([ '$id' => $base [ 'body' ][ 'databases' ][ 1 ][ '$id' ]])) -> toString (),
],
2022-06-22 10:51:49 +00:00
]);
$this -> assertCount ( 0 , $databases [ 'body' ][ 'databases' ]);
$this -> assertEmpty ( $databases [ 'body' ][ 'databases' ]);
/**
* Test for Before
*/
$base = $this -> client -> call ( Client :: METHOD_GET , '/databases' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()));
$databases = $this -> client -> call ( Client :: METHOD_GET , '/databases' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
2023-12-20 10:55:09 +00:00
'queries' => [
Query :: cursorBefore ( new Document ([ '$id' => $base [ 'body' ][ 'databases' ][ 1 ][ '$id' ]])) -> toString (),
],
2022-06-22 10:51:49 +00:00
]);
$this -> assertCount ( 1 , $databases [ 'body' ][ 'databases' ]);
$this -> assertEquals ( $base [ 'body' ][ 'databases' ][ 0 ][ '$id' ], $databases [ 'body' ][ 'databases' ][ 0 ][ '$id' ]);
$databases = $this -> client -> call ( Client :: METHOD_GET , '/databases' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
2023-12-20 10:55:09 +00:00
'queries' => [
Query :: cursorBefore ( new Document ([ '$id' => $base [ 'body' ][ 'databases' ][ 0 ][ '$id' ]])) -> toString (),
],
2022-06-22 10:51:49 +00:00
]);
$this -> assertCount ( 0 , $databases [ 'body' ][ 'databases' ]);
$this -> assertEmpty ( $databases [ 'body' ][ 'databases' ]);
/**
* Test for Search
*/
$databases = $this -> client -> call ( Client :: METHOD_GET , '/databases' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'search' => 'first'
]);
$this -> assertEquals ( 1 , $databases [ 'body' ][ 'total' ]);
$this -> assertEquals ( 'first' , $databases [ 'body' ][ 'databases' ][ 0 ][ '$id' ]);
$databases = $this -> client -> call ( Client :: METHOD_GET , '/databases' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'search' => 'Test'
]);
$this -> assertEquals ( 2 , $databases [ 'body' ][ 'total' ]);
$this -> assertEquals ( 'Test 1' , $databases [ 'body' ][ 'databases' ][ 0 ][ 'name' ]);
$this -> assertEquals ( 'Test 2' , $databases [ 'body' ][ 'databases' ][ 1 ][ 'name' ]);
$databases = $this -> client -> call ( Client :: METHOD_GET , '/databases' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'search' => 'Nonexistent'
]);
$this -> assertEquals ( 0 , $databases [ 'body' ][ 'total' ]);
/**
* Test for FAILURE
*/
$response = $this -> client -> call ( Client :: METHOD_GET , '/databases' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
2023-12-20 10:55:09 +00:00
'queries' => [
Query :: cursorAfter ( new Document ([ '$id' => 'unknown' ])) -> toString (),
],
2022-06-22 10:51:49 +00:00
]);
$this -> assertEquals ( 400 , $response [ 'headers' ][ 'status-code' ]);
// This collection already exists
$response = $this -> client -> call ( Client :: METHOD_POST , '/databases' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'name' => 'Test 1' ,
2022-08-14 10:33:36 +00:00
'databaseId' => ID :: custom ( 'first' ),
2022-06-22 10:51:49 +00:00
]);
$this -> assertEquals ( 409 , $response [ 'headers' ][ 'status-code' ]);
return [ 'databaseId' => $test1 [ 'body' ][ '$id' ]];
}
/**
* @ depends testListDatabases
*/
public function testGetDatabase ( array $data ) : array
{
$databaseId = $data [ 'databaseId' ];
/**
* Test for SUCCESS
*/
$database = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId , [
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]);
$this -> assertEquals ( 200 , $database [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( $databaseId , $database [ 'body' ][ '$id' ]);
$this -> assertEquals ( 'Test 1' , $database [ 'body' ][ 'name' ]);
2023-05-18 13:25:22 +00:00
$this -> assertEquals ( true , $database [ 'body' ][ 'enabled' ]);
2022-06-22 10:51:49 +00:00
return [ 'databaseId' => $database [ 'body' ][ '$id' ]];
}
2023-05-22 14:40:09 +00:00
/**
* @ depends testListDatabases
*/
public function testUpdateDatabase ( array $data )
{
$databaseId = $data [ 'databaseId' ];
$database = $this -> client -> call ( Client :: METHOD_PUT , '/databases/' . $databaseId , [
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
], [
'name' => 'Test 1 Updated' ,
2023-05-23 08:00:39 +00:00
'enabled' => false ,
]);
2023-05-22 14:40:09 +00:00
$this -> assertEquals ( 200 , $database [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 'Test 1 Updated' , $database [ 'body' ][ 'name' ]);
$this -> assertFalse ( $database [ 'body' ][ 'enabled' ]);
// Now update the database without the passing the enabled parameter
$database = $this -> client -> call ( Client :: METHOD_PUT , '/databases/' . $databaseId , [
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
2023-05-23 08:00:48 +00:00
], [
'name' => 'Test 1'
]);
2023-05-22 14:40:09 +00:00
$this -> assertEquals ( 200 , $database [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 'Test 1' , $database [ 'body' ][ 'name' ]);
$this -> assertTrue ( $database [ 'body' ][ 'enabled' ]);
}
2022-06-22 10:51:49 +00:00
/**
* @ depends testListDatabases
*/
public function testDeleteDatabase ( $data )
{
$databaseId = $data [ 'databaseId' ];
$response = $this -> client -> call ( Client :: METHOD_DELETE , '/databases/' . $databaseId , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
], $this -> getHeaders ()));
$this -> assertEquals ( 204 , $response [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( " " , $response [ 'body' ]);
// Try to get the collection and check if it has been deleted
$response = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ]
], $this -> getHeaders ()));
$this -> assertEquals ( 404 , $response [ 'headers' ][ 'status-code' ]);
}
2023-05-22 14:40:09 +00:00
public function testListCollections () : array
2021-08-09 14:54:10 +00:00
{
2022-06-22 10:51:49 +00:00
$database = $this -> client -> call ( Client :: METHOD_POST , '/databases' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
2022-08-14 10:33:36 +00:00
'databaseId' => ID :: unique (),
2022-06-22 10:51:49 +00:00
'name' => 'invalidDocumentDatabase' ,
]);
$this -> assertEquals ( 201 , $database [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 'invalidDocumentDatabase' , $database [ 'body' ][ 'name' ]);
2023-05-19 12:48:26 +00:00
$this -> assertTrue ( $database [ 'body' ][ 'enabled' ]);
2022-06-22 10:51:49 +00:00
$databaseId = $database [ 'body' ][ '$id' ];
2021-08-09 14:54:10 +00:00
/**
* Test for SUCCESS
*/
2022-06-22 10:51:49 +00:00
$test1 = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections' , array_merge ([
2021-08-09 14:54:10 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'name' => 'Test 1' ,
2022-08-14 10:33:36 +00:00
'collectionId' => ID :: custom ( 'first' ),
2022-08-03 04:17:49 +00:00
'permissions' => [
2022-08-14 05:21:11 +00:00
Permission :: read ( Role :: any ()),
Permission :: create ( Role :: any ()),
Permission :: update ( Role :: any ()),
Permission :: delete ( Role :: any ()),
2022-08-03 04:17:49 +00:00
],
'documentSecurity' => true ,
2021-08-09 14:54:10 +00:00
]);
2022-06-22 10:51:49 +00:00
$test2 = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections' , array_merge ([
2021-08-09 14:54:10 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'name' => 'Test 2' ,
2022-08-14 10:33:36 +00:00
'collectionId' => ID :: custom ( 'second' ),
2022-08-03 04:17:49 +00:00
'permissions' => [
2022-08-14 05:21:11 +00:00
Permission :: read ( Role :: any ()),
Permission :: create ( Role :: any ()),
Permission :: update ( Role :: any ()),
Permission :: delete ( Role :: any ()),
2022-08-03 04:17:49 +00:00
],
'documentSecurity' => true ,
2021-08-09 14:54:10 +00:00
]);
2022-06-22 10:51:49 +00:00
$collections = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections' , array_merge ([
2021-08-09 14:54:10 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()));
2022-02-27 09:57:09 +00:00
$this -> assertEquals ( 2 , $collections [ 'body' ][ 'total' ]);
2021-08-09 14:54:10 +00:00
$this -> assertEquals ( $test1 [ 'body' ][ '$id' ], $collections [ 'body' ][ 'collections' ][ 0 ][ '$id' ]);
2023-05-19 12:48:26 +00:00
$this -> assertEquals ( $test1 [ 'body' ][ 'enabled' ], $collections [ 'body' ][ 'collections' ][ 0 ][ 'enabled' ]);
2021-08-09 14:54:10 +00:00
$this -> assertEquals ( $test2 [ 'body' ][ '$id' ], $collections [ 'body' ][ 'collections' ][ 1 ][ '$id' ]);
2023-05-19 12:48:26 +00:00
$this -> assertEquals ( $test1 [ 'body' ][ 'enabled' ], $collections [ 'body' ][ 'collections' ][ 0 ][ 'enabled' ]);
2021-08-09 14:54:10 +00:00
2022-08-24 12:43:07 +00:00
$base = array_reverse ( $collections [ 'body' ][ 'collections' ]);
$collections = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
2023-12-20 10:55:09 +00:00
'queries' => [
Query :: limit ( 1 ) -> toString (),
],
2022-08-24 12:43:07 +00:00
]);
$this -> assertEquals ( 200 , $collections [ 'headers' ][ 'status-code' ]);
$this -> assertCount ( 1 , $collections [ 'body' ][ 'collections' ]);
$collections = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
2023-12-20 10:55:09 +00:00
'queries' => [
Query :: offset ( 1 ) -> toString (),
],
2022-08-24 12:43:07 +00:00
]);
$this -> assertEquals ( 200 , $collections [ 'headers' ][ 'status-code' ]);
$this -> assertCount ( 1 , $collections [ 'body' ][ 'collections' ]);
$collections = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
2023-12-20 10:55:09 +00:00
'queries' => [
Query :: equal ( 'enabled' , [ true ]) -> toString (),
],
2022-08-24 12:43:07 +00:00
]);
$this -> assertEquals ( 200 , $collections [ 'headers' ][ 'status-code' ]);
$this -> assertCount ( 2 , $collections [ 'body' ][ 'collections' ]);
$collections = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
2023-12-20 10:55:09 +00:00
'queries' => [
Query :: equal ( 'enabled' , [ false ]) -> toString (),
],
2022-08-24 12:43:07 +00:00
]);
$this -> assertEquals ( 200 , $collections [ 'headers' ][ 'status-code' ]);
$this -> assertCount ( 0 , $collections [ 'body' ][ 'collections' ]);
2021-08-09 14:54:10 +00:00
/**
* Test for Order
*/
2022-06-22 10:51:49 +00:00
$collections = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections' , array_merge ([
2021-08-09 14:54:10 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
2023-12-20 10:55:09 +00:00
'queries' => [
Query :: orderDesc () -> toString (),
],
2021-08-09 14:54:10 +00:00
]);
2022-02-27 09:57:09 +00:00
$this -> assertEquals ( 2 , $collections [ 'body' ][ 'total' ]);
2021-08-09 14:54:10 +00:00
$this -> assertEquals ( $base [ 0 ][ '$id' ], $collections [ 'body' ][ 'collections' ][ 0 ][ '$id' ]);
$this -> assertEquals ( $base [ 1 ][ '$id' ], $collections [ 'body' ][ 'collections' ][ 1 ][ '$id' ]);
/**
* Test for After
*/
2022-06-22 10:51:49 +00:00
$base = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections' , array_merge ([
2021-08-09 14:54:10 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()));
2022-06-22 10:51:49 +00:00
$collections = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections' , array_merge ([
2021-08-09 14:54:10 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
2023-12-20 10:55:09 +00:00
'queries' => [
Query :: cursorAfter ( new Document ([ '$id' => $base [ 'body' ][ 'collections' ][ 0 ][ '$id' ]])) -> toString (),
],
2021-08-09 14:54:10 +00:00
]);
$this -> assertCount ( 1 , $collections [ 'body' ][ 'collections' ]);
$this -> assertEquals ( $base [ 'body' ][ 'collections' ][ 1 ][ '$id' ], $collections [ 'body' ][ 'collections' ][ 0 ][ '$id' ]);
2022-06-22 10:51:49 +00:00
$collections = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections' , array_merge ([
2021-08-09 14:54:10 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
2023-12-20 10:55:09 +00:00
'queries' => [
Query :: cursorAfter ( new Document ([ '$id' => $base [ 'body' ][ 'collections' ][ 1 ][ '$id' ]])) -> toString (),
],
2021-08-09 14:54:10 +00:00
]);
$this -> assertCount ( 0 , $collections [ 'body' ][ 'collections' ]);
$this -> assertEmpty ( $collections [ 'body' ][ 'collections' ]);
2021-10-05 10:30:33 +00:00
/**
* Test for Before
*/
2022-06-22 10:51:49 +00:00
$base = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections' , array_merge ([
2021-10-05 10:30:33 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()));
2022-06-22 10:51:49 +00:00
$collections = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections' , array_merge ([
2021-10-05 10:30:33 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
2023-12-20 10:55:09 +00:00
'queries' => [
Query :: cursorBefore ( new Document ([ '$id' => $base [ 'body' ][ 'collections' ][ 1 ][ '$id' ]])) -> toString (),
],
2021-10-05 10:30:33 +00:00
]);
$this -> assertCount ( 1 , $collections [ 'body' ][ 'collections' ]);
$this -> assertEquals ( $base [ 'body' ][ 'collections' ][ 0 ][ '$id' ], $collections [ 'body' ][ 'collections' ][ 0 ][ '$id' ]);
2022-06-22 10:51:49 +00:00
$collections = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections' , array_merge ([
2021-10-05 10:30:33 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
2023-12-20 10:55:09 +00:00
'queries' => [
Query :: cursorBefore ( new Document ([ '$id' => $base [ 'body' ][ 'collections' ][ 0 ][ '$id' ]])) -> toString (),
],
2021-10-05 10:30:33 +00:00
]);
$this -> assertCount ( 0 , $collections [ 'body' ][ 'collections' ]);
$this -> assertEmpty ( $collections [ 'body' ][ 'collections' ]);
2022-01-19 09:04:57 +00:00
/**
* Test for Search
*/
2022-06-22 10:51:49 +00:00
$collections = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections' , array_merge ([
2022-01-19 09:04:57 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'search' => 'first'
]);
2022-02-27 09:57:09 +00:00
$this -> assertEquals ( 1 , $collections [ 'body' ][ 'total' ]);
2022-01-19 09:04:57 +00:00
$this -> assertEquals ( 'first' , $collections [ 'body' ][ 'collections' ][ 0 ][ '$id' ]);
2022-06-22 10:51:49 +00:00
$collections = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections' , array_merge ([
2022-01-19 09:04:57 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'search' => 'Test'
]);
2022-05-23 14:54:50 +00:00
2022-02-27 09:57:09 +00:00
$this -> assertEquals ( 2 , $collections [ 'body' ][ 'total' ]);
2022-01-19 09:04:57 +00:00
$this -> assertEquals ( 'Test 1' , $collections [ 'body' ][ 'collections' ][ 0 ][ 'name' ]);
$this -> assertEquals ( 'Test 2' , $collections [ 'body' ][ 'collections' ][ 1 ][ 'name' ]);
2022-06-22 10:51:49 +00:00
$collections = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections' , array_merge ([
2022-01-19 09:04:57 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'search' => 'Nonexistent'
]);
2022-05-23 14:54:50 +00:00
2022-02-27 09:57:09 +00:00
$this -> assertEquals ( 0 , $collections [ 'body' ][ 'total' ]);
2022-01-19 09:04:57 +00:00
2021-10-05 10:30:33 +00:00
/**
* Test for FAILURE
*/
2022-06-22 10:51:49 +00:00
$response = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections' , array_merge ([
2021-10-05 10:30:33 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
2023-12-20 10:55:09 +00:00
'queries' => [
Query :: cursorAfter ( new Document ([ '$id' => 'unknown' ])) -> toString (),
],
2021-10-05 10:30:33 +00:00
]);
2022-08-08 11:00:03 +00:00
$this -> assertEquals ( 400 , $response [ 'headers' ][ 'status-code' ]);
2022-01-12 19:51:13 +00:00
// This collection already exists
2022-06-22 10:51:49 +00:00
$response = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections' , array_merge ([
2022-01-12 19:51:13 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'name' => 'Test 1' ,
2022-08-14 10:33:36 +00:00
'collectionId' => ID :: custom ( 'first' ),
2022-08-03 04:17:49 +00:00
'permissions' => [
2022-08-14 05:21:11 +00:00
Permission :: read ( Role :: any ()),
Permission :: create ( Role :: any ()),
Permission :: update ( Role :: any ()),
Permission :: delete ( Role :: any ()),
2022-08-03 04:17:49 +00:00
],
'documentSecurity' => true ,
2022-01-12 19:51:13 +00:00
]);
2022-08-08 11:00:03 +00:00
$this -> assertEquals ( 409 , $response [ 'headers' ][ 'status-code' ]);
2023-05-29 08:34:41 +00:00
return [
'databaseId' => $databaseId ,
'collectionId' => $test1 [ 'body' ][ '$id' ],
];
2023-05-22 14:40:09 +00:00
}
/**
* @ depends testListCollections
*/
public function testGetCollection ( array $data ) : void
{
$databaseId = $data [ 'databaseId' ];
$collectionId = $data [ 'collectionId' ];
$collection = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collectionId , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
], $this -> getHeaders ()));
$this -> assertEquals ( 200 , $collection [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 'Test 1' , $collection [ 'body' ][ 'name' ]);
$this -> assertEquals ( 'first' , $collection [ 'body' ][ '$id' ]);
$this -> assertTrue ( $collection [ 'body' ][ 'enabled' ]);
}
/**
* @ depends testListCollections
*/
public function testUpdateCollection ( array $data )
{
$databaseId = $data [ 'databaseId' ];
$collectionId = $data [ 'collectionId' ];
$collection = $this -> client -> call ( Client :: METHOD_PUT , '/databases/' . $databaseId . '/collections/' . $collectionId , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'name' => 'Test 1 Updated' ,
'enabled' => false
]);
$this -> assertEquals ( 200 , $collection [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 'Test 1 Updated' , $collection [ 'body' ][ 'name' ]);
$this -> assertEquals ( 'first' , $collection [ 'body' ][ '$id' ]);
$this -> assertFalse ( $collection [ 'body' ][ 'enabled' ]);
2021-08-09 14:54:10 +00:00
}
2023-06-08 11:04:57 +00:00
/**
2024-08-16 06:18:52 +00:00
* @ depends testListCollections
2025-05-26 06:03:03 +00:00
* @ group cl - ignore
2023-06-08 11:04:57 +00:00
*/
2023-06-22 04:29:09 +00:00
public function testCreateEncryptedAttribute ( array $data ) : void
2023-06-08 11:04:57 +00:00
{
$databaseId = $data [ 'databaseId' ];
/**
* Test for SUCCESS
*/
// Create collection
$actors = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'collectionId' => ID :: unique (),
'name' => 'Encrypted Actors Data' ,
'permissions' => [
Permission :: read ( Role :: any ()),
Permission :: create ( Role :: any ()),
Permission :: update ( Role :: any ()),
Permission :: delete ( Role :: any ()),
],
'documentSecurity' => true ,
]);
$this -> assertEquals ( 201 , $actors [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( $actors [ 'body' ][ 'name' ], 'Encrypted Actors Data' );
/**
* Test for creating encrypted attributes
*/
$attributesPath = '/databases/' . $databaseId . '/collections/' . $actors [ 'body' ][ '$id' ] . '/attributes' ;
$firstName = $this -> client -> call ( Client :: METHOD_POST , $attributesPath . '/string' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'key' => 'firstName' ,
'size' => 256 ,
'required' => true ,
]);
2025-05-26 06:03:03 +00:00
2025-05-23 15:27:35 +00:00
// checking size test
$lastName = $this -> client -> call ( Client :: METHOD_POST , $attributesPath . '/string' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'key' => 'lastName' ,
'size' => 149 ,
'required' => true ,
'encrypt' => true
]);
$this -> assertEquals ( " Size too small. Encrypted strings require a minimum size of " . APP_DATABASE_ENCRYPT_SIZE_MIN . " characters. " , $lastName [ 'body' ][ 'message' ]);
2023-06-08 11:04:57 +00:00
$lastName = $this -> client -> call ( Client :: METHOD_POST , $attributesPath . '/string' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'key' => 'lastName' ,
'size' => 256 ,
'required' => true ,
2025-05-26 05:36:55 +00:00
'encrypt' => true
2023-06-08 11:04:57 +00:00
]);
2025-05-26 05:36:55 +00:00
$this -> assertTrue ( $lastName [ 'body' ][ 'encrypt' ]);
2025-05-26 06:03:03 +00:00
2025-05-26 05:36:55 +00:00
sleep ( 1 );
2025-05-26 06:03:03 +00:00
2025-05-26 05:36:55 +00:00
$response = $this -> client -> call ( Client :: METHOD_GET , $attributesPath . '/lastName' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ],
]));
2025-05-26 06:03:03 +00:00
2025-05-26 05:36:55 +00:00
$this -> assertTrue ( $response [ 'body' ][ 'encrypt' ]);
2023-06-08 11:04:57 +00:00
2023-06-23 10:29:23 +00:00
/**
* Check status of every attribute
*/
2023-06-08 11:04:57 +00:00
$this -> assertEquals ( 202 , $firstName [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 'firstName' , $firstName [ 'body' ][ 'key' ]);
$this -> assertEquals ( 'string' , $firstName [ 'body' ][ 'type' ]);
$this -> assertEquals ( 202 , $lastName [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 'lastName' , $lastName [ 'body' ][ 'key' ]);
$this -> assertEquals ( 'string' , $lastName [ 'body' ][ 'type' ]);
// Wait for database worker to finish creating attributes
2023-06-22 04:29:09 +00:00
sleep ( 2 );
2023-06-08 11:04:57 +00:00
// Creating document to ensure cache is purged on schema change
$document = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $actors [ 'body' ][ '$id' ] . '/documents' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'documentId' => ID :: unique (),
'data' => [
2023-06-21 10:45:00 +00:00
'firstName' => 'Jonah' ,
'lastName' => 'Jameson' ,
2023-06-08 11:04:57 +00:00
],
'permissions' => [
Permission :: read ( Role :: any ()),
Permission :: update ( Role :: any ()),
Permission :: delete ( Role :: any ()),
],
]);
// Check document to ensure cache is purged on schema change
$document = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $actors [ 'body' ][ '$id' ] . '/documents/' . $document [ 'body' ][ '$id' ], array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
2023-06-22 04:29:09 +00:00
$this -> assertEquals ( 200 , $document [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 'Jonah' , $document [ 'body' ][ 'firstName' ]);
$this -> assertEquals ( 'Jameson' , $document [ 'body' ][ 'lastName' ]);
2025-05-26 05:36:55 +00:00
$actors = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $actors [ 'body' ][ '$id' ], array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), []);
$attributes = $actors [ 'body' ][ 'attributes' ];
foreach ( $attributes as $attribute ) {
$this -> assertArrayHasKey ( 'encrypt' , $attribute );
if ( $attribute [ 'key' ] === 'firstName' ) {
$this -> assertFalse ( $attribute [ 'encrypt' ]);
}
if ( $attribute [ 'key' ] === 'lastName' ) {
$this -> assertTrue ( $attribute [ 'encrypt' ]);
}
}
2023-06-08 11:04:57 +00:00
}
2021-08-08 23:56:31 +00:00
public function testDeleteAttribute () : array
2020-12-05 05:31:59 +00:00
{
2022-06-22 10:51:49 +00:00
$database = $this -> client -> call ( Client :: METHOD_POST , '/databases' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
2022-08-14 10:33:36 +00:00
'databaseId' => ID :: unique (),
2022-06-22 10:51:49 +00:00
'name' => 'invalidDocumentDatabase' ,
]);
$this -> assertEquals ( 201 , $database [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 'invalidDocumentDatabase' , $database [ 'body' ][ 'name' ]);
$databaseId = $database [ 'body' ][ '$id' ];
2020-12-05 05:31:59 +00:00
/**
* Test for SUCCESS
*/
// Create collection
2022-06-22 10:51:49 +00:00
$actors = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections' , array_merge ([
2020-12-05 05:31:59 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
2022-08-14 10:33:36 +00:00
'collectionId' => ID :: unique (),
2021-06-15 14:24:51 +00:00
'name' => 'Actors' ,
2022-08-03 04:17:49 +00:00
'permissions' => [
2022-08-14 05:21:11 +00:00
Permission :: read ( Role :: any ()),
Permission :: create ( Role :: any ()),
Permission :: update ( Role :: any ()),
Permission :: delete ( Role :: any ()),
2022-08-03 04:17:49 +00:00
],
'documentSecurity' => true ,
2020-12-05 05:31:59 +00:00
]);
2022-08-08 11:00:03 +00:00
$this -> assertEquals ( 201 , $actors [ 'headers' ][ 'status-code' ]);
2020-12-05 05:31:59 +00:00
$this -> assertEquals ( $actors [ 'body' ][ 'name' ], 'Actors' );
2021-06-11 18:07:05 +00:00
2022-06-22 10:51:49 +00:00
$firstName = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $actors [ 'body' ][ '$id' ] . '/attributes/string' , array_merge ([
2021-06-11 18:07:05 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
2021-12-16 15:04:30 +00:00
'key' => 'firstName' ,
2021-06-11 18:07:05 +00:00
'size' => 256 ,
'required' => true ,
]);
2022-06-22 10:51:49 +00:00
$lastName = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $actors [ 'body' ][ '$id' ] . '/attributes/string' , array_merge ([
2021-06-11 18:07:05 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
2021-12-16 15:04:30 +00:00
'key' => 'lastName' ,
2021-06-11 18:07:05 +00:00
'size' => 256 ,
'required' => true ,
]);
2022-06-22 10:51:49 +00:00
$unneeded = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $actors [ 'body' ][ '$id' ] . '/attributes/string' , array_merge ([
2021-08-08 22:08:10 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
2021-12-16 15:04:30 +00:00
'key' => 'unneeded' ,
2021-08-08 22:08:10 +00:00
'size' => 256 ,
'required' => true ,
]);
// Wait for database worker to finish creating attributes
2021-08-23 04:06:53 +00:00
sleep ( 2 );
2021-08-08 22:08:10 +00:00
2021-11-23 17:39:01 +00:00
// Creating document to ensure cache is purged on schema change
2022-06-22 10:51:49 +00:00
$document = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $actors [ 'body' ][ '$id' ] . '/documents' , array_merge ([
2021-11-23 17:39:01 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
2022-08-14 10:33:36 +00:00
'documentId' => ID :: unique (),
2021-11-23 17:39:01 +00:00
'data' => [
'firstName' => 'lorem' ,
'lastName' => 'ipsum' ,
2023-05-22 14:40:09 +00:00
'unneeded' => 'dolor'
2021-11-23 17:39:01 +00:00
],
2022-08-03 04:17:49 +00:00
'permissions' => [
2022-08-14 05:21:11 +00:00
Permission :: read ( Role :: any ()),
Permission :: update ( Role :: any ()),
Permission :: delete ( Role :: any ()),
2022-08-03 04:17:49 +00:00
],
2021-11-23 17:39:01 +00:00
]);
2022-06-22 10:51:49 +00:00
$index = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $actors [ 'body' ][ '$id' ] . '/indexes' , array_merge ([
2021-08-08 22:08:10 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
2021-12-16 15:04:30 +00:00
'key' => 'key_lastName' ,
2021-08-08 22:08:10 +00:00
'type' => 'key' ,
'attributes' => [
'lastName' ,
],
]);
// Wait for database worker to finish creating index
2021-08-23 04:06:53 +00:00
sleep ( 2 );
2021-08-08 22:08:10 +00:00
2022-06-22 10:51:49 +00:00
$collection = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $actors [ 'body' ][ '$id' ], array_merge ([
2021-08-08 22:08:10 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
2022-05-23 14:54:50 +00:00
]), []);
2021-08-08 22:08:10 +00:00
2021-08-22 14:06:59 +00:00
$unneededId = $unneeded [ 'body' ][ 'key' ];
2021-08-08 22:08:10 +00:00
2022-08-08 11:00:03 +00:00
$this -> assertEquals ( 200 , $collection [ 'headers' ][ 'status-code' ]);
2021-08-08 22:08:10 +00:00
$this -> assertIsArray ( $collection [ 'body' ][ 'attributes' ]);
$this -> assertCount ( 3 , $collection [ 'body' ][ 'attributes' ]);
2021-08-22 14:06:59 +00:00
$this -> assertEquals ( $collection [ 'body' ][ 'attributes' ][ 0 ][ 'key' ], $firstName [ 'body' ][ 'key' ]);
$this -> assertEquals ( $collection [ 'body' ][ 'attributes' ][ 1 ][ 'key' ], $lastName [ 'body' ][ 'key' ]);
$this -> assertEquals ( $collection [ 'body' ][ 'attributes' ][ 2 ][ 'key' ], $unneeded [ 'body' ][ 'key' ]);
2021-08-08 22:08:10 +00:00
$this -> assertCount ( 1 , $collection [ 'body' ][ 'indexes' ]);
2021-08-22 16:36:26 +00:00
$this -> assertEquals ( $collection [ 'body' ][ 'indexes' ][ 0 ][ 'key' ], $index [ 'body' ][ 'key' ]);
2021-08-08 22:08:10 +00:00
// Delete attribute
2024-08-16 06:18:52 +00:00
$attribute = $this -> client -> call ( Client :: METHOD_DELETE , '/databases/' . $databaseId . '/collections/' . $actors [ 'body' ][ '$id' ] . '/attributes/' . $unneededId , array_merge ([
2021-08-08 22:08:10 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
2022-08-08 11:00:03 +00:00
$this -> assertEquals ( 204 , $attribute [ 'headers' ][ 'status-code' ]);
2021-08-23 04:06:53 +00:00
sleep ( 2 );
2021-06-18 17:09:07 +00:00
2021-11-23 17:39:01 +00:00
// Check document to ensure cache is purged on schema change
2022-06-22 10:51:49 +00:00
$document = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $actors [ 'body' ][ '$id' ] . '/documents/' . $document [ 'body' ][ '$id' ], array_merge ([
2021-11-23 17:39:01 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
$this -> assertNotContains ( $unneededId , $document [ 'body' ]);
2022-06-22 10:51:49 +00:00
$collection = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $actors [ 'body' ][ '$id' ], array_merge ([
2021-06-11 18:07:05 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
2022-05-23 14:54:50 +00:00
]), []);
2020-12-05 05:31:59 +00:00
2022-08-08 11:00:03 +00:00
$this -> assertEquals ( 200 , $collection [ 'headers' ][ 'status-code' ]);
2021-06-18 17:09:07 +00:00
$this -> assertIsArray ( $collection [ 'body' ][ 'attributes' ]);
$this -> assertCount ( 2 , $collection [ 'body' ][ 'attributes' ]);
2021-08-22 16:36:26 +00:00
$this -> assertEquals ( $collection [ 'body' ][ 'attributes' ][ 0 ][ 'key' ], $firstName [ 'body' ][ 'key' ]);
$this -> assertEquals ( $collection [ 'body' ][ 'attributes' ][ 1 ][ 'key' ], $lastName [ 'body' ][ 'key' ]);
2021-06-18 17:09:07 +00:00
2021-08-08 22:08:10 +00:00
return [
'collectionId' => $actors [ 'body' ][ '$id' ],
2021-12-16 15:04:30 +00:00
'key' => $index [ 'body' ][ 'key' ],
2022-06-22 10:51:49 +00:00
'databaseId' => $databaseId
2021-08-08 22:08:10 +00:00
];
}
2021-08-23 04:06:53 +00:00
2021-08-08 22:08:10 +00:00
/**
* @ depends testDeleteAttribute
*/
2021-08-08 23:56:31 +00:00
public function testDeleteIndex ( $data ) : array
{
2022-06-22 10:51:49 +00:00
$databaseId = $data [ 'databaseId' ];
$index = $this -> client -> call ( Client :: METHOD_DELETE , '/databases/' . $databaseId . '/collections/' . $data [ 'collectionId' ] . '/indexes/' . $data [ 'key' ], array_merge ([
2021-08-08 23:56:31 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
2022-08-08 11:00:03 +00:00
$this -> assertEquals ( 204 , $index [ 'headers' ][ 'status-code' ]);
2021-08-23 04:06:53 +00:00
2021-08-08 23:56:31 +00:00
// Wait for database worker to finish deleting index
2021-08-23 04:06:53 +00:00
sleep ( 2 );
2021-08-08 23:56:31 +00:00
2022-06-22 10:51:49 +00:00
$collection = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $data [ 'collectionId' ], array_merge ([
2021-08-08 23:56:31 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
2021-08-23 04:06:53 +00:00
]), []);
2021-08-08 23:56:31 +00:00
$this -> assertCount ( 0 , $collection [ 'body' ][ 'indexes' ]);
return $data ;
}
/**
* @ depends testDeleteIndex
*/
2021-09-02 21:38:46 +00:00
public function testDeleteIndexOnDeleteAttribute ( $data )
{
2022-06-22 10:51:49 +00:00
$databaseId = $data [ 'databaseId' ];
$attribute1 = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $data [ 'collectionId' ] . '/attributes/string' , array_merge ([
2021-09-02 21:38:46 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
2021-12-16 15:04:30 +00:00
'key' => 'attribute1' ,
2021-09-02 21:38:46 +00:00
'size' => 16 ,
'required' => true ,
]);
2022-06-22 10:51:49 +00:00
$attribute2 = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $data [ 'collectionId' ] . '/attributes/string' , array_merge ([
2021-09-02 21:38:46 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
2021-12-16 15:04:30 +00:00
'key' => 'attribute2' ,
2021-09-02 21:38:46 +00:00
'size' => 16 ,
'required' => true ,
]);
2022-07-18 13:22:23 +00:00
$this -> assertEquals ( 202 , $attribute1 [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 202 , $attribute2 [ 'headers' ][ 'status-code' ]);
2021-09-02 21:38:46 +00:00
$this -> assertEquals ( 'attribute1' , $attribute1 [ 'body' ][ 'key' ]);
$this -> assertEquals ( 'attribute2' , $attribute2 [ 'body' ][ 'key' ]);
sleep ( 2 );
2022-06-22 10:51:49 +00:00
$index1 = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $data [ 'collectionId' ] . '/indexes' , array_merge ([
2021-09-02 21:38:46 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
2021-12-16 15:04:30 +00:00
'key' => 'index1' ,
2021-09-02 21:38:46 +00:00
'type' => 'key' ,
'attributes' => [ 'attribute1' , 'attribute2' ],
'orders' => [ 'ASC' , 'ASC' ],
]);
2022-06-22 10:51:49 +00:00
$index2 = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $data [ 'collectionId' ] . '/indexes' , array_merge ([
2021-09-02 21:38:46 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
2021-12-16 15:04:30 +00:00
'key' => 'index2' ,
2021-09-02 21:38:46 +00:00
'type' => 'key' ,
'attributes' => [ 'attribute2' ],
]);
2022-07-18 13:22:23 +00:00
$this -> assertEquals ( 202 , $index1 [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 202 , $index2 [ 'headers' ][ 'status-code' ]);
2021-09-02 21:38:46 +00:00
$this -> assertEquals ( 'index1' , $index1 [ 'body' ][ 'key' ]);
$this -> assertEquals ( 'index2' , $index2 [ 'body' ][ 'key' ]);
sleep ( 2 );
2021-09-21 01:23:41 +00:00
// Expected behavior: deleting attribute2 will cause index2 to be dropped, and index1 rebuilt with a single key
2022-06-22 10:51:49 +00:00
$deleted = $this -> client -> call ( Client :: METHOD_DELETE , '/databases/' . $databaseId . '/collections/' . $data [ 'collectionId' ] . '/attributes/' . $attribute2 [ 'body' ][ 'key' ], array_merge ([
2021-09-02 21:38:46 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
2022-08-08 11:00:03 +00:00
$this -> assertEquals ( 204 , $deleted [ 'headers' ][ 'status-code' ]);
2021-09-02 21:38:46 +00:00
// wait for database worker to complete
sleep ( 2 );
2022-06-22 10:51:49 +00:00
$collection = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $data [ 'collectionId' ], array_merge ([
2021-09-02 21:38:46 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
$this -> assertEquals ( 200 , $collection [ 'headers' ][ 'status-code' ]);
$this -> assertIsArray ( $collection [ 'body' ][ 'indexes' ]);
$this -> assertCount ( 1 , $collection [ 'body' ][ 'indexes' ]);
$this -> assertEquals ( $index1 [ 'body' ][ 'key' ], $collection [ 'body' ][ 'indexes' ][ 0 ][ 'key' ]);
$this -> assertIsArray ( $collection [ 'body' ][ 'indexes' ][ 0 ][ 'attributes' ]);
$this -> assertCount ( 1 , $collection [ 'body' ][ 'indexes' ][ 0 ][ 'attributes' ]);
$this -> assertEquals ( $attribute1 [ 'body' ][ 'key' ], $collection [ 'body' ][ 'indexes' ][ 0 ][ 'attributes' ][ 0 ]);
// Delete attribute
2022-06-22 10:51:49 +00:00
$deleted = $this -> client -> call ( Client :: METHOD_DELETE , '/databases/' . $databaseId . '/collections/' . $data [ 'collectionId' ] . '/attributes/' . $attribute1 [ 'body' ][ 'key' ], array_merge ([
2021-09-02 21:38:46 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
2022-08-08 11:00:03 +00:00
$this -> assertEquals ( 204 , $deleted [ 'headers' ][ 'status-code' ]);
2021-09-02 21:38:46 +00:00
return $data ;
}
2021-09-27 23:38:03 +00:00
public function testCleanupDuplicateIndexOnDeleteAttribute ()
2021-09-21 01:23:41 +00:00
{
2022-06-22 10:51:49 +00:00
$database = $this -> client -> call ( Client :: METHOD_POST , '/databases' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
2022-08-14 10:33:36 +00:00
'databaseId' => ID :: unique (),
2022-06-22 10:51:49 +00:00
'name' => 'invalidDocumentDatabase' ,
]);
$this -> assertEquals ( 201 , $database [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 'invalidDocumentDatabase' , $database [ 'body' ][ 'name' ]);
$databaseId = $database [ 'body' ][ '$id' ];
$collection = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections' , array_merge ([
2021-09-27 23:38:03 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
2022-08-14 10:33:36 +00:00
'collectionId' => ID :: unique (),
2021-09-27 23:38:03 +00:00
'name' => 'TestCleanupDuplicateIndexOnDeleteAttribute' ,
2022-08-03 04:17:49 +00:00
'permissions' => [
2022-08-14 05:21:11 +00:00
Permission :: read ( Role :: any ()),
Permission :: create ( Role :: any ()),
Permission :: update ( Role :: any ()),
Permission :: delete ( Role :: any ()),
2022-08-03 04:17:49 +00:00
],
'documentSecurity' => true ,
2021-09-27 23:38:03 +00:00
]);
$this -> assertEquals ( 201 , $collection [ 'headers' ][ 'status-code' ]);
$this -> assertNotEmpty ( $collection [ 'body' ][ '$id' ]);
$collectionId = $collection [ 'body' ][ '$id' ];
2022-06-22 10:51:49 +00:00
$attribute1 = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/string' , array_merge ([
2021-09-21 01:23:41 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
2021-12-16 15:04:30 +00:00
'key' => 'attribute1' ,
2021-09-21 01:23:41 +00:00
'size' => 16 ,
'required' => true ,
]);
2022-06-22 10:51:49 +00:00
$attribute2 = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/string' , array_merge ([
2021-09-21 01:23:41 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
2021-12-16 15:04:30 +00:00
'key' => 'attribute2' ,
2021-09-21 01:23:41 +00:00
'size' => 16 ,
'required' => true ,
]);
2022-07-18 13:22:23 +00:00
$this -> assertEquals ( 202 , $attribute1 [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 202 , $attribute2 [ 'headers' ][ 'status-code' ]);
2021-09-21 01:23:41 +00:00
$this -> assertEquals ( 'attribute1' , $attribute1 [ 'body' ][ 'key' ]);
$this -> assertEquals ( 'attribute2' , $attribute2 [ 'body' ][ 'key' ]);
sleep ( 2 );
2022-06-22 10:51:49 +00:00
$index1 = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $collectionId . '/indexes' , array_merge ([
2021-09-21 01:23:41 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
2021-12-16 15:04:30 +00:00
'key' => 'index1' ,
2021-09-21 01:23:41 +00:00
'type' => 'key' ,
'attributes' => [ 'attribute1' , 'attribute2' ],
'orders' => [ 'ASC' , 'ASC' ],
]);
2022-06-22 10:51:49 +00:00
$index2 = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $collectionId . '/indexes' , array_merge ([
2021-09-21 01:23:41 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
2021-12-16 15:04:30 +00:00
'key' => 'index2' ,
2021-09-21 01:23:41 +00:00
'type' => 'key' ,
'attributes' => [ 'attribute2' ],
]);
2022-07-18 13:22:23 +00:00
$this -> assertEquals ( 202 , $index1 [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 202 , $index2 [ 'headers' ][ 'status-code' ]);
2021-09-21 01:23:41 +00:00
$this -> assertEquals ( 'index1' , $index1 [ 'body' ][ 'key' ]);
$this -> assertEquals ( 'index2' , $index2 [ 'body' ][ 'key' ]);
sleep ( 2 );
// Expected behavior: deleting attribute1 would cause index1 to be a duplicate of index2 and automatically removed
2022-06-22 10:51:49 +00:00
$deleted = $this -> client -> call ( Client :: METHOD_DELETE , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/' . $attribute1 [ 'body' ][ 'key' ], array_merge ([
2021-09-21 01:23:41 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
2022-08-08 11:00:03 +00:00
$this -> assertEquals ( 204 , $deleted [ 'headers' ][ 'status-code' ]);
2021-09-21 01:23:41 +00:00
// wait for database worker to complete
sleep ( 2 );
2022-06-22 10:51:49 +00:00
$collection = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collectionId , array_merge ([
2021-09-21 01:23:41 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
$this -> assertEquals ( 200 , $collection [ 'headers' ][ 'status-code' ]);
$this -> assertIsArray ( $collection [ 'body' ][ 'indexes' ]);
$this -> assertCount ( 1 , $collection [ 'body' ][ 'indexes' ]);
$this -> assertEquals ( $index2 [ 'body' ][ 'key' ], $collection [ 'body' ][ 'indexes' ][ 0 ][ 'key' ]);
$this -> assertIsArray ( $collection [ 'body' ][ 'indexes' ][ 0 ][ 'attributes' ]);
$this -> assertCount ( 1 , $collection [ 'body' ][ 'indexes' ][ 0 ][ 'attributes' ]);
$this -> assertEquals ( $attribute2 [ 'body' ][ 'key' ], $collection [ 'body' ][ 'indexes' ][ 0 ][ 'attributes' ][ 0 ]);
// Delete attribute
2022-06-22 10:51:49 +00:00
$deleted = $this -> client -> call ( Client :: METHOD_DELETE , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/' . $attribute2 [ 'body' ][ 'key' ], array_merge ([
2021-09-21 01:23:41 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
2022-08-08 11:00:03 +00:00
$this -> assertEquals ( 204 , $deleted [ 'headers' ][ 'status-code' ]);
2021-09-21 01:23:41 +00:00
}
2021-09-02 21:38:46 +00:00
/**
* @ depends testDeleteIndexOnDeleteAttribute
*/
2021-08-08 22:08:10 +00:00
public function testDeleteCollection ( $data )
{
2022-06-22 10:51:49 +00:00
$databaseId = $data [ 'databaseId' ];
2021-08-08 22:08:10 +00:00
$collectionId = $data [ 'collectionId' ];
2020-12-05 05:31:59 +00:00
// Add Documents to the collection
2022-06-22 10:51:49 +00:00
$document1 = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $collectionId . '/documents' , array_merge ([
2020-12-05 05:31:59 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
2022-08-14 10:33:36 +00:00
'documentId' => ID :: unique (),
2020-12-05 05:31:59 +00:00
'data' => [
'firstName' => 'Tom' ,
'lastName' => 'Holland' ,
],
2022-08-03 04:17:49 +00:00
'permissions' => [
2022-08-15 11:24:31 +00:00
Permission :: read ( Role :: user ( $this -> getUser ()[ '$id' ])),
Permission :: update ( Role :: user ( $this -> getUser ()[ '$id' ])),
Permission :: delete ( Role :: user ( $this -> getUser ()[ '$id' ])),
2022-08-03 04:17:49 +00:00
],
2020-12-05 05:31:59 +00:00
]);
2022-06-22 10:51:49 +00:00
$document2 = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $collectionId . '/documents' , array_merge ([
2020-12-05 05:31:59 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
2022-08-14 10:33:36 +00:00
'documentId' => ID :: unique (),
2020-12-05 05:31:59 +00:00
'data' => [
'firstName' => 'Samuel' ,
'lastName' => 'Jackson' ,
],
2022-08-03 04:17:49 +00:00
'permissions' => [
2022-08-15 11:24:31 +00:00
Permission :: read ( Role :: user ( $this -> getUser ()[ '$id' ])),
Permission :: update ( Role :: user ( $this -> getUser ()[ '$id' ])),
Permission :: delete ( Role :: user ( $this -> getUser ()[ '$id' ])),
2022-08-03 04:17:49 +00:00
],
2020-12-05 05:31:59 +00:00
]);
2021-06-11 18:07:05 +00:00
2022-08-08 11:00:03 +00:00
$this -> assertEquals ( 201 , $document1 [ 'headers' ][ 'status-code' ]);
2022-08-02 09:18:49 +00:00
$this -> assertIsArray ( $document1 [ 'body' ][ '$permissions' ]);
2022-08-13 14:10:28 +00:00
$this -> assertCount ( 3 , $document1 [ 'body' ][ '$permissions' ]);
2020-12-05 05:31:59 +00:00
$this -> assertEquals ( $document1 [ 'body' ][ 'firstName' ], 'Tom' );
$this -> assertEquals ( $document1 [ 'body' ][ 'lastName' ], 'Holland' );
2022-08-08 11:00:03 +00:00
$this -> assertEquals ( 201 , $document2 [ 'headers' ][ 'status-code' ]);
2022-08-02 09:18:49 +00:00
$this -> assertIsArray ( $document2 [ 'body' ][ '$permissions' ]);
2022-08-13 14:10:28 +00:00
$this -> assertCount ( 3 , $document2 [ 'body' ][ '$permissions' ]);
2020-12-05 05:31:59 +00:00
$this -> assertEquals ( $document2 [ 'body' ][ 'firstName' ], 'Samuel' );
$this -> assertEquals ( $document2 [ 'body' ][ 'lastName' ], 'Jackson' );
// Delete the actors collection
2022-06-22 10:51:49 +00:00
$response = $this -> client -> call ( Client :: METHOD_DELETE , '/databases/' . $databaseId . '/collections/' . $collectionId , array_merge ([
2020-12-05 05:31:59 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
], $this -> getHeaders ()));
2022-08-08 11:00:03 +00:00
$this -> assertEquals ( 204 , $response [ 'headers' ][ 'status-code' ]);
2022-05-23 14:54:50 +00:00
$this -> assertEquals ( $response [ 'body' ], " " );
2020-12-05 05:31:59 +00:00
// Try to get the collection and check if it has been deleted
2022-06-22 10:51:49 +00:00
$response = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collectionId , array_merge ([
2020-12-05 05:31:59 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ]
], $this -> getHeaders ()));
2022-08-08 11:00:03 +00:00
$this -> assertEquals ( 404 , $response [ 'headers' ][ 'status-code' ]);
2020-12-05 05:31:59 +00:00
}
2021-07-29 23:36:46 +00:00
2024-04-23 03:20:25 +00:00
/**
* @ throws Exception
*/
public function testDeleteCollectionDeletesRelatedAttributes () : void
{
$database = $this -> client -> call ( Client :: METHOD_POST , '/databases' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'databaseId' => ID :: unique (),
'name' => 'TestDeleteCollectionDeletesRelatedAttributes' ,
]);
$databaseId = $database [ 'body' ][ '$id' ];
$collection1 = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'collectionId' => ID :: unique (),
'name' => 'Collection1' ,
'documentSecurity' => false ,
'permissions' => [],
]);
$collection2 = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'collectionId' => ID :: unique (),
'name' => 'Collection2' ,
'documentSecurity' => false ,
'permissions' => [],
]);
$collection1 = $collection1 [ 'body' ][ '$id' ];
$collection2 = $collection2 [ 'body' ][ '$id' ];
$this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $collection1 . '/attributes/relationship' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ],
]), [
'relatedCollectionId' => $collection2 ,
'type' => Database :: RELATION_MANY_TO_ONE ,
'twoWay' => false ,
'key' => 'collection2'
]);
sleep ( 2 );
$this -> client -> call ( Client :: METHOD_DELETE , '/databases/' . $databaseId . '/collections/' . $collection2 , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ],
], $this -> getHeaders ()));
sleep ( 2 );
$attributes = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collection1 . '/attributes' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ],
], $this -> getHeaders ()));
$this -> assertEquals ( 0 , $attributes [ 'body' ][ 'total' ]);
}
2021-08-04 21:05:09 +00:00
2021-08-31 16:35:03 +00:00
public function testAttributeRowWidthLimit ()
{
2022-06-22 10:51:49 +00:00
$database = $this -> client -> call ( Client :: METHOD_POST , '/databases' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
2022-08-14 10:33:36 +00:00
'databaseId' => ID :: unique (),
2022-06-22 10:51:49 +00:00
'name' => 'invalidDocumentDatabase' ,
]);
$this -> assertEquals ( 201 , $database [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 'invalidDocumentDatabase' , $database [ 'body' ][ 'name' ]);
$databaseId = $database [ 'body' ][ '$id' ];
$collection = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections' , array_merge ([
2021-08-31 16:35:03 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
2022-08-14 10:33:36 +00:00
'collectionId' => ID :: custom ( 'attributeRowWidthLimit' ),
2021-08-31 16:35:03 +00:00
'name' => 'attributeRowWidthLimit' ,
2022-08-03 04:17:49 +00:00
'permissions' => [
2022-08-14 05:21:11 +00:00
Permission :: read ( Role :: any ()),
Permission :: create ( Role :: any ()),
Permission :: update ( Role :: any ()),
Permission :: delete ( Role :: any ()),
2022-08-03 04:17:49 +00:00
],
'documentSecurity' => true ,
2021-08-31 16:35:03 +00:00
]);
2022-08-08 11:00:03 +00:00
$this -> assertEquals ( 201 , $collection [ 'headers' ][ 'status-code' ]);
2021-08-31 16:35:03 +00:00
$this -> assertEquals ( $collection [ 'body' ][ 'name' ], 'attributeRowWidthLimit' );
$collectionId = $collection [ 'body' ][ '$id' ];
// Add wide string attributes to approach row width limit
2022-05-23 14:54:50 +00:00
for ( $i = 0 ; $i < 15 ; $i ++ ) {
2022-06-22 10:51:49 +00:00
$attribute = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/string' , array_merge ([
2021-08-31 16:35:03 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
2021-12-16 15:04:30 +00:00
'key' => " attribute { $i } " ,
2021-08-31 16:35:03 +00:00
'size' => 1024 ,
'required' => true ,
]);
2022-08-12 12:54:27 +00:00
$this -> assertEquals ( 202 , $attribute [ 'headers' ][ 'status-code' ]);
2021-08-31 16:35:03 +00:00
}
sleep ( 5 );
2022-06-22 10:51:49 +00:00
$tooWide = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/string' , array_merge ([
2021-08-31 16:35:03 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
2021-12-16 15:04:30 +00:00
'key' => 'tooWide' ,
2021-08-31 16:35:03 +00:00
'size' => 1024 ,
'required' => true ,
]);
2021-09-01 14:36:01 +00:00
$this -> assertEquals ( 400 , $tooWide [ 'headers' ][ 'status-code' ]);
2024-11-12 09:27:24 +00:00
$this -> assertEquals ( 'attribute_limit_exceeded' , $tooWide [ 'body' ][ 'type' ]);
2021-08-31 16:35:03 +00:00
}
2021-07-29 23:36:46 +00:00
public function testIndexLimitException ()
{
2022-06-22 10:51:49 +00:00
$database = $this -> client -> call ( Client :: METHOD_POST , '/databases' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
2022-08-14 10:33:36 +00:00
'databaseId' => ID :: unique (),
2022-06-22 10:51:49 +00:00
'name' => 'invalidDocumentDatabase' ,
]);
$this -> assertEquals ( 201 , $database [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 'invalidDocumentDatabase' , $database [ 'body' ][ 'name' ]);
$databaseId = $database [ 'body' ][ '$id' ];
$collection = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections' , array_merge ([
2021-07-29 23:36:46 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
2022-08-14 10:33:36 +00:00
'collectionId' => ID :: custom ( 'testLimitException' ),
2021-07-29 23:36:46 +00:00
'name' => 'testLimitException' ,
2022-08-03 04:17:49 +00:00
'permissions' => [
2022-08-14 05:21:11 +00:00
Permission :: read ( Role :: any ()),
Permission :: create ( Role :: any ()),
Permission :: update ( Role :: any ()),
Permission :: delete ( Role :: any ()),
2022-08-03 04:17:49 +00:00
],
'documentSecurity' => true ,
2021-07-29 23:36:46 +00:00
]);
2022-08-08 11:00:03 +00:00
$this -> assertEquals ( 201 , $collection [ 'headers' ][ 'status-code' ]);
2021-07-29 23:36:46 +00:00
$this -> assertEquals ( $collection [ 'body' ][ 'name' ], 'testLimitException' );
$collectionId = $collection [ 'body' ][ '$id' ];
// add unique attributes for indexing
2022-05-23 14:54:50 +00:00
for ( $i = 0 ; $i < 64 ; $i ++ ) {
2021-07-29 23:36:46 +00:00
// $this->assertEquals(true, static::getDatabase()->createAttribute('indexLimit', "test{$i}", Database::VAR_STRING, 16, true));
2022-06-22 10:51:49 +00:00
$attribute = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/string' , array_merge ([
2021-07-29 23:36:46 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
2021-12-16 15:04:30 +00:00
'key' => " attribute { $i } " ,
2021-07-29 23:36:46 +00:00
'size' => 64 ,
'required' => true ,
]);
2022-08-12 12:54:27 +00:00
$this -> assertEquals ( 202 , $attribute [ 'headers' ][ 'status-code' ]);
2021-07-29 23:36:46 +00:00
}
2023-03-24 03:48:50 +00:00
sleep ( 10 );
2021-07-30 18:40:37 +00:00
2022-06-22 10:51:49 +00:00
$collection = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collectionId , array_merge ([
2021-07-30 18:40:37 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
2022-08-08 11:00:03 +00:00
$this -> assertEquals ( 200 , $collection [ 'headers' ][ 'status-code' ]);
2021-07-30 18:40:37 +00:00
$this -> assertEquals ( $collection [ 'body' ][ 'name' ], 'testLimitException' );
$this -> assertIsArray ( $collection [ 'body' ][ 'attributes' ]);
$this -> assertIsArray ( $collection [ 'body' ][ 'indexes' ]);
2021-08-11 17:25:22 +00:00
$this -> assertCount ( 64 , $collection [ 'body' ][ 'attributes' ]);
$this -> assertCount ( 0 , $collection [ 'body' ][ 'indexes' ]);
2021-07-29 23:36:46 +00:00
2021-10-26 00:14:12 +00:00
foreach ( $collection [ 'body' ][ 'attributes' ] as $attribute ) {
2021-10-26 19:15:46 +00:00
$this -> assertEquals ( 'available' , $attribute [ 'status' ], 'attribute: ' . $attribute [ 'key' ]);
2021-10-26 00:14:12 +00:00
}
2022-06-15 07:47:46 +00:00
// Test indexLimit = 64
2023-11-27 12:34:29 +00:00
// MariaDB, MySQL, and MongoDB create 6 indexes per new collection
2021-07-29 23:36:46 +00:00
// Add up to the limit, then check if the next index throws IndexLimitException
2023-11-27 12:34:29 +00:00
for ( $i = 0 ; $i < 58 ; $i ++ ) {
2022-06-22 10:51:49 +00:00
$index = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $collectionId . '/indexes' , array_merge ([
2021-07-29 23:36:46 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
2021-12-16 15:04:30 +00:00
'key' => " key_attribute { $i } " ,
2021-07-30 18:40:37 +00:00
'type' => 'key' ,
2021-07-29 23:36:46 +00:00
'attributes' => [ " attribute { $i } " ],
]);
2021-07-30 18:40:37 +00:00
2022-07-18 13:22:23 +00:00
$this -> assertEquals ( 202 , $index [ 'headers' ][ 'status-code' ]);
2021-08-24 23:35:43 +00:00
$this -> assertEquals ( " key_attribute { $i } " , $index [ 'body' ][ 'key' ]);
2021-07-29 23:36:46 +00:00
}
2021-08-24 23:35:43 +00:00
sleep ( 5 );
2021-07-29 23:36:46 +00:00
2022-06-22 10:51:49 +00:00
$collection = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collectionId , array_merge ([
2021-07-29 23:36:46 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
2022-08-08 11:00:03 +00:00
$this -> assertEquals ( 200 , $collection [ 'headers' ][ 'status-code' ]);
2021-07-30 18:40:37 +00:00
$this -> assertEquals ( $collection [ 'body' ][ 'name' ], 'testLimitException' );
$this -> assertIsArray ( $collection [ 'body' ][ 'attributes' ]);
$this -> assertIsArray ( $collection [ 'body' ][ 'indexes' ]);
$this -> assertCount ( 64 , $collection [ 'body' ][ 'attributes' ]);
2023-11-27 12:34:29 +00:00
$this -> assertCount ( 58 , $collection [ 'body' ][ 'indexes' ]);
2021-07-30 18:40:37 +00:00
2022-06-22 10:51:49 +00:00
$tooMany = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $collectionId . '/indexes' , array_merge ([
2021-07-29 23:36:46 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
2021-12-16 15:04:30 +00:00
'key' => 'tooMany' ,
2021-07-30 18:40:37 +00:00
'type' => 'key' ,
2021-08-24 23:35:43 +00:00
'attributes' => [ 'attribute61' ],
2021-07-29 23:36:46 +00:00
]);
$this -> assertEquals ( 400 , $tooMany [ 'headers' ][ 'status-code' ]);
2021-08-24 23:35:43 +00:00
$this -> assertEquals ( 'Index limit exceeded' , $tooMany [ 'body' ][ 'message' ]);
2021-09-02 16:46:05 +00:00
2022-06-22 10:51:49 +00:00
$collection = $this -> client -> call ( Client :: METHOD_DELETE , '/databases/' . $databaseId . '/collections/' . $collectionId , array_merge ([
2021-09-02 16:46:05 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
$this -> assertEquals ( 204 , $collection [ 'headers' ][ 'status-code' ]);
2021-07-29 23:36:46 +00:00
}
2023-02-26 15:45:42 +00:00
2023-02-27 07:45:21 +00:00
public function testAttributeUpdate () : array
2023-02-26 15:45:42 +00:00
{
$database = $this -> client -> call ( Client :: METHOD_POST , '/databases' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'databaseId' => ID :: unique (),
'name' => 'updateAttributes' ,
]);
$this -> assertEquals ( 201 , $database [ 'headers' ][ 'status-code' ]);
$databaseId = $database [ 'body' ][ '$id' ];
$collection = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'collectionId' => ID :: custom ( 'updateAttributes' ),
'name' => 'updateAttributes'
]);
$this -> assertEquals ( 201 , $collection [ 'headers' ][ 'status-code' ]);
$collectionId = $collection [ 'body' ][ '$id' ];
2023-02-27 07:45:21 +00:00
/**
* Create String Attribute
*/
2023-02-26 15:45:42 +00:00
$attribute = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/string' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'key' => 'string' ,
'size' => 1024 ,
2023-02-27 07:45:21 +00:00
'required' => false
]);
$this -> assertEquals ( 202 , $attribute [ 'headers' ][ 'status-code' ]);
/**
* Create Email Attribute
*/
$attribute = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/email' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'key' => 'email' ,
'required' => false
]);
$this -> assertEquals ( 202 , $attribute [ 'headers' ][ 'status-code' ]);
/**
* Create IP Attribute
*/
$attribute = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/ip' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'key' => 'ip' ,
'required' => false
]);
$this -> assertEquals ( 202 , $attribute [ 'headers' ][ 'status-code' ]);
/**
* Create URL Attribute
*/
$attribute = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/url' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'key' => 'url' ,
'required' => false
]);
$this -> assertEquals ( 202 , $attribute [ 'headers' ][ 'status-code' ]);
/**
* Create Integer Attribute
*/
$attribute = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/integer' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'key' => 'integer' ,
'required' => false
]);
$this -> assertEquals ( 202 , $attribute [ 'headers' ][ 'status-code' ]);
/**
* Create Float Attribute
*/
$attribute = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/float' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'key' => 'float' ,
'required' => false
]);
/**
* Create Boolean Attribute
*/
$attribute = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/boolean' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'key' => 'boolean' ,
'required' => false
]);
/**
* Create Datetime Attribute
*/
$attribute = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/datetime' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'key' => 'datetime' ,
'required' => false
2023-02-26 15:45:42 +00:00
]);
2023-02-27 07:45:21 +00:00
/**
* Create Enum Attribute
*/
$attribute = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/enum' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'key' => 'enum' ,
'required' => false ,
'elements' => [ 'lorem' , 'ipsum' ]
]);
2023-02-26 15:45:42 +00:00
$this -> assertEquals ( 202 , $attribute [ 'headers' ][ 'status-code' ]);
sleep ( 5 );
2023-02-27 07:45:21 +00:00
return [
'databaseId' => $databaseId ,
'collectionId' => $collectionId
];
}
/**
* @ depends testAttributeUpdate
*/
public function testAttributeUpdateString ( array $data )
{
$key = 'string' ;
$databaseId = $data [ 'databaseId' ];
$collectionId = $data [ 'collectionId' ];
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/string/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => false ,
'default' => 'lorem'
]);
2023-03-02 08:31:35 +00:00
$this -> assertEquals ( 200 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:45:21 +00:00
$new = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/' . $key , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
$this -> assertFalse ( $new [ 'body' ][ 'required' ]);
$this -> assertEquals ( 'lorem' , $new [ 'body' ][ 'default' ]);
2023-03-31 12:56:38 +00:00
$new = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collectionId , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
2024-03-06 17:34:21 +00:00
$attribute = array_values ( array_filter ( $new [ 'body' ][ 'attributes' ], fn ( array $a ) => $a [ 'key' ] === $key ))[ 0 ] ? ? null ;
2023-03-31 12:56:38 +00:00
$this -> assertNotNull ( $attribute );
$this -> assertFalse ( $attribute [ 'required' ]);
$this -> assertEquals ( 'lorem' , $attribute [ 'default' ]);
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/string/' . $key , array_merge ([
2023-03-01 12:00:36 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => false ,
'default' => null
]);
2023-03-02 08:31:35 +00:00
$this -> assertEquals ( 200 , $update [ 'headers' ][ 'status-code' ]);
2023-03-01 12:00:36 +00:00
$new = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/' . $key , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
$this -> assertFalse ( $new [ 'body' ][ 'required' ]);
$this -> assertNull ( $new [ 'body' ][ 'default' ]);
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/string/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => false ,
'default' => 'ipsum'
]);
2023-03-02 08:31:35 +00:00
$this -> assertEquals ( 200 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:45:21 +00:00
$new = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/' . $key , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
$this -> assertFalse ( $new [ 'body' ][ 'required' ]);
$this -> assertEquals ( 'ipsum' , $new [ 'body' ][ 'default' ]);
/**
* Test against failure
*/
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/string/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => 'i am no boolean' ,
'default' => 'dolor'
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: GENERAL_ARGUMENT_INVALID , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/string/' . $key , array_merge ([
2023-02-26 15:45:42 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => false ,
2023-02-27 07:45:21 +00:00
'default' => 123
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: GENERAL_ARGUMENT_INVALID , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/string/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => true ,
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: GENERAL_ARGUMENT_INVALID , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/string/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'default' => 'ipsum'
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: GENERAL_ARGUMENT_INVALID , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/string/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => true ,
2023-02-26 15:45:42 +00:00
'default' => 'ipsum'
]);
2023-02-27 07:45:21 +00:00
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: ATTRIBUTE_DEFAULT_UNSUPPORTED , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
}
/**
* @ depends testAttributeUpdate
*/
public function testAttributeUpdateEmail ( array $data )
{
$key = 'email' ;
$databaseId = $data [ 'databaseId' ];
$collectionId = $data [ 'collectionId' ];
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/email/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => false ,
'default' => 'torsten@appwrite.io'
]);
2023-03-02 08:31:35 +00:00
$this -> assertEquals ( 200 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:45:21 +00:00
$new = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/' . $key , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
$this -> assertFalse ( $new [ 'body' ][ 'required' ]);
$this -> assertEquals ( 'torsten@appwrite.io' , $new [ 'body' ][ 'default' ]);
2023-03-31 12:56:38 +00:00
$new = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collectionId , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
2024-03-06 17:34:21 +00:00
$attribute = array_values ( array_filter ( $new [ 'body' ][ 'attributes' ], fn ( array $a ) => $a [ 'key' ] === $key ))[ 0 ] ? ? null ;
2023-03-31 12:56:38 +00:00
$this -> assertNotNull ( $attribute );
$this -> assertFalse ( $attribute [ 'required' ]);
$this -> assertEquals ( 'torsten@appwrite.io' , $attribute [ 'default' ]);
2023-03-01 12:00:36 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/email/' . $key , array_merge ([
2023-03-01 12:00:36 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => false ,
'default' => null
]);
2023-03-02 08:31:35 +00:00
$this -> assertEquals ( 200 , $update [ 'headers' ][ 'status-code' ]);
2023-03-01 12:00:36 +00:00
$new = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/' . $key , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
$this -> assertFalse ( $new [ 'body' ][ 'required' ]);
$this -> assertNull ( $new [ 'body' ][ 'default' ]);
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/email/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => false ,
'default' => 'eldad@appwrite.io'
]);
2023-03-02 08:31:35 +00:00
$this -> assertEquals ( 200 , $update [ 'headers' ][ 'status-code' ]);
2023-02-26 15:45:42 +00:00
2023-02-27 07:45:21 +00:00
$new = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/' . $key , array_merge ([
2023-02-26 15:45:42 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
2023-02-27 07:45:21 +00:00
$this -> assertFalse ( $new [ 'body' ][ 'required' ]);
$this -> assertEquals ( 'eldad@appwrite.io' , $new [ 'body' ][ 'default' ]);
/**
* Test against failure
*/
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/email/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => 'no boolean' ,
'default' => 'torsten@appwrite.io'
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: GENERAL_ARGUMENT_INVALID , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/email/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => false ,
'default' => 'i am no email'
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: GENERAL_ARGUMENT_INVALID , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/email/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => true ,
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: GENERAL_ARGUMENT_INVALID , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/email/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'default' => 'ipsum'
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: GENERAL_ARGUMENT_INVALID , $update [ 'body' ][ 'type' ]);
2023-02-26 15:45:42 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/email/' . $key , array_merge ([
2023-02-26 15:45:42 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => true ,
2023-02-27 07:45:21 +00:00
'default' => 'torsten@appwrite.io'
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: ATTRIBUTE_DEFAULT_UNSUPPORTED , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
}
/**
* @ depends testAttributeUpdate
*/
public function testAttributeUpdateIp ( array $data )
{
$key = 'ip' ;
$databaseId = $data [ 'databaseId' ];
$collectionId = $data [ 'collectionId' ];
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/ip/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => false ,
'default' => '127.0.0.1'
]);
2023-03-02 08:31:35 +00:00
$this -> assertEquals ( 200 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:45:21 +00:00
$new = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/' . $key , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
$this -> assertFalse ( $new [ 'body' ][ 'required' ]);
$this -> assertEquals ( '127.0.0.1' , $new [ 'body' ][ 'default' ]);
2023-03-31 12:56:38 +00:00
$new = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collectionId , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
2024-03-06 17:34:21 +00:00
$attribute = array_values ( array_filter ( $new [ 'body' ][ 'attributes' ], fn ( array $a ) => $a [ 'key' ] === $key ))[ 0 ] ? ? null ;
2023-03-31 12:56:38 +00:00
$this -> assertNotNull ( $attribute );
$this -> assertFalse ( $attribute [ 'required' ]);
$this -> assertEquals ( '127.0.0.1' , $attribute [ 'default' ]);
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/ip/' . $key , array_merge ([
2023-03-01 12:00:36 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => false ,
'default' => null
]);
2023-03-02 08:31:35 +00:00
$this -> assertEquals ( 200 , $update [ 'headers' ][ 'status-code' ]);
2023-03-01 12:00:36 +00:00
$new = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/' . $key , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
$this -> assertFalse ( $new [ 'body' ][ 'required' ]);
$this -> assertNull ( $new [ 'body' ][ 'default' ]);
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/ip/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => false ,
'default' => '192.168.0.1'
2023-02-26 15:45:42 +00:00
]);
2023-03-02 08:31:35 +00:00
$this -> assertEquals ( 200 , $update [ 'headers' ][ 'status-code' ]);
2023-02-26 15:45:42 +00:00
2023-02-27 07:45:21 +00:00
$new = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/' . $key , array_merge ([
2023-02-26 15:45:42 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
2023-02-27 07:45:21 +00:00
$this -> assertFalse ( $new [ 'body' ][ 'required' ]);
$this -> assertEquals ( '192.168.0.1' , $new [ 'body' ][ 'default' ]);
/**
* Test against failure
*/
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/ip/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => 'no boolean' ,
'default' => '127.0.0.1'
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: GENERAL_ARGUMENT_INVALID , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/ip/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => false ,
'default' => 'i am no ip'
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: GENERAL_ARGUMENT_INVALID , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/ip/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => true ,
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: GENERAL_ARGUMENT_INVALID , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/ip/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'default' => '127.0.0.1'
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: GENERAL_ARGUMENT_INVALID , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/ip/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => true ,
'default' => '127.0.0.1'
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: ATTRIBUTE_DEFAULT_UNSUPPORTED , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
}
/**
* @ depends testAttributeUpdate
*/
public function testAttributeUpdateUrl ( array $data )
{
$key = 'url' ;
$databaseId = $data [ 'databaseId' ];
$collectionId = $data [ 'collectionId' ];
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/url/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => false ,
'default' => 'http://appwrite.io'
]);
2023-03-02 08:31:35 +00:00
$this -> assertEquals ( 200 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:45:21 +00:00
$new = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/' . $key , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
$this -> assertFalse ( $new [ 'body' ][ 'required' ]);
$this -> assertEquals ( 'http://appwrite.io' , $new [ 'body' ][ 'default' ]);
2023-03-31 12:56:38 +00:00
$new = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collectionId , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
2024-03-06 17:34:21 +00:00
$attribute = array_values ( array_filter ( $new [ 'body' ][ 'attributes' ], fn ( array $a ) => $a [ 'key' ] === $key ))[ 0 ] ? ? null ;
2023-03-31 12:56:38 +00:00
$this -> assertNotNull ( $attribute );
$this -> assertFalse ( $attribute [ 'required' ]);
$this -> assertEquals ( 'http://appwrite.io' , $attribute [ 'default' ]);
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/url/' . $key , array_merge ([
2023-03-01 12:00:36 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => false ,
'default' => null
]);
2023-03-02 08:31:35 +00:00
$this -> assertEquals ( 200 , $update [ 'headers' ][ 'status-code' ]);
2023-03-01 12:00:36 +00:00
$new = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/' . $key , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
$this -> assertFalse ( $new [ 'body' ][ 'required' ]);
$this -> assertNull ( $new [ 'body' ][ 'default' ]);
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/url/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => false ,
'default' => 'https://appwrite.io'
]);
2023-03-02 08:31:35 +00:00
$this -> assertEquals ( 200 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:45:21 +00:00
$new = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/' . $key , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
$this -> assertFalse ( $new [ 'body' ][ 'required' ]);
$this -> assertEquals ( 'https://appwrite.io' , $new [ 'body' ][ 'default' ]);
/**
* Test against failure
*/
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/url/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => 'no boolean' ,
'default' => 'https://appwrite.io'
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: GENERAL_ARGUMENT_INVALID , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/url/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => false ,
'default' => 'i am no url'
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: GENERAL_ARGUMENT_INVALID , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/url/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => true ,
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: GENERAL_ARGUMENT_INVALID , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/url/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'default' => 'https://appwrite.io'
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: GENERAL_ARGUMENT_INVALID , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/url/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => true ,
'default' => 'https://appwrite.io'
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: ATTRIBUTE_DEFAULT_UNSUPPORTED , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
}
/**
* @ depends testAttributeUpdate
*/
public function testAttributeUpdateInteger ( array $data )
{
$key = 'integer' ;
$databaseId = $data [ 'databaseId' ];
$collectionId = $data [ 'collectionId' ];
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/integer/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => false ,
'default' => 123 ,
'min' => 0 ,
'max' => 1000
]);
2023-03-02 08:31:35 +00:00
$this -> assertEquals ( 200 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:45:21 +00:00
$new = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/' . $key , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
$this -> assertFalse ( $new [ 'body' ][ 'required' ]);
$this -> assertEquals ( 123 , $new [ 'body' ][ 'default' ]);
$this -> assertEquals ( 0 , $new [ 'body' ][ 'min' ]);
$this -> assertEquals ( 1000 , $new [ 'body' ][ 'max' ]);
2023-03-31 12:56:38 +00:00
$new = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collectionId , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
2024-03-06 17:34:21 +00:00
$attribute = array_values ( array_filter ( $new [ 'body' ][ 'attributes' ], fn ( array $a ) => $a [ 'key' ] === $key ))[ 0 ] ? ? null ;
2023-03-31 12:56:38 +00:00
$this -> assertNotNull ( $attribute );
$this -> assertFalse ( $attribute [ 'required' ]);
$this -> assertEquals ( 123 , $attribute [ 'default' ]);
$this -> assertEquals ( 0 , $attribute [ 'min' ]);
$this -> assertEquals ( 1000 , $attribute [ 'max' ]);
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/integer/' . $key , array_merge ([
2023-03-01 12:00:36 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => false ,
'default' => null ,
'min' => 0 ,
'max' => 1000
]);
2023-03-02 08:31:35 +00:00
$this -> assertEquals ( 200 , $update [ 'headers' ][ 'status-code' ]);
2023-03-01 12:00:36 +00:00
$new = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/' . $key , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
$this -> assertFalse ( $new [ 'body' ][ 'required' ]);
$this -> assertNull ( $new [ 'body' ][ 'default' ]);
$this -> assertEquals ( 0 , $new [ 'body' ][ 'min' ]);
$this -> assertEquals ( 1000 , $new [ 'body' ][ 'max' ]);
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/integer/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => false ,
'default' => 456 ,
'min' => 100 ,
'max' => 2000
]);
2023-03-02 08:31:35 +00:00
$this -> assertEquals ( 200 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:45:21 +00:00
$new = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/' . $key , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
$this -> assertFalse ( $new [ 'body' ][ 'required' ]);
$this -> assertEquals ( 456 , $new [ 'body' ][ 'default' ]);
$this -> assertEquals ( 100 , $new [ 'body' ][ 'min' ]);
$this -> assertEquals ( 2000 , $new [ 'body' ][ 'max' ]);
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/integer/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
2025-02-20 13:37:13 +00:00
'required' => false ,
'default' => 100 ,
2023-02-27 07:45:21 +00:00
'min' => 0 ,
]);
2025-02-20 13:37:13 +00:00
$this -> assertEquals ( 200 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/integer/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => false ,
2025-02-26 17:35:06 +00:00
'default' => 10 ,
'max' => 100 ,
2023-02-27 07:45:21 +00:00
]);
2025-02-20 13:37:13 +00:00
$this -> assertEquals ( 200 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:45:21 +00:00
2025-02-20 13:37:13 +00:00
/**
* Test against failure
*/
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/integer/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
2025-02-20 13:37:13 +00:00
'required' => 'no boolean' ,
'default' => 123 ,
'min' => 0 ,
2023-02-27 07:45:21 +00:00
'max' => 500
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: GENERAL_ARGUMENT_INVALID , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/integer/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => false ,
2025-02-20 13:37:13 +00:00
'default' => 'i am no integer' ,
2023-02-27 07:45:21 +00:00
'min' => 0 ,
2025-02-20 13:37:13 +00:00
'max' => 500
2023-02-27 07:45:21 +00:00
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: GENERAL_ARGUMENT_INVALID , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/integer/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => false ,
'default' => 100 ,
2025-02-20 13:37:13 +00:00
'min' => 'i am no integer' ,
'max' => 500
2023-02-27 07:45:21 +00:00
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: GENERAL_ARGUMENT_INVALID , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/integer/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => false ,
'default' => 100 ,
2025-02-20 13:37:13 +00:00
'min' => 0 ,
'max' => 'i am no integer'
2023-02-27 07:45:21 +00:00
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: GENERAL_ARGUMENT_INVALID , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/integer/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => false ,
'min' => 0 ,
'max' => 100 ,
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: GENERAL_ARGUMENT_INVALID , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/integer/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'default' => 50 ,
'min' => 0 ,
'max' => 100 ,
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: GENERAL_ARGUMENT_INVALID , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/integer/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => true ,
'default' => 50 ,
'min' => 0 ,
'max' => 100
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: ATTRIBUTE_DEFAULT_UNSUPPORTED , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/integer/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => false ,
'default' => 50 ,
'min' => 55 ,
'max' => 100
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: ATTRIBUTE_VALUE_INVALID , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/integer/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => false ,
'default' => 105 ,
'min' => 50 ,
'max' => 100
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: ATTRIBUTE_VALUE_INVALID , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/integer/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => false ,
'default' => 50 ,
'min' => 200 ,
'max' => 100
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: ATTRIBUTE_VALUE_INVALID , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
}
/**
* @ depends testAttributeUpdate
*/
public function testAttributeUpdateFloat ( array $data )
{
$key = 'float' ;
$databaseId = $data [ 'databaseId' ];
$collectionId = $data [ 'collectionId' ];
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/float/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => false ,
'default' => 123.456 ,
'min' => 0.0 ,
'max' => 1000.0
]);
2023-03-02 08:31:35 +00:00
$this -> assertEquals ( 200 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:45:21 +00:00
$new = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/' . $key , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
$this -> assertFalse ( $new [ 'body' ][ 'required' ]);
$this -> assertEquals ( 123.456 , $new [ 'body' ][ 'default' ]);
$this -> assertEquals ( 0 , $new [ 'body' ][ 'min' ]);
$this -> assertEquals ( 1000 , $new [ 'body' ][ 'max' ]);
2023-03-31 12:56:38 +00:00
$new = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collectionId , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
2024-03-06 17:34:21 +00:00
$attribute = array_values ( array_filter ( $new [ 'body' ][ 'attributes' ], fn ( array $a ) => $a [ 'key' ] === $key ))[ 0 ] ? ? null ;
2023-03-31 12:56:38 +00:00
$this -> assertNotNull ( $attribute );
$this -> assertFalse ( $attribute [ 'required' ]);
$this -> assertEquals ( 123.456 , $attribute [ 'default' ]);
$this -> assertEquals ( 0 , $attribute [ 'min' ]);
$this -> assertEquals ( 1000 , $attribute [ 'max' ]);
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/float/' . $key , array_merge ([
2023-03-01 12:00:36 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => false ,
'default' => null ,
'min' => 0.0 ,
'max' => 1000.0
]);
2023-03-02 08:31:35 +00:00
$this -> assertEquals ( 200 , $update [ 'headers' ][ 'status-code' ]);
2023-03-01 12:00:36 +00:00
$new = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/' . $key , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
$this -> assertFalse ( $new [ 'body' ][ 'required' ]);
$this -> assertNull ( $new [ 'body' ][ 'default' ]);
$this -> assertEquals ( 0 , $new [ 'body' ][ 'min' ]);
$this -> assertEquals ( 1000 , $new [ 'body' ][ 'max' ]);
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/float/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => false ,
'default' => 456.789 ,
'min' => 123.456 ,
'max' => 2000.0
]);
2023-03-02 08:31:35 +00:00
$this -> assertEquals ( 200 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:45:21 +00:00
$new = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/' . $key , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
$this -> assertFalse ( $new [ 'body' ][ 'required' ]);
$this -> assertEquals ( 456.789 , $new [ 'body' ][ 'default' ]);
$this -> assertEquals ( 123.456 , $new [ 'body' ][ 'min' ]);
$this -> assertEquals ( 2000 , $new [ 'body' ][ 'max' ]);
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/float/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
2025-02-20 13:37:13 +00:00
'required' => false ,
2023-02-27 07:45:21 +00:00
'default' => 123.456 ,
'min' => 0.0 ,
]);
2025-02-20 13:37:13 +00:00
$this -> assertEquals ( 200 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/float/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => false ,
2025-02-26 17:35:06 +00:00
'default' => 23.456 ,
'max' => 100.0 ,
2023-02-27 07:45:21 +00:00
]);
2025-02-20 13:37:13 +00:00
$this -> assertEquals ( 200 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:45:21 +00:00
2025-02-20 13:37:13 +00:00
/**
* Test against failure
*/
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/float/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
2025-02-20 13:37:13 +00:00
'required' => 'no boolean' ,
2023-02-27 07:45:21 +00:00
'default' => 123.456 ,
2025-02-20 13:37:13 +00:00
'min' => 0.0 ,
'max' => 1000.0
2023-02-27 07:45:21 +00:00
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: GENERAL_ARGUMENT_INVALID , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/float/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => false ,
2025-02-20 13:37:13 +00:00
'default' => 'i am no integer' ,
2023-02-27 07:45:21 +00:00
'min' => 0.0 ,
2025-02-20 13:37:13 +00:00
'max' => 500.0
2023-02-27 07:45:21 +00:00
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: GENERAL_ARGUMENT_INVALID , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/float/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => false ,
'default' => 123.456 ,
2025-02-20 13:37:13 +00:00
'min' => 'i am no integer' ,
'max' => 500.0
2023-02-27 07:45:21 +00:00
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: GENERAL_ARGUMENT_INVALID , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/float/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => false ,
'default' => 123.456 ,
2025-02-20 13:37:13 +00:00
'min' => 0.0 ,
'max' => 'i am no integer'
2023-02-27 07:45:21 +00:00
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: GENERAL_ARGUMENT_INVALID , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/float/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => false ,
'min' => 0.0 ,
'max' => 100.0 ,
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: GENERAL_ARGUMENT_INVALID , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/float/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'default' => 123.456 ,
'min' => 0.0 ,
'max' => 100.0 ,
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: GENERAL_ARGUMENT_INVALID , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/float/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => true ,
'default' => 123.456 ,
'min' => 0.0 ,
'max' => 100.0
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: ATTRIBUTE_DEFAULT_UNSUPPORTED , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/float/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => false ,
'default' => 123.456 ,
'min' => 200.0 ,
'max' => 300.0
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: ATTRIBUTE_VALUE_INVALID , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/float/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => false ,
'default' => 123.456 ,
'min' => 0.0 ,
'max' => 100.0
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: ATTRIBUTE_VALUE_INVALID , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/float/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => false ,
'default' => 50.0 ,
'min' => 200.0 ,
'max' => 100.0
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: ATTRIBUTE_VALUE_INVALID , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
}
/**
* @ depends testAttributeUpdate
*/
public function testAttributeUpdateBoolean ( array $data )
{
$key = 'boolean' ;
$databaseId = $data [ 'databaseId' ];
$collectionId = $data [ 'collectionId' ];
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/boolean/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => false ,
'default' => true
]);
2023-03-02 08:31:35 +00:00
$this -> assertEquals ( 200 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:45:21 +00:00
$new = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/' . $key , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
$this -> assertFalse ( $new [ 'body' ][ 'required' ]);
$this -> assertEquals ( true , $new [ 'body' ][ 'default' ]);
2023-03-31 12:56:38 +00:00
$new = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collectionId , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
2024-03-06 17:34:21 +00:00
$attribute = array_values ( array_filter ( $new [ 'body' ][ 'attributes' ], fn ( array $a ) => $a [ 'key' ] === $key ))[ 0 ] ? ? null ;
2023-03-31 12:56:38 +00:00
$this -> assertNotNull ( $attribute );
$this -> assertFalse ( $attribute [ 'required' ]);
$this -> assertEquals ( true , $attribute [ 'default' ]);
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/boolean/' . $key , array_merge ([
2023-03-01 12:00:36 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => false ,
'default' => null
]);
2023-03-02 08:31:35 +00:00
$this -> assertEquals ( 200 , $update [ 'headers' ][ 'status-code' ]);
2023-03-01 12:00:36 +00:00
$new = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/' . $key , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
$this -> assertFalse ( $new [ 'body' ][ 'required' ]);
$this -> assertNull ( $new [ 'body' ][ 'default' ]);
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/boolean/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => false ,
'default' => false
]);
2023-03-02 08:31:35 +00:00
$this -> assertEquals ( 200 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:45:21 +00:00
$new = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/' . $key , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
$this -> assertFalse ( $new [ 'body' ][ 'required' ]);
$this -> assertEquals ( false , $new [ 'body' ][ 'default' ]);
/**
* Test against failure
*/
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/boolean/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => 'no boolean' ,
'default' => true
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: GENERAL_ARGUMENT_INVALID , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/boolean/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => false ,
'default' => 'i am no boolean'
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: GENERAL_ARGUMENT_INVALID , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/boolean/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => true ,
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: GENERAL_ARGUMENT_INVALID , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/boolean/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'default' => false
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: GENERAL_ARGUMENT_INVALID , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/boolean/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => true ,
'default' => true
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: ATTRIBUTE_DEFAULT_UNSUPPORTED , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
}
/**
* @ depends testAttributeUpdate
*/
public function testAttributeUpdateDatetime ( array $data )
{
$key = 'datetime' ;
$databaseId = $data [ 'databaseId' ];
$collectionId = $data [ 'collectionId' ];
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/datetime/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => false ,
'default' => '1975-06-12 14:12:55+02:00'
]);
2023-03-02 08:31:35 +00:00
$this -> assertEquals ( 200 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:45:21 +00:00
$new = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/' . $key , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
$this -> assertFalse ( $new [ 'body' ][ 'required' ]);
$this -> assertEquals ( '1975-06-12 14:12:55+02:00' , $new [ 'body' ][ 'default' ]);
2023-03-31 12:56:38 +00:00
$new = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collectionId , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
2024-03-06 17:34:21 +00:00
$attribute = array_values ( array_filter ( $new [ 'body' ][ 'attributes' ], fn ( array $a ) => $a [ 'key' ] === $key ))[ 0 ] ? ? null ;
2023-03-31 12:56:38 +00:00
$this -> assertNotNull ( $attribute );
$this -> assertFalse ( $attribute [ 'required' ]);
$this -> assertEquals ( '1975-06-12 14:12:55+02:00' , $attribute [ 'default' ]);
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/datetime/' . $key , array_merge ([
2023-03-01 12:00:36 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => false ,
'default' => null
]);
2023-03-02 08:31:35 +00:00
$this -> assertEquals ( 200 , $update [ 'headers' ][ 'status-code' ]);
2023-03-01 12:00:36 +00:00
$new = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/' . $key , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
$this -> assertFalse ( $new [ 'body' ][ 'required' ]);
$this -> assertNull ( $new [ 'body' ][ 'default' ]);
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/datetime/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => false ,
'default' => '1965-06-12 14:12:55+02:00'
]);
2023-03-02 08:31:35 +00:00
$this -> assertEquals ( 200 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:45:21 +00:00
$new = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/' . $key , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
$this -> assertFalse ( $new [ 'body' ][ 'required' ]);
$this -> assertEquals ( '1965-06-12 14:12:55+02:00' , $new [ 'body' ][ 'default' ]);
/**
* Test against failure
*/
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/datetime/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => 'no boolean' ,
'default' => '1975-06-12 14:12:55+02:00'
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: GENERAL_ARGUMENT_INVALID , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/datetime/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => false ,
'default' => 'i am no datetime'
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: GENERAL_ARGUMENT_INVALID , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/datetime/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => true ,
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: GENERAL_ARGUMENT_INVALID , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/datetime/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'default' => '1975-06-12 14:12:55+02:00'
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: GENERAL_ARGUMENT_INVALID , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/datetime/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => true ,
'default' => '1975-06-12 14:12:55+02:00'
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: ATTRIBUTE_DEFAULT_UNSUPPORTED , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
}
/**
* @ depends testAttributeUpdate
*/
public function testAttributeUpdateEnum ( array $data )
{
$key = 'enum' ;
$databaseId = $data [ 'databaseId' ];
$collectionId = $data [ 'collectionId' ];
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/enum/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'elements' => [ 'lorem' , 'ipsum' , 'dolor' ],
'required' => false ,
'default' => 'lorem'
]);
2023-03-02 08:31:35 +00:00
$this -> assertEquals ( 200 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:45:21 +00:00
$new = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/' . $key , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
$this -> assertFalse ( $new [ 'body' ][ 'required' ]);
$this -> assertEquals ( 'lorem' , $new [ 'body' ][ 'default' ]);
$this -> assertCount ( 3 , $new [ 'body' ][ 'elements' ]);
$this -> assertContains ( 'lorem' , $new [ 'body' ][ 'elements' ]);
$this -> assertContains ( 'ipsum' , $new [ 'body' ][ 'elements' ]);
$this -> assertContains ( 'dolor' , $new [ 'body' ][ 'elements' ]);
2023-03-31 12:56:38 +00:00
$new = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collectionId , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
2024-03-06 17:34:21 +00:00
$attribute = array_values ( array_filter ( $new [ 'body' ][ 'attributes' ], fn ( array $a ) => $a [ 'key' ] === $key ))[ 0 ] ? ? null ;
2023-03-31 12:56:38 +00:00
$this -> assertNotNull ( $attribute );
$this -> assertFalse ( $attribute [ 'required' ]);
$this -> assertEquals ( 'lorem' , $attribute [ 'default' ]);
$this -> assertCount ( 3 , $attribute [ 'elements' ]);
$this -> assertContains ( 'lorem' , $attribute [ 'elements' ]);
$this -> assertContains ( 'ipsum' , $attribute [ 'elements' ]);
$this -> assertContains ( 'dolor' , $attribute [ 'elements' ]);
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/enum/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
2023-03-01 12:00:36 +00:00
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'elements' => [ 'lorem' , 'ipsum' , 'dolor' ],
'required' => false ,
'default' => null
]);
2023-03-02 08:31:35 +00:00
$this -> assertEquals ( 200 , $update [ 'headers' ][ 'status-code' ]);
2023-03-01 12:00:36 +00:00
$new = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/' . $key , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
$this -> assertFalse ( $new [ 'body' ][ 'required' ]);
$this -> assertNull ( $new [ 'body' ][ 'default' ]);
$this -> assertCount ( 3 , $new [ 'body' ][ 'elements' ]);
$this -> assertContains ( 'lorem' , $new [ 'body' ][ 'elements' ]);
$this -> assertContains ( 'ipsum' , $new [ 'body' ][ 'elements' ]);
$this -> assertContains ( 'dolor' , $new [ 'body' ][ 'elements' ]);
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/enum/' . $key , array_merge ([
2023-03-01 12:00:36 +00:00
'content-type' => 'application/json' ,
2023-02-27 07:45:21 +00:00
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'elements' => [ 'ipsum' , 'dolor' ],
'required' => false ,
'default' => 'dolor'
]);
2023-03-02 08:31:35 +00:00
$this -> assertEquals ( 200 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:45:21 +00:00
$new = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/' . $key , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
$this -> assertFalse ( $new [ 'body' ][ 'required' ]);
$this -> assertEquals ( 'dolor' , $new [ 'body' ][ 'default' ]);
$this -> assertCount ( 2 , $new [ 'body' ][ 'elements' ]);
$this -> assertContains ( 'ipsum' , $new [ 'body' ][ 'elements' ]);
$this -> assertContains ( 'dolor' , $new [ 'body' ][ 'elements' ]);
/**
* Test against failure
*/
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/enum/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'elements' => [],
'required' => false ,
'default' => 'lorem'
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: ATTRIBUTE_VALUE_INVALID , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/enum/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'elements' => [ 'ipsum' , 'dolor' ],
'required' => false ,
'default' => 'lorem'
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: ATTRIBUTE_VALUE_INVALID , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/enum/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => 'no boolean' ,
'default' => 'lorem' ,
'elements' => [ 'lorem' , 'ipsum' , 'dolor' ],
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: GENERAL_ARGUMENT_INVALID , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/enum/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => false ,
'default' => 123 ,
'elements' => [ 'lorem' , 'ipsum' , 'dolor' ],
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: GENERAL_ARGUMENT_INVALID , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/enum/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => false ,
'default' => 'lorem' ,
'elements' => 'i am no array' ,
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: GENERAL_ARGUMENT_INVALID , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/enum/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => false ,
'default' => 'lorem' ,
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: GENERAL_ARGUMENT_INVALID , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/enum/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => true ,
'elements' => [ 'lorem' , 'ipsum' , 'dolor' ],
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: GENERAL_ARGUMENT_INVALID , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/enum/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'default' => 'lorem' ,
'elements' => [ 'lorem' , 'ipsum' , 'dolor' ],
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: GENERAL_ARGUMENT_INVALID , $update [ 'body' ][ 'type' ]);
2023-02-27 07:45:21 +00:00
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/enum/' . $key , array_merge ([
2023-02-27 07:45:21 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => true ,
'default' => 'lorem' ,
'elements' => [ 'lorem' , 'ipsum' , 'dolor' ],
]);
$this -> assertEquals ( 400 , $update [ 'headers' ][ 'status-code' ]);
2023-02-27 07:47:20 +00:00
$this -> assertEquals ( AppwriteException :: ATTRIBUTE_DEFAULT_UNSUPPORTED , $update [ 'body' ][ 'type' ]);
2023-02-26 15:45:42 +00:00
}
2023-02-27 07:59:37 +00:00
2024-08-30 09:50:42 +00:00
/**
* @ depends testAttributeUpdate
*/
public function testAttributeUpdateStringResize ( array $data )
{
$key = 'string' ;
$databaseId = $data [ 'databaseId' ];
$collectionId = $data [ 'collectionId' ];
$document = $this -> client -> call (
Client :: METHOD_POST ,
'/databases/' . $databaseId . '/collections/' . $collectionId . '/documents' ,
array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]),
[
'documentId' => 'unique()' ,
'data' => [
'string' => 'string'
],
" permissions " => [ " read( \" any \" ) " ]
]
);
// Test Resize Up
$attribute = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/string/' . $key , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'size' => 2048 ,
'default' => '' ,
'required' => false
]);
$this -> assertEquals ( 200 , $attribute [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 2048 , $attribute [ 'body' ][ 'size' ]);
// Test create new document with new size
$newDoc = $this -> client -> call (
Client :: METHOD_POST ,
'/databases/' . $databaseId . '/collections/' . $collectionId . '/documents' ,
array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]),
[
'documentId' => 'unique()' ,
'data' => [
'string' => str_repeat ( 'a' , 2048 )
],
" permissions " => [ " read( \" any \" ) " ]
]
);
$this -> assertEquals ( 201 , $newDoc [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 2048 , strlen ( $newDoc [ 'body' ][ 'string' ]));
// Test update document with new size
$document = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/documents/' . $document [ 'body' ][ '$id' ], array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'data' => [
'string' => str_repeat ( 'a' , 2048 )
]
]);
$this -> assertEquals ( 200 , $document [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 2048 , strlen ( $document [ 'body' ][ 'string' ]));
// Test Exception on resize down with data that is too large
$attribute = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/string/' . $key , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'size' => 10 ,
'default' => '' ,
'required' => false
]);
$this -> assertEquals ( 400 , $attribute [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( AppwriteException :: ATTRIBUTE_INVALID_RESIZE , $attribute [ 'body' ][ 'type' ]);
// original documents to original size, remove new document
$document = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/documents/' . $document [ 'body' ][ '$id' ], array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'data' => [
'string' => 'string'
]
]);
$this -> assertEquals ( 200 , $document [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 'string' , $document [ 'body' ][ 'string' ]);
$deleteDoc = $this -> client -> call ( Client :: METHOD_DELETE , '/databases/' . $databaseId . '/collections/' . $collectionId . '/documents/' . $newDoc [ 'body' ][ '$id' ], array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
$this -> assertEquals ( 204 , $deleteDoc [ 'headers' ][ 'status-code' ]);
// Test Resize Down
$attribute = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/string/' . $key , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'size' => 10 ,
'default' => '' ,
'required' => false
]);
$this -> assertEquals ( 200 , $attribute [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 10 , $attribute [ 'body' ][ 'size' ]);
// Test create new document with new size
$newDoc = $this -> client -> call (
Client :: METHOD_POST ,
'/databases/' . $databaseId . '/collections/' . $collectionId . '/documents' ,
array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]),
[
'documentId' => 'unique()' ,
'data' => [
'string' => str_repeat ( 'a' , 10 )
],
" permissions " => [ " read( \" any \" ) " ]
]
);
$this -> assertEquals ( 201 , $newDoc [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 10 , strlen ( $newDoc [ 'body' ][ 'string' ]));
// Test update document with new size
$document = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/documents/' . $document [ 'body' ][ '$id' ], array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'data' => [
'string' => str_repeat ( 'a' , 10 )
]
]);
$this -> assertEquals ( 200 , $document [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 10 , strlen ( $document [ 'body' ][ 'string' ]));
2024-08-30 10:18:45 +00:00
// Try create document with string that is too large
$newDoc = $this -> client -> call (
Client :: METHOD_POST ,
'/databases/' . $databaseId . '/collections/' . $collectionId . '/documents' ,
array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]),
[
'documentId' => 'unique()' ,
'data' => [
'string' => str_repeat ( 'a' , 11 )
],
" permissions " => [ " read( \" any \" ) " ]
]
);
$this -> assertEquals ( 400 , $newDoc [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( AppwriteException :: DOCUMENT_INVALID_STRUCTURE , $newDoc [ 'body' ][ 'type' ]);
2024-08-30 09:50:42 +00:00
}
2023-02-27 07:59:37 +00:00
/**
* @ depends testAttributeUpdate
*/
public function testAttributeUpdateNotFound ( array $data )
{
$databaseId = $data [ 'databaseId' ];
$collectionId = $data [ 'collectionId' ];
$attributes = [
'string' => [
'required' => false ,
'default' => 'ipsum'
],
'email' => [
'required' => false ,
'default' => 'eldad@appwrite.io'
],
'ip' => [
'required' => false ,
'default' => '127.0.0.1'
],
'url' => [
'required' => false ,
'default' => 'https://appwrite.io'
],
'integer' => [
'required' => false ,
'default' => 5 ,
'min' => 0 ,
'max' => 10
],
'float' => [
'required' => false ,
'default' => 5.5 ,
'min' => 0.0 ,
'max' => 10.0
],
'datetime' => [
'required' => false ,
'default' => '1975-06-12 14:12:55+02:00'
],
'enum' => [
'elements' => [ 'lorem' , 'ipsum' , 'dolor' ],
'required' => false ,
'default' => 'lorem'
]
];
foreach ( $attributes as $key => $payload ) {
/**
* Check if Database exists
*/
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/i_dont_exist/collections/' . $collectionId . '/attributes/' . $key . '/unknown_' . $key , array_merge ([
2023-02-27 07:59:37 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), $payload );
$this -> assertEquals ( 404 , $update [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( AppwriteException :: DATABASE_NOT_FOUND , $update [ 'body' ][ 'type' ]);
/**
* Check if Collection exists
*/
2023-03-23 10:28:31 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/i_dont_exist/attributes/' . $key . '/unknown_' . $key , array_merge ([
2023-02-27 07:59:37 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), $payload );
$this -> assertEquals ( 404 , $update [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( AppwriteException :: COLLECTION_NOT_FOUND , $update [ 'body' ][ 'type' ]);
/**
* Check if Attribute exists
*/
2023-03-23 10:25:40 +00:00
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/' . $key . '/unknown_' . $key , array_merge ([
2023-02-27 07:59:37 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), $payload );
$this -> assertEquals ( 404 , $update [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( AppwriteException :: ATTRIBUTE_NOT_FOUND , $update [ 'body' ][ 'type' ]);
}
}
2024-08-16 06:18:52 +00:00
/**
* @ depends testAttributeUpdate
*/
public function testAttributeRename ( array $data )
{
$key = 'string' ;
$databaseId = $data [ 'databaseId' ];
$collectionId = $data [ 'collectionId' ];
// Create document to test against
$document = $this -> client -> call (
Client :: METHOD_POST ,
'/databases/' . $databaseId . '/collections/' . $collectionId . '/documents' ,
array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]),
[
'documentId' => 'unique()' ,
'data' => [
'string' => 'string'
],
" permissions " => [ " read( \" any \" ) " ]
]
);
$this -> assertEquals ( 201 , $document [ 'headers' ][ 'status-code' ]);
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/string/' . $key , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'required' => false ,
'default' => 'lorum' ,
'newKey' => 'new_string' ,
]);
$this -> assertEquals ( 200 , $update [ 'headers' ][ 'status-code' ]);
$key = 'new_string' ;
$new = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/' . $key , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
$this -> assertEquals ( 'new_string' , $new [ 'body' ][ 'key' ]);
$doc1 = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collectionId . '/documents/' . $document [ 'body' ][ '$id' ], array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
$this -> assertArrayHasKey ( 'new_string' , $doc1 [ 'body' ]);
$this -> assertEquals ( 'string' , $doc1 [ 'body' ][ 'new_string' ]);
$this -> assertArrayNotHasKey ( 'string' , $doc1 [ 'body' ]);
// Try and create a new document with the new attribute
$doc2 = $this -> client -> call (
Client :: METHOD_POST ,
'/databases/' . $databaseId . '/collections/' . $collectionId . '/documents' ,
array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]),
[
'documentId' => 'unique()' ,
'data' => [
'new_string' => 'string'
],
" permissions " => [ " read( \" any \" ) " ]
]
);
$this -> assertEquals ( 201 , $doc2 [ 'headers' ][ 'status-code' ]);
$this -> assertArrayHasKey ( 'new_string' , $doc2 [ 'body' ]);
$this -> assertEquals ( 'string' , $doc2 [ 'body' ][ 'new_string' ]);
// Expect fail, try and create a new document with the old attribute
$doc3 = $this -> client -> call (
Client :: METHOD_POST ,
'/databases/' . $databaseId . '/collections/' . $collectionId . '/documents' ,
array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]),
[
'documentId' => 'unique()' ,
'data' => [
'string' => 'string'
],
" permissions " => [ " read( \" any \" ) " ]
]
);
$this -> assertEquals ( 400 , $doc3 [ 'headers' ][ 'status-code' ]);
}
public function createRelationshipCollections ()
{
// Prepare the database with collections and relationships
$database = $this -> client -> call ( Client :: METHOD_POST , '/databases' , [
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
], [
'databaseId' => 'database1' ,
'name' => 'Test Database'
]);
$databaseId = $database [ 'body' ][ '$id' ];
$this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'collectionId' => 'collection1' ,
'name' => 'level1' ,
'documentSecurity' => false ,
'permissions' => [
Permission :: create ( Role :: user ( $this -> getUser ()[ '$id' ])),
Permission :: read ( Role :: user ( $this -> getUser ()[ '$id' ])),
Permission :: update ( Role :: user ( $this -> getUser ()[ '$id' ])),
Permission :: delete ( Role :: user ( $this -> getUser ()[ '$id' ])),
]
]);
$this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'collectionId' => 'collection2' ,
'name' => 'level2' ,
'documentSecurity' => false ,
'permissions' => [
Permission :: create ( Role :: user ( $this -> getUser ()[ '$id' ])),
Permission :: read ( Role :: user ( $this -> getUser ()[ '$id' ])),
Permission :: update ( Role :: user ( $this -> getUser ()[ '$id' ])),
Permission :: delete ( Role :: user ( $this -> getUser ()[ '$id' ])),
]
]);
\sleep ( 2 );
}
public function cleanupRelationshipCollection ()
{
$this -> client -> call ( Client :: METHOD_DELETE , '/databases/database1' , [
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]);
\sleep ( 2 );
}
public function testAttributeRenameRelationshipOneToMany ()
{
$databaseId = 'database1' ;
$collection1Id = 'collection1' ;
$collection2Id = 'collection2' ;
$this -> createRelationshipCollections ();
$relation = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $collection1Id . '/attributes/relationship' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'relatedCollectionId' => $collection2Id ,
'type' => 'oneToMany' ,
'twoWay' => true ,
'onDelete' => 'cascade' ,
'key' => 'level2' ,
'twoWayKey' => 'level1'
]);
\sleep ( 3 );
$collection1Attributes = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collection1Id , [
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]);
$collection1RelationAttribute = $collection1Attributes [ 'body' ][ 'attributes' ][ 0 ];
$this -> assertEquals ( $relation [ 'body' ][ 'side' ], $collection1RelationAttribute [ 'side' ]);
$this -> assertEquals ( $relation [ 'body' ][ 'twoWayKey' ], $collection1RelationAttribute [ 'twoWayKey' ]);
$this -> assertEquals ( $relation [ 'body' ][ 'relatedCollection' ], $collection1RelationAttribute [ 'relatedCollection' ]);
// Create a document for checking later
$originalDocument = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $collection1Id . '/documents' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'documentId' => 'unique()' ,
'data' => [
'level2' => [[
'$id' => 'unique()' ,
'$permissions' => [ " read( \" any \" ) " ]
]],
],
" permissions " => [ " read( \" any \" ) " ]
]);
$this -> assertEquals ( 201 , $originalDocument [ 'headers' ][ 'status-code' ]);
// Rename the attribute
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collection1Id . '/attributes/level2' . '/relationship' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'newKey' => 'new_level_2'
]);
$this -> assertEquals ( 200 , $update [ 'headers' ][ 'status-code' ]);
// Check the document's key has been renamed
$newDocument = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collection1Id . '/documents/' . $originalDocument [ 'body' ][ '$id' ], array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
$this -> assertArrayHasKey ( 'new_level_2' , $newDocument [ 'body' ]);
$this -> assertEquals ( 1 , count ( $newDocument [ 'body' ][ 'new_level_2' ]));
$this -> assertArrayNotHasKey ( 'level2' , $newDocument [ 'body' ]);
// Check level2 document has been renamed
$level2Document = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collection2Id . '/documents/' . $newDocument [ 'body' ][ 'new_level_2' ][ 0 ][ '$id' ], array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
$this -> assertArrayHasKey ( 'level1' , $level2Document [ 'body' ]);
$this -> assertNotEmpty ( $level2Document [ 'body' ][ 'level1' ]);
// Check if attribute was renamed on the parent's side
$collection1Attributes = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collection1Id , [
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]);
$this -> assertEquals ( 200 , $collection1Attributes [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 1 , count ( $collection1Attributes [ 'body' ][ 'attributes' ]));
$this -> assertEquals ( 'new_level_2' , $collection1Attributes [ 'body' ][ 'attributes' ][ 0 ][ 'key' ]);
// Check if attribute was renamed on the child's side
$collection2Attributes = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collection2Id , [
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]);
$this -> assertEquals ( 200 , $collection2Attributes [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 1 , count ( $collection2Attributes [ 'body' ][ 'attributes' ]));
$this -> assertEquals ( 'new_level_2' , $collection2Attributes [ 'body' ][ 'attributes' ][ 0 ][ 'twoWayKey' ]);
$this -> cleanupRelationshipCollection ();
}
public function testAttributeRenameRelationshipOneToOne ()
{
$databaseId = 'database1' ;
$collection1Id = 'collection1' ;
$collection2Id = 'collection2' ;
$this -> createRelationshipCollections ();
$relation = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $collection1Id . '/attributes/relationship' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'relatedCollectionId' => $collection2Id ,
'type' => 'oneToOne' ,
'twoWay' => true ,
'onDelete' => 'cascade' ,
'key' => 'level2' ,
'twoWayKey' => 'level1'
]);
\sleep ( 3 );
$collection1Attributes = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collection1Id , [
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]);
$collection1RelationAttribute = $collection1Attributes [ 'body' ][ 'attributes' ][ 0 ];
$this -> assertEquals ( $relation [ 'body' ][ 'side' ], $collection1RelationAttribute [ 'side' ]);
$this -> assertEquals ( $relation [ 'body' ][ 'twoWayKey' ], $collection1RelationAttribute [ 'twoWayKey' ]);
$this -> assertEquals ( $relation [ 'body' ][ 'relatedCollection' ], $collection1RelationAttribute [ 'relatedCollection' ]);
// Create a document for checking later
$originalDocument = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $collection1Id . '/documents' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'documentId' => 'unique()' ,
'data' => [
'level2' => [
'$id' => 'unique()' ,
'$permissions' => [ " read( \" any \" ) " ]
],
],
" permissions " => [ " read( \" any \" ) " ]
]);
$this -> assertEquals ( 201 , $originalDocument [ 'headers' ][ 'status-code' ]);
// Rename the attribute
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collection1Id . '/attributes/level2' . '/relationship' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'newKey' => 'new_level_2'
]);
$this -> assertEquals ( 200 , $update [ 'headers' ][ 'status-code' ]);
// Check the document's key has been renamed
$newDocument = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collection1Id . '/documents/' . $originalDocument [ 'body' ][ '$id' ], array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
$this -> assertArrayHasKey ( 'new_level_2' , $newDocument [ 'body' ]);
$this -> assertNotEmpty ( $newDocument [ 'body' ][ 'new_level_2' ]);
$this -> assertArrayNotHasKey ( 'level2' , $newDocument [ 'body' ]);
// Check level2 document has been renamed
$level2Document = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collection2Id . '/documents/' . $newDocument [ 'body' ][ 'new_level_2' ][ '$id' ], array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
$this -> assertArrayHasKey ( 'level1' , $level2Document [ 'body' ]);
$this -> assertNotEmpty ( $level2Document [ 'body' ][ 'level1' ]);
// Check if attribute was renamed on the parent's side
$collection1Attributes = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collection1Id , [
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]);
$this -> assertEquals ( 200 , $collection1Attributes [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 1 , count ( $collection1Attributes [ 'body' ][ 'attributes' ]));
$this -> assertEquals ( 'new_level_2' , $collection1Attributes [ 'body' ][ 'attributes' ][ 0 ][ 'key' ]);
// Check if attribute was renamed on the child's side
$collection2Attributes = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collection2Id , [
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]);
$this -> assertEquals ( 200 , $collection2Attributes [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 1 , count ( $collection2Attributes [ 'body' ][ 'attributes' ]));
$this -> assertEquals ( 'new_level_2' , $collection2Attributes [ 'body' ][ 'attributes' ][ 0 ][ 'twoWayKey' ]);
$this -> cleanupRelationshipCollection ();
}
public function testAttributeRenameRelationshipManyToOne ()
{
$databaseId = 'database1' ;
$collection1Id = 'collection1' ;
$collection2Id = 'collection2' ;
$this -> createRelationshipCollections ();
$relation = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $collection1Id . '/attributes/relationship' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'relatedCollectionId' => $collection2Id ,
'type' => 'manyToOne' ,
'twoWay' => true ,
'onDelete' => 'cascade' ,
'key' => 'level2' ,
'twoWayKey' => 'level1'
]);
\sleep ( 3 );
$collection1Attributes = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collection1Id , [
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]);
$collection1RelationAttribute = $collection1Attributes [ 'body' ][ 'attributes' ][ 0 ];
$this -> assertEquals ( $relation [ 'body' ][ 'side' ], $collection1RelationAttribute [ 'side' ]);
$this -> assertEquals ( $relation [ 'body' ][ 'twoWayKey' ], $collection1RelationAttribute [ 'twoWayKey' ]);
$this -> assertEquals ( $relation [ 'body' ][ 'relatedCollection' ], $collection1RelationAttribute [ 'relatedCollection' ]);
// Create a document for checking later
$originalDocument = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $collection1Id . '/documents' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'documentId' => 'unique()' ,
'data' => [
'level2' => [
'$id' => 'unique()' ,
'$permissions' => [ " read( \" any \" ) " ]
],
],
" permissions " => [ " read( \" any \" ) " ]
]);
$this -> assertEquals ( 201 , $originalDocument [ 'headers' ][ 'status-code' ]);
// Rename the attribute
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collection1Id . '/attributes/level2' . '/relationship' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'newKey' => 'new_level_2'
]);
$this -> assertEquals ( 200 , $update [ 'headers' ][ 'status-code' ]);
// Check the document's key has been renamed
$newDocument = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collection1Id . '/documents/' . $originalDocument [ 'body' ][ '$id' ], array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
$this -> assertArrayHasKey ( 'new_level_2' , $newDocument [ 'body' ]);
$this -> assertNotEmpty ( $newDocument [ 'body' ][ 'new_level_2' ]);
$this -> assertArrayNotHasKey ( 'level2' , $newDocument [ 'body' ]);
// Check level2 document has been renamed
$level2Document = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collection2Id . '/documents/' . $newDocument [ 'body' ][ 'new_level_2' ][ '$id' ], array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
$this -> assertArrayHasKey ( 'level1' , $level2Document [ 'body' ]);
$this -> assertNotEmpty ( $level2Document [ 'body' ][ 'level1' ]);
// Check if attribute was renamed on the parent's side
$collection1Attributes = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collection1Id , [
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]);
$this -> assertEquals ( 200 , $collection1Attributes [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 1 , count ( $collection1Attributes [ 'body' ][ 'attributes' ]));
$this -> assertEquals ( 'new_level_2' , $collection1Attributes [ 'body' ][ 'attributes' ][ 0 ][ 'key' ]);
// Check if attribute was renamed on the child's side
$collection2Attributes = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collection2Id , [
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]);
$this -> assertEquals ( 200 , $collection2Attributes [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 1 , count ( $collection2Attributes [ 'body' ][ 'attributes' ]));
$this -> assertEquals ( 'new_level_2' , $collection2Attributes [ 'body' ][ 'attributes' ][ 0 ][ 'twoWayKey' ]);
$this -> cleanupRelationshipCollection ();
}
public function testAttributeRenameRelationshipManyToMany ()
{
$databaseId = 'database1' ;
$collection1Id = 'collection1' ;
$collection2Id = 'collection2' ;
$this -> createRelationshipCollections ();
$relation = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $collection1Id . '/attributes/relationship' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'relatedCollectionId' => $collection2Id ,
'type' => 'manyToOne' ,
'twoWay' => true ,
'onDelete' => 'cascade' ,
'key' => 'level2' ,
'twoWayKey' => 'level1'
]);
\sleep ( 3 );
$collection1Attributes = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collection1Id , [
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]);
$collection1RelationAttribute = $collection1Attributes [ 'body' ][ 'attributes' ][ 0 ];
$this -> assertEquals ( $relation [ 'body' ][ 'side' ], $collection1RelationAttribute [ 'side' ]);
$this -> assertEquals ( $relation [ 'body' ][ 'twoWayKey' ], $collection1RelationAttribute [ 'twoWayKey' ]);
$this -> assertEquals ( $relation [ 'body' ][ 'relatedCollection' ], $collection1RelationAttribute [ 'relatedCollection' ]);
// Create a document for checking later
$originalDocument = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $collection1Id . '/documents' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'documentId' => 'unique()' ,
'data' => [
'level2' => [
'$id' => 'unique()' ,
'$permissions' => [ " read( \" any \" ) " ]
],
],
" permissions " => [ " read( \" any \" ) " ]
]);
$this -> assertEquals ( 201 , $originalDocument [ 'headers' ][ 'status-code' ]);
// Rename the attribute
$update = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $databaseId . '/collections/' . $collection1Id . '/attributes/level2' . '/relationship' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'newKey' => 'new_level_2'
]);
$this -> assertEquals ( 200 , $update [ 'headers' ][ 'status-code' ]);
// Check the document's key has been renamed
$newDocument = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collection1Id . '/documents/' . $originalDocument [ 'body' ][ '$id' ], array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
$this -> assertArrayHasKey ( 'new_level_2' , $newDocument [ 'body' ]);
$this -> assertNotEmpty ( $newDocument [ 'body' ][ 'new_level_2' ]);
$this -> assertArrayNotHasKey ( 'level2' , $newDocument [ 'body' ]);
// Check level2 document has been renamed
$level2Document = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collection2Id . '/documents/' . $newDocument [ 'body' ][ 'new_level_2' ][ '$id' ], array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]));
$this -> assertArrayHasKey ( 'level1' , $level2Document [ 'body' ]);
$this -> assertNotEmpty ( $level2Document [ 'body' ][ 'level1' ]);
// Check if attribute was renamed on the parent's side
$collection1Attributes = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collection1Id , [
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]);
$this -> assertEquals ( 200 , $collection1Attributes [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 1 , count ( $collection1Attributes [ 'body' ][ 'attributes' ]));
$this -> assertEquals ( 'new_level_2' , $collection1Attributes [ 'body' ][ 'attributes' ][ 0 ][ 'key' ]);
// Check if attribute was renamed on the child's side
$collection2Attributes = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $databaseId . '/collections/' . $collection2Id , [
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]);
$this -> assertEquals ( 200 , $collection2Attributes [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 1 , count ( $collection2Attributes [ 'body' ][ 'attributes' ]));
$this -> assertEquals ( 'new_level_2' , $collection2Attributes [ 'body' ][ 'attributes' ][ 0 ][ 'twoWayKey' ]);
$this -> cleanupRelationshipCollection ();
}
2025-05-08 05:17:02 +00:00
public function testBulkCreate () : void
{
// Create database
$database = $this -> client -> call ( Client :: METHOD_POST , '/databases' , [
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
], [
'databaseId' => ID :: unique (),
'name' => 'Bulk Create Perms' ,
]);
$this -> assertNotEmpty ( $database [ 'body' ][ '$id' ]);
$databaseId = $database [ 'body' ][ '$id' ];
$collection = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'collectionId' => ID :: unique (),
'name' => 'Bulk Create Perms' ,
'documentSecurity' => true ,
'permissions' => [
Permission :: create ( Role :: any ()),
Permission :: read ( Role :: any ()),
Permission :: delete ( Role :: any ()),
Permission :: update ( Role :: any ()),
],
]);
$this -> assertEquals ( 201 , $collection [ 'headers' ][ 'status-code' ]);
$data = [
'$id' => $collection [ 'body' ][ '$id' ],
'databaseId' => $collection [ 'body' ][ 'databaseId' ]
];
// Await attribute
$numberAttribute = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $data [ '$id' ] . '/attributes/integer' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'key' => 'number' ,
'required' => true ,
]);
$this -> assertEquals ( 202 , $numberAttribute [ 'headers' ][ 'status-code' ]);
sleep ( 1 );
$response = $this -> client -> call ( Client :: METHOD_POST , " /databases/ { $databaseId } /collections/ { $data [ '$id' ] } /documents " , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'documents' => [
[
'$id' => ID :: unique (),
'number' => 1 ,
],
[
'$id' => ID :: unique (),
'number' => 2 ,
],
[
'$id' => ID :: unique (),
'number' => 3 ,
],
],
]);
$this -> assertEquals ( 201 , $response [ 'headers' ][ 'status-code' ]);
$this -> assertCount ( 3 , $response [ 'body' ][ 'documents' ]);
$response = $this -> client -> call ( Client :: METHOD_GET , " /databases/ { $databaseId } /collections/ { $data [ '$id' ] } /documents " , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()));
$this -> assertEquals ( 1 , $response [ 'body' ][ 'documents' ][ 0 ][ 'number' ]);
$this -> assertEquals ( 2 , $response [ 'body' ][ 'documents' ][ 1 ][ 'number' ]);
$this -> assertEquals ( 3 , $response [ 'body' ][ 'documents' ][ 2 ][ 'number' ]);
$this -> assertEquals ( 200 , $response [ 'headers' ][ 'status-code' ]);
$this -> assertCount ( 3 , $response [ 'body' ][ 'documents' ]);
2025-05-08 06:09:37 +00:00
// TEST SUCCESS - $id is auto-assigned if not included in bulk documents
$response = $this -> client -> call ( Client :: METHOD_POST , " /databases/ { $databaseId } /collections/ { $data [ '$id' ] } /documents " , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'documents' => [
[
'number' => 1 ,
]
],
]);
$this -> assertEquals ( 201 , $response [ 'headers' ][ 'status-code' ]);
2025-05-08 05:17:02 +00:00
// TEST FAIL - Can't use data and document together
$response = $this -> client -> call ( Client :: METHOD_POST , " /databases/ { $databaseId } /collections/ { $data [ '$id' ] } /documents " , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'data' => [
'number' => 5
],
'documents' => [
[
'$id' => ID :: unique (),
'number' => 1 ,
]
],
]);
$this -> assertEquals ( 400 , $response [ 'headers' ][ 'status-code' ]);
// TEST FAIL - Can't use $documentId and create bulk documents
$response = $this -> client -> call ( Client :: METHOD_POST , " /databases/ { $databaseId } /collections/ { $data [ '$id' ] } /documents " , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'documentId' => ID :: unique (),
'documents' => [
[
'$id' => ID :: unique (),
'number' => 1 ,
]
],
]);
$this -> assertEquals ( 400 , $response [ 'headers' ][ 'status-code' ]);
2025-05-08 06:09:37 +00:00
// TEST FAIL - Can't include invalid ID in bulk documents
2025-05-08 05:17:02 +00:00
$response = $this -> client -> call ( Client :: METHOD_POST , " /databases/ { $databaseId } /collections/ { $data [ '$id' ] } /documents " , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'documents' => [
[
2025-05-08 06:09:37 +00:00
'$id' => '$invalid' ,
2025-05-08 05:17:02 +00:00
'number' => 1 ,
]
],
]);
$this -> assertEquals ( 400 , $response [ 'headers' ][ 'status-code' ]);
// TEST FAIL - Can't miss number in bulk documents
$response = $this -> client -> call ( Client :: METHOD_POST , " /databases/ { $databaseId } /collections/ { $data [ '$id' ] } /documents " , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'documents' => [
[
'$id' => ID :: unique (),
'number' => 1 ,
],
[
'$id' => ID :: unique (),
],
],
]);
$this -> assertEquals ( 400 , $response [ 'headers' ][ 'status-code' ]);
// TEST FAIL - Can't push more than APP_LIMIT_DATABASE_BATCH documents
$response = $this -> client -> call ( Client :: METHOD_POST , " /databases/ { $databaseId } /collections/ { $data [ '$id' ] } /documents " , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'documents' => array_fill ( 0 , APP_LIMIT_DATABASE_BATCH + 1 , [
'$id' => ID :: unique (),
'number' => 1 ,
]),
]);
$this -> assertEquals ( 400 , $response [ 'headers' ][ 'status-code' ]);
2025-05-08 06:09:37 +00:00
// TEST FAIL - Can't include invalid permissions in nested documents
$response = $this -> client -> call ( Client :: METHOD_POST , " /databases/ { $databaseId } /collections/ { $data [ '$id' ] } /documents " , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'documents' => [
[
'$id' => ID :: unique (),
'$permissions' => [ 'invalid' ],
'number' => 1 ,
],
],
]);
2025-05-08 05:17:02 +00:00
// TEST FAIL - Can't bulk create in a collection with relationships
2025-05-08 06:09:37 +00:00
$collection2 = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'collectionId' => ID :: unique (),
'name' => 'Bulk Related' ,
'documentSecurity' => true ,
'permissions' => [],
]);
$response = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $data [ '$id' ] . '/attributes/relationship' , array_merge ([
2025-05-08 05:17:02 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
], $this -> getHeaders ()), [
2025-05-08 06:09:37 +00:00
'relatedCollectionId' => $collection2 [ 'body' ][ '$id' ],
2025-05-08 05:17:02 +00:00
'type' => 'manyToOne' ,
'twoWay' => true ,
'onDelete' => 'cascade' ,
'key' => 'level2' ,
'twoWayKey' => 'level1'
]);
$this -> assertEquals ( 202 , $response [ 'headers' ][ 'status-code' ]);
sleep ( 1 );
$response = $this -> client -> call ( Client :: METHOD_POST , " /databases/ { $databaseId } /collections/ { $data [ '$id' ] } /documents " , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'documents' => [
[ '$id' => ID :: unique (), 'number' => 1 ,],
[ '$id' => ID :: unique (), 'number' => 2 ,],
],
]);
$this -> assertEquals ( 400 , $response [ 'headers' ][ 'status-code' ]);
}
2025-05-08 06:09:37 +00:00
public function testBulkUpdate () : void
2025-05-08 05:17:02 +00:00
{
// Create database
$database = $this -> client -> call ( Client :: METHOD_POST , '/databases' , [
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
], [
'databaseId' => ID :: unique (),
'name' => 'Bulk Updates'
]);
$this -> assertNotEmpty ( $database [ 'body' ][ '$id' ]);
$databaseId = $database [ 'body' ][ '$id' ];
$collection = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'collectionId' => ID :: unique (),
'name' => 'Bulk Updates' ,
'documentSecurity' => true ,
'permissions' => [
Permission :: create ( Role :: any ()),
Permission :: read ( Role :: any ()),
Permission :: delete ( Role :: any ()),
Permission :: update ( Role :: any ()),
],
]);
$this -> assertEquals ( 201 , $collection [ 'headers' ][ 'status-code' ]);
$data = [
'$id' => $collection [ 'body' ][ '$id' ],
'databaseId' => $collection [ 'body' ][ 'databaseId' ]
];
// Await attribute
$numberAttribute = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $data [ '$id' ] . '/attributes/integer' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'key' => 'number' ,
'required' => true ,
]);
$this -> assertEquals ( 202 , $numberAttribute [ 'headers' ][ 'status-code' ]);
// Wait for database worker to create attributes
sleep ( 2 );
// Create documents
$createBulkDocuments = function ( $amount = 10 ) use ( $data ) {
$documents = [];
for ( $x = 1 ; $x <= $amount ; $x ++ ) {
$documents [] = [
'$id' => ID :: unique (),
'number' => $x ,
];
}
$doc = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $data [ 'databaseId' ] . '/collections/' . $data [ '$id' ] . '/documents' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'documents' => $documents ,
]);
$this -> assertEquals ( 201 , $doc [ 'headers' ][ 'status-code' ]);
};
$createBulkDocuments ();
// TEST: Update all documents
$response = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $data [ 'databaseId' ] . '/collections/' . $data [ '$id' ] . '/documents' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'data' => [
'number' => 100 ,
'$permissions' => [
Permission :: read ( Role :: user ( $this -> getUser ()[ '$id' ])),
Permission :: update ( Role :: user ( $this -> getUser ()[ '$id' ])),
Permission :: delete ( Role :: user ( $this -> getUser ()[ '$id' ])),
]
],
]);
$this -> assertEquals ( 200 , $response [ 'headers' ][ 'status-code' ]);
$this -> assertCount ( 10 , $response [ 'body' ][ 'documents' ]);
$documents = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $data [ 'databaseId' ] . '/collections/' . $data [ '$id' ] . '/documents' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
Query :: equal ( 'number' , [ 100 ]) -> toString (),
]);
$this -> assertEquals ( 200 , $documents [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 10 , $documents [ 'body' ][ 'total' ]);
$returnedDocuments = $response [ 'body' ][ 'documents' ];
$refetchedDocuments = $documents [ 'body' ][ 'documents' ];
$this -> assertEquals ( $returnedDocuments , $refetchedDocuments );
foreach ( $documents [ 'body' ][ 'documents' ] as $document ) {
$this -> assertEquals ([
Permission :: read ( Role :: user ( $this -> getUser ()[ '$id' ])),
Permission :: update ( Role :: user ( $this -> getUser ()[ '$id' ])),
Permission :: delete ( Role :: user ( $this -> getUser ()[ '$id' ])),
], $document [ '$permissions' ]);
$this -> assertEquals ( $collection [ 'body' ][ '$id' ], $document [ '$collectionId' ]);
$this -> assertEquals ( $data [ 'databaseId' ], $document [ '$databaseId' ]);
$this -> assertEquals ( $document [ 'number' ], 100 );
}
// TEST: Check permissions persist
$response = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $data [ 'databaseId' ] . '/collections/' . $data [ '$id' ] . '/documents' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'data' => [
'number' => 200
],
]);
$this -> assertEquals ( 200 , $response [ 'headers' ][ 'status-code' ]);
$this -> assertCount ( 10 , $response [ 'body' ][ 'documents' ]);
$documents = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $data [ 'databaseId' ] . '/collections/' . $data [ '$id' ] . '/documents' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
Query :: equal ( 'number' , [ 200 ]) -> toString (),
]);
$this -> assertEquals ( 200 , $documents [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 10 , $documents [ 'body' ][ 'total' ]);
foreach ( $documents [ 'body' ][ 'documents' ] as $document ) {
$this -> assertEquals ([
Permission :: read ( Role :: user ( $this -> getUser ()[ '$id' ])),
Permission :: update ( Role :: user ( $this -> getUser ()[ '$id' ])),
Permission :: delete ( Role :: user ( $this -> getUser ()[ '$id' ])),
], $document [ '$permissions' ]);
}
// TEST: Update documents with limit
$response = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $data [ 'databaseId' ] . '/collections/' . $data [ '$id' ] . '/documents' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'data' => [
'number' => 300
],
'queries' => [
Query :: limit ( 5 ) -> toString (),
],
]);
$this -> assertEquals ( 200 , $response [ 'headers' ][ 'status-code' ]);
$this -> assertCount ( 5 , $response [ 'body' ][ 'documents' ]);
$documents = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $data [ 'databaseId' ] . '/collections/' . $data [ '$id' ] . '/documents' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'queries' => [ Query :: equal ( 'number' , [ 200 ]) -> toString ()]
]);
$this -> assertEquals ( 200 , $documents [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 5 , $documents [ 'body' ][ 'total' ]);
// TEST: Update documents with offset
$response = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $data [ 'databaseId' ] . '/collections/' . $data [ '$id' ] . '/documents' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'data' => [
'number' => 300
],
'queries' => [
Query :: offset ( 5 ) -> toString (),
],
]);
$this -> assertEquals ( 200 , $response [ 'headers' ][ 'status-code' ]);
$this -> assertCount ( 5 , $response [ 'body' ][ 'documents' ]);
$documents = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $data [ 'databaseId' ] . '/collections/' . $data [ '$id' ] . '/documents' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'queries' => [ Query :: equal ( 'number' , [ 300 ]) -> toString ()]
]);
$this -> assertEquals ( 200 , $documents [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 10 , $documents [ 'body' ][ 'total' ]);
// TEST: Update documents with equals filter
$response = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $data [ 'databaseId' ] . '/collections/' . $data [ '$id' ] . '/documents' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'data' => [
'number' => 400
],
'queries' => [
Query :: equal ( 'number' , [ 300 ]) -> toString (),
],
]);
$this -> assertEquals ( 200 , $response [ 'headers' ][ 'status-code' ]);
$this -> assertCount ( 10 , $response [ 'body' ][ 'documents' ]);
$documents = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $data [ 'databaseId' ] . '/collections/' . $data [ '$id' ] . '/documents' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'queries' => [ Query :: equal ( 'number' , [ 400 ]) -> toString ()]
]);
$this -> assertEquals ( 200 , $documents [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 10 , $documents [ 'body' ][ 'total' ]);
// TEST: Fail - Can't bulk update in a collection with relationships
2025-05-08 06:09:37 +00:00
$collection2 = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'collectionId' => ID :: unique (),
'name' => 'Bulk Related' ,
'documentSecurity' => true ,
'permissions' => [],
]);
2025-05-08 05:17:02 +00:00
2025-05-08 06:09:37 +00:00
$response = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $data [ '$id' ] . '/attributes/relationship' , array_merge ([
2025-05-08 05:17:02 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
], $this -> getHeaders ()), [
2025-05-08 06:09:37 +00:00
'relatedCollectionId' => $collection2 [ 'body' ][ '$id' ],
2025-05-08 05:17:02 +00:00
'type' => 'manyToOne' ,
'twoWay' => true ,
'onDelete' => 'cascade' ,
'key' => 'level2' ,
'twoWayKey' => 'level1'
]);
$this -> assertEquals ( 202 , $response [ 'headers' ][ 'status-code' ]);
sleep ( 1 );
$response = $this -> client -> call ( Client :: METHOD_PATCH , '/databases/' . $data [ 'databaseId' ] . '/collections/' . $data [ '$id' ] . '/documents' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'data' => [
'number' => 500
],
'queries' => [
Query :: equal ( 'number' , [ 300 ]) -> toString (),
],
]);
$this -> assertEquals ( 400 , $response [ 'headers' ][ 'status-code' ]);
}
2025-05-08 06:09:37 +00:00
public function testBulkUpsert () : void
2025-05-08 05:17:02 +00:00
{
// Create database
$database = $this -> client -> call ( Client :: METHOD_POST , '/databases' , [
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
], [
'databaseId' => ID :: unique (),
'name' => 'Bulk Upserts'
]);
$this -> assertNotEmpty ( $database [ 'body' ][ '$id' ]);
$databaseId = $database [ 'body' ][ '$id' ];
$collection = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'collectionId' => ID :: unique (),
'name' => 'Bulk Upserts' ,
'documentSecurity' => true ,
'permissions' => [
Permission :: create ( Role :: any ()),
Permission :: read ( Role :: any ()),
Permission :: delete ( Role :: any ()),
Permission :: update ( Role :: any ()),
],
]);
$this -> assertEquals ( 201 , $collection [ 'headers' ][ 'status-code' ]);
$data = [
'$id' => $collection [ 'body' ][ '$id' ],
'databaseId' => $collection [ 'body' ][ 'databaseId' ]
];
// Await attribute
$numberAttribute = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $data [ '$id' ] . '/attributes/integer' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'key' => 'number' ,
'required' => true ,
]);
$this -> assertEquals ( 202 , $numberAttribute [ 'headers' ][ 'status-code' ]);
// Wait for database worker to create attributes
sleep ( 2 );
// Create documents
$createBulkDocuments = function ( $amount = 10 ) use ( $data ) {
$documents = [];
for ( $x = 1 ; $x <= $amount ; $x ++ ) {
$documents [] = [
'$id' => " $x " ,
'number' => $x ,
];
}
$response = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $data [ 'databaseId' ] . '/collections/' . $data [ '$id' ] . '/documents' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'documents' => $documents ,
]);
$this -> assertEquals ( 201 , $response [ 'headers' ][ 'status-code' ]);
return $documents ;
};
$documents = $createBulkDocuments ();
// Update 1 document
$documents [ \array_key_last ( $documents )][ 'number' ] = 1000 ;
// Add 1 document
$documents [] = [ 'number' => 11 ];
// TEST: Upsert all documents
$response = $this -> client -> call ( Client :: METHOD_PUT , '/databases/' . $data [ 'databaseId' ] . '/collections/' . $data [ '$id' ] . '/documents' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'documents' => $documents ,
]);
// Unchanged docs are skipped. 2 documents should be returned, 1 updated and 1 inserted.
$this -> assertEquals ( 200 , $response [ 'headers' ][ 'status-code' ]);
$this -> assertCount ( 2 , $response [ 'body' ][ 'documents' ]);
$this -> assertEquals ( 1000 , $response [ 'body' ][ 'documents' ][ 0 ][ 'number' ]);
$this -> assertEquals ( 11 , $response [ 'body' ][ 'documents' ][ 1 ][ 'number' ]);
$documents = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $data [ 'databaseId' ] . '/collections/' . $data [ '$id' ] . '/documents' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
]));
$this -> assertEquals ( 200 , $documents [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 11 , $documents [ 'body' ][ 'total' ]);
foreach ( $documents [ 'body' ][ 'documents' ] as $index => $document ) {
$this -> assertEquals ( $collection [ 'body' ][ '$id' ], $document [ '$collectionId' ]);
$this -> assertEquals ( $data [ 'databaseId' ], $document [ '$databaseId' ]);
switch ( $index ) {
case 9 :
$this -> assertEquals ( 1000 , $document [ 'number' ]);
break ;
default :
$this -> assertEquals ( $index + 1 , $document [ 'number' ]);
}
}
// TEST: Upsert permissions
$response = $this -> client -> call ( Client :: METHOD_PUT , '/databases/' . $data [ 'databaseId' ] . '/collections/' . $data [ '$id' ] . '/documents' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'documents' => [
[
'$id' => '1' ,
'number' => 1000 ,
],
[
'$id' => '10' ,
'$permissions' => [
Permission :: read ( Role :: user ( $this -> getUser ()[ '$id' ])),
Permission :: update ( Role :: user ( $this -> getUser ()[ '$id' ])),
Permission :: delete ( Role :: user ( $this -> getUser ()[ '$id' ])),
],
'number' => 10 ,
],
],
]);
$this -> assertEquals ( 1000 , $response [ 'body' ][ 'documents' ][ 0 ][ 'number' ]);
$this -> assertEquals ([], $response [ 'body' ][ 'documents' ][ 0 ][ '$permissions' ]);
$this -> assertEquals ([
Permission :: read ( Role :: user ( $this -> getUser ()[ '$id' ])),
Permission :: update ( Role :: user ( $this -> getUser ()[ '$id' ])),
Permission :: delete ( Role :: user ( $this -> getUser ()[ '$id' ])),
], $response [ 'body' ][ 'documents' ][ 1 ][ '$permissions' ]);
// TEST: Fail - Can't bulk upsert in a collection with relationships
2025-05-08 06:09:37 +00:00
$collection2 = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'collectionId' => ID :: unique (),
'name' => 'Bulk Related' ,
'documentSecurity' => true ,
'permissions' => [],
]);
2025-05-08 05:17:02 +00:00
2025-05-08 06:09:37 +00:00
$response = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $data [ '$id' ] . '/attributes/relationship' , array_merge ([
2025-05-08 05:17:02 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
], $this -> getHeaders ()), [
2025-05-08 06:09:37 +00:00
'relatedCollectionId' => $collection2 [ 'body' ][ '$id' ],
2025-05-08 05:17:02 +00:00
'type' => 'manyToOne' ,
'twoWay' => true ,
'onDelete' => 'cascade' ,
'key' => 'level2' ,
'twoWayKey' => 'level1'
]);
$this -> assertEquals ( 202 , $response [ 'headers' ][ 'status-code' ]);
sleep ( 1 );
$response = $this -> client -> call ( Client :: METHOD_PUT , '/databases/' . $data [ 'databaseId' ] . '/collections/' . $data [ '$id' ] . '/documents' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'documents' => [
[
'$id' => '1' ,
'number' => 1000 ,
],
],
]);
$this -> assertEquals ( 400 , $response [ 'headers' ][ 'status-code' ]);
}
2025-05-08 06:09:37 +00:00
public function testBulkDelete () : void
2025-05-08 05:17:02 +00:00
{
// Create database
$database = $this -> client -> call ( Client :: METHOD_POST , '/databases' , [
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
], [
'databaseId' => ID :: unique (),
'name' => 'Bulk Deletes'
]);
$this -> assertNotEmpty ( $database [ 'body' ][ '$id' ]);
$databaseId = $database [ 'body' ][ '$id' ];
$collection = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'collectionId' => ID :: unique (),
'name' => 'Bulk Deletes' ,
'documentSecurity' => false ,
'permissions' => [
Permission :: create ( Role :: any ()),
Permission :: read ( Role :: any ()),
Permission :: delete ( Role :: any ()),
],
]);
$this -> assertEquals ( 201 , $collection [ 'headers' ][ 'status-code' ]);
$data = [
'$id' => $collection [ 'body' ][ '$id' ],
'databaseId' => $collection [ 'body' ][ 'databaseId' ]
];
// Await attribute
$numberAttribute = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $data [ '$id' ] . '/attributes/integer' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'key' => 'number' ,
'required' => true ,
]);
$this -> assertEquals ( 202 , $numberAttribute [ 'headers' ][ 'status-code' ]);
// wait for database worker to create attributes
sleep ( 2 );
// Create documents
$createBulkDocuments = function ( $amount = 11 ) use ( $data ) {
$documents = [];
for ( $x = 0 ; $x < $amount ; $x ++ ) {
$documents [] = [
'$id' => ID :: unique (),
'number' => $x ,
];
}
$doc = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $data [ 'databaseId' ] . '/collections/' . $data [ '$id' ] . '/documents' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'documents' => $documents ,
]);
$this -> assertEquals ( 201 , $doc [ 'headers' ][ 'status-code' ]);
};
$createBulkDocuments ();
$documents = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $data [ 'databaseId' ] . '/collections/' . $data [ '$id' ] . '/documents' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()));
$this -> assertEquals ( 200 , $documents [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 11 , $documents [ 'body' ][ 'total' ]);
// TEST: Delete all documents
$response = $this -> client -> call ( Client :: METHOD_DELETE , '/databases/' . $data [ 'databaseId' ] . '/collections/' . $data [ '$id' ] . '/documents' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()));
$this -> assertEquals ( 200 , $response [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 11 , $response [ 'body' ][ 'total' ]);
$documents = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $data [ 'databaseId' ] . '/collections/' . $data [ '$id' ] . '/documents' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()));
$this -> assertEquals ( 200 , $documents [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 0 , $documents [ 'body' ][ 'total' ]);
// TEST: Delete documents with query
$createBulkDocuments ();
$documents = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $data [ 'databaseId' ] . '/collections/' . $data [ '$id' ] . '/documents' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()));
$this -> assertEquals ( 200 , $documents [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 11 , $documents [ 'body' ][ 'total' ]);
$response = $this -> client -> call ( Client :: METHOD_DELETE , '/databases/' . $data [ 'databaseId' ] . '/collections/' . $data [ '$id' ] . '/documents' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'queries' => [
Query :: lessThan ( 'number' , 5 ) -> toString (),
],
]);
$this -> assertEquals ( 200 , $response [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 5 , $response [ 'body' ][ 'total' ]);
$documents = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $data [ 'databaseId' ] . '/collections/' . $data [ '$id' ] . '/documents' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()));
$this -> assertEquals ( 200 , $documents [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 6 , $documents [ 'body' ][ 'total' ]);
foreach ( $documents [ 'body' ][ 'documents' ] as $document ) {
$this -> assertGreaterThanOrEqual ( 5 , $document [ 'number' ]);
}
// Cleanup
$response = $this -> client -> call ( Client :: METHOD_DELETE , '/databases/' . $data [ 'databaseId' ] . '/collections/' . $data [ '$id' ] . '/documents' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()));
$this -> assertEquals ( 200 , $response [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 6 , $response [ 'body' ][ 'total' ]);
// SUCCESS: Delete documents with query
$createBulkDocuments ();
$documents = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $data [ 'databaseId' ] . '/collections/' . $data [ '$id' ] . '/documents' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()));
$this -> assertEquals ( 200 , $documents [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 11 , $documents [ 'body' ][ 'total' ]);
$response = $this -> client -> call ( Client :: METHOD_DELETE , '/databases/' . $data [ 'databaseId' ] . '/collections/' . $data [ '$id' ] . '/documents' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'queries' => [
Query :: lessThan ( 'number' , 5 ) -> toString (),
],
]);
$this -> assertEquals ( 200 , $response [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 5 , $response [ 'body' ][ 'total' ]);
$documents = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $data [ 'databaseId' ] . '/collections/' . $data [ '$id' ] . '/documents' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()));
$this -> assertEquals ( 200 , $documents [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 6 , $documents [ 'body' ][ 'total' ]);
// Cleanup
$response = $this -> client -> call ( Client :: METHOD_DELETE , '/databases/' . $data [ 'databaseId' ] . '/collections/' . $data [ '$id' ] . '/documents' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()));
$this -> assertEquals ( 200 , $response [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 6 , $response [ 'body' ][ 'total' ]);
// SUCCESS: Delete Documents with limit query
$createBulkDocuments ();
$documents = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $data [ 'databaseId' ] . '/collections/' . $data [ '$id' ] . '/documents' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()));
$this -> assertEquals ( 200 , $documents [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 11 , $documents [ 'body' ][ 'total' ]);
$response = $this -> client -> call ( Client :: METHOD_DELETE , '/databases/' . $data [ 'databaseId' ] . '/collections/' . $data [ '$id' ] . '/documents' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'queries' => [
Query :: limit ( 2 ) -> toString (),
],
]);
$this -> assertEquals ( 200 , $response [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 2 , $response [ 'body' ][ 'total' ]);
$documents = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $data [ 'databaseId' ] . '/collections/' . $data [ '$id' ] . '/documents' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()));
$this -> assertEquals ( 200 , $documents [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 9 , $documents [ 'body' ][ 'total' ]);
// Cleanup
$response = $this -> client -> call ( Client :: METHOD_DELETE , '/databases/' . $data [ 'databaseId' ] . '/collections/' . $data [ '$id' ] . '/documents' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()));
$this -> assertEquals ( 200 , $response [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 9 , $response [ 'body' ][ 'total' ]);
// SUCCESS: Delete Documents with offset query
$createBulkDocuments ();
$documents = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $data [ 'databaseId' ] . '/collections/' . $data [ '$id' ] . '/documents' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()));
$this -> assertEquals ( 200 , $documents [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 11 , $documents [ 'body' ][ 'total' ]);
$response = $this -> client -> call ( Client :: METHOD_DELETE , '/databases/' . $data [ 'databaseId' ] . '/collections/' . $data [ '$id' ] . '/documents' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'queries' => [
Query :: offset ( 5 ) -> toString (),
],
]);
$this -> assertEquals ( 200 , $response [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 6 , $response [ 'body' ][ 'total' ]);
$documents = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $data [ 'databaseId' ] . '/collections/' . $data [ '$id' ] . '/documents' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()));
$this -> assertEquals ( 200 , $documents [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 5 , $documents [ 'body' ][ 'total' ]);
$lastDoc = end ( $documents [ 'body' ][ 'documents' ]);
$this -> assertNotEmpty ( $lastDoc );
$this -> assertEquals ( 4 , $lastDoc [ 'number' ]);
// Cleanup
$response = $this -> client -> call ( Client :: METHOD_DELETE , '/databases/' . $data [ 'databaseId' ] . '/collections/' . $data [ '$id' ] . '/documents' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()));
$this -> assertEquals ( 200 , $response [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 5 , $response [ 'body' ][ 'total' ]);
// SUCCESS: Delete 100 documents
$createBulkDocuments ( 100 );
$documents = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $data [ 'databaseId' ] . '/collections/' . $data [ '$id' ] . '/documents' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()));
$this -> assertEquals ( 200 , $documents [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 100 , $documents [ 'body' ][ 'total' ]);
$response = $this -> client -> call ( Client :: METHOD_DELETE , '/databases/' . $data [ 'databaseId' ] . '/collections/' . $data [ '$id' ] . '/documents' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()));
$this -> assertEquals ( 200 , $response [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 100 , $response [ 'body' ][ 'total' ]);
$documents = $this -> client -> call ( Client :: METHOD_GET , '/databases/' . $data [ 'databaseId' ] . '/collections/' . $data [ '$id' ] . '/documents' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()));
$this -> assertEquals ( 200 , $documents [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 0 , $documents [ 'body' ][ 'total' ]);
// TEST: Fail - Can't bulk delete in a collection with relationships
2025-05-08 06:09:37 +00:00
$collection2 = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
]), [
'collectionId' => ID :: unique (),
'name' => 'Bulk Related' ,
'documentSecurity' => true ,
'permissions' => [],
]);
2025-05-08 05:17:02 +00:00
2025-05-08 06:09:37 +00:00
$response = $this -> client -> call ( Client :: METHOD_POST , '/databases/' . $databaseId . '/collections/' . $data [ '$id' ] . '/attributes/relationship' , array_merge ([
2025-05-08 05:17:02 +00:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ]
], $this -> getHeaders ()), [
2025-05-08 06:09:37 +00:00
'relatedCollectionId' => $collection2 [ 'body' ][ '$id' ],
2025-05-08 05:17:02 +00:00
'type' => 'manyToOne' ,
'twoWay' => true ,
'onDelete' => 'cascade' ,
'key' => 'level2' ,
'twoWayKey' => 'level1'
]);
$this -> assertEquals ( 202 , $response [ 'headers' ][ 'status-code' ]);
sleep ( 1 );
$response = $this -> client -> call ( Client :: METHOD_DELETE , '/databases/' . $data [ 'databaseId' ] . '/collections/' . $data [ '$id' ] . '/documents' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()));
$this -> assertEquals ( 400 , $response [ 'headers' ][ 'status-code' ]);
}
2022-05-23 14:54:50 +00:00
}