Merge pull request #16591 from ixiam/dev/core#1575
[civicrm-core.git] / tests / phpunit / CRM / Member / BAO / QueryTest.php
CommitLineData
df60621b 1<?php
0eea664b 2
df60621b 3/**
4 * Include dataProvider for tests
acb109b7 5 * @group headless
df60621b 6 */
7class CRM_Member_BAO_QueryTest extends CiviUnitTestCase {
8
9 /**
10 * Set up function.
11 *
12 * Ensure CiviCase is enabled.
13 */
14 public function setUp() {
15 parent::setUp();
16 CRM_Core_BAO_ConfigSetting::enableComponent('CiviCase');
17 }
18
19 /**
20 * Check that membership type is handled.
21 *
22 * We want to see the following syntaxes for membership_type_id field handled:
23 * 1) membership_type_id => 1
24 */
25 public function testConvertEntityFieldSingleValue() {
9099cab3
CW
26 $formValues = ['membership_type_id' => 2];
27 $params = CRM_Contact_BAO_Query::convertFormValues($formValues, 0, FALSE, NULL, ['membership_type_id']);
28 $this->assertEquals(['membership_type_id', '=', 2, 0, 0], $params[0]);
df60621b 29 $obj = new CRM_Contact_BAO_Query($params);
9099cab3 30 $this->assertEquals(['civicrm_membership.membership_type_id = 2'], $obj->_where[0]);
df60621b 31 }
32
33 /**
34 * Check that membership type is handled.
35 *
36 * We want to see the following syntaxes for membership_type_id field handled:
37 * 2) membership_type_id => 5,6
38 *
39 * The last of these is the format used prior to converting membership_type_id to an entity reference field.
40 */
41 public function testConvertEntityFieldMultipleValueEntityRef() {
9099cab3
CW
42 $formValues = ['membership_type_id' => '1,2'];
43 $params = CRM_Contact_BAO_Query::convertFormValues($formValues, 0, FALSE, NULL, ['membership_type_id']);
44 $this->assertEquals(['membership_type_id', 'IN', [1, 2], 0, 0], $params[0]);
df60621b 45 $obj = new CRM_Contact_BAO_Query($params);
9099cab3 46 $this->assertEquals(['civicrm_membership.membership_type_id IN ("1", "2")'], $obj->_where[0]);
df60621b 47 }
48
49 /**
50 * Check that membership type is handled.
51 *
52 * We want to see the following syntaxes for membership_type_id field handled:
53 * 3) membership_type_id => array(5,6)
54 *
55 * The last of these is the format used prior to converting membership_type_id to an entity reference field. It will
56 * be used by pre-existing smart groups.
57 */
58 public function testConvertEntityFieldMultipleValueLegacy() {
9099cab3
CW
59 $formValues = ['membership_type_id' => [1, 2]];
60 $params = CRM_Contact_BAO_Query::convertFormValues($formValues, 0, FALSE, NULL, ['membership_type_id']);
61 $this->assertEquals(['membership_type_id', 'IN', [1, 2], 0, 0], $params[0]);
df60621b 62 $obj = new CRM_Contact_BAO_Query($params);
9099cab3 63 $this->assertEquals(['civicrm_membership.membership_type_id IN ("1", "2")'], $obj->_where[0]);
df60621b 64 }
65
66 /**
67 * Check that running convertFormValues more than one doesn't mangle the array.
68 *
69 * Unfortunately the convertFormValues & indeed much of the query code is run in pre-process AND post-process.
70 *
71 * The convertFormValues function should cope with this until such time as we can rationalise that.
72 */
73 public function testConvertEntityFieldMultipleValueEntityRefDoubleRun() {
9099cab3
CW
74 $formValues = ['membership_type_id' => '1,2'];
75 $params = CRM_Contact_BAO_Query::convertFormValues($formValues, 0, FALSE, NULL, ['membership_type_id']);
76 $this->assertEquals(['membership_type_id', 'IN', [1, 2], 0, 0], $params[0]);
77 $params = CRM_Contact_BAO_Query::convertFormValues($params, 0, FALSE, NULL, ['membership_type_id']);
78 $this->assertEquals(['membership_type_id', 'IN', [1, 2], 0, 0], $params[0]);
df60621b 79 $obj = new CRM_Contact_BAO_Query($params);
9099cab3 80 $this->assertEquals(['civicrm_membership.membership_type_id IN ("1", "2")'], $obj->_where[0]);
df60621b 81 }
82
c12606e5
SL
83 /**
84 * Membership Date fields
85 * @return array
86 */
87 public function membershipDateFields() {
88 $fields = [];
89 $fields[] = ['membership_join_date'];
90 $fields[] = ['membership_start_date'];
91 $fields[] = ['membership_end_date'];
92 return $fields;
93 }
94
95 /**
96 * Test generating a correct where clause for date fields as generated by search builder
97 * @dataProvider membershipDateFields
98 */
99 public function testMembershipDateWhereSearchBuilder($dateField) {
100 $dbDateField = str_replace('membership_', '', $dateField);
101 $formValues = [
102 'mapper' => [
103 1 => [['Membership', $dateField], [''], [''], [''], ['']],
104 2 => [[''], [''], [''], [''], ['']],
105 3 => [[''], [''], [''], [''], ['']],
106 ],
107 'operator' => [
108 1 => ['<=', '', '', '', ''],
109 2 => ['', '', '', '', ''],
110 3 => ['', '', '', '', ''],
111 ],
112 'value' => [
113 1 => ['20200201', '', '', '', ''],
114 2 => ['', '', '', '', '', ''],
115 3 => ['', '', '', '', '', ''],
116 ],
117 'radio_ts' => '',
118 ];
119 $searchBuilderForm = new CRM_Contact_Form_Search_Builder();
120 $params = [[$dateField, "<=", "20200201", 1, 0]];
121 $this->assertEquals($params, $searchBuilderForm->convertFormValues($formValues));
122 $obj = new CRM_Contact_BAO_Query($params);
123 $this->assertEquals(['civicrm_membership.' . $dbDateField . ' <= \'20200201000000\''], $obj->_where[1]);
124 }
125
df60621b 126}