Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.
Common duplication problems, and corresponding solutions are:
1 | <?php |
||
7 | class ElasticSearchPageControllerTest extends ElasticsearchFunctionalTestBase { |
||
8 | |||
9 | public static $fixture_file = 'elastica/tests/lotsOfPhotos.yml'; |
||
10 | |||
11 | |||
12 | public function setUp() { |
||
13 | parent::setUp(); |
||
14 | $esp = new ElasticSearchPage(); |
||
15 | $esp->Title = 'Search with aggregation'; |
||
16 | $esp->Content = 'Example search page with aggregation'; |
||
17 | $esp->Identifier = 'testwithagg'; |
||
18 | $esp->IndexingOff = true; |
||
19 | $esp->URLSegment = 'search'; |
||
20 | $esp->SiteTreeOnly = false; |
||
21 | $esp->ClassesToSearch = 'FlickrPhotoTO'; |
||
22 | $esp->SearchHelper = 'FlickrPhotoTOElasticaSearchHelper'; |
||
23 | $esp->write(); |
||
24 | |||
25 | $esp2 = new ElasticSearchPage(); |
||
26 | $esp2->Title = 'Search without aggregation'; |
||
27 | $esp2->Content = 'Example search page'; |
||
28 | $esp2->Identifier = 'testwithoutagg'; |
||
29 | $esp2->IndexingOff = true; |
||
30 | $esp2->URLSegment = 'search'; |
||
31 | $esp2->SiteTreeOnly = false; |
||
32 | $esp2->ClassesToSearch = 'FlickrPhotoTO'; |
||
33 | $esp2->ContentForEmptySearch = 'Content for empty search'; |
||
34 | $esp2->write(); |
||
35 | |||
36 | #NOTE: how to edit extra extra fields programatically |
||
37 | $extraFields = array('Searchable' => 1, 'SimilarSearchable' => 1, 'Active' => 1, |
||
38 | 'Weight' => 1); |
||
39 | $esfs2 = $esp2->ElasticaSearchableFields(); |
||
40 | foreach($esfs2 as $sf) { |
||
41 | if($sf->Name == 'Title' || $sf->Name == 'Description') { |
||
42 | $esfs2->remove($sf); |
||
43 | $esfs2->add($sf, $extraFields); |
||
44 | } |
||
45 | } |
||
46 | $esp2->write(); |
||
47 | |||
48 | $esfs = $esp->ElasticaSearchableFields(); |
||
49 | |||
50 | foreach($esfs as $sf) { |
||
51 | if($sf->Name == 'Title' || $sf->Name == 'Description') { |
||
52 | $esfs->remove($sf); |
||
53 | $esfs->add($sf, $extraFields); |
||
54 | } |
||
55 | } |
||
56 | $esp->write(); |
||
57 | $esp->publish('Stage', 'Live'); |
||
58 | $esp2->publish('Stage', 'Live'); |
||
59 | $this->ElasticSearchPage = $esp; |
||
60 | $this->ElasticSearchPage2 = $esp2; |
||
61 | } |
||
62 | |||
63 | |||
64 | public function testAggregationNoneSelected() { |
||
65 | //SearchHelper |
||
66 | |||
67 | $this->autoFollowRedirection = false; |
||
68 | |||
69 | //Note pages need to be published, by default fixtures only reside in Stage |
||
70 | $searchPageObj = $this->ElasticSearchPage; |
||
71 | |||
72 | $url = $searchPageObj->Link(); |
||
73 | $searchPage = $this->get($searchPageObj->URLSegment); |
||
74 | $this->assertEquals(200, $searchPage->getStatusCode()); |
||
75 | $url = rtrim($url, '/'); |
||
76 | |||
77 | $response = $this->get($url); |
||
78 | |||
79 | $this->assertEquals(200, $response->getStatusCode()); |
||
80 | |||
81 | $this->assertSelectorStartsWithOrEquals('ul.iso span.count', 0, '(5)'); |
||
82 | $this->assertSelectorStartsWithOrEquals('ul.iso span.count', 1, '(11)'); |
||
83 | $this->assertSelectorStartsWithOrEquals('ul.iso span.count', 2, '(12)'); |
||
84 | $this->assertSelectorStartsWithOrEquals('ul.iso span.count', 3, '(13)'); |
||
85 | $this->assertSelectorStartsWithOrEquals('ul.iso span.count', 4, '(16)'); |
||
86 | $this->assertSelectorStartsWithOrEquals('ul.iso span.count', 5, '(13)'); |
||
87 | $this->assertSelectorStartsWithOrEquals('ul.iso span.count', 6, '(11)'); |
||
88 | $this->assertSelectorStartsWithOrEquals('ul.iso span.count', 7, '(19)'); |
||
89 | $this->assertSelectorStartsWithOrEquals('ul.focal_length span.count', 0, '(12)'); |
||
90 | $this->assertSelectorStartsWithOrEquals('ul.focal_length span.count', 1, '(11)'); |
||
91 | $this->assertSelectorStartsWithOrEquals('ul.focal_length span.count', 2, '(11)'); |
||
92 | $this->assertSelectorStartsWithOrEquals('ul.focal_length span.count', 3, '(20)'); |
||
93 | $this->assertSelectorStartsWithOrEquals('ul.focal_length span.count', 4, '(12)'); |
||
94 | $this->assertSelectorStartsWithOrEquals('ul.focal_length span.count', 5, '(17)'); |
||
95 | $this->assertSelectorStartsWithOrEquals('ul.focal_length span.count', 6, '(17)'); |
||
96 | $this->assertSelectorStartsWithOrEquals('ul.shutter_speed span.count', 0, '(17)'); |
||
97 | $this->assertSelectorStartsWithOrEquals('ul.shutter_speed span.count', 1, '(15)'); |
||
98 | $this->assertSelectorStartsWithOrEquals('ul.shutter_speed span.count', 2, '(17)'); |
||
99 | $this->assertSelectorStartsWithOrEquals('ul.shutter_speed span.count', 3, '(10)'); |
||
100 | $this->assertSelectorStartsWithOrEquals('ul.shutter_speed span.count', 4, '(18)'); |
||
101 | $this->assertSelectorStartsWithOrEquals('ul.shutter_speed span.count', 5, '(1)'); |
||
102 | $this->assertSelectorStartsWithOrEquals('ul.shutter_speed span.count', 6, '(10)'); |
||
103 | $this->assertSelectorStartsWithOrEquals('ul.shutter_speed span.count', 7, '(12)'); |
||
104 | $this->assertSelectorStartsWithOrEquals('ul.aperture span.count', 0, '(21)'); |
||
105 | $this->assertSelectorStartsWithOrEquals('ul.aperture span.count', 1, '(23)'); |
||
106 | $this->assertSelectorStartsWithOrEquals('ul.aperture span.count', 2, '(17)'); |
||
107 | $this->assertSelectorStartsWithOrEquals('ul.aperture span.count', 3, '(16)'); |
||
108 | $this->assertSelectorStartsWithOrEquals('ul.aperture span.count', 4, '(23)'); |
||
109 | $this->assertSelectorStartsWithOrEquals('ul.aspect span.count', 0, '(9)'); |
||
110 | $this->assertSelectorStartsWithOrEquals('ul.aspect span.count', 1, '(31)'); |
||
111 | $this->assertSelectorStartsWithOrEquals('ul.aspect span.count', 2, '(16)'); |
||
112 | $this->assertSelectorStartsWithOrEquals('ul.aspect span.count', 3, '(39)'); |
||
113 | $this->assertSelectorStartsWithOrEquals('ul.aspect span.count', 4, '(5)'); |
||
114 | } |
||
115 | |||
116 | |||
117 | public function testAggregationOneSelected() { |
||
118 | //SearchHelper |
||
119 | |||
120 | $this->autoFollowRedirection = false; |
||
121 | |||
122 | //Note pages need to be published, by default fixtures only reside in Stage |
||
123 | $searchPageObj = $this->ElasticSearchPage; |
||
124 | |||
125 | $url = $searchPageObj->Link(); |
||
126 | $searchPage = $this->get($searchPageObj->URLSegment); |
||
127 | $this->assertEquals(200, $searchPage->getStatusCode()); |
||
128 | $url = rtrim($url, '/'); |
||
129 | $url .= '?ISO=400'; |
||
130 | |||
131 | $response = $this->get($url); |
||
132 | |||
133 | $this->assertEquals(200, $response->getStatusCode()); |
||
134 | |||
135 | // These are less than in the no facets selected case, as expected |
||
136 | $this->assertSelectorStartsWithOrEquals('ul.focal_length span.count', 0, '(2)'); |
||
137 | $this->assertSelectorStartsWithOrEquals('ul.focal_length span.count', 1, '(1)'); |
||
138 | $this->assertSelectorStartsWithOrEquals('ul.focal_length span.count', 2, '(2)'); |
||
139 | $this->assertSelectorStartsWithOrEquals('ul.focal_length span.count', 3, '(1)'); |
||
140 | $this->assertSelectorStartsWithOrEquals('ul.focal_length span.count', 4, '(3)'); |
||
141 | $this->assertSelectorStartsWithOrEquals('ul.focal_length span.count', 5, '(1)'); |
||
142 | $this->assertSelectorStartsWithOrEquals('ul.focal_length span.count', 6, '(3)'); |
||
143 | $this->assertSelectorStartsWithOrEquals('ul.shutter_speed span.count', 0, '(3)'); |
||
144 | $this->assertSelectorStartsWithOrEquals('ul.shutter_speed span.count', 1, '(2)'); |
||
145 | $this->assertSelectorStartsWithOrEquals('ul.shutter_speed span.count', 2, '(2)'); |
||
146 | $this->assertSelectorStartsWithOrEquals('ul.shutter_speed span.count', 3, '(1)'); |
||
147 | $this->assertSelectorStartsWithOrEquals('ul.shutter_speed span.count', 4, '(2)'); |
||
148 | $this->assertSelectorStartsWithOrEquals('ul.shutter_speed span.count', 5, '(3)'); |
||
149 | $this->assertSelectorStartsWithOrEquals('ul.aperture span.count', 0, '(3)'); |
||
150 | $this->assertSelectorStartsWithOrEquals('ul.aperture span.count', 1, '(4)'); |
||
151 | $this->assertSelectorStartsWithOrEquals('ul.aperture span.count', 2, '(3)'); |
||
152 | $this->assertSelectorStartsWithOrEquals('ul.aperture span.count', 3, '(1)'); |
||
153 | $this->assertSelectorStartsWithOrEquals('ul.aperture span.count', 4, '(2)'); |
||
154 | $this->assertSelectorStartsWithOrEquals('ul.aspect span.count', 0, '(0)'); |
||
155 | $this->assertSelectorStartsWithOrEquals('ul.aspect span.count', 1, '(4)'); |
||
156 | $this->assertSelectorStartsWithOrEquals('ul.aspect span.count', 2, '(1)'); |
||
157 | $this->assertSelectorStartsWithOrEquals('ul.aspect span.count', 3, '(7)'); |
||
158 | $this->assertSelectorStartsWithOrEquals('ul.aspect span.count', 4, '(1)'); |
||
159 | |||
160 | |||
161 | } |
||
162 | |||
163 | |||
164 | |||
165 | public function testAggregationTwoSelected() { |
||
166 | //SearchHelper |
||
167 | |||
168 | $this->autoFollowRedirection = false; |
||
169 | |||
170 | //Note pages need to be published, by default fixtures only reside in Stage |
||
171 | $searchPageObj = $this->ElasticSearchPage; |
||
172 | |||
173 | $url = $searchPageObj->Link(); |
||
174 | $searchPage = $this->get($searchPageObj->URLSegment); |
||
175 | $this->assertEquals(200, $searchPage->getStatusCode()); |
||
176 | $url = rtrim($url, '/'); |
||
177 | $url .= '?ISO=400&ShutterSpeed=2%2F250'; |
||
178 | |||
179 | $response = $this->get($url); |
||
180 | $this->assertEquals(200, $response->getStatusCode()); |
||
181 | |||
182 | // These are less than in the one facet selected case, as expected |
||
183 | $this->assertSelectorStartsWithOrEquals('ul.focal_length span.count', 0, '(1)'); |
||
184 | $this->assertSelectorStartsWithOrEquals('ul.focal_length span.count', 1, '(2)'); |
||
185 | $this->assertSelectorStartsWithOrEquals('ul.aperture span.count', 0, '(1)'); |
||
186 | $this->assertSelectorStartsWithOrEquals('ul.aperture span.count', 1, '(1)'); |
||
187 | $this->assertSelectorStartsWithOrEquals('ul.aperture span.count', 2, '(1)'); |
||
188 | $this->assertSelectorStartsWithOrEquals('ul.aspect span.count', 0, '(0)'); |
||
189 | $this->assertSelectorStartsWithOrEquals('ul.aspect span.count', 1, '(1)'); |
||
190 | $this->assertSelectorStartsWithOrEquals('ul.aspect span.count', 2, '(0)'); |
||
191 | $this->assertSelectorStartsWithOrEquals('ul.aspect span.count', 3, '(2)'); |
||
192 | $this->assertSelectorStartsWithOrEquals('ul.aspect span.count', 4, '(0)'); |
||
193 | } |
||
194 | |||
195 | |||
196 | public function testAggregationThreeSelected() { |
||
218 | |||
219 | |||
220 | public function testQueryIsEmpty() { |
||
242 | |||
243 | View Code Duplication | public function testQueryInSearchBoxForOneFormOnly() { |
|
244 | $searchPageObj = $this->ElasticSearchPage2; |
||
245 | $url = rtrim($searchPageObj->Link(), '/'); |
||
246 | $url .= "?q=Auckland&sfid=" . $searchPageObj->Identifier; |
||
252 | |||
253 | |||
254 | /* |
||
255 | Check the search form attributes for autocomplete info |
||
256 | */ |
||
257 | public function testSearchFormAutocompleteEnabled() { |
||
287 | |||
288 | |||
289 | public function testTemplateOverrideExtension() { |
||
316 | |||
317 | |||
318 | View Code Duplication | public function testSimilarNotSearchable() { |
|
328 | |||
329 | |||
330 | View Code Duplication | public function testSimilarNull() { |
|
340 | |||
341 | |||
342 | View Code Duplication | public function testSimilarClassDoesNotExist() { |
|
351 | |||
352 | |||
353 | View Code Duplication | public function testSimilarSearchServerDown() { |
|
361 | |||
362 | |||
363 | View Code Duplication | public function testNormalSearchServerDown() { |
|
371 | |||
372 | |||
373 | public function testSimilarValid() { |
||
389 | |||
390 | |||
391 | /* |
||
392 | Search for New Zealind and get search results for New Zealand. Show option to click on |
||
393 | actual search of New Zealind |
||
394 | */ |
||
395 | public function testSuggestion() { |
||
437 | /* |
||
438 | <p class="showingResultsForMsg">Showing results for <a href="./?q=New Zealand">New <strong class="hl">Zealand</strong></a></p> |
||
439 | <p class="searchOriginalQueryMsg">Search instead for <a href="/search-2?q=New Zealind&is=1">New Zealind</a></p> |
||
440 | |||
441 | |||
442 | */ |
||
443 | |||
444 | |||
445 | View Code Duplication | public function testSearchOnePageNoAggregation() { |
|
481 | |||
482 | |||
483 | /* When a search is posted, should redirect to the same URL with the search term attached. This |
||
484 | means that searches can be bookmarked if so required */ |
||
485 | public function testRedirection() { |
||
502 | |||
503 | |||
504 | /* |
||
505 | Add test for redirection of /search/?q=XXX to /search?q=XXX |
||
506 | */ |
||
507 | |||
508 | |||
509 | /* |
||
510 | Test a search for an uncommon term, no pagination here |
||
511 | */ |
||
512 | View Code Duplication | public function testSearchOnePage() { |
|
545 | |||
546 | |||
547 | |||
548 | /* |
||
549 | Test a search for a common term, in order to induce pagination |
||
550 | */ |
||
551 | public function testSiteTreeSearch() { |
||
586 | |||
587 | |||
588 | |||
589 | /* |
||
590 | Test a search for a common term, in order to induce pagination |
||
591 | */ |
||
592 | public function testSearchSeveralPagesPage() { |
||
654 | |||
655 | |||
656 | private function enableHighlights() { |
||
670 | } |
||
671 |
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.
This is most likely a typographical error or the method has been renamed.