crossword-8.x-1.x-dev/tests/src/Kernel/CrosswordDataServiceTest.php
tests/src/Kernel/CrosswordDataServiceTest.php
<?php namespace Drupal\Tests\crossword\Kernel; use Drupal\KernelTests\KernelTestBase; /** * Covers CrosswordDataService. * * @group crossword */ class CrosswordDataServiceTest extends KernelTestBase { /** * The modules to load to run the test. * * @var array */ protected static $modules = ['system', 'crossword', 'file', 'user']; /** * {@inheritdoc} */ protected function setUp(): void { parent::setUp(); $this->installConfig(['file', 'user']); $this->installSchema('user', ['users_data']); $this->installSchema('file', ['file_usage']); $this->installEntitySchema('user'); $this->installEntitySchema('file'); } /** * Test data service against test puzzle. */ public function testCrosswordDataService() { $contents = file_get_contents(\Drupal::service('extension.list.module')->getPath('crossword') . "/tests/files/test.txt"); $file = \Drupal::service('file.repository')->writeData($contents, "public://test.txt"); $expected_json = file_get_contents(\Drupal::service('extension.list.module')->getPath('crossword') . "/tests/files/test.json"); $expected_data = json_decode($expected_json, TRUE); $expected_data['id'] = $file->id(); // Not cached at first. $cache_service = \Drupal::service('cache.crossword'); $this->assertFalse($cache_service->get($file->id())); // Test the big method. $crossword_data_service = \Drupal::service('crossword.data_service'); $data = $crossword_data_service->getData($file); $this->assertEquals($expected_data, $data); // Now it should be cached. $cached = $cache_service->get($file->id()); $this->assertNotEmpty($cached); $this->assertEquals($expected_data, $cached->data['data']); // Check all the other methods. $expected_solution = [['A', '', 'ONE'], ['B', 'C', 'D'], ['TWO', 'E', 'F']]; $solution = $crossword_data_service->getSolution($file); $this->assertEquals($expected_solution, $solution); $solution_dot = [['A', '.', 'ONE'], ['B', 'C', 'D'], ['TWO', 'E', 'F']]; $solution = $crossword_data_service->getSolution($file, '.'); $this->assertEquals($solution_dot, $solution); $title = $crossword_data_service->getTitle($file); $this->assertEquals('Test Puzzle', $title); $author = $crossword_data_service->getAuthor($file); $this->assertEquals('Test Author', $author); $dimensions = $crossword_data_service->getDimensions($file, ' by '); $this->assertEquals('3 by 3', $dimensions); $dimension_across = $crossword_data_service->getDimensionAcross($file); $this->assertEquals(3, $dimension_across); $dimension_down = $crossword_data_service->getDimensionDown($file); $this->assertEquals(3, $dimension_down); $is_rebus = $crossword_data_service->isRebus($file); $this->assertTrue($is_rebus); // Test get redacted data. $redacted_json = file_get_contents(\Drupal::service('extension.list.module')->getPath('crossword') . "/tests/files/redacted.json"); $redacted_data = json_decode($redacted_json, TRUE); $redacted_data['id'] = $file->id(); $data = $crossword_data_service->getData($file, TRUE); $this->assertEquals($redacted_data, $data); } /** * Test data service against xss attempts. * * We explicitly test that script tags and onclick get stripped. */ public function testCrosswordDataServiceXss() { $contents = file_get_contents(\Drupal::service('extension.list.module')->getPath('crossword') . "/tests/files/xss.txt"); $file = \Drupal::service('file.repository')->writeData($contents, "public://xss.txt"); $expected_json = file_get_contents(\Drupal::service('extension.list.module')->getPath('crossword') . "/tests/files/xss.json"); $expected_data = json_decode($expected_json, TRUE); $expected_data['id'] = $file->id(); $crossword_data_service = \Drupal::service('crossword.data_service'); $data = $crossword_data_service->getData($file); $this->assertEquals($expected_data, $data); } /** * Tests that json_encode works, which requires proper UTF-8 encoding. * * The file we parse is from issue 3102647 which spun off of 3102499. */ public function testJsonEncoding() { $contents = file_get_contents(\Drupal::service('extension.list.module')->getPath('crossword') . "/tests/files/3102647.puz"); $file = \Drupal::service('file.repository')->writeData($contents, "public://3102647.puz"); $crossword_data_service = \Drupal::service('crossword.data_service'); $data = $crossword_data_service->getData($file); $this->assertNotEmpty(json_encode($data)); } /** * Tests that a corrupted file is handled correctly, especially caching. */ public function testCorruptedFile() { $contents = file_get_contents(\Drupal::service('extension.list.module')->getPath('crossword') . "/tests/files/corrupted_bad_grid.puz"); $file = \Drupal::service('file.repository')->writeData($contents, "public://corrupted_bad_grid.puz"); $cache_service = \Drupal::service('cache.crossword'); $this->assertFalse($cache_service->get($file->id())); $crossword_data_service = \Drupal::service('crossword.data_service'); $data = $crossword_data_service->getData($file); $this->assertNull($data); $cached = $cache_service->get($file->id()); $this->assertNotEmpty($cached); $this->assertNull($cached->data['data']); $data = $crossword_data_service->getData($file); $this->assertNull($data); } }