From ce539972a54053ed14993c0586d393363219bfbb Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 30 Oct 2025 21:51:50 +0000 Subject: [PATCH 1/7] Initial plan From de4f473da192ed954ee734bb456a7d545c8aa974 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 30 Oct 2025 21:56:12 +0000 Subject: [PATCH 2/7] Initial plan for adding webp test cases Co-authored-by: stnguyen90 <1477010+stnguyen90@users.noreply.github.com> --- tests/resources/logo.webp | Bin 0 -> 17200 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/resources/logo.webp diff --git a/tests/resources/logo.webp b/tests/resources/logo.webp new file mode 100644 index 0000000000000000000000000000000000000000..f9bde111dbbd3ff06345f7fa53a29c2013d42f9f GIT binary patch literal 17200 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 literal 0 HcmV?d00001 From 4a8651ab39bbe45293e4830da0a457f0fd4b7e73 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 30 Oct 2025 21:58:02 +0000 Subject: [PATCH 3/7] Add webp test cases for upload/view and preview Co-authored-by: stnguyen90 <1477010+stnguyen90@users.noreply.github.com> --- tests/e2e/Services/Storage/StorageBase.php | 105 +++++++++++++++++++++ 1 file changed, 105 insertions(+) diff --git a/tests/e2e/Services/Storage/StorageBase.php b/tests/e2e/Services/Storage/StorageBase.php index 6879645a22..8b7ceef45f 100644 --- a/tests/e2e/Services/Storage/StorageBase.php +++ b/tests/e2e/Services/Storage/StorageBase.php @@ -869,6 +869,111 @@ trait StorageBase return $data; } + /** + * @depends testCreateBucketFile + */ + public function testUploadWebpImage(): array + { + /** + * Test for SUCCESS - Upload and view webp image + */ + $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 Webp', + 'fileSecurity' => true, + 'maximumFileSize' => 2000000, //2MB + 'allowedFileExtensions' => ['webp'], + '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']); + + $bucketId = $bucket['body']['$id']; + + // Upload webp file + $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.webp'), 'image/webp', 'logo.webp'), + '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('logo.webp', $file['body']['name']); + $this->assertEquals('image/webp', $file['body']['mimeType']); + + $fileId = $file['body']['$id']; + + // View webp file + $view = $this->client->call(Client::METHOD_GET, '/storage/buckets/' . $bucketId . '/files/' . $fileId . '/view', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders())); + + $this->assertEquals(200, $view['headers']['status-code']); + $this->assertEquals('image/webp', $view['headers']['content-type']); + $this->assertNotEmpty($view['body']); + + return ['bucketId' => $bucketId, 'fileId' => $fileId]; + } + + /** + * @depends testCreateBucketFile + */ + public function testPreviewNonWebpAsWebp(array $data): array + { + $bucketId = $data['bucketId']; + + // Upload a PNG image + $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']); + + $fileId = $file['body']['$id']; + + // Preview PNG as webp + $preview = $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' => 300, + 'output' => 'webp', + ]); + + $this->assertEquals(200, $preview['headers']['status-code']); + $this->assertEquals('image/webp', $preview['headers']['content-type']); + $this->assertNotEmpty($preview['body']); + + return $data; + } + /** * @depends testUpdateBucketFile */ From d1511d5ba1734a0839100c6edfd17107e49095cf Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 30 Oct 2025 22:26:30 +0000 Subject: [PATCH 4/7] Refactor webp tests per review feedback Co-authored-by: stnguyen90 <1477010+stnguyen90@users.noreply.github.com> --- tests/e2e/Services/Storage/StorageBase.php | 120 +++++++-------------- tests/resources/logo-after.webp | Bin 0 -> 6236 bytes tests/resources/logo.webp | Bin 17200 -> 0 bytes 3 files changed, 36 insertions(+), 84 deletions(-) create mode 100644 tests/resources/logo-after.webp delete mode 100644 tests/resources/logo.webp diff --git a/tests/e2e/Services/Storage/StorageBase.php b/tests/e2e/Services/Storage/StorageBase.php index 8b7ceef45f..2012be7375 100644 --- a/tests/e2e/Services/Storage/StorageBase.php +++ b/tests/e2e/Services/Storage/StorageBase.php @@ -30,7 +30,7 @@ trait StorageBase 'name' => 'Test Bucket', 'fileSecurity' => true, 'maximumFileSize' => 2000000, //2MB - 'allowedFileExtensions' => ['jpg', 'png', 'jfif'], + 'allowedFileExtensions' => ['jpg', 'png', 'jfif', 'webp'], 'permissions' => [ Permission::read(Role::any()), Permission::create(Role::any()), @@ -263,7 +263,39 @@ trait StorageBase $this->assertEquals(400, $res['headers']['status-code']); $this->assertEquals(Exception::STORAGE_INVALID_APPWRITE_ID, $res['body']['type']); - return ['bucketId' => $bucketId, 'fileId' => $file['body']['$id'], 'largeFileId' => $largeFile['body']['$id'], 'largeBucketId' => $bucket2['body']['$id']]; + /** + * Test for SUCCESS - Upload and view webp image + */ + $webpFile = $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-after.webp'), 'image/webp', 'logo-after.webp'), + 'permissions' => [ + Permission::read(Role::any()), + Permission::update(Role::any()), + Permission::delete(Role::any()), + ], + ]); + $this->assertEquals(201, $webpFile['headers']['status-code']); + $this->assertNotEmpty($webpFile['body']['$id']); + $this->assertEquals('logo-after.webp', $webpFile['body']['name']); + $this->assertEquals('image/webp', $webpFile['body']['mimeType']); + + $webpFileId = $webpFile['body']['$id']; + + // View webp file + $webpView = $this->client->call(Client::METHOD_GET, '/storage/buckets/' . $bucketId . '/files/' . $webpFileId . '/view', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders())); + + $this->assertEquals(200, $webpView['headers']['status-code']); + $this->assertEquals('image/webp', $webpView['headers']['content-type']); + $this->assertNotEmpty($webpView['body']); + + return ['bucketId' => $bucketId, 'fileId' => $file['body']['$id'], 'largeFileId' => $largeFile['body']['$id'], 'largeBucketId' => $bucket2['body']['$id'], 'webpFileId' => $webpFileId]; } public function testCreateBucketFileZstdCompression(): array @@ -872,90 +904,10 @@ trait StorageBase /** * @depends testCreateBucketFile */ - public function testUploadWebpImage(): array - { - /** - * Test for SUCCESS - Upload and view webp image - */ - $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 Webp', - 'fileSecurity' => true, - 'maximumFileSize' => 2000000, //2MB - 'allowedFileExtensions' => ['webp'], - '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']); - - $bucketId = $bucket['body']['$id']; - - // Upload webp file - $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.webp'), 'image/webp', 'logo.webp'), - '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('logo.webp', $file['body']['name']); - $this->assertEquals('image/webp', $file['body']['mimeType']); - - $fileId = $file['body']['$id']; - - // View webp file - $view = $this->client->call(Client::METHOD_GET, '/storage/buckets/' . $bucketId . '/files/' . $fileId . '/view', array_merge([ - 'content-type' => 'application/json', - 'x-appwrite-project' => $this->getProject()['$id'], - ], $this->getHeaders())); - - $this->assertEquals(200, $view['headers']['status-code']); - $this->assertEquals('image/webp', $view['headers']['content-type']); - $this->assertNotEmpty($view['body']); - - return ['bucketId' => $bucketId, 'fileId' => $fileId]; - } - - /** - * @depends testCreateBucketFile - */ - public function testPreviewNonWebpAsWebp(array $data): array + public function testFilePreview(array $data): array { $bucketId = $data['bucketId']; - - // Upload a PNG image - $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']); - - $fileId = $file['body']['$id']; + $fileId = $data['fileId']; // Preview PNG as webp $preview = $this->client->call(Client::METHOD_GET, '/storage/buckets/' . $bucketId . '/files/' . $fileId . '/preview', array_merge([ diff --git a/tests/resources/logo-after.webp b/tests/resources/logo-after.webp new file mode 100644 index 0000000000000000000000000000000000000000..b91c5dc1fa912333d58fba3f42bbce0f8559ae73 GIT binary patch literal 6236 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 G0000WrY4pE literal 0 HcmV?d00001 diff --git a/tests/resources/logo.webp b/tests/resources/logo.webp deleted file mode 100644 index f9bde111dbbd3ff06345f7fa53a29c2013d42f9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17200 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 From df8fb23e75182fc20b6880b97311c634dd638390 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 3 Nov 2025 18:13:21 +0000 Subject: [PATCH 5/7] Fix test assertion for file count with offset Co-authored-by: stnguyen90 <1477010+stnguyen90@users.noreply.github.com> --- tests/e2e/Services/Storage/StorageBase.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/e2e/Services/Storage/StorageBase.php b/tests/e2e/Services/Storage/StorageBase.php index 2012be7375..a89cd711cb 100644 --- a/tests/e2e/Services/Storage/StorageBase.php +++ b/tests/e2e/Services/Storage/StorageBase.php @@ -448,7 +448,7 @@ trait StorageBase ], ]); $this->assertEquals(200, $files['headers']['status-code']); - $this->assertEquals(0, count($files['body']['files'])); + $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', From 2d332264c67f5fc8bd8bddd3213fc79c6333f2c4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 4 Nov 2025 06:16:41 +0000 Subject: [PATCH 6/7] Replace with simple webp image for testing Co-authored-by: stnguyen90 <1477010+stnguyen90@users.noreply.github.com> --- tests/resources/logo-after.webp | Bin 6236 -> 634 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/resources/logo-after.webp b/tests/resources/logo-after.webp index b91c5dc1fa912333d58fba3f42bbce0f8559ae73..4a8791784a819b23d95ba2eef1de7fde040e3c9c 100644 GIT binary patch literal 634 zcmV-=0)_ojNk&F;0ssJ4MM6+kP&goF0ssJTAOM{KDv$wW06tM7k3}P*As3mv05}B% zv$t@!kcR;P{Xpv!@<7$3@yGRF!D+xBg?^|10Q?>O0N`ix0X_lbXZ!=i8X!NQdFB3@ z`~&#M_RsE}B>&XCP&$A=RZ5Gds?ur|MJru3R+CU6nxFeN>6BHzR~aLP!2Jh-Oj)OS zUTc+*>VRhxh#-3HF#M%evvD53)-#T$_?XU21=)c35Rr>47o8+2svO*!BE4hGj)15&1k5K zJFntgTznMm4pBQ{{K^81fgBPI$P`H;&vzh z{w6)I_+NkGcJ{-!^<|Uc5C5?1{_M?}{RrUj*_4jC`&}ex`zNVj9-;_Xa7F+NT;e^Wjb`{XDmxYC z%hCkeMpiZ<3^%-y|B&b74a!C5iC1PFI4iiOYUYiA_M0~o^3%=#7Z&_J(fWPJe>iJb UFbRwZDTesrE^7?y000000F0V5`2YX_ literal 6236 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 G0000WrY4pE From 8a9d0a3f337f3230a33d16259186d48eb43dc0e6 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 5 Nov 2025 19:30:21 +0000 Subject: [PATCH 7/7] Rename logo-after.webp to image.webp Co-authored-by: stnguyen90 <1477010+stnguyen90@users.noreply.github.com> --- tests/e2e/Services/Storage/StorageBase.php | 4 ++-- tests/resources/{logo-after.webp => image.webp} | Bin 2 files changed, 2 insertions(+), 2 deletions(-) rename tests/resources/{logo-after.webp => image.webp} (100%) diff --git a/tests/e2e/Services/Storage/StorageBase.php b/tests/e2e/Services/Storage/StorageBase.php index a89cd711cb..c67cfcc99a 100644 --- a/tests/e2e/Services/Storage/StorageBase.php +++ b/tests/e2e/Services/Storage/StorageBase.php @@ -271,7 +271,7 @@ trait StorageBase 'x-appwrite-project' => $this->getProject()['$id'], ], $this->getHeaders()), [ 'fileId' => ID::unique(), - 'file' => new CURLFile(realpath(__DIR__ . '/../../../resources/logo-after.webp'), 'image/webp', 'logo-after.webp'), + 'file' => new CURLFile(realpath(__DIR__ . '/../../../resources/image.webp'), 'image/webp', 'image.webp'), 'permissions' => [ Permission::read(Role::any()), Permission::update(Role::any()), @@ -280,7 +280,7 @@ trait StorageBase ]); $this->assertEquals(201, $webpFile['headers']['status-code']); $this->assertNotEmpty($webpFile['body']['$id']); - $this->assertEquals('logo-after.webp', $webpFile['body']['name']); + $this->assertEquals('image.webp', $webpFile['body']['name']); $this->assertEquals('image/webp', $webpFile['body']['mimeType']); $webpFileId = $webpFile['body']['$id']; diff --git a/tests/resources/logo-after.webp b/tests/resources/image.webp similarity index 100% rename from tests/resources/logo-after.webp rename to tests/resources/image.webp