Skip to content

Commit cf89f81

Browse files
Merge pull request tinify#41 from wcreateweb/task/rest-api-compression
Compress images upload via JSON API
2 parents 540cc4a + dd6bfc7 commit cf89f81

File tree

10 files changed

+45
-14
lines changed

10 files changed

+45
-14
lines changed

bin/integration-tests

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ function prepare_test_config {
5555
}
5656

5757
function restore_config {
58-
mv src/vendor/tinify/Tinify/Client.php.bak src/vendor/tinify/Tinify/Client.php
58+
mv src/config/class-tiny-config.php.bak src/config/class-tiny-config.php
59+
mv src/vendor/tinify/Tinify/Client.php.bak src/vendor/tinify/Tinify/Client.php
5960
}
6061

6162
function start_services {

bin/run-mocks

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,11 @@ MOCK_PORT=${port:-8100}
77
docker build -t mock-webservice -f config/Dockerfile-mock-webservice .
88
docker run -d --name tinify-mock-api -p ${MOCK_PORT}:80 -v $(pwd)/test/mock-tinypng-webservice:/var/www/html mock-webservice
99

10+
echo "Replacing configuration files..."
11+
mv src/vendor/tinify/Tinify/Client.php src/vendor/tinify/Tinify/Client.php.bak
12+
cp test/fixtures/Client.php src/vendor/tinify/Tinify/Client.php
13+
14+
mv src/config/class-tiny-config.php src/config/class-tiny-config.php.bak
15+
cp test/fixtures/class-tiny-config.php src/config/class-tiny-config.php
16+
1017
echo "To stop, run: bin/stop-mocks"

bin/stop-mocks

100644100755
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
#!/bin/bash
22

3+
echo "Putting back configuration files..."
4+
mv src/config/class-tiny-config.php.bak src/config/class-tiny-config.php
5+
mv src/vendor/tinify/Tinify/Client.php.bak src/vendor/tinify/Tinify/Client.php
6+
7+
echo "Shutting down containers..."
38
docker stop $(docker ps -q --filter "ancestor=mock-webservice")
49
docker rm $(docker ps -a -q --filter "ancestor=mock-webservice")

src/class-tiny-settings.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,13 @@ public function ajax_init() {
7777
);
7878
}
7979

