2020-01-13 10:28:26 +13:00
< ? php
namespace Tests\E2E\Services\Storage ;
use CURLFile ;
use Tests\E2E\Client ;
2022-07-13 04:44:58 +12:00
use Utopia\Database\DateTime ;
2022-08-14 22:33:36 +12:00
use Utopia\Database\ID ;
use Utopia\Database\Permission ;
use Utopia\Database\Role ;
2020-01-13 10:28:26 +13:00
trait StorageBase
{
2021-06-21 19:06:28 +12:00
public function testCreateBucketFile () : array
2021-06-17 22:10:58 +12:00
{
/**
* Test for SUCCESS
*/
2022-02-16 21:30:09 +13:00
$bucket = $this -> client -> call ( Client :: METHOD_POST , '/storage/buckets' , [
2021-06-17 22:10:58 +12:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
2021-06-21 19:06:28 +12:00
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ],
2022-02-16 21:30:09 +13:00
], [
2022-08-14 22:33:36 +12:00
'bucketId' => ID :: unique (),
2021-06-17 22:10:58 +12:00
'name' => 'Test Bucket' ,
2022-08-03 16:17:49 +12:00
'fileSecurity' => true ,
2021-06-21 19:06:28 +12:00
'maximumFileSize' => 2000000 , //2MB
2021-06-23 00:12:46 +12:00
'allowedFileExtensions' => [ " jpg " , " png " ],
2022-08-03 16:17:49 +12:00
'permissions' => [
2022-08-14 17:21:11 +12:00
Permission :: read ( Role :: any ()),
Permission :: create ( Role :: any ()),
Permission :: update ( Role :: any ()),
Permission :: delete ( Role :: any ()),
2022-08-03 16:17:49 +12:00
],
2021-06-17 22:10:58 +12:00
]);
$this -> assertEquals ( 201 , $bucket [ 'headers' ][ 'status-code' ]);
$this -> assertNotEmpty ( $bucket [ 'body' ][ '$id' ]);
2021-06-21 19:06:28 +12:00
2021-06-17 22:10:58 +12:00
$bucketId = $bucket [ 'body' ][ '$id' ];
2021-06-21 19:06:28 +12:00
$file = $this -> client -> call ( Client :: METHOD_POST , '/storage/buckets/' . $bucketId . '/files' , array_merge ([
2021-06-17 22:10:58 +12:00
'content-type' => 'multipart/form-data' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
2022-08-14 22:33:36 +12:00
'fileId' => ID :: unique (),
2021-06-17 22:10:58 +12:00
'file' => new CURLFile ( realpath ( __DIR__ . '/../../../resources/logo.png' ), 'image/png' , 'logo.png' ),
2022-08-03 16:17:49 +12:00
'permissions' => [
2022-08-14 17:21:11 +12:00
Permission :: read ( Role :: any ()),
Permission :: update ( Role :: any ()),
Permission :: delete ( Role :: any ()),
2022-08-03 16:17:49 +12:00
],
2021-06-17 22:10:58 +12:00
]);
2021-06-18 20:38:36 +12:00
$this -> assertEquals ( 201 , $file [ 'headers' ][ 'status-code' ]);
2021-06-17 22:10:58 +12:00
$this -> assertNotEmpty ( $file [ 'body' ][ '$id' ]);
2022-07-13 04:44:58 +12:00
$this -> assertEquals ( true , DateTime :: isValid ( $file [ 'body' ][ '$createdAt' ]));
2021-06-17 22:10:58 +12:00
$this -> assertEquals ( 'logo.png' , $file [ 'body' ][ 'name' ]);
$this -> assertEquals ( 'image/png' , $file [ 'body' ][ 'mimeType' ]);
$this -> assertEquals ( 47218 , $file [ 'body' ][ 'sizeOriginal' ]);
2021-06-21 20:23:08 +12:00
$this -> assertTrue ( md5_file ( realpath ( __DIR__ . '/../../../resources/logo.png' )) != $file [ 'body' ][ 'signature' ]); // should validate that the file is encrypted
/**
* Test for Large File above 20 MB
* This should also validate the test for when Bucket encryption
* is disabled as we are using same test
*/
2022-02-16 21:30:09 +13:00
$bucket2 = $this -> client -> call ( Client :: METHOD_POST , '/storage/buckets' , [
2021-06-21 20:23:08 +12:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ],
2022-02-16 21:30:09 +13:00
], [
2022-08-14 22:33:36 +12:00
'bucketId' => ID :: unique (),
2021-06-21 20:23:08 +12:00
'name' => 'Test Bucket 2' ,
2022-08-03 16:17:49 +12:00
'fileSecurity' => true ,
'permissions' => [
2022-08-14 17:21:11 +12:00
Permission :: read ( Role :: any ()),
Permission :: create ( Role :: any ()),
Permission :: update ( Role :: any ()),
Permission :: delete ( Role :: any ()),
2022-08-03 16:17:49 +12:00
],
2021-06-21 20:23:08 +12:00
]);
$this -> assertEquals ( 201 , $bucket2 [ 'headers' ][ 'status-code' ]);
$this -> assertNotEmpty ( $bucket2 [ 'body' ][ '$id' ]);
2022-03-15 22:51:51 +13:00
2021-07-07 22:07:11 +12:00
/**
* Chunked Upload
*/
$source = __DIR__ . " /../../../resources/disk-a/large-file.mp4 " ;
$totalSize = \filesize ( $source );
2022-05-24 02:54:50 +12:00
$chunkSize = 5 * 1024 * 1024 ;
2021-07-07 22:07:11 +12:00
$handle = @ fopen ( $source , " rb " );
2021-09-08 20:02:05 +12:00
$fileId = 'unique()' ;
2021-07-27 23:02:53 +12:00
$mimeType = mime_content_type ( $source );
$counter = 0 ;
$size = filesize ( $source );
2021-09-27 19:36:34 +13:00
$headers = [
'content-type' => 'multipart/form-data' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ]
];
$id = '' ;
2021-07-27 23:02:53 +12:00
while ( ! feof ( $handle )) {
$curlFile = new \CURLFile ( 'data://' . $mimeType . ';base64,' . base64_encode ( @ fread ( $handle , $chunkSize )), $mimeType , 'large-file.mp4' );
2021-09-27 19:36:34 +13:00
$headers [ 'content-range' ] = 'bytes ' . ( $counter * $chunkSize ) . '-' . min (((( $counter * $chunkSize ) + $chunkSize ) - 1 ), $size ) . '/' . $size ;
2022-05-24 02:54:50 +12:00
if ( ! empty ( $id )) {
2021-09-27 19:36:34 +13:00
$headers [ 'x-appwrite-id' ] = $id ;
}
$largeFile = $this -> client -> call ( Client :: METHOD_POST , '/storage/buckets/' . $bucket2 [ 'body' ][ '$id' ] . '/files' , array_merge ( $headers , $this -> getHeaders ()), [
2021-09-08 20:02:05 +12:00
'fileId' => $fileId ,
2021-07-07 22:07:11 +12:00
'file' => $curlFile ,
2022-08-03 16:17:49 +12:00
'permissions' => [
2022-08-14 17:21:11 +12:00
Permission :: read ( Role :: any ()),
Permission :: update ( Role :: any ()),
Permission :: delete ( Role :: any ()),
2022-08-03 16:17:49 +12:00
],
2021-07-07 22:07:11 +12:00
]);
2021-07-27 23:02:53 +12:00
$counter ++ ;
2021-09-27 19:36:34 +13:00
$id = $largeFile [ 'body' ][ '$id' ];
2021-07-07 22:07:11 +12:00
}
@ fclose ( $handle );
2022-03-15 22:51:51 +13:00
2021-07-07 22:07:11 +12:00
$this -> assertEquals ( 201 , $largeFile [ 'headers' ][ 'status-code' ]);
$this -> assertNotEmpty ( $largeFile [ 'body' ][ '$id' ]);
2022-07-13 04:44:58 +12:00
$this -> assertEquals ( true , DateTime :: isValid ( $largeFile [ 'body' ][ '$createdAt' ]));
2021-07-07 22:07:11 +12:00
$this -> assertEquals ( 'large-file.mp4' , $largeFile [ 'body' ][ 'name' ]);
$this -> assertEquals ( 'video/mp4' , $largeFile [ 'body' ][ 'mimeType' ]);
$this -> assertEquals ( $totalSize , $largeFile [ 'body' ][ 'sizeOriginal' ]);
$this -> assertEquals ( md5_file ( realpath ( __DIR__ . '/../../../resources/disk-a/large-file.mp4' )), $largeFile [ 'body' ][ 'signature' ]); // should validate that the file is not encrypted
2022-03-15 22:51:51 +13:00
2022-01-16 20:32:39 +13:00
/**
* Failure
* Test for Chunk above 5 MB
*/
$source = __DIR__ . " /../../../resources/disk-a/large-file.mp4 " ;
$totalSize = \filesize ( $source );
2022-05-24 02:54:50 +12:00
$chunkSize = 6 * 1024 * 1024 ;
2022-01-16 20:32:39 +13:00
$handle = @ fopen ( $source , " rb " );
$fileId = 'unique()' ;
$mimeType = mime_content_type ( $source );
$counter = 0 ;
$size = filesize ( $source );
$headers = [
'content-type' => 'multipart/form-data' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ]
];
$id = '' ;
$curlFile = new \CURLFile ( 'data://' . $mimeType . ';base64,' . base64_encode ( @ fread ( $handle , $chunkSize )), $mimeType , 'large-file.mp4' );
$headers [ 'content-range' ] = 'bytes ' . ( $counter * $chunkSize ) . '-' . min (((( $counter * $chunkSize ) + $chunkSize ) - 1 ), $size ) . '/' . $size ;
2022-05-24 02:54:50 +12:00
$res = $this -> client -> call ( Client :: METHOD_POST , '/storage/buckets/' . $bucket2 [ 'body' ][ '$id' ] . '/files' , $this -> getHeaders (), [
2022-01-16 20:32:39 +13:00
'fileId' => $fileId ,
'file' => $curlFile ,
2022-08-03 16:17:49 +12:00
'permissions' => [
2022-08-14 17:21:11 +12:00
Permission :: read ( Role :: any ()),
Permission :: update ( Role :: any ()),
Permission :: delete ( Role :: any ()),
2022-08-03 16:17:49 +12:00
],
2022-01-16 20:32:39 +13:00
]);
@ fclose ( $handle );
2022-03-15 22:51:51 +13:00
2022-01-17 00:25:26 +13:00
$this -> assertEquals ( 413 , $res [ 'headers' ][ 'status-code' ]);
2022-03-15 22:51:51 +13:00
2021-06-17 22:10:58 +12:00
/**
2021-06-21 18:58:06 +12:00
* Test for FAILURE unknown Bucket
2021-06-17 22:10:58 +12:00
*/
2021-06-21 18:58:06 +12:00
$res = $this -> client -> call ( Client :: METHOD_POST , '/storage/buckets/empty/files' , array_merge ([
'content-type' => 'multipart/form-data' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
2022-08-14 22:33:36 +12:00
'fileId' => ID :: unique (),
2021-06-21 18:58:06 +12:00
'file' => new CURLFile ( realpath ( __DIR__ . '/../../../resources/logo.png' ), 'image/png' , 'logo.png' ),
2022-08-03 16:17:49 +12:00
'permissions' => [
2022-08-14 17:21:11 +12:00
Permission :: read ( Role :: any ()),
Permission :: update ( Role :: any ()),
Permission :: delete ( Role :: any ()),
2022-08-03 16:17:49 +12:00
],
2021-06-21 18:58:06 +12:00
]);
$this -> assertEquals ( 404 , $res [ 'headers' ][ 'status-code' ]);
2021-06-21 19:06:28 +12:00
/**
2021-06-23 00:12:46 +12:00
* Test for FAILURE file above bucket ' s file size limit
2021-06-21 19:06:28 +12:00
*/
$res = $this -> client -> call ( Client :: METHOD_POST , '/storage/buckets/' . $bucketId . '/files' , array_merge ([
'content-type' => 'multipart/form-data' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
2022-08-14 22:33:36 +12:00
'fileId' => ID :: unique (),
2021-06-21 19:06:28 +12:00
'file' => new CURLFile ( realpath ( __DIR__ . '/../../../resources/disk-b/kitten-1.png' ), 'image/png' , 'kitten-1.png' ),
2022-08-03 16:17:49 +12:00
'permissions' => [
2022-08-14 17:21:11 +12:00
Permission :: read ( Role :: any ()),
Permission :: update ( Role :: any ()),
Permission :: delete ( Role :: any ()),
2022-08-03 16:17:49 +12:00
],
2021-06-21 19:06:28 +12:00
]);
$this -> assertEquals ( 400 , $res [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 'File size not allowed' , $res [ 'body' ][ 'message' ]);
/**
2021-06-23 00:12:46 +12:00
* Test for FAILURE unsupported bucket file extension
2021-06-21 19:06:28 +12:00
*/
2021-06-23 00:12:46 +12:00
$res = $this -> client -> call ( Client :: METHOD_POST , '/storage/buckets/' . $bucketId . '/files' , array_merge ([
'content-type' => 'multipart/form-data' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
2022-08-14 22:33:36 +12:00
'fileId' => ID :: unique (),
2021-06-23 00:12:46 +12:00
'file' => new CURLFile ( realpath ( __DIR__ . '/../../../resources/disk-a/kitten-3.gif' ), 'image/gif' , 'kitten-3.gif' ),
2022-08-03 16:17:49 +12:00
'permissions' => [
2022-08-14 17:21:11 +12:00
Permission :: read ( Role :: any ()),
Permission :: update ( Role :: any ()),
Permission :: delete ( Role :: any ()),
2022-08-03 16:17:49 +12:00
],
2021-06-23 00:12:46 +12:00
]);
$this -> assertEquals ( 400 , $res [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 'File extension not allowed' , $res [ 'body' ][ 'message' ]);
2022-04-01 02:10:30 +13:00
/**
* Test for FAILURE create bucket with too high limit ( bigger then _APP_STORAGE_LIMIT )
*/
$failedBucket = $this -> client -> call ( Client :: METHOD_POST , '/storage/buckets' , [
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ],
], [
2022-08-14 22:33:36 +12:00
'bucketId' => ID :: unique (),
2022-04-01 02:10:30 +13:00
'name' => 'Test Bucket 2' ,
2022-08-03 16:17:49 +12:00
'fileSecurity' => true ,
2022-04-01 02:10:30 +13:00
'maximumFileSize' => 200000000 , //200MB
'allowedFileExtensions' => [ " jpg " , " png " ],
2022-08-03 16:17:49 +12:00
'permissions' => [
2022-08-14 17:21:11 +12:00
Permission :: read ( Role :: any ()),
Permission :: create ( Role :: any ()),
Permission :: update ( Role :: any ()),
Permission :: delete ( Role :: any ()),
2022-08-03 16:17:49 +12:00
],
2022-04-01 02:10:30 +13:00
]);
2022-08-09 19:11:30 +12:00
2022-04-01 02:10:30 +13:00
$this -> assertEquals ( 400 , $failedBucket [ 'headers' ][ 'status-code' ]);
2022-08-09 19:11:30 +12:00
return [ 'bucketId' => $bucketId , 'fileId' => $file [ 'body' ][ '$id' ], 'largeFileId' => $largeFile [ 'body' ][ '$id' ], 'largeBucketId' => $bucket2 [ 'body' ][ '$id' ]];
2021-06-18 21:24:16 +12:00
}
2022-08-31 15:03:51 +12:00
public function testCreateBucketFileZstdCompression () : array
2022-08-31 14:49:13 +12:00
{
$bucket = $this -> client -> call ( Client :: METHOD_POST , '/storage/buckets' , [
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'x-appwrite-key' => $this -> getProject ()[ 'apiKey' ],
], [
'bucketId' => ID :: unique (),
'name' => 'Test Bucket' ,
'fileSecurity' => true ,
'maximumFileSize' => 2000000 , //2MB
'allowedFileExtensions' => [ " jpg " , " png " ],
'compression' => 'zstd' ,
'permissions' => [
Permission :: read ( Role :: any ()),
Permission :: create ( Role :: any ()),
Permission :: update ( Role :: any ()),
Permission :: delete ( Role :: any ()),
],
]);
$this -> assertEquals ( 201 , $bucket [ 'headers' ][ 'status-code' ]);
$this -> assertNotEmpty ( $bucket [ 'body' ][ '$id' ]);
$this -> assertEquals ( 'zstd' , $bucket [ 'body' ][ 'compression' ]);
$bucketId = $bucket [ 'body' ][ '$id' ];
$file = $this -> client -> call ( Client :: METHOD_POST , '/storage/buckets/' . $bucketId . '/files' , array_merge ([
'content-type' => 'multipart/form-data' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'fileId' => ID :: unique (),
'file' => new CURLFile ( realpath ( __DIR__ . '/../../../resources/logo.png' ), 'image/png' , 'logo.png' ),
'permissions' => [
Permission :: read ( Role :: any ()),
Permission :: update ( Role :: any ()),
Permission :: delete ( Role :: any ()),
],
]);
$this -> assertEquals ( 201 , $file [ 'headers' ][ 'status-code' ]);
$this -> assertNotEmpty ( $file [ 'body' ][ '$id' ]);
$this -> assertEquals ( true , DateTime :: isValid ( $file [ 'body' ][ '$createdAt' ]));
$this -> assertEquals ( 'logo.png' , $file [ 'body' ][ 'name' ]);
$this -> assertEquals ( 'image/png' , $file [ 'body' ][ 'mimeType' ]);
$this -> assertEquals ( 47218 , $file [ 'body' ][ 'sizeOriginal' ]);
$this -> assertTrue ( md5_file ( realpath ( __DIR__ . '/../../../resources/logo.png' )) != $file [ 'body' ][ 'signature' ]); // should validate that the file is encrypted
2022-08-31 15:03:51 +12:00
return [ 'bucketId' => $bucketId ];
2022-08-31 14:49:13 +12:00
}
2021-06-18 21:24:16 +12:00
/**
* @ depends testCreateBucketFile
*/
2021-06-21 19:06:28 +12:00
public function testListBucketFiles ( array $data ) : array
2021-06-18 21:24:16 +12:00
{
/**
* Test for SUCCESS
*/
$files = $this -> client -> call ( Client :: METHOD_GET , '/storage/buckets/' . $data [ 'bucketId' ] . '/files' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()));
$this -> assertEquals ( 200 , $files [ 'headers' ][ 'status-code' ]);
2022-02-27 22:57:09 +13:00
$this -> assertGreaterThan ( 0 , $files [ 'body' ][ 'total' ]);
2021-06-18 21:24:16 +12:00
$this -> assertGreaterThan ( 0 , count ( $files [ 'body' ][ 'files' ]));
2022-08-24 23:55:43 +12:00
$files = $this -> client -> call ( Client :: METHOD_GET , '/storage/buckets/' . $data [ 'bucketId' ] . '/files' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'queries' => [ 'limit(0)' ]
]);
$this -> assertEquals ( 200 , $files [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 0 , count ( $files [ 'body' ][ 'files' ]));
$files = $this -> client -> call ( Client :: METHOD_GET , '/storage/buckets/' . $data [ 'bucketId' ] . '/files' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'queries' => [ 'offset(1)' ]
]);
$this -> assertEquals ( 200 , $files [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 0 , count ( $files [ 'body' ][ 'files' ]));
$files = $this -> client -> call ( Client :: METHOD_GET , '/storage/buckets/' . $data [ 'bucketId' ] . '/files' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'queries' => [ 'equal("mimeType", "image/png")' ]
]);
$this -> assertEquals ( 200 , $files [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 1 , count ( $files [ 'body' ][ 'files' ]));
$files = $this -> client -> call ( Client :: METHOD_GET , '/storage/buckets/' . $data [ 'bucketId' ] . '/files' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'queries' => [ 'equal("mimeType", "image/jpeg")' ]
]);
$this -> assertEquals ( 200 , $files [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 0 , count ( $files [ 'body' ][ 'files' ]));
2021-06-18 21:24:16 +12:00
/**
2021-06-21 18:58:06 +12:00
* Test for FAILURE unknown Bucket
2021-06-18 21:24:16 +12:00
*/
2021-06-21 19:06:28 +12:00
2021-06-21 18:58:06 +12:00
$files = $this -> client -> call ( Client :: METHOD_GET , '/storage/buckets/empty/files' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()));
$this -> assertEquals ( 404 , $files [ 'headers' ][ 'status-code' ]);
2021-06-18 21:24:16 +12:00
return $data ;
2021-06-17 22:10:58 +12:00
}
2021-06-18 21:33:00 +12:00
/**
* @ depends testCreateBucketFile
*/
2021-06-21 19:06:28 +12:00
public function testGetBucketFile ( array $data ) : array
2021-06-18 21:33:00 +12:00
{
2021-06-21 18:58:06 +12:00
$bucketId = $data [ 'bucketId' ];
2021-06-18 21:33:00 +12:00
/**
* Test for SUCCESS
*/
2021-06-21 18:58:06 +12:00
$file1 = $this -> client -> call ( Client :: METHOD_GET , '/storage/buckets/' . $bucketId . '/files/' . $data [ 'fileId' ], array_merge ([
2021-06-18 21:33:00 +12:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()));
$this -> assertEquals ( 200 , $file1 [ 'headers' ][ 'status-code' ]);
$this -> assertNotEmpty ( $file1 [ 'body' ][ '$id' ]);
2022-07-13 04:44:58 +12:00
$this -> assertEquals ( true , DateTime :: isValid ( $file1 [ 'body' ][ '$createdAt' ]));
2021-06-18 21:33:00 +12:00
$this -> assertEquals ( 'logo.png' , $file1 [ 'body' ][ 'name' ]);
$this -> assertEquals ( 'image/png' , $file1 [ 'body' ][ 'mimeType' ]);
$this -> assertEquals ( 47218 , $file1 [ 'body' ][ 'sizeOriginal' ]);
2022-08-02 21:19:15 +12:00
$this -> assertIsArray ( $file1 [ 'body' ][ '$permissions' ]);
2022-08-14 02:10:28 +12:00
$this -> assertCount ( 3 , $file1 [ 'body' ][ '$permissions' ]);
2021-06-18 21:33:00 +12:00
2021-06-21 18:58:06 +12:00
$file2 = $this -> client -> call ( Client :: METHOD_GET , '/storage/buckets/' . $bucketId . '/files/' . $data [ 'fileId' ] . '/preview' , array_merge ([
2021-06-18 21:33:00 +12:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()));
$this -> assertEquals ( 200 , $file2 [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 'image/png' , $file2 [ 'headers' ][ 'content-type' ]);
$this -> assertNotEmpty ( $file2 [ 'body' ]);
2021-06-21 19:06:28 +12:00
2021-06-18 21:33:00 +12:00
//new image preview features
2021-06-21 18:58:06 +12:00
$file3 = $this -> client -> call ( Client :: METHOD_GET , '/storage/buckets/' . $bucketId . '/files/' . $data [ 'fileId' ] . '/preview' , array_merge ([
2021-06-18 21:33:00 +12:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'width' => 300 ,
'height' => 100 ,
'borderRadius' => '50' ,
'opacity' => '0.5' ,
'output' => 'png' ,
'rotation' => '45' ,
]);
$this -> assertEquals ( 200 , $file3 [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 'image/png' , $file3 [ 'headers' ][ 'content-type' ]);
$this -> assertNotEmpty ( $file3 [ 'body' ]);
$image = new \Imagick ();
$image -> readImageBlob ( $file3 [ 'body' ]);
$original = new \Imagick ( __DIR__ . '/../../../resources/logo-after.png' );
$this -> assertEquals ( $image -> getImageWidth (), $original -> getImageWidth ());
$this -> assertEquals ( $image -> getImageHeight (), $original -> getImageHeight ());
$this -> assertEquals ( 'PNG' , $image -> getImageFormat ());
2021-06-21 18:58:06 +12:00
$file4 = $this -> client -> call ( Client :: METHOD_GET , '/storage/buckets/' . $bucketId . '/files/' . $data [ 'fileId' ] . '/preview' , array_merge ([
2021-06-18 21:33:00 +12:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'width' => 200 ,
'height' => 80 ,
'borderWidth' => '5' ,
'borderColor' => 'ff0000' ,
'output' => 'jpg' ,
]);
2021-06-21 19:06:28 +12:00
2021-06-18 21:33:00 +12:00
$this -> assertEquals ( 200 , $file4 [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 'image/jpeg' , $file4 [ 'headers' ][ 'content-type' ]);
$this -> assertNotEmpty ( $file4 [ 'body' ]);
2021-06-21 19:06:28 +12:00
2021-06-18 21:33:00 +12:00
$image = new \Imagick ();
$image -> readImageBlob ( $file4 [ 'body' ]);
$original = new \Imagick ( __DIR__ . '/../../../resources/logo-after.jpg' );
$this -> assertEquals ( $image -> getImageWidth (), $original -> getImageWidth ());
$this -> assertEquals ( $image -> getImageHeight (), $original -> getImageHeight ());
$this -> assertEquals ( 'JPEG' , $image -> getImageFormat ());
2021-06-21 18:58:06 +12:00
$file5 = $this -> client -> call ( Client :: METHOD_GET , '/storage/buckets/' . $bucketId . '/files/' . $data [ 'fileId' ] . '/download' , array_merge ([
2021-06-18 21:33:00 +12:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()));
$this -> assertEquals ( 200 , $file5 [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 'attachment; filename="logo.png"' , $file5 [ 'headers' ][ 'content-disposition' ]);
$this -> assertEquals ( 'image/png' , $file5 [ 'headers' ][ 'content-type' ]);
$this -> assertNotEmpty ( $file5 [ 'body' ]);
2021-09-12 20:50:43 +12:00
// Test ranged download
$file51 = $this -> client -> call ( Client :: METHOD_GET , '/storage/buckets/' . $bucketId . '/files/' . $data [ 'fileId' ] . '/download' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'Range' => 'bytes=0-99' ,
], $this -> getHeaders ()));
$path = __DIR__ . '/../../../resources/logo.png' ;
$originalChunk = \file_get_contents ( $path , false , null , 0 , 100 );
$this -> assertEquals ( 206 , $file51 [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 'attachment; filename="logo.png"' , $file51 [ 'headers' ][ 'content-disposition' ]);
$this -> assertEquals ( 'image/png' , $file51 [ 'headers' ][ 'content-type' ]);
$this -> assertNotEmpty ( $file51 [ 'body' ]);
$this -> assertEquals ( $originalChunk , $file51 [ 'body' ]);
2022-05-24 02:54:50 +12:00
2021-09-12 21:29:40 +12:00
// Test ranged download - with invalid range
$file52 = $this -> client -> call ( Client :: METHOD_GET , '/storage/buckets/' . $bucketId . '/files/' . $data [ 'fileId' ] . '/download' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'Range' => 'bytes=0-' ,
], $this -> getHeaders ()));
2021-09-13 18:22:27 +12:00
$this -> assertEquals ( 206 , $file52 [ 'headers' ][ 'status-code' ]);
2022-05-24 02:54:50 +12:00
2021-09-12 21:29:40 +12:00
// Test ranged download - with invalid range
$file53 = $this -> client -> call ( Client :: METHOD_GET , '/storage/buckets/' . $bucketId . '/files/' . $data [ 'fileId' ] . '/download' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'Range' => 'bytes=988' ,
], $this -> getHeaders ()));
2022-05-24 02:54:50 +12:00
2021-09-13 18:22:27 +12:00
$this -> assertEquals ( 416 , $file53 [ 'headers' ][ 'status-code' ]);
2022-05-24 02:54:50 +12:00
2021-09-12 21:29:40 +12:00
// Test ranged download - with invalid range
$file54 = $this -> client -> call ( Client :: METHOD_GET , '/storage/buckets/' . $bucketId . '/files/' . $data [ 'fileId' ] . '/download' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
'Range' => 'bytes=-988' ,
], $this -> getHeaders ()));
2022-05-24 02:54:50 +12:00
2021-09-13 18:22:27 +12:00
$this -> assertEquals ( 416 , $file54 [ 'headers' ][ 'status-code' ]);
2022-05-24 02:54:50 +12:00
2021-06-21 18:58:06 +12:00
$file6 = $this -> client -> call ( Client :: METHOD_GET , '/storage/buckets/' . $bucketId . '/files/' . $data [ 'fileId' ] . '/view' , array_merge ([
2021-06-18 21:33:00 +12:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()));
$this -> assertEquals ( 200 , $file6 [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 'image/png' , $file6 [ 'headers' ][ 'content-type' ]);
$this -> assertNotEmpty ( $file6 [ 'body' ]);
2021-11-12 03:11:56 +13:00
// Test for negative angle values in fileGetPreview
2021-12-08 22:10:13 +13:00
$file7 = $this -> client -> call ( Client :: METHOD_GET , '/storage/buckets/' . $bucketId . '/files/' . $data [ 'fileId' ] . '/preview' , array_merge ([
2021-11-12 03:11:56 +13:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'width' => 300 ,
'height' => 100 ,
'borderRadius' => '50' ,
'opacity' => '0.5' ,
'output' => 'png' ,
'rotation' => '-315' ,
]);
2022-05-24 02:54:50 +12:00
2021-11-12 03:11:56 +13:00
$this -> assertEquals ( 200 , $file7 [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 'image/png' , $file7 [ 'headers' ][ 'content-type' ]);
$this -> assertNotEmpty ( $file7 [ 'body' ]);
$image = new \Imagick ();
$image -> readImageBlob ( $file7 [ 'body' ]);
$original = new \Imagick ( __DIR__ . '/../../../resources/logo-after.png' );
$this -> assertEquals ( $image -> getImageWidth (), $original -> getImageWidth ());
$this -> assertEquals ( $image -> getImageHeight (), $original -> getImageHeight ());
$this -> assertEquals ( 'PNG' , $image -> getImageFormat ());
2021-06-22 20:37:04 +12:00
/**
* Test large files decompress successfully
*/
$file7 = $this -> client -> call ( Client :: METHOD_GET , '/storage/buckets/' . $data [ 'largeBucketId' ] . '/files/' . $data [ 'largeFileId' ] . '/download' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()));
$fileData = $file7 [ 'body' ];
$this -> assertEquals ( 200 , $file7 [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 'attachment; filename="large-file.mp4"' , $file7 [ 'headers' ][ 'content-disposition' ]);
$this -> assertEquals ( 'video/mp4' , $file7 [ 'headers' ][ 'content-type' ]);
$this -> assertNotEmpty ( $fileData );
$this -> assertEquals ( md5_file ( realpath ( __DIR__ . '/../../../resources/disk-a/large-file.mp4' )), md5 ( $fileData )); // validate the file is downloaded correctly
2021-06-18 21:33:00 +12:00
/**
2021-06-21 18:58:06 +12:00
* Test for FAILURE unknown Bucket
2021-06-18 21:33:00 +12:00
*/
2021-06-22 20:37:04 +12:00
$file8 = $this -> client -> call ( Client :: METHOD_GET , '/storage/buckets/empty/files/' . $data [ 'fileId' ], array_merge ([
2021-06-21 18:58:06 +12:00
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
2021-08-10 01:08:44 +12:00
], $this -> getHeaders ()), [
'limit' => 2
]);
2021-06-21 18:58:06 +12:00
2021-06-22 20:37:04 +12:00
$this -> assertEquals ( 404 , $file8 [ 'headers' ][ 'status-code' ]);
2021-06-21 18:58:06 +12:00
2021-06-18 21:33:00 +12:00
return $data ;
}
2021-06-20 23:20:35 +12:00
/**
* @ depends testCreateBucketFile
2022-01-25 21:25:58 +13:00
*/
public function testFilePreviewCache ( array $data ) : array
{
$bucketId = $data [ 'bucketId' ];
$file = $this -> client -> call ( Client :: METHOD_POST , '/storage/buckets/' . $bucketId . '/files' , array_merge ([
'content-type' => 'multipart/form-data' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
2022-08-14 22:33:36 +12:00
'fileId' => ID :: custom ( 'testcache' ),
2022-01-25 21:25:58 +13:00
'file' => new CURLFile ( realpath ( __DIR__ . '/../../../resources/logo.png' ), 'image/png' , 'logo.png' ),
2022-08-03 16:17:49 +12:00
'permissions' => [
2022-08-14 17:21:11 +12:00
Permission :: read ( Role :: any ()),
Permission :: update ( Role :: any ()),
Permission :: delete ( Role :: any ()),
2022-08-03 16:17:49 +12:00
],
2022-01-25 21:25:58 +13:00
]);
$this -> assertEquals ( 201 , $file [ 'headers' ][ 'status-code' ]);
$this -> assertNotEmpty ( $file [ 'body' ][ '$id' ]);
2022-05-24 02:54:50 +12:00
2022-01-25 21:25:58 +13:00
$fileId = $file [ 'body' ][ '$id' ];
//get image preview
$file3 = $this -> client -> call ( Client :: METHOD_GET , '/storage/buckets/' . $bucketId . '/files/' . $fileId . '/preview' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'width' => 300 ,
'height' => 100 ,
'borderRadius' => '50' ,
'opacity' => '0.5' ,
'output' => 'png' ,
'rotation' => '45' ,
]);
$this -> assertEquals ( 200 , $file3 [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 'image/png' , $file3 [ 'headers' ][ 'content-type' ]);
$this -> assertNotEmpty ( $file3 [ 'body' ]);
$imageBefore = new \Imagick ();
$imageBefore -> readImageBlob ( $file3 [ 'body' ]);
$file = $this -> client -> call ( Client :: METHOD_DELETE , '/storage/buckets/' . $data [ 'bucketId' ] . '/files/' . $fileId , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()));
$this -> assertEquals ( 204 , $file [ 'headers' ][ 'status-code' ]);
$this -> assertEmpty ( $file [ 'body' ]);
2022-08-16 00:16:32 +12:00
sleep ( 1 );
2022-01-25 21:25:58 +13:00
//upload again using the same ID
$file = $this -> client -> call ( Client :: METHOD_POST , '/storage/buckets/' . $bucketId . '/files' , array_merge ([
'content-type' => 'multipart/form-data' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
2022-08-14 22:33:36 +12:00
'fileId' => ID :: custom ( 'testcache' ),
2022-01-27 20:21:32 +13:00
'file' => new CURLFile ( realpath ( __DIR__ . '/../../../resources/disk-b/kitten-2.png' ), 'image/png' , 'logo.png' ),
2022-08-03 16:17:49 +12:00
'permissions' => [
2022-08-14 17:21:11 +12:00
Permission :: read ( Role :: any ()),
Permission :: update ( Role :: any ()),
Permission :: delete ( Role :: any ()),
2022-08-03 16:17:49 +12:00
],
2022-01-25 21:25:58 +13:00
]);
$this -> assertEquals ( 201 , $file [ 'headers' ][ 'status-code' ]);
$this -> assertNotEmpty ( $file [ 'body' ][ '$id' ]);
2022-05-24 02:54:50 +12:00
2022-01-25 21:25:58 +13:00
//get image preview after
$file3 = $this -> client -> call ( Client :: METHOD_GET , '/storage/buckets/' . $bucketId . '/files/' . $fileId . '/preview' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'width' => 300 ,
'height' => 100 ,
'borderRadius' => '50' ,
'opacity' => '0.5' ,
'output' => 'png' ,
'rotation' => '45' ,
]);
$this -> assertEquals ( 200 , $file3 [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 'image/png' , $file3 [ 'headers' ][ 'content-type' ]);
$this -> assertNotEmpty ( $file3 [ 'body' ]);
$imageAfter = new \Imagick ();
$imageAfter -> readImageBlob ( $file3 [ 'body' ]);
2022-01-27 20:34:47 +13:00
$this -> assertNotEquals ( $imageBefore -> getImageBlob (), $imageAfter -> getImageBlob ());
2022-01-25 21:25:58 +13:00
return $data ;
}
2022-08-31 15:03:51 +12:00
/**
* @ depends testCreateBucketFileZstdCompression
*/
public function testFilePreviewZstdCompression ( array $data ) : array
{
$bucketId = $data [ 'bucketId' ];
$file = $this -> client -> call ( Client :: METHOD_POST , '/storage/buckets/' . $bucketId . '/files' , array_merge ([
'content-type' => 'multipart/form-data' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
2022-08-31 15:04:11 +12:00
'fileId' => ID :: unique (),
2022-08-31 15:03:51 +12:00
'file' => new CURLFile ( realpath ( __DIR__ . '/../../../resources/logo.png' ), 'image/png' , 'logo.png' ),
'permissions' => [
Permission :: read ( Role :: any ()),
Permission :: update ( Role :: any ()),
Permission :: delete ( Role :: any ()),
],
]);
$this -> assertEquals ( 201 , $file [ 'headers' ][ 'status-code' ]);
$this -> assertNotEmpty ( $file [ 'body' ][ '$id' ]);
$fileId = $file [ 'body' ][ '$id' ];
//get image preview
$file3 = $this -> client -> call ( Client :: METHOD_GET , '/storage/buckets/' . $bucketId . '/files/' . $fileId . '/preview' , array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
'width' => 300 ,
'height' => 100 ,
'borderRadius' => '50' ,
'opacity' => '0.5' ,
'output' => 'png' ,
'rotation' => '45' ,
]);
$this -> assertEquals ( 200 , $file3 [ 'headers' ][ 'status-code' ]);
$this -> assertEquals ( 'image/png' , $file3 [ 'headers' ][ 'content-type' ]);
$this -> assertNotEmpty ( $file3 [ 'body' ]);
return $data ;
}
2022-01-25 21:25:58 +13:00
/**
* @ depends testCreateBucketFile
2021-06-20 23:20:35 +12:00
*/
2021-06-21 19:06:28 +12:00
public function testUpdateBucketFile ( array $data ) : array
2021-06-20 23:20:35 +12:00
{
/**
* Test for SUCCESS
*/
$file = $this -> client -> call ( Client :: METHOD_PUT , '/storage/buckets/' . $data [ 'bucketId' ] . '/files/' . $data [ 'fileId' ], array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
2022-08-03 16:17:49 +12:00
'permissions' => [
2022-08-15 23:24:31 +12: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 16:17:49 +12:00
]
2021-06-20 23:20:35 +12:00
]);
$this -> assertEquals ( 200 , $file [ 'headers' ][ 'status-code' ]);
$this -> assertNotEmpty ( $file [ 'body' ][ '$id' ]);
2022-07-13 04:44:58 +12:00
$this -> assertEquals ( true , DateTime :: isValid ( $file [ 'body' ][ '$createdAt' ]));
2021-06-20 23:20:35 +12:00
$this -> assertEquals ( 'logo.png' , $file [ 'body' ][ 'name' ]);
$this -> assertEquals ( 'image/png' , $file [ 'body' ][ 'mimeType' ]);
$this -> assertEquals ( 47218 , $file [ 'body' ][ 'sizeOriginal' ]);
//$this->assertEquals(54944, $file['body']['sizeActual']);
//$this->assertEquals('gzip', $file['body']['algorithm']);
//$this->assertEquals('1', $file['body']['fileOpenSSLVersion']);
//$this->assertEquals('aes-128-gcm', $file['body']['fileOpenSSLCipher']);
//$this->assertNotEmpty($file['body']['fileOpenSSLTag']);
//$this->assertNotEmpty($file['body']['fileOpenSSLIV']);
2022-08-02 21:19:15 +12:00
$this -> assertIsArray ( $file [ 'body' ][ '$permissions' ]);
2022-08-14 02:10:28 +12:00
$this -> assertCount ( 3 , $file [ 'body' ][ '$permissions' ]);
2021-06-21 19:06:28 +12:00
2021-06-20 23:20:35 +12:00
/**
2021-06-21 18:58:06 +12:00
* Test for FAILURE unknown Bucket
2021-06-20 23:20:35 +12:00
*/
2021-06-21 18:58:06 +12:00
$file = $this -> client -> call ( Client :: METHOD_PUT , '/storage/buckets/empty/files/' . $data [ 'fileId' ], array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()), [
2022-08-03 16:17:49 +12:00
'permissions' => [
2022-08-15 23:24:31 +12: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 16:17:49 +12:00
]
2021-06-21 18:58:06 +12:00
]);
2021-06-21 19:06:28 +12:00
2021-06-21 18:58:06 +12:00
$this -> assertEquals ( 404 , $file [ 'headers' ][ 'status-code' ]);
2021-06-21 19:06:28 +12:00
2021-06-20 23:20:35 +12:00
return $data ;
}
/**
* @ depends testUpdateBucketFile
*/
2021-06-21 19:06:28 +12:00
public function testDeleteBucketFile ( array $data ) : array
2021-06-20 23:20:35 +12:00
{
/**
* Test for SUCCESS
*/
$file = $this -> client -> call ( Client :: METHOD_DELETE , '/storage/buckets/' . $data [ 'bucketId' ] . '/files/' . $data [ 'fileId' ], array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()));
$this -> assertEquals ( 204 , $file [ 'headers' ][ 'status-code' ]);
$this -> assertEmpty ( $file [ 'body' ]);
$file = $this -> client -> call ( Client :: METHOD_GET , '/storage/files/' . $data [ 'fileId' ], array_merge ([
'content-type' => 'application/json' ,
'x-appwrite-project' => $this -> getProject ()[ '$id' ],
], $this -> getHeaders ()));
$this -> assertEquals ( 404 , $file [ 'headers' ][ 'status-code' ]);
2021-06-21 19:06:28 +12:00
2021-06-20 23:20:35 +12:00
return $data ;
}
2021-06-21 19:06:28 +12:00
}