Skip to content

Compress images upload via JSON API #41

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 11 commits into from
Feb 17, 2025
3 changes: 2 additions & 1 deletion bin/integration-tests
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,8 @@ function prepare_test_config {
}

function restore_config {
mv src/vendor/tinify/Tinify/Client.php.bak src/vendor/tinify/Tinify/Client.php
mv src/config/class-tiny-config.php.bak src/config/class-tiny-config.php
mv src/vendor/tinify/Tinify/Client.php.bak src/vendor/tinify/Tinify/Client.php
}

function start_services {
Expand Down
7 changes: 7 additions & 0 deletions bin/run-mocks
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,11 @@ MOCK_PORT=${port:-8100}
docker build -t mock-webservice -f config/Dockerfile-mock-webservice .
docker run -d --name tinify-mock-api -p ${MOCK_PORT}:80 -v $(pwd)/test/mock-tinypng-webservice:/var/www/html mock-webservice

echo "Replacing configuration files..."
mv src/vendor/tinify/Tinify/Client.php src/vendor/tinify/Tinify/Client.php.bak
cp test/fixtures/Client.php src/vendor/tinify/Tinify/Client.php

mv src/config/class-tiny-config.php src/config/class-tiny-config.php.bak
cp test/fixtures/class-tiny-config.php src/config/class-tiny-config.php

echo "To stop, run: bin/stop-mocks"
5 changes: 5 additions & 0 deletions bin/stop-mocks
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
#!/bin/bash

echo "Putting back configuration files..."
mv src/config/class-tiny-config.php.bak src/config/class-tiny-config.php
mv src/vendor/tinify/Tinify/Client.php.bak src/vendor/tinify/Tinify/Client.php

echo "Shutting down containers..."
docker stop $(docker ps -q --filter "ancestor=mock-webservice")
docker rm $(docker ps -a -q --filter "ancestor=mock-webservice")
7 changes: 7 additions & 0 deletions src/class-tiny-settings.php
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,13 @@ public function ajax_init() {
);
}

public function rest_init() {
try {
$this->init_compressor();
} catch ( Tiny_Exception $e ) {
}
}

public function admin_init() {
try {
$this->init_compressor();
Expand Down
5 changes: 5 additions & 0 deletions src/class-tiny-wp-base.php
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@ protected static function get_prefixed_name( $name ) {

public function __construct() {
add_action( 'init', $this->get_method( 'init' ) );
add_action( 'rest_api_init', $this->get_method( 'rest_init' ) );

if ( self::is_xmlrpc_request() ) {
add_action( 'init', $this->get_method( 'xmlrpc_init' ) );
} elseif ( self::doing_ajax_request() ) {
Expand Down Expand Up @@ -95,4 +97,7 @@ public function admin_init() {

public function admin_menu() {
}

public function rest_init() {
}
}
16 changes: 7 additions & 9 deletions test/integration/bulkoptimization.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -135,19 +135,17 @@ test.describe('bulkoptimization', () => {

await page.goto('/wp-admin/upload.php?page=tiny-bulk-optimization');

// We uploaded 3 images
await expect(page.locator('#uploaded-images')).toHaveText('3');
await expect(page.locator('#optimizable-image-sizes')).toHaveText('5');
await expect(page.locator('#optimized-image-sizes')).toHaveText('4');

if (WPVersion < 5.7) {
await expect(page.locator('#unoptimized-library-size')).toHaveText('3.03 MB');
await expect(page.locator('#optimized-library-size')).toHaveText('2.36 MB');
await expect(page.locator('#savings-percentage')).toHaveText('22.2%');
} else {
await expect(page.locator('#unoptimized-library-size')).toHaveText('2.84 MB');
await expect(page.locator('#optimized-library-size')).toHaveText('2.16 MB');
await expect(page.locator('#savings-percentage')).toHaveText('23.8%');
}
// Comparing byte sizes is unreliable at the moment. We need to figure out
// why there are differences between environments and versions.
// await expect(page.locator('#unoptimized-library-size')).toHaveText('3.03 MB');
// await expect(page.locator('#optimized-library-size')).toHaveText('2.36 MB');
// await expect(page.locator('#savings-percentage')).toHaveText('22.2%');

await expect(page.locator('#compression-progress-bar')).toHaveText('4 / 9 (44%)');
});

Expand Down
10 changes: 7 additions & 3 deletions test/integration/compression.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -458,8 +458,12 @@ test.describe('compression', () => {
await expect(page.getByRole('button', { name: 'Compress' })).not.toBeVisible();
});

// This is failing as images stay uncompressed
test.skip('compresses images upload via JSON API', async () => {
test('compresses images upload via JSON API', async () => {
if (WPVersion < 4.7) {
// Content REST API was introduced in 4.7
return;
}

await setAPIKey(page, 'JPG123');
await setCompressionTiming(page, 'auto');
await enableCompressionSizes(page, ['0', 'medium']);
Expand All @@ -472,7 +476,7 @@ test.describe('compression', () => {

const blob = new Blob([new Uint8Array(params.file)], { type: 'image/jpeg' });

const mediaResponse = await fetch(`${params.baseURL}/wp-json/wp/v2/media`, {
const mediaResponse = await fetch(`${params.baseURL}?rest_route=/wp/v2/media`, {
method: 'POST',
headers: {
'X-WP-Nonce': nonce,
Expand Down
2 changes: 1 addition & 1 deletion test/integration/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ export async function uploadMedia(page: Page, file: string) {

export async function clearMediaLibrary(page: Page) {
await page.goto('/wp-admin/upload.php?mode=list');
const hasNoFiles = await page.getByText('No media files found.').isVisible();
const hasNoFiles = await page.getByText('No media').isVisible();
if (hasNoFiles) {
return;
}
Expand Down
3 changes: 3 additions & 0 deletions test/unit/TinySettingsAjaxTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,15 @@ public function set_up() {
public function test_ajax_init_should_add_actions() {
$this->assertEquals(array(
array( 'init', array( $this->subject, 'init' ) ),
array( 'rest_api_init', array( $this->subject, 'rest_init' ) ),
array( 'admin_init', array( $this->subject, 'admin_init' ) ),
array( 'admin_menu', array( $this->subject, 'admin_menu' ) ),
array( 'init', array( $this->notices, 'init' ) ),
array( 'rest_api_init', array( $this->notices, 'rest_init' ) ),
array( 'admin_init', array( $this->notices, 'admin_init' ) ),
array( 'admin_menu', array( $this->notices, 'admin_menu' ) ),
array( 'init', array( $this->notices, 'init' ) ),
array( 'rest_api_init', array( $this->notices, 'rest_init' ) ),
array( 'admin_init', array( $this->notices, 'admin_init' ) ),
array( 'admin_menu', array( $this->notices, 'admin_menu' ) ),
array( 'wp_ajax_tiny_image_sizes_notice', array( $this->subject, 'image_sizes_notice' ) ),
Expand Down
1 change: 1 addition & 0 deletions test/unit/TinyWpBaseTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ public function set_up() {
public function test_should_add_init_hooks() {
$this->assertEquals(array(
array( 'init', array( $this->subject, 'init' ) ),
array( 'rest_api_init', array( $this->subject, 'rest_init' ) ),
array( 'admin_init', array( $this->subject, 'admin_init' ) ),
array( 'admin_menu', array( $this->subject, 'admin_menu' ) ),
),
Expand Down