Skip to content

Commit

Permalink
Add checks and unit tests to Transformers (#44634)
Browse files Browse the repository at this point in the history
* Add checks and unit tests to Transformers

* Add changelog

* Update docs

* Fix test

* Set the default value to an empty array

* Set default value to array() for ArrayColumn
  • Loading branch information
chihsuan committed Feb 16, 2024
1 parent 0ea64cf commit 75118fb
Show file tree
Hide file tree
Showing 17 changed files with 182 additions and 11 deletions.
4 changes: 4 additions & 0 deletions plugins/woocommerce/changelog/dev-audit-transformaters
@@ -0,0 +1,4 @@
Significance: patch
Type: dev

Add checks and unit tests to Transformers
Expand Up @@ -23,7 +23,11 @@ class ArrayColumn implements TransformerInterface {
*
* @return mixed
*/
public function transform( $value, stdClass $arguments = null, $default = null ) {
public function transform( $value, stdClass $arguments = null, $default = array() ) {
if ( ! is_array( $value ) ) {
return $default;
}

return array_column( $value, $arguments->key );
}

Expand All @@ -39,6 +43,14 @@ public function validate( stdClass $arguments = null ) {
return false;
}

if (
null !== $arguments->key &&
! is_string( $arguments->key ) &&
! is_int( $arguments->key )
) {
return false;
}

return true;
}
}
Expand Up @@ -20,7 +20,11 @@ class ArrayFlatten implements TransformerInterface {
*
* @return mixed|null
*/
public function transform( $value, stdClass $arguments = null, $default = null ) {
public function transform( $value, stdClass $arguments = null, $default = array() ) {
if ( ! is_array( $value ) ) {
return $default;
}

$return = array();
array_walk_recursive(
$value,
Expand Down
Expand Up @@ -20,7 +20,11 @@ class ArrayKeys implements TransformerInterface {
*
* @return mixed
*/
public function transform( $value, stdClass $arguments = null, $default = null ) {
public function transform( $value, stdClass $arguments = null, $default = array() ) {
if ( ! is_array( $value ) ) {
return $default;
}

return array_keys( $value );
}

Expand Down
Expand Up @@ -24,6 +24,10 @@ class ArraySearch implements TransformerInterface {
* @return mixed|null
*/
public function transform( $value, stdClass $arguments = null, $default = null ) {
if ( ! is_array( $value ) ) {
return $default;
}

$key = array_search( $arguments->value, $value, true );
if ( false !== $key ) {
return $value[ $key ];
Expand Down
Expand Up @@ -20,7 +20,11 @@ class ArrayValues implements TransformerInterface {
*
* @return mixed
*/
public function transform( $value, stdClass $arguments = null, $default = null ) {
public function transform( $value, stdClass $arguments = null, $default = array() ) {
if ( ! is_array( $value ) ) {
return $default;
}

return array_values( $value );
}

Expand Down
Expand Up @@ -6,21 +6,25 @@
use stdClass;

/**
* Count elements in Array.
* Count elements in Array or Countable object.
*
* @package Automattic\WooCommerce\Admin\RemoteInboxNotifications\Transformers
*/
class Count implements TransformerInterface {
/**
* Count elements in Array.
* Count elements in Array or Countable object.
*
* @param array $value an array to count.
* @param stdClass|null $arguments arguments.
* @param string|null $default default value.
* @param array|Countable $value an array to count.
* @param stdClass|null $arguments arguments.
* @param string|null $default default value.
*
* @return number
*/
public function transform( $value, stdClass $arguments = null, $default = null ) {
if ( ! is_array( $value ) && ! $value instanceof \Countable ) {
return $default;
}

return count( $value );
}

Expand Down
Expand Up @@ -43,6 +43,10 @@ public function transform( $value, stdclass $arguments = null, $default = null )
* @return mixed|null
*/
public function get( $array, $path, $default = null ) {
if ( ! is_array( $array ) ) {
return $default;
}

if ( isset( $array[ $path ] ) ) {
return $array[ $path ];
}
Expand Down
Expand Up @@ -14,15 +14,32 @@ class PrepareUrl implements TransformerInterface {
/**
* Prepares the site URL by removing the protocol and trailing slash.
*
* @param mixed $value a value to transform.
* @param string $value a value to transform.
* @param stdClass|null $arguments arguments.
* @param string|null $default default value.
*
* @return mixed|null
*/
public function transform( $value, stdClass $arguments = null, $default = null ) {
if ( ! is_string( $value ) ) {
return $default;
}

$url_parts = wp_parse_url( rtrim( $value, '/' ) );
return isset( $url_parts['path'] ) ? $url_parts['host'] . $url_parts['path'] : $url_parts['host'];

if ( ! $url_parts ) {
return $default;
}

if ( ! isset( $url_parts['host'] ) ) {
return $default;
}

if ( isset( $url_parts['path'] ) ) {
return $url_parts['host'] . $url_parts['path'];
}

return $url_parts['host'];
}

/**
Expand Down
Expand Up @@ -21,6 +21,37 @@ public function test_validate_returns_false_when_key_argument_is_missing() {
$this->assertFalse( false, $result );
}

/**
* Test validate method returns false when argument->key is not valid type
*/
public function test_validate_returns_false_when_argument_key_is_not_valid_type() {
$array_column = new ArrayColumn();
$result = $array_column->validate(
(object) array(
'key' => true,
)
);
$this->assertFalse( false, $result );

$result = $array_column->validate(
(object) array(
'key' => array(),
)
);
$this->assertFalse( false, $result );
}

/**
* Test it returns default value when value is not an array
*/
public function test_it_returns_default_value_when_value_is_not_an_array() {
$arguments = (object) array( 'key' => 'name' );
$array_column = new ArrayColumn();
$default = 'default value';
$result = $array_column->transform( 'invalid value', $arguments, $default );
$this->assertEquals( $default, $result );
}

/**
* Test it returns value by array column.
*/
Expand Down
Expand Up @@ -11,6 +11,16 @@
* class WC_Admin_Tests_RemoteInboxNotifications_Transformers_ArrayKeys
*/
class WC_Admin_Tests_RemoteInboxNotifications_Transformers_ArrayFlatten extends WC_Unit_Test_Case {
/**
* Test it returns default value when value is not an array
*/
public function test_it_returns_default_value_when_value_is_not_an_array() {
$default = 'default value';
$array_keys = new ArrayFlatten();
$result = $array_keys->transform( 'invalid value', null, $default );
$this->assertEquals( $default, $result );
}

/**
* Test it returns flatten array
*/
Expand Down
Expand Up @@ -11,6 +11,16 @@
* class WC_Admin_Tests_RemoteInboxNotifications_Transformers_ArrayKeys
*/
class WC_Admin_Tests_RemoteInboxNotifications_Transformers_ArrayKeys extends WC_Unit_Test_Case {
/**
* Test it returns default value when value is not an array
*/
public function test_it_returns_default_value_when_value_is_not_an_array() {
$default = 'default value';
$array_keys = new ArrayKeys();
$result = $array_keys->transform( 'invalid value', null, $default );
$this->assertEquals( $default, $result );
}

/**
* Test it returns array values.
*/
Expand Down
Expand Up @@ -31,6 +31,16 @@ public function test_it_returns_null_if_value_is_not_found() {
$this->assertEquals( null, $result );
}

/**
* Test it returns default value when value is not an array
*/
public function test_it_returns_default_value_when_value_is_not_an_array() {
$default = 'default value';
$array_keys = new ArraySearch();
$result = $array_keys->transform( 'invalid value', null, $default );
$this->assertEquals( $default, $result );
}

/**
* Test it returns value by array value.
*/
Expand Down
Expand Up @@ -11,6 +11,16 @@
* class WC_Admin_Tests_RemoteInboxNotifications_Transformers_ArrayValues
*/
class WC_Admin_Tests_RemoteInboxNotifications_Transformers_ArrayValues extends WC_Unit_Test_Case {
/**
* Test it returns default value when value is not an array
*/
public function test_it_returns_default_value_when_value_is_not_an_array() {
$default = 'default value';
$array_keys = new ArrayValues();
$result = $array_keys->transform( 'invalid value', null, $default );
$this->assertEquals( $default, $result );
}

/**
* Test it returns array values.
*/
Expand Down
Expand Up @@ -11,6 +11,16 @@
* class WC_Admin_Tests_RemoteInboxNotifications_Transformers_ArrayValues
*/
class WC_Admin_Tests_RemoteInboxNotifications_Transformers_ArrayCount extends WC_Unit_Test_Case {
/**
* Test it returns default value when value is not an array.
*/
public function test_it_returns_default_value_when_value_is_not_an_array() {
$default = 'default value';
$array_keys = new Count();
$result = $array_keys->transform( 'invalid value', null, $default );
$this->assertEquals( $default, $result );
}

/**
* Test it returns array count.
*/
Expand Down
Expand Up @@ -35,6 +35,18 @@ public function test_it_can_get_value_by_index() {
$this->assertEquals( $result, $item );
}

/**
* Test it returns default value when value is not an array.
*/
public function test_it_returns_default_value_when_value_is_not_an_array() {
$arguments = (object) array( 'path' => 'teams.ghidorah' );
$default = 'default value';
$array_keys = new DotNotation();

$result = $array_keys->transform( 'invalid value', $arguments, $default );
$this->assertEquals( $default, $result );
}

/**
* Test it get getvalue by dot notation.
*/
Expand Down
Expand Up @@ -11,6 +11,27 @@
* class WC_Admin_Tests_RemoteInboxNotifications_Transformers_PrepareUrl
*/
class WC_Admin_Tests_RemoteInboxNotifications_Transformers_PrepareUrl extends WC_Unit_Test_Case {
/**
* Test it returns default value when url is not string.
*/
public function test_it_returns_default_value_when_url_is_not_string() {

$prepare_url = new PrepareUrl();
$default = 'default value';
$result = $prepare_url->transform( 123, null, $default );
$this->assertEquals( $default, $result );
}

/**
* Test it returns default when url cannot be parsed.
*/
public function test_it_returns_default_when_url_cannot_be_parsed() {
$prepare_url = new PrepareUrl();
$default = 'default value';
$result = $prepare_url->transform( 'invalid url', null, $default );
$this->assertEquals( $default, $result );
}

/**
* Test it returns url without protocol and trailing slash.
*/
Expand Down

0 comments on commit 75118fb

Please sign in to comment.