dvf-2.x-dev/tests/src/Unit/DvfHelpersTest.php
tests/src/Unit/DvfHelpersTest.php
<?php
namespace Drupal\Tests\dvf\Unit;
use Drupal\Core\GeneratedLink;
use Drupal\Core\Link;
use Drupal\dvf\DvfHelpers;
use Drupal\Tests\UnitTestCase;
use Drupal\Core\DependencyInjection\ContainerBuilder;
/**
* Tests DvfHelpers.
*
* @group dvf
*/
class DvfHelpersTest extends UnitTestCase {
/**
* The Dvf helpers class to test.
*
* @var \Drupal\dvf\DvfHelpers
*/
protected $dvfHelpers;
/**
* Setup test dependencies including container and mock.
*/
protected function setUp(): void {
parent::setUp();
$this->dvfHelpers = new DvfHelpers();
// Create dummy Drupal container for DI services.
$container = new ContainerBuilder();
\Drupal::setContainer($container);
// Mock the link generator for testGetHelpPageLink().
$linkGenerator = $this->createMock('Drupal\Core\Utility\LinkGeneratorInterface');
// Mock its generateFromLink function by creating
// link markup using generated Uri.
$linkGenerator->expects($this->any())
->method('generateFromLink')
->willReturnCallback(function (Link $link) {
// Since path validator mock returns null,
// link has been built with Link::fromInternalUri('base:...')
$uri = str_replace('base:', '/', $link->getUrl()->getUri());
$markup = '<a href="' . $uri . '">' . $link->getText() . '</a>';
$generated_link = new GeneratedLink();
return $generated_link->setGeneratedLink($markup);
});
$container->set('link_generator', $linkGenerator);
$container->set('path.validator', $this->createMock('Drupal\Core\Path\PathValidatorInterface'));
}
/**
* Test for correct json validation.
*
* @param string $input
* Input to simulate valid /invalid json.
* @param string $message
* A message to display successful outcome.
* @param bool $expected
* Expected result from function call.
*
* @cover ::validateJson()
* @dataProvider providerTestValidateJson()
*/
public function testValidateJson(string $input, string $message, bool $expected) {
$output = $this->dvfHelpers->validateJson($input);
$this->expectedEqualOutput($message, $expected, $output);
}
/**
* Provider for testValidateJson().
*/
public function providerTestValidateJson() {
return [[
'input' => '[{"2001": 30,"2002": 40,"2003": 50,"Fruits": "Apple"}]',
'message' => 'Provided json is valid',
'expected' => TRUE,
],
[
'input' => '[{{"2001": 30,"2002": 40,"2003": 50,"Fruits": "Apple"}]',
'message' => 'Provided json is valid',
'expected' => FALSE,
],
];
}
/**
* Tests correct transformation of text to machine name.
*
* @covers ::transformMachineName()
*/
public function testTransformMachineName() {
$message = 'Text transformed to machine name';
$input = 'Non Machine Name';
$expected = 'non_machine_name';
$output = $this->dvfHelpers->transformMachineName($input);
$this->expectedEqualOutput($message, $expected, $output);
}
/**
* Tests that "help page" links can be retrieved.
*
* @covers ::getHelpPageLink()
*/
public function testGetHelpPageLinks() {
$message = 'Help page page link rendered';
$template_names = [
'column-overrides',
'data-filters',
'grid-lines',
'keys',
'label-overrides',
'split',
'x-axis-grouping',
];
$base_path = '/dvf/help/';
foreach ($template_names as $template_name) {
$expected = '<span class="dvf-admin-popup"><a href="' . $base_path . $template_name . '">Help</a> ⧉</span>';
$result = $this->dvfHelpers->getHelpPageLink($template_name);
$output = $result->__toString();
$this->expectedEqualOutput($message, $expected, $output);
}
}
/**
* Tests that empty elements are removed from nested array.
*
* @covers ::filterArrayRecursive()
*/
public function testFilterArrayRecursive() {
$message = 'Empty elements removed from nested array';
$input = [
'to_keep' => '1',
'to_keep_nested' => ['2'],
'to_remove' => '',
'to_remove_nested' => [],
];
$expected = [
'to_keep' => '1',
'to_keep_nested' => ['2'],
];
$output = $this->dvfHelpers->filterArrayRecursive($input);
$this->expectedEqualOutput($message, $expected, $output);
}
/**
* Handy function to run equal assertion against two values.
*
* Compares two values and display both values if different.
*
* @param string $message
* The message to render.
* @param mixed $expected
* Expected value that can be compared with '===' operator.
* @param mixed $output
* Output value that can be compared with '===' operator.
*/
protected function expectedEqualOutput($message, $expected, $output) {
// Display output vs expected in case of failure.
if ($output !== $expected) {
print_r([
'output' => $output,
'expected' => $expected,
]);
}
$this->assertTrue(
$output === $expected,
$message
);
}
}
