Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 16 additions & 8 deletions inc/compatibility/elementor.php
Original file line number Diff line number Diff line change
Expand Up @@ -134,12 +134,16 @@ public function enqueue() {
/**
* Filter rest responses to add Neve Palette Colors to pages using Elementor.
*
* @param \WP_REST_Response $response request response.
* @param array $handler request handler.
* @param \WP_REST_Request $request rest request.
* @return \WP_REST_Response
* @param \WP_REST_Response|\WP_Error $response request response.
* @param array $handler request handler.
* @param \WP_REST_Request $request rest request.
* @return \WP_REST_Response|\WP_Error
*/
public function alter_global_colors_front_end( $response, $handler, \WP_REST_Request $request ) {
if ( is_wp_error( $response ) ) {
return $response;
}

$route = $request->get_route();
$rest_to_slugs = [
'nvprimaryaccent' => 'nv-primary-accent',
Expand Down Expand Up @@ -178,12 +182,16 @@ public function alter_global_colors_front_end( $response, $handler, \WP_REST_Req
/**
* Filter rest responses to add Neve Palette Colors to Elementor.
*
* @param \WP_REST_Response $response request response.
* @param array $handler request handler.
* @param \WP_REST_Request $request rest request.
* @return \WP_REST_Response
* @param \WP_REST_Response|\WP_Error $response request response.
* @param array $handler request handler.
* @param \WP_REST_Request $request rest request.
* @return \WP_REST_Response|\WP_Error
*/
public function alter_global_colors_in_picker( $response, $handler, \WP_REST_Request $request ) {
if ( is_wp_error( $response ) ) {
return $response;
}

$route = $request->get_route();

if ( $route !== '/elementor/v1/globals' ) {
Expand Down
92 changes: 92 additions & 0 deletions tests/test-elementor-compatibility.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
<?php
/**
* Tests Elementor compatibility.
*
* @package neve
*/

/**
* Class TestElementorCompatibility
*/
class TestElementorCompatibility extends WP_UnitTestCase {

/**
* The globals REST route filtered by the picker callback.
*/
const GLOBALS_ROUTE = '/elementor/v1/globals';

/**
* A single global color REST route, filtered by the front end callback.
*/
const COLOR_ROUTE = self::GLOBALS_ROUTE . '/colors/nvprimaryaccent';

/**
* Build a compatibility instance in a post-init state.
*
* Avoids ::init(), which needs ELEMENTOR_VERSION defined and would leak that
* constant plus its hooks into the rest of the suite.
*
* @return \Neve\Compatibility\Elementor
*/
private function get_elementor_compat() {
$elementor = new \Neve\Compatibility\Elementor();

$custom_colors = new ReflectionProperty( $elementor, 'custom_global_colors' );
$custom_colors->setAccessible( true );
$custom_colors->setValue( $elementor, [] );

return $elementor;
}

/**
* Errored responses should be passed through untouched.
*/
public function test_global_colors_in_picker_passes_through_wp_error() {
$elementor = $this->get_elementor_compat();
$request = new WP_REST_Request( 'GET', self::GLOBALS_ROUTE );
$error = new WP_Error( 'rest_forbidden', 'Sorry, you are not allowed to do that.', [ 'status' => 403 ] );

$this->assertSame( $error, $elementor->alter_global_colors_in_picker( $error, [], $request ) );
}

/**
* Errored responses on a color route should be passed through untouched.
*/
public function test_global_colors_front_end_passes_through_wp_error() {
$elementor = $this->get_elementor_compat();
$request = new WP_REST_Request( 'GET', self::COLOR_ROUTE );
$error = new WP_Error( 'rest_forbidden', 'Sorry, you are not allowed to do that.', [ 'status' => 403 ] );

$this->assertSame( $error, $elementor->alter_global_colors_front_end( $error, [], $request ) );
}

/**
* Valid responses should still get the Neve palette colors merged in.
*/
public function test_global_colors_in_picker_adds_palette_colors() {
$elementor = $this->get_elementor_compat();
$request = new WP_REST_Request( 'GET', self::GLOBALS_ROUTE );
$response = new WP_REST_Response( [ 'colors' => [] ] );

$filtered = $elementor->alter_global_colors_in_picker( $response, [], $request );
$data = $filtered->get_data();

$this->assertArrayHasKey( 'nvprimaryaccent', $data['colors'] );
$this->assertArrayHasKey( 'value', $data['colors']['nvprimaryaccent'] );
}

/**
* Valid responses on a single color route should be replaced with the Neve color.
*/
public function test_global_colors_front_end_overrides_color() {
$elementor = $this->get_elementor_compat();
$request = new WP_REST_Request( 'GET', self::COLOR_ROUTE );
$response = new WP_REST_Response( [] );

$filtered = $elementor->alter_global_colors_front_end( $response, [], $request );
$data = $filtered->get_data();

$this->assertSame( 'nvprimaryaccent', $data['id'] );
$this->assertArrayHasKey( 'value', $data );
}
}
Loading