migmag-1.0.x-dev/migmag_process/tests/src/Unit/Plugin/MigMagCompareTest.php
migmag_process/tests/src/Unit/Plugin/MigMagCompareTest.php
<?php
namespace Drupal\Tests\migmag_process\Unit\Plugin;
use Composer\InstalledVersions;
use Drupal\Tests\migrate\Unit\MigrateTestCase;
use Drupal\migmag_process\Plugin\migrate\process\MigMagCompare;
use Drupal\migrate\MigrateException;
use Drupal\migrate\MigrateExecutableInterface;
use Drupal\migrate\Row;
/**
* Tests the migmag_compare process plugin.
*
* @coversDefaultClass \Drupal\migmag_process\Plugin\migrate\process\MigMagCompare
*
* @group migmag_process
*/
class MigMagCompareTest extends MigrateTestCase {
/**
* Tests the transformation of the provided values.
*
* @param array $plugin_config
* The configuration of the tested plugin instance.
* @param mixed $value
* The incoming value to test the transformation with.
* @param mixed $expected_result
* The expected result of the transformation.
* @param string|null $expected_exception_message
* The expected message of the MigrateException if the test case should end
* in a MigrateException. If this is NULL, then the test does not expects a
* MigrateException to be thrown. Defaults to NULL.
*
* @covers ::transform
* @covers ::doCompare
* @covers ::deliverReturnValue
*
* @dataProvider providerTestTransform
*/
public function testTransform(array $plugin_config, $value, $expected_result, ?string $expected_exception_message = NULL): void {
$migrate_executable = $this->prophesize(MigrateExecutableInterface::class);
$row = $this->prophesize(Row::class);
$plugin_config += ['plugin' => 'migmag_compare'];
$plugin = new MigMagCompare(
$plugin_config,
$plugin_config['plugin'],
[]
);
if ($expected_exception_message) {
$this->expectException(MigrateException::class);
$this->expectExceptionMessage($expected_exception_message);
}
$actual_result = $plugin->transform(
$value,
$migrate_executable->reveal(),
$row->reveal(),
'destination_property'
);
$this->assertSame($expected_result, $actual_result);
}
/**
* Data provider for ::testTransform.
*
* @return array[]
* The test cases.
*/
public static function providerTestTransform(): array {
$return_if_conf = [
'true' => 'true',
'false' => 'false',
0 => 'equal',
-1 => '1st less than 2nd',
1 => '1st greater than 2nd',
];
$lt10PhpUnit = version_compare(InstalledVersions::getVersion('phpunit/phpunit'), '10', 'lt');
return [
"No operator ('==='), expected FALSE" => [
'plugin_config' => [],
'value' => ['0', 0],
'expected_result' => FALSE,
],
"No operator ('==='), expected TRUE" => [
'plugin_config' => [],
'value' => ['foo', 'foo'],
'expected_result' => TRUE,
],
"'==' operator, expected FALSE" => [
'plugin_config' => ['operator' => '=='],
'value' => ['ab', 1],
'expected_result' => FALSE,
],
"'==' operator, expected TRUE" => [
'plugin_config' => ['operator' => '=='],
'value' => ['0', 0],
'expected_result' => TRUE,
],
"Why weak comparison ('==') is dangerous (with PHP < 8.0)" => [
'plugin_config' => ['operator' => '=='],
'value' => ['ab', 0],
'expected_result' => PHP_MAJOR_VERSION < 8,
],
"'===' operator, expected FALSE" => [
'plugin_config' => ['operator' => '==='],
'value' => ['1', 1],
'expected_result' => FALSE,
],
"'===' operator, expected TRUE" => [
'plugin_config' => ['operator' => '==='],
'value' => [1.234, 1.234],
'expected_result' => TRUE,
],
"'!=' operator, expected FALSE" => [
'plugin_config' => ['operator' => '!='],
'value' => ['0', 0],
'expected_result' => FALSE,
],
"'!=' operator, expected TRUE" => [
'plugin_config' => ['operator' => '!='],
'value' => ['ab', 1],
'expected_result' => TRUE,
],
"Why weak comparison ('!=') is dangerous (with PHP < 8.0)" => [
'plugin_config' => ['operator' => '!='],
'value' => ['ab', 0],
'expected_result' => PHP_MAJOR_VERSION >= 8,
],
"Mixed values #1, '<>' operator, expected FALSE" => [
'plugin_config' => ['operator' => '<>'],
'value' => ['1.2345', 1.2345],
'expected_result' => FALSE,
],
"Mixed values #2, '<>' operator" => [
'plugin_config' => ['operator' => '<>'],
'value' => ['0abc', 0],
'expected_result' => PHP_MAJOR_VERSION >= 8,
],
"Mixed values #3, '!=' operator, expected FALSE" => [
'plugin_config' => ['operator' => '<>'],
'value' => [NULL, ''],
'expected_result' => FALSE,
],
"'!==' operator, expected FALSE" => [
'plugin_config' => ['operator' => '!=='],
'value' => [1.2345, 1.2345],
'expected_result' => FALSE,
],
"'!==' operator, expected TRUE" => [
'plugin_config' => ['operator' => '!=='],
'value' => ['1.2345', 1.2345],
'expected_result' => TRUE,
],
"'<' operator #1, expected FALSE" => [
'plugin_config' => ['operator' => '<'],
'value' => [1.23456, 1.2345],
'expected_result' => FALSE,
],
"'<' operator #2, expected TRUE" => [
'plugin_config' => ['operator' => '<'],
'value' => [1.2345, 1.23456],
'expected_result' => TRUE,
],
"'<' operator #3, expected TRUE" => [
'plugin_config' => ['operator' => '<'],
'value' => ['1.2345', 1.23456],
'expected_result' => TRUE,
],
"'<' operator #4, expected FALSE" => [
'plugin_config' => ['operator' => '<'],
'value' => ['1.23456', 1.2345],
'expected_result' => FALSE,
],
"'<=' operator #1, expected FALSE" => [
'plugin_config' => ['operator' => '<='],
'value' => [1.2345, 1],
'expected_result' => FALSE,
],
"'<=' operator #2, expected TRUE" => [
'plugin_config' => ['operator' => '<='],
'value' => [1, 1.2345],
'expected_result' => TRUE,
],
"'<=' operator #3, expected TRUE" => [
'plugin_config' => ['operator' => '<='],
'value' => ['1.23456', 1.2345678],
'expected_result' => TRUE,
],
"'>' operator #1, expected FALSE" => [
'plugin_config' => ['operator' => '>'],
'value' => [1.23456, 1.2345678],
'expected_result' => FALSE,
],
"'>' operator #2, expected TRUE" => [
'plugin_config' => ['operator' => '>'],
'value' => [1.23456, 1.2345],
'expected_result' => TRUE,
],
"'>=' operator #1, expected FALSE" => [
'plugin_config' => ['operator' => '>='],
'value' => [1, 1.2345],
'expected_result' => FALSE,
],
"'>=' operator #2, expected TRUE" => [
'plugin_config' => ['operator' => '>='],
'value' => [1.2345, 1],
'expected_result' => TRUE,
],
"'>=' operator #3, expected TRUE" => [
'plugin_config' => ['operator' => '>='],
'value' => [1.2345678, '1.23456'],
'expected_result' => TRUE,
],
"Second object is always bigger" => [
'plugin_config' => ['operator' => '>'],
'value' => [(object) ['a' => 1], (object) []],
'expected_result' => TRUE,
],
"Second array is always bigger" => [
'plugin_config' => ['operator' => '>'],
'value' => [[1], []],
'expected_result' => TRUE,
],
"'<=>' operator #1" => [
'plugin_config' => ['operator' => '<=>'],
'value' => [1, 2],
'expected_result' => -1,
],
"'<=>' operator #2" => [
'plugin_config' => ['operator' => '<=>'],
'value' => [2, 2],
'expected_result' => 0,
],
"'<=>' operator #3" => [
'plugin_config' => ['operator' => '<=>'],
'value' => [3, 2],
'expected_result' => 1,
],
"'<=>' operator #4: object" => [
'plugin_config' => ['operator' => '<=>'],
'value' => [(object) [1 => 1], (object) [1 => 0]],
'expected_result' => 1,
],
"'<=>' operator #5: object" => [
'plugin_config' => ['operator' => '<=>'],
'value' => [(object) [1 => 1], (object) [1 => 1]],
'expected_result' => 0,
],
"'<=>' operator #6: object" => [
'plugin_config' => ['operator' => '<=>'],
'value' => [(object) [1 => 1], (object) [1 => 2]],
'expected_result' => -1,
],
'return_if #1: true' => [
'plugin_config' => ['return_if' => $return_if_conf],
'value' => [1, 1],
'expected_result' => 'true',
],
'return_if #2: false' => [
'plugin_config' => ['return_if' => $return_if_conf],
'value' => [0, 1],
'expected_result' => 'false',
],
'return_if #3: less' => [
'plugin_config' => [
'operator' => '<=>',
'return_if' => $return_if_conf,
],
'value' => [0, 1],
'expected_result' => '1st less than 2nd',
],
'return_if #4: equal' => [
'plugin_config' => [
'operator' => '<=>',
'return_if' => $return_if_conf,
],
'value' => [1, 1],
'expected_result' => 'equal',
],
'return_if #5: greater' => [
'plugin_config' => [
'operator' => '<=>',
'return_if' => $return_if_conf,
],
'value' => [2, 1],
'expected_result' => '1st greater than 2nd',
],
"Exception: comparison fails" => [
'plugin_config' => ['operator' => '<=>'],
'value' => [(object) [1 => 1], 1],
'expected_result' => $lt10PhpUnit ? NULL : 0,
'expected_exception_message' => $lt10PhpUnit
? "Comparison failed in 'migmag_compare' migrate process plugin with message: Object of class stdClass could not be converted to int."
: NULL,
],
"Exception: object value" => [
'plugin_config' => [],
'value' => (object) ['foo' => 'bar'],
'expected_result' => NULL,
'expected_exception_message' => "'migmag_compare' migrate process plugin's processed value must be an array, got 'object'.",
],
"Exception: integer value" => [
'plugin_config' => [],
'value' => 1,
'expected_result' => NULL,
'expected_exception_message' => "'migmag_compare' migrate process plugin's processed value must be an array, got 'integer'.",
],
"Exception: only one array value" => [
'plugin_config' => [],
'value' => [1],
'expected_result' => NULL,
'expected_exception_message' => "'migmag_compare' migrate process plugin's processed array value must have at least two values.",
],
"Exception: unsupported operator" => [
'plugin_config' => ['operator' => 'foo'],
'value' => [1, 2],
'expected_result' => NULL,
'expected_exception_message' => "'migmag_compare' migrate process plugin does not support operator 'foo'.",
],
"Exception: non-string operator" => [
'plugin_config' => ['operator' => (object) ['foo']],
'value' => [1, 2],
'expected_result' => NULL,
'expected_exception_message' => "'migmag_compare' migrate process plugin's operator must be a string, got 'object'.",
],
];
}
}