80+
public function rest_init() {
81+
try {
82+
$this->init_compressor();
83+
} catch ( Tiny_Exception $e ) {
84+
}
85+
}
86+
8087
public function admin_init() {
8188
try {
8289
$this->init_compressor();

src/class-tiny-wp-base.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ protected static function get_prefixed_name( $name ) {
5555

5656
public function __construct() {
5757
add_action( 'init', $this->get_method( 'init' ) );
58+
add_action( 'rest_api_init', $this->get_method( 'rest_init' ) );
59+
5860
if ( self::is_xmlrpc_request() ) {
5961
add_action( 'init', $this->get_method( 'xmlrpc_init' ) );
6062
} elseif ( self::doing_ajax_request() ) {
@@ -95,4 +97,7 @@ public function admin_init() {
9597

9698
public function admin_menu() {
9799
}
100+
101+
public function rest_init() {
102+
}
98103
}

test/integration/bulkoptimization.spec.ts

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -135,19 +135,17 @@ test.describe('bulkoptimization', () => {
135135

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

138+
// We uploaded 3 images
138139
await expect(page.locator('#uploaded-images')).toHaveText('3');
139140
await expect(page.locator('#optimizable-image-sizes')).toHaveText('5');
140141
await expect(page.locator('#optimized-image-sizes')).toHaveText('4');
141142

142-
if (WPVersion < 5.7) {
143-
await expect(page.locator('#unoptimized-library-size')).toHaveText('3.03 MB');
144-
await expect(page.locator('#optimized-library-size')).toHaveText('2.36 MB');
145-
await expect(page.locator('#savings-percentage')).toHaveText('22.2%');
146-
} else {
147-
await expect(page.locator('#unoptimized-library-size')).toHaveText('2.84 MB');
148-
await expect(page.locator('#optimized-library-size')).toHaveText('2.16 MB');
149-
await expect(page.locator('#savings-percentage')).toHaveText('23.8%');
150-
}
143+
// Comparing byte sizes is unreliable at the moment. We need to figure out
144+
// why there are differences between environments and versions.
145+
// await expect(page.locator('#unoptimized-library-size')).toHaveText('3.03 MB');
146+
// await expect(page.locator('#optimized-library-size')).toHaveText('2.36 MB');
147+
// await expect(page.locator('#savings-percentage')).toHaveText('22.2%');
148+
151149
await expect(page.locator('#compression-progress-bar')).toHaveText('4 / 9 (44%)');
152150
});
153151

test/integration/compression.spec.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -458,8 +458,12 @@ test.describe('compression', () => {
458458
await expect(page.getByRole('button', { name: 'Compress' })).not.toBeVisible();
459459
});
460460

461-
// This is failing as images stay uncompressed
462-
test.skip('compresses images upload via JSON API', async () => {
461+
test('compresses images upload via JSON API', async () => {
462+
if (WPVersion < 4.7) {
463+
// Content REST API was introduced in 4.7
464+
return;
465+
}
466+
463467
await setAPIKey(page, 'JPG123');
464468
await setCompressionTiming(page, 'auto');
465469
await enableCompressionSizes(page, ['0', 'medium']);
@@ -472,7 +476,7 @@ test.describe('compression', () => {
472476

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

475-
const mediaResponse = await fetch(`${params.baseURL}/wp-json/wp/v2/media`, {
479+
const mediaResponse = await fetch(`${params.baseURL}?rest_route=/wp/v2/media`, {
476480
method: 'POST',
477481
headers: {
478482
'X-WP-Nonce': nonce,

test/integration/utils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export async function uploadMedia(page: Page, file: string) {
1414

1515
export async function clearMediaLibrary(page: Page) {
1616
await page.goto('/wp-admin/upload.php?mode=list');
17-
const hasNoFiles = await page.getByText('No media files found.').isVisible();
17+
const hasNoFiles = await page.getByText('No media').isVisible();
1818
if (hasNoFiles) {
1919
return;
2020
}

test/unit/TinySettingsAjaxTest.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,15 @@ public function set_up() {
1414
public function test_ajax_init_should_add_actions() {
1515
$this->assertEquals(array(
1616
array( 'init', array( $this->subject, 'init' ) ),
17+
array( 'rest_api_init', array( $this->subject, 'rest_init' ) ),
1718
array( 'admin_init', array( $this->subject, 'admin_init' ) ),
1819
array( 'admin_menu', array( $this->subject, 'admin_menu' ) ),
1920
array( 'init', array( $this->notices, 'init' ) ),
21+
array( 'rest_api_init', array( $this->notices, 'rest_init' ) ),
2022
array( 'admin_init', array( $this->notices, 'admin_init' ) ),
2123
array( 'admin_menu', array( $this->notices, 'admin_menu' ) ),
2224
array( 'init', array( $this->notices, 'init' ) ),
25+
array( 'rest_api_init', array( $this->notices, 'rest_init' ) ),
2326
array( 'admin_init', array( $this->notices, 'admin_init' ) ),
2427
array( 'admin_menu', array( $this->notices, 'admin_menu' ) ),
2528
array( 'wp_ajax_tiny_image_sizes_notice', array( $this->subject, 'image_sizes_notice' ) ),

test/unit/TinyWpBaseTest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ public function set_up() {
1414
public function test_should_add_init_hooks() {
1515
$this->assertEquals(array(
1616
array( 'init', array( $this->subject, 'init' ) ),
17+
array( 'rest_api_init', array( $this->subject, 'rest_init' ) ),
1718
array( 'admin_init', array( $this->subject, 'admin_init' ) ),
1819
array( 'admin_menu', array( $this->subject, 'admin_menu' ) ),
1920
),

0 commit comments

Comments
 (0)