PageRenderTime 51ms CodeModel.GetById 22ms RepoModel.GetById 1ms app.codeStats 0ms

/core/modules/views/tests/src/Kernel/Handler/FilterNumericTest.php

http://github.com/drupal/drupal
PHP | 516 lines | 412 code | 50 blank | 54 comment | 0 complexity | a7a21526d2a55e77740fca4b31ff718d MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.1
  1. <?php
  2. namespace Drupal\Tests\views\Kernel\Handler;
  3. use Drupal\Tests\views\Kernel\ViewsKernelTestBase;
  4. use Drupal\views\Views;
  5. /**
  6. * Tests the numeric filter handler.
  7. *
  8. * @group views
  9. */
  10. class FilterNumericTest extends ViewsKernelTestBase {
  11. public static $modules = ['system'];
  12. /**
  13. * Views used by this test.
  14. *
  15. * @var array
  16. */
  17. public static $testViews = ['test_view'];
  18. /**
  19. * Map column names.
  20. *
  21. * @var array
  22. */
  23. protected $columnMap = [
  24. 'views_test_data_name' => 'name',
  25. 'views_test_data_age' => 'age',
  26. ];
  27. public function viewsData() {
  28. $data = parent::viewsData();
  29. $data['views_test_data']['age']['filter']['allow empty'] = TRUE;
  30. $data['views_test_data']['id']['filter']['allow empty'] = FALSE;
  31. return $data;
  32. }
  33. public function testFilterNumericSimple() {
  34. $view = Views::getView('test_view');
  35. $view->setDisplay();
  36. // Change the filtering
  37. $view->displayHandlers->get('default')->overrideOption('filters', [
  38. 'age' => [
  39. 'id' => 'age',
  40. 'table' => 'views_test_data',
  41. 'field' => 'age',
  42. 'relationship' => 'none',
  43. 'operator' => '=',
  44. 'value' => ['value' => 28],
  45. ],
  46. ]);
  47. $this->executeView($view);
  48. $resultset = [
  49. [
  50. 'name' => 'Ringo',
  51. 'age' => 28,
  52. ],
  53. ];
  54. $this->assertIdenticalResultset($view, $resultset, $this->columnMap);
  55. }
  56. public function testFilterNumericExposedGroupedSimple() {
  57. $filters = $this->getGroupedExposedFilters();
  58. $view = Views::getView('test_view');
  59. $view->newDisplay('page', 'Page', 'page_1');
  60. // Filter: Age, Operator: =, Value: 28
  61. $filters['age']['group_info']['default_group'] = 1;
  62. $view->setDisplay('page_1');
  63. $view->displayHandlers->get('page_1')->overrideOption('filters', $filters);
  64. $view->save();
  65. $this->container->get('router.builder')->rebuild();
  66. $this->executeView($view);
  67. $resultset = [
  68. [
  69. 'name' => 'Ringo',
  70. 'age' => 28,
  71. ],
  72. ];
  73. $this->assertIdenticalResultset($view, $resultset, $this->columnMap);
  74. }
  75. /**
  76. * Tests the between operator.
  77. *
  78. * @param string $operator
  79. * The operator to test ('between' or 'not between').
  80. * @param string $min
  81. * The min value.
  82. * @param string $max
  83. * The max value.
  84. * @param array $expected_result
  85. * The expected results.
  86. *
  87. * @dataProvider providerTestFilterNumericBetween
  88. */
  89. public function testFilterNumericBetween($operator, $min, $max, array $expected_result) {
  90. $view = Views::getView('test_view');
  91. $view->setDisplay();
  92. $view->displayHandlers->get('default')->overrideOption('filters', [
  93. 'age' => [
  94. 'id' => 'age',
  95. 'table' => 'views_test_data',
  96. 'field' => 'age',
  97. 'relationship' => 'none',
  98. 'operator' => $operator,
  99. 'value' => [
  100. 'min' => $min,
  101. 'max' => $max,
  102. ],
  103. ],
  104. ]);
  105. $this->executeView($view);
  106. $this->assertIdenticalResultset($view, $expected_result, $this->columnMap);
  107. }
  108. /**
  109. * Provides data for self::testFilterNumericBetween().
  110. *
  111. * @return array
  112. * An array of arrays, each containing the parameters for
  113. * self::testFilterNumericBetween().
  114. */
  115. public function providerTestFilterNumericBetween() {
  116. $all_result = [
  117. ['name' => 'John', 'age' => 25],
  118. ['name' => 'George', 'age' => 27],
  119. ['name' => 'Ringo', 'age' => 28],
  120. ['name' => 'Paul', 'age' => 26],
  121. ['name' => 'Meredith', 'age' => 30],
  122. ];
  123. return [
  124. // Each test case is operator, min, max, expected result.
  125. 'Test between' => [
  126. 'between', 26, 29, [
  127. ['name' => 'George', 'age' => 27],
  128. ['name' => 'Ringo', 'age' => 28],
  129. ['name' => 'Paul', 'age' => 26],
  130. ],
  131. ],
  132. 'Test between with just min' => [
  133. 'between', 28, '', [
  134. ['name' => 'Ringo', 'age' => 28],
  135. ['name' => 'Meredith', 'age' => 30],
  136. ],
  137. ],
  138. 'Test between with just max' => [
  139. 'between', '', 26,
  140. [
  141. ['name' => 'John', 'age' => 25],
  142. ['name' => 'Paul', 'age' => 26],
  143. ],
  144. ],
  145. 'Test between with empty min and max' => [
  146. 'between', '', '', $all_result,
  147. ],
  148. 'Test not between' => [
  149. 'not between', 26, 29, [
  150. ['name' => 'John', 'age' => 25],
  151. ['name' => 'Meredith', 'age' => 30],
  152. ],
  153. ],
  154. 'Test not between with just min' => [
  155. 'not between', 28, '', [
  156. ['name' => 'John', 'age' => 25],
  157. ['name' => 'George', 'age' => 27],
  158. ['name' => 'Paul', 'age' => 26],
  159. ],
  160. ],
  161. 'Test not between with just max' => [
  162. 'not between', '', 26, [
  163. ['name' => 'George', 'age' => 27],
  164. ['name' => 'Ringo', 'age' => 28],
  165. ['name' => 'Meredith', 'age' => 30],
  166. ],
  167. ],
  168. 'Test not between with empty min and max' => [
  169. 'not between', '', '', $all_result,
  170. ],
  171. ];
  172. }
  173. public function testFilterNumericExposedGroupedBetween() {
  174. $filters = $this->getGroupedExposedFilters();
  175. $view = Views::getView('test_view');
  176. $view->newDisplay('page', 'Page', 'page_1');
  177. // Filter: Age, Operator: between, Value: 26 and 29
  178. $filters['age']['group_info']['default_group'] = 2;
  179. $view->setDisplay('page_1');
  180. $view->displayHandlers->get('page_1')->overrideOption('filters', $filters);
  181. $view->save();
  182. $this->container->get('router.builder')->rebuild();
  183. $this->executeView($view);
  184. $resultset = [
  185. [
  186. 'name' => 'George',
  187. 'age' => 27,
  188. ],
  189. [
  190. 'name' => 'Ringo',
  191. 'age' => 28,
  192. ],
  193. [
  194. 'name' => 'Paul',
  195. 'age' => 26,
  196. ],
  197. ];
  198. $this->assertIdenticalResultset($view, $resultset, $this->columnMap);
  199. }
  200. public function testFilterNumericExposedGroupedNotBetween() {
  201. $filters = $this->getGroupedExposedFilters();
  202. $view = Views::getView('test_view');
  203. $view->newDisplay('page', 'Page', 'page_1');
  204. // Filter: Age, Operator: between, Value: 26 and 29
  205. $filters['age']['group_info']['default_group'] = 3;
  206. $view->setDisplay('page_1');
  207. $view->displayHandlers->get('page_1')->overrideOption('filters', $filters);
  208. $view->save();
  209. $this->container->get('router.builder')->rebuild();
  210. $this->executeView($view);
  211. $resultset = [
  212. [
  213. 'name' => 'John',
  214. 'age' => 25,
  215. ],
  216. [
  217. 'name' => 'Meredith',
  218. 'age' => 30,
  219. ],
  220. ];
  221. $this->assertIdenticalResultset($view, $resultset, $this->columnMap);
  222. }
  223. /**
  224. * Tests the numeric filter handler with the 'regular_expression' operator.
  225. */
  226. public function testFilterNumericRegularExpression() {
  227. $view = Views::getView('test_view');
  228. $view->setDisplay();
  229. // Filtering by regular expression pattern.
  230. $view->displayHandlers->get('default')->overrideOption('filters', [
  231. 'age' => [
  232. 'id' => 'age',
  233. 'table' => 'views_test_data',
  234. 'field' => 'age',
  235. 'relationship' => 'none',
  236. 'operator' => 'regular_expression',
  237. 'value' => [
  238. 'value' => '2[8]',
  239. ],
  240. ],
  241. ]);
  242. $this->executeView($view);
  243. $resultset = [
  244. [
  245. 'name' => 'Ringo',
  246. 'age' => 28,
  247. ],
  248. ];
  249. $this->assertIdenticalResultset($view, $resultset, $this->columnMap);
  250. }
  251. /**
  252. * Tests the numeric filter handler with the 'regular_expression' operator
  253. * to grouped exposed filters.
  254. */
  255. public function testFilterNumericExposedGroupedRegularExpression() {
  256. $filters = $this->getGroupedExposedFilters();
  257. $view = Views::getView('test_view');
  258. $view->newDisplay('page', 'Page', 'page_1');
  259. // Filter: Age, Operator: regular_expression, Value: 2[7-8]
  260. $filters['age']['group_info']['default_group'] = 6;
  261. $view->setDisplay('page_1');
  262. $view->displayHandlers->get('page_1')->overrideOption('filters', $filters);
  263. $view->save();
  264. $this->executeView($view);
  265. $resultset = [
  266. [
  267. 'name' => 'George',
  268. 'age' => 27,
  269. ],
  270. [
  271. 'name' => 'Ringo',
  272. 'age' => 28,
  273. ],
  274. ];
  275. $this->assertIdenticalResultset($view, $resultset, $this->columnMap);
  276. }
  277. public function testFilterNumericEmpty() {
  278. $view = Views::getView('test_view');
  279. $view->setDisplay();
  280. // Change the filtering
  281. $view->displayHandlers->get('default')->overrideOption('filters', [
  282. 'age' => [
  283. 'id' => 'age',
  284. 'table' => 'views_test_data',
  285. 'field' => 'age',
  286. 'relationship' => 'none',
  287. 'operator' => 'empty',
  288. ],
  289. ]);
  290. $this->executeView($view);
  291. $resultset = [];
  292. $this->assertIdenticalResultset($view, $resultset, $this->columnMap);
  293. $view->destroy();
  294. $view->setDisplay();
  295. // Change the filtering
  296. $view->displayHandlers->get('default')->overrideOption('filters', [
  297. 'age' => [
  298. 'id' => 'age',
  299. 'table' => 'views_test_data',
  300. 'field' => 'age',
  301. 'relationship' => 'none',
  302. 'operator' => 'not empty',
  303. ],
  304. ]);
  305. $this->executeView($view);
  306. $resultset = [
  307. [
  308. 'name' => 'John',
  309. 'age' => 25,
  310. ],
  311. [
  312. 'name' => 'George',
  313. 'age' => 27,
  314. ],
  315. [
  316. 'name' => 'Ringo',
  317. 'age' => 28,
  318. ],
  319. [
  320. 'name' => 'Paul',
  321. 'age' => 26,
  322. ],
  323. [
  324. 'name' => 'Meredith',
  325. 'age' => 30,
  326. ],
  327. ];
  328. $this->assertIdenticalResultset($view, $resultset, $this->columnMap);
  329. }
  330. public function testFilterNumericExposedGroupedEmpty() {
  331. $filters = $this->getGroupedExposedFilters();
  332. $view = Views::getView('test_view');
  333. $view->newDisplay('page', 'Page', 'page_1');
  334. // Filter: Age, Operator: empty, Value:
  335. $filters['age']['group_info']['default_group'] = 4;
  336. $view->setDisplay('page_1');
  337. $view->displayHandlers->get('page_1')->overrideOption('filters', $filters);
  338. $view->save();
  339. $this->container->get('router.builder')->rebuild();
  340. $this->executeView($view);
  341. $resultset = [];
  342. $this->assertIdenticalResultset($view, $resultset, $this->columnMap);
  343. }
  344. public function testFilterNumericExposedGroupedNotEmpty() {
  345. $filters = $this->getGroupedExposedFilters();
  346. $view = Views::getView('test_view');
  347. $view->newDisplay('page', 'Page', 'page_1');
  348. // Filter: Age, Operator: empty, Value:
  349. $filters['age']['group_info']['default_group'] = 5;
  350. $view->setDisplay('page_1');
  351. $view->displayHandlers->get('page_1')->overrideOption('filters', $filters);
  352. $view->save();
  353. $this->container->get('router.builder')->rebuild();
  354. $this->executeView($view);
  355. $resultset = [
  356. [
  357. 'name' => 'John',
  358. 'age' => 25,
  359. ],
  360. [
  361. 'name' => 'George',
  362. 'age' => 27,
  363. ],
  364. [
  365. 'name' => 'Ringo',
  366. 'age' => 28,
  367. ],
  368. [
  369. 'name' => 'Paul',
  370. 'age' => 26,
  371. ],
  372. [
  373. 'name' => 'Meredith',
  374. 'age' => 30,
  375. ],
  376. ];
  377. $this->assertIdenticalResultset($view, $resultset, $this->columnMap);
  378. }
  379. public function testAllowEmpty() {
  380. $view = Views::getView('test_view');
  381. $view->setDisplay();
  382. $view->displayHandlers->get('default')->overrideOption('filters', [
  383. 'id' => [
  384. 'id' => 'id',
  385. 'table' => 'views_test_data',
  386. 'field' => 'id',
  387. 'relationship' => 'none',
  388. ],
  389. 'age' => [
  390. 'id' => 'age',
  391. 'table' => 'views_test_data',
  392. 'field' => 'age',
  393. 'relationship' => 'none',
  394. ],
  395. ]);
  396. $view->initHandlers();
  397. $id_operators = $view->filter['id']->operators();
  398. $age_operators = $view->filter['age']->operators();
  399. $this->assertFalse(isset($id_operators['empty']));
  400. $this->assertFalse(isset($id_operators['not empty']));
  401. $this->assertTrue(isset($age_operators['empty']));
  402. $this->assertTrue(isset($age_operators['not empty']));
  403. }
  404. protected function getGroupedExposedFilters() {
  405. $filters = [
  406. 'age' => [
  407. 'id' => 'age',
  408. 'plugin_id' => 'numeric',
  409. 'table' => 'views_test_data',
  410. 'field' => 'age',
  411. 'relationship' => 'none',
  412. 'exposed' => TRUE,
  413. 'expose' => [
  414. 'operator' => 'age_op',
  415. 'label' => 'age',
  416. 'identifier' => 'age',
  417. ],
  418. 'is_grouped' => TRUE,
  419. 'group_info' => [
  420. 'label' => 'age',
  421. 'identifier' => 'age',
  422. 'default_group' => 'All',
  423. 'group_items' => [
  424. 1 => [
  425. 'title' => 'Age is 28',
  426. 'operator' => '=',
  427. 'value' => ['value' => 28],
  428. ],
  429. 2 => [
  430. 'title' => 'Age is between 26 and 29',
  431. 'operator' => 'between',
  432. 'value' => [
  433. 'min' => 26,
  434. 'max' => 29,
  435. ],
  436. ],
  437. 3 => [
  438. 'title' => 'Age is not between 26 and 29',
  439. 'operator' => 'not between',
  440. 'value' => [
  441. 'min' => 26,
  442. 'max' => 29,
  443. ],
  444. ],
  445. 4 => [
  446. 'title' => 'Age is empty',
  447. 'operator' => 'empty',
  448. ],
  449. 5 => [
  450. 'title' => 'Age is not empty',
  451. 'operator' => 'not empty',
  452. ],
  453. 6 => [
  454. 'title' => 'Age is regexp 2[7-8]',
  455. 'operator' => 'regular_expression',
  456. 'value' => [
  457. 'value' => '2[7-8]',
  458. ],
  459. ],
  460. ],
  461. ],
  462. ],
  463. ];
  464. return $filters;
  465. }
  466. }