Completed
Push — apply-code-style ( 1a43bf...37cc85 )
by
unknown
45:48
created

SearchServiceLocationTest::createMovieContent()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 72

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
nc 1
nop 0
dl 0
loc 72
rs 8.6109
c 0
b 0
f 0

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
/**
4
 * File containing the SearchServiceLocationTest class.
5
 *
6
 * @copyright Copyright (C) eZ Systems AS. All rights reserved.
7
 * @license For full copyright and license information view LICENSE file distributed with this source code.
8
 */
9
namespace eZ\Publish\API\Repository\Tests;
10
11
use eZ\Publish\API\Repository\Tests\SetupFactory\LegacyElasticsearch;
12
use eZ\Publish\Core\Repository\Values\Content\Location;
13
use eZ\Publish\API\Repository\Values\Content\LocationQuery;
14
use eZ\Publish\API\Repository\Values\Content\Query\Criterion;
15
use eZ\Publish\API\Repository\Values\Content\Query\SortClause;
16
use eZ\Publish\API\Repository\Values\Content\Search\SearchResult;
17
use eZ\Publish\API\Repository\Values\Content\Search\SearchHit;
18
use eZ\Publish\API\Repository\Exceptions\NotImplementedException;
19
20
/**
21
 * Test case for Location operations in the SearchService.
22
 *
23
 * @see eZ\Publish\API\Repository\SearchService
24
 * @group integration
25
 * @group search
26
 */
27
class SearchServiceLocationTest extends BaseTest
28
{
29
    const QUERY_CLASS = LocationQuery::class;
30
31
    use Common\FacetedSearchProvider;
32
33
    protected function setUp()
34
    {
35
        $setupFactory = $this->getSetupFactory();
36
        if ($setupFactory instanceof LegacyElasticsearch) {
37
            $this->markTestSkipped('Field Location search is not yet implemented Elasticsearch search engine');
38
        }
39
40
        parent::setUp();
41
    }
42
43
    /**
44
     * Test for the findLocation() method.
45
     *
46
     * @dataProvider getFacetedSearches
47
     *
48
     * @see \eZ\Publish\API\Repository\SearchService::findLoctions()
49
     */
50
    public function testFindFacetedLocation(LocationQuery $query, $fixture)
51
    {
52
        $this->assertQueryFixture($query, $fixture);
53
    }
54
55
    /**
56
     * Create movie Content with subtitle field set to null.
57
     *
58
     * @return \eZ\Publish\API\Repository\Values\Content\Content[]
59
     */
60
    protected function createMovieContent(): array
61
    {
62
        $movies = [];
63
64
        $repository = $this->getRepository();
65
        $contentTypeService = $repository->getContentTypeService();
66
        $contentService = $repository->getContentService();
67
68
        $createStruct = $contentTypeService->newContentTypeCreateStruct('movie');
69
        $createStruct->mainLanguageCode = 'eng-GB';
70
        $createStruct->remoteId = 'movie-123';
71
        $createStruct->names = ['eng-GB' => 'Movie'];
72
        $createStruct->creatorId = 14;
73
        $createStruct->creationDate = new \DateTime();
74
75
        $fieldTitle = $contentTypeService->newFieldDefinitionCreateStruct('title', 'ezstring');
76
        $fieldTitle->names = ['eng-GB' => 'Title'];
77
        $fieldTitle->fieldGroup = 'main';
78
        $fieldTitle->position = 1;
79
        $fieldTitle->isTranslatable = false;
80
        $fieldTitle->isSearchable = true;
81
        $fieldTitle->isRequired = true;
82
        $createStruct->addFieldDefinition($fieldTitle);
83
84
        $fieldSubtitle = $contentTypeService->newFieldDefinitionCreateStruct('subtitle', 'ezstring');
85
        $fieldSubtitle->names = ['eng-GB' => 'Subtitle'];
86
        $fieldSubtitle->fieldGroup = 'main';
87
        $fieldSubtitle->position = 2;
88
        $fieldSubtitle->isTranslatable = false;
89
        $fieldSubtitle->isSearchable = true;
90
        $fieldSubtitle->isRequired = false;
91
        $createStruct->addFieldDefinition($fieldSubtitle);
92
93
        $contentTypeGroup = $contentTypeService->loadContentTypeGroupByIdentifier('Content');
94
        $contentTypeDraft = $contentTypeService->createContentType($createStruct, [$contentTypeGroup]);
95
        $contentTypeService->publishContentTypeDraft($contentTypeDraft);
96
        $contentType = $contentTypeService->loadContentType($contentTypeDraft->id);
97
98
        $createStructRambo = $contentService->newContentCreateStruct($contentType, 'eng-GB');
99
        $createStructRambo->remoteId = 'movie-456';
100
        $createStructRambo->alwaysAvailable = false;
101
        $createStructRambo->setField('title', 'Rambo');
102
        $locationCreateStruct = $repository->getLocationService()->newLocationCreateStruct(2);
103
104
        $ramboDraft = $contentService->createContent($createStructRambo, [$locationCreateStruct]);
105
        $movies[] = $contentService->publishVersion($ramboDraft->getVersionInfo());
106
        $this->refreshSearch($repository);
107
108
        $createStructRobocop = $contentService->newContentCreateStruct($contentType, 'eng-GB');
109
        $createStructRobocop->remoteId = 'movie-789';
110
        $createStructRobocop->alwaysAvailable = false;
111
        $createStructRobocop->setField('title', 'Robocop');
112
        $createStructRobocop->setField('subtitle', '');
113
        $locationCreateStruct = $repository->getLocationService()->newLocationCreateStruct(2);
114
115
        $robocopDraft = $contentService->createContent($createStructRobocop, [$locationCreateStruct]);
116
        $movies[] = $contentService->publishVersion($robocopDraft->getVersionInfo());
117
        $this->refreshSearch($repository);
118
119
        $createStructLastHope = $contentService->newContentCreateStruct($contentType, 'eng-GB');
120
        $createStructLastHope->remoteId = 'movie-101112';
121
        $createStructLastHope->alwaysAvailable = false;
122
        $createStructLastHope->setField('title', 'Star Wars');
123
        $createStructLastHope->setField('subtitle', 'Last Hope');
124
        $locationCreateStruct = $repository->getLocationService()->newLocationCreateStruct(2);
125
126
        $lastHopeDraft = $contentService->createContent($createStructLastHope, [$locationCreateStruct]);
127
        $movies[] = $contentService->publishVersion($lastHopeDraft->getVersionInfo());
128
        $this->refreshSearch($repository);
129
130
        return $movies;
131
    }
132
133
    /**
134
     * Create test Content with ezcountry field having multiple countries selected.
135
     *
136
     * @return \eZ\Publish\API\Repository\Values\Content\Content
137
     */
138
    protected function createMultipleCountriesContent()
139
    {
140
        $repository = $this->getRepository();
141
        $contentTypeService = $repository->getContentTypeService();
142
        $contentService = $repository->getContentService();
143
144
        $createStruct = $contentTypeService->newContentTypeCreateStruct('countries-multiple');
145
        $createStruct->mainLanguageCode = 'eng-GB';
146
        $createStruct->remoteId = 'countries-multiple-123';
147
        $createStruct->names = ['eng-GB' => 'Multiple countries'];
148
        $createStruct->creatorId = 14;
149
        $createStruct->creationDate = new \DateTime();
150
151
        $fieldCreate = $contentTypeService->newFieldDefinitionCreateStruct('countries', 'ezcountry');
152
        $fieldCreate->names = ['eng-GB' => 'Countries'];
153
        $fieldCreate->fieldGroup = 'main';
154
        $fieldCreate->position = 1;
155
        $fieldCreate->isTranslatable = false;
156
        $fieldCreate->isSearchable = true;
157
        $fieldCreate->fieldSettings = ['isMultiple' => true];
158
159
        $createStruct->addFieldDefinition($fieldCreate);
160
161
        $contentGroup = $contentTypeService->loadContentTypeGroupByIdentifier('Content');
162
        $contentTypeDraft = $contentTypeService->createContentType($createStruct, [$contentGroup]);
163
        $contentTypeService->publishContentTypeDraft($contentTypeDraft);
164
        $contentType = $contentTypeService->loadContentType($contentTypeDraft->id);
165
166
        $createStruct = $contentService->newContentCreateStruct($contentType, 'eng-GB');
167
        $createStruct->remoteId = 'countries-multiple-456';
168
        $createStruct->alwaysAvailable = false;
169
        $createStruct->setField(
170
            'countries',
171
            ['BE', 'DE', 'FR', 'HR', 'NO', 'PT', 'RU']
172
        );
173
174
        $locationCreateStruct = $repository->getLocationService()->newLocationCreateStruct(2);
175
        $draft = $contentService->createContent($createStruct, [$locationCreateStruct]);
176
        $content = $contentService->publishVersion($draft->getVersionInfo());
177
178
        $this->refreshSearch($repository);
179
180
        return $content;
181
    }
182
183
    /**
184
     * Test for the findLocations() method.
185
     *
186
     * @see \eZ\Publish\API\Repository\SearchService::findLocations()
187
     */
188 View Code Duplication
    public function testFieldIsEmptyInLocation()
189
    {
190
        $testContents = $this->createMovieContent();
191
192
        $query = new LocationQuery(
193
            [
194
                'query' => new Criterion\IsFieldEmpty('subtitle'),
195
            ]
196
        );
197
198
        $repository = $this->getRepository();
199
        $searchService = $repository->getSearchService();
200
        $result = $searchService->findLocations($query);
201
202
        $this->assertEquals(2, $result->totalCount);
203
204
        $this->assertEquals(
205
            $testContents[0]->contentInfo->mainLocationId,
206
            $result->searchHits[0]->valueObject->id
0 ignored issues
show
Documentation introduced by
The property id does not exist on object<eZ\Publish\API\Re...ory\Values\ValueObject>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
207
        );
208
209
        $this->assertEquals(
210
            $testContents[1]->contentInfo->mainLocationId,
211
            $result->searchHits[1]->valueObject->id
0 ignored issues
show
Documentation introduced by
The property id does not exist on object<eZ\Publish\API\Re...ory\Values\ValueObject>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
212
        );
213
    }
214
215
    /**
216
     * Test for the findLocations() method.
217
     *
218
     * @see \eZ\Publish\API\Repository\SearchService::findLocations()
219
     */
220 View Code Duplication
    public function testFieldIsNotEmptyInLocation()
221
    {
222
        $testContents = $this->createMovieContent();
223
224
        $query = new LocationQuery(
225
            [
226
                'query' => new Criterion\IsFieldEmpty(
227
                    'subtitle',
228
                    false
229
                ),
230
            ]
231
        );
232
233
        $repository = $this->getRepository();
234
        $searchService = $repository->getSearchService();
235
        $result = $searchService->findLocations($query);
236
237
        $this->assertEquals(1, $result->totalCount);
238
239
        $this->assertEquals(
240
            $testContents[2]->contentInfo->mainLocationId,
241
            $result->searchHits[0]->valueObject->id
0 ignored issues
show
Documentation introduced by
The property id does not exist on object<eZ\Publish\API\Re...ory\Values\ValueObject>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
242
        );
243
    }
244
245
    /**
246
     * Test for the findLocations() method.
247
     *
248
     * @see \eZ\Publish\API\Repository\SearchService::findLocations()
249
     */
250 View Code Duplication
    public function testFieldCollectionContains()
251
    {
252
        $testContent = $this->createMultipleCountriesContent();
253
254
        $query = new LocationQuery(
255
            [
256
                'query' => new Criterion\Field(
257
                    'countries',
258
                    Criterion\Operator::CONTAINS,
259
                    'Belgium'
260
                ),
261
            ]
262
        );
263
264
        $repository = $this->getRepository();
265
        $searchService = $repository->getSearchService();
266
        $result = $searchService->findLocations($query);
267
268
        $this->assertEquals(1, $result->totalCount);
269
        $this->assertEquals(
270
            $testContent->contentInfo->mainLocationId,
271
            $result->searchHits[0]->valueObject->id
0 ignored issues
show
Documentation introduced by
The property id does not exist on object<eZ\Publish\API\Re...ory\Values\ValueObject>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
272
        );
273
    }
274
275
    /**
276
     * Test for the findLocations() method.
277
     *
278
     * @see \eZ\Publish\API\Repository\SearchService::findLocations()
279
     * @depends eZ\Publish\API\Repository\Tests\SearchServiceTest::testFieldCollectionContains
280
     */
281 View Code Duplication
    public function testFieldCollectionContainsNoMatch()
282
    {
283
        $this->createMultipleCountriesContent();
284
        $query = new LocationQuery(
285
            [
286
                'query' => new Criterion\Field(
287
                    'countries',
288
                    Criterion\Operator::CONTAINS,
289
                    'Netherlands Antilles'
290
                ),
291
            ]
292
        );
293
294
        $repository = $this->getRepository();
295
        $searchService = $repository->getSearchService();
296
        $result = $searchService->findLocations($query);
297
298
        $this->assertEquals(0, $result->totalCount);
299
    }
300
301
    /**
302
     * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException
303
     */
304 View Code Duplication
    public function testInvalidFieldIdentifierRange()
305
    {
306
        $repository = $this->getRepository();
307
        $searchService = $repository->getSearchService();
308
309
        $searchService->findLocations(
310
            new LocationQuery(
311
                [
312
                    'filter' => new Criterion\Field(
313
                        'some_hopefully_unknown_field',
314
                        Criterion\Operator::BETWEEN,
315
                        [10, 1000]
316
                    ),
317
                    'sortClauses' => [new SortClause\ContentId()],
318
                ]
319
            )
320
        );
321
    }
322
323
    /**
324
     * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException
325
     */
326
    public function testInvalidFieldIdentifierIn()
327
    {
328
        $repository = $this->getRepository();
329
        $searchService = $repository->getSearchService();
330
331
        $searchService->findLocations(
332
            new LocationQuery(
333
                [
334
                    'filter' => new Criterion\Field(
335
                        'some_hopefully_unknown_field',
336
                        Criterion\Operator::EQ,
337
                        1000
338
                    ),
339
                    'sortClauses' => [new SortClause\ContentId()],
340
                ]
341
            )
342
        );
343
    }
344
345
    /**
346
     * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException
347
     */
348
    public function testFindLocationsWithNonSearchableField()
349
    {
350
        $repository = $this->getRepository();
351
        $searchService = $repository->getSearchService();
352
353
        $searchService->findLocations(
354
            new LocationQuery(
355
                [
356
                    'filter' => new Criterion\Field(
357
                        'tag_cloud_url',
358
                        Criterion\Operator::EQ,
359
                        'http://nimbus.com'
360
                    ),
361
                    'sortClauses' => [new SortClause\ContentId()],
362
                ]
363
            )
364
        );
365
    }
366
367
    /**
368
     * @param \eZ\Publish\API\Repository\Values\Content\Search\SearchResult $result
369
     *
370
     * @return array
371
     */
372
    protected function mapResultLocationIds(SearchResult $result)
373
    {
374
        return array_map(
375
            function (SearchHit $searchHit) {
376
                return $searchHit->valueObject->id;
0 ignored issues
show
Documentation introduced by
The property id does not exist on object<eZ\Publish\API\Re...ory\Values\ValueObject>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
377
            },
378
            $result->searchHits
379
        );
380
    }
381
382
    /**
383
     * Test for the findLocations() method.
384
     *
385
     * @see \eZ\Publish\API\Repository\SearchService::findLocations()
386
     */
387 View Code Duplication
    public function testQueryCustomField()
388
    {
389
        $query = new LocationQuery(
390
            [
391
                'query' => new Criterion\CustomField(
392
                    'custom_field',
393
                    Criterion\Operator::EQ,
394
                    'AdMiNiStRaToR'
395
                ),
396
                'offset' => 0,
397
                'limit' => 10,
398
                'sortClauses' => [new SortClause\ContentId()],
399
            ]
400
        );
401
        $this->assertQueryFixture(
402
            $query,
403
            $this->getFixtureDir() . '/QueryCustomField.php',
404
            null,
405
            true
406
        );
407
    }
408
409
    /**
410
     * Test for the findLocations() method.
411
     *
412
     * This tests explicitly queries the first_name while user is contained in
413
     * the last_name of admin and anonymous. This is done to show the custom
414
     * copy field working.
415
     *
416
     * @see \eZ\Publish\API\Repository\SearchService::findLocations()
417
     */
418 View Code Duplication
    public function testQueryModifiedField()
419
    {
420
        // Check using get_class since the others extend SetupFactory\Legacy
421
        if (ltrim(get_class($this->getSetupFactory()), '\\') === 'eZ\Publish\API\Repository\Tests\SetupFactory\Legacy') {
422
            $this->markTestIncomplete(
423
                'Custom fields not supported by LegacySE ' .
424
                '(@todo: Legacy should fallback to just querying normal field so this should be tested here)'
425
            );
426
        }
427
428
        $query = new LocationQuery(
429
            [
430
                'query' => new Criterion\Field(
431
                    'first_name',
432
                    Criterion\Operator::EQ,
433
                    'User'
434
                ),
435
                'offset' => 0,
436
                'limit' => 10,
437
                'sortClauses' => [new SortClause\ContentId()],
438
            ]
439
        );
440
        $query->query->setCustomField('user', 'first_name', 'custom_field');
0 ignored issues
show
Bug introduced by
It seems like you code against a specific sub-type and not the parent class eZ\Publish\API\Repositor...Content\Query\Criterion as the method setCustomField() does only exist in the following sub-classes of eZ\Publish\API\Repositor...Content\Query\Criterion: eZ\Publish\API\Repositor...t\Query\Criterion\Field, eZ\Publish\API\Repositor...uery\Criterion\FullText, eZ\Publish\API\Repositor...ion\MapLocationDistance. Maybe you want to instanceof check for one of these explicitly?

Let’s take a look at an example:

abstract class User
{
    /** @return string */
    abstract public function getPassword();
}

class MyUser extends User
{
    public function getPassword()
    {
        // return something
    }

    public function getDisplayName()
    {
        // return some name.
    }
}

class AuthSystem
{
    public function authenticate(User $user)
    {
        $this->logger->info(sprintf('Authenticating %s.', $user->getDisplayName()));
        // do something.
    }
}

In the above example, the authenticate() method works fine as long as you just pass instances of MyUser. However, if you now also want to pass a different sub-classes of User which does not have a getDisplayName() method, the code will break.

Available Fixes

  1. Change the type-hint for the parameter:

    class AuthSystem
    {
        public function authenticate(MyUser $user) { /* ... */ }
    }
    
  2. Add an additional type-check:

    class AuthSystem
    {
        public function authenticate(User $user)
        {
            if ($user instanceof MyUser) {
                $this->logger->info(/** ... */);
            }
    
            // or alternatively
            if ( ! $user instanceof MyUser) {
                throw new \LogicException(
                    '$user must be an instance of MyUser, '
                   .'other instances are not supported.'
                );
            }
    
        }
    }
    
Note: PHP Analyzer uses reverse abstract interpretation to narrow down the types inside the if block in such a case.
  1. Add the method to the parent class:

    abstract class User
    {
        /** @return string */
        abstract public function getPassword();
    
        /** @return string */
        abstract public function getDisplayName();
    }
    
Loading history...
441
442
        $this->assertQueryFixture(
443
            $query,
444
            $this->getFixtureDir() . '/QueryModifiedField.php',
445
            null,
446
            true
447
        );
448
    }
449
450
    /**
451
     * @return \eZ\Publish\API\Repository\Values\ContentType\ContentType
452
     */
453 View Code Duplication
    protected function createTestPlaceContentType()
454
    {
455
        $repository = $this->getRepository();
456
        $contentTypeService = $repository->getContentTypeService();
457
458
        $createStruct = $contentTypeService->newContentTypeCreateStruct('testtype');
459
        $createStruct->mainLanguageCode = 'eng-GB';
460
        $createStruct->names = ['eng-GB' => 'Test type'];
461
        $createStruct->creatorId = 14;
462
        $createStruct->creationDate = new \DateTime();
463
464
        $translatableFieldCreate = $contentTypeService->newFieldDefinitionCreateStruct('maplocation', 'ezgmaplocation');
465
        $translatableFieldCreate->names = ['eng-GB' => 'Map location field'];
466
        $translatableFieldCreate->fieldGroup = 'main';
467
        $translatableFieldCreate->position = 1;
468
        $translatableFieldCreate->isTranslatable = false;
469
        $translatableFieldCreate->isSearchable = true;
470
471
        $createStruct->addFieldDefinition($translatableFieldCreate);
472
473
        $contentGroup = $contentTypeService->loadContentTypeGroupByIdentifier('Content');
474
        $contentTypeDraft = $contentTypeService->createContentType($createStruct, [$contentGroup]);
475
        $contentTypeService->publishContentTypeDraft($contentTypeDraft);
476
        $contentType = $contentTypeService->loadContentType($contentTypeDraft->id);
477
478
        return $contentType;
479
    }
480
481
    /**
482
     * Test for the findLocations() method.
483
     *
484
     * @see \eZ\Publish\API\Repository\SearchService::findLocations()
485
     * @group maplocation
486
     */
487 View Code Duplication
    public function testMapLocationDistanceLessThanOrEqual()
488
    {
489
        $contentType = $this->createTestPlaceContentType();
490
491
        // Create a draft to account for behaviour with ContentType in different states
492
        $repository = $this->getRepository();
493
        $contentTypeService = $repository->getContentTypeService();
494
        $contentService = $repository->getContentService();
495
        $contentTypeService->createContentTypeDraft($contentType);
496
        $locationCreateStruct = $repository->getLocationService()->newLocationCreateStruct(2);
497
498
        $createStruct = $contentService->newContentCreateStruct($contentType, 'eng-GB');
499
        $createStruct->alwaysAvailable = false;
500
        $createStruct->mainLanguageCode = 'eng-GB';
501
        $createStruct->setField(
502
            'maplocation',
503
            [
504
                'latitude' => 45.894877,
505
                'longitude' => 15.972699,
506
                'address' => 'Here be wild boars',
507
            ],
508
            'eng-GB'
509
        );
510
511
        $draft = $contentService->createContent($createStruct, [$locationCreateStruct]);
512
        $wildBoars = $contentService->publishVersion($draft->getVersionInfo());
513
514
        $createStruct = $contentService->newContentCreateStruct($contentType, 'eng-GB');
515
        $createStruct->alwaysAvailable = false;
516
        $createStruct->mainLanguageCode = 'eng-GB';
517
        $createStruct->setField(
518
            'maplocation',
519
            [
520
                'latitude' => 45.927334,
521
                'longitude' => 15.934847,
522
                'address' => 'A lone tree',
523
            ],
524
            'eng-GB'
525
        );
526
527
        $draft = $contentService->createContent($createStruct, [$locationCreateStruct]);
528
        $tree = $contentService->publishVersion($draft->getVersionInfo());
0 ignored issues
show
Unused Code introduced by
$tree is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
529
530
        $this->refreshSearch($repository);
531
532
        $query = new LocationQuery(
533
            [
534
                'filter' => new Criterion\LogicalAnd(
535
                    [
536
                        new Criterion\ContentTypeId($contentType->id),
537
                        new Criterion\MapLocationDistance(
538
                            'maplocation',
539
                            Criterion\Operator::LTE,
540
                            240,
541
                            43.756825,
542
                            15.775074
543
                        ),
544
                    ]
545
                ),
546
                'offset' => 0,
547
                'limit' => 10,
548
                'sortClauses' => [],
549
            ]
550
        );
551
552
        $searchService = $repository->getSearchService();
553
        $result = $searchService->findLocations($query);
554
555
        $this->assertEquals(1, $result->totalCount);
556
        $this->assertEquals(
557
            $wildBoars->contentInfo->mainLocationId,
558
            $result->searchHits[0]->valueObject->id
0 ignored issues
show
Documentation introduced by
The property id does not exist on object<eZ\Publish\API\Re...ory\Values\ValueObject>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
559
        );
560
    }
561
562
    /**
563
     * Test for the findLocations() method.
564
     *
565
     * @see \eZ\Publish\API\Repository\SearchService::findLocations()
566
     * @group maplocation
567
     */
568 View Code Duplication
    public function testMapLocationDistanceGreaterThanOrEqual()
569
    {
570
        $contentType = $this->createTestPlaceContentType();
571
572
        // Create a draft to account for behaviour with ContentType in different states
573
        $repository = $this->getRepository();
574
        $contentTypeService = $repository->getContentTypeService();
575
        $contentService = $repository->getContentService();
576
        $contentTypeService->createContentTypeDraft($contentType);
577
        $locationCreateStruct = $repository->getLocationService()->newLocationCreateStruct(2);
578
579
        $createStruct = $contentService->newContentCreateStruct($contentType, 'eng-GB');
580
        $createStruct->alwaysAvailable = false;
581
        $createStruct->mainLanguageCode = 'eng-GB';
582
        $createStruct->setField(
583
            'maplocation',
584
            [
585
                'latitude' => 45.894877,
586
                'longitude' => 15.972699,
587
                'address' => 'Here be wild boars',
588
            ],
589
            'eng-GB'
590
        );
591
592
        $draft = $contentService->createContent($createStruct, [$locationCreateStruct]);
593
        $wildBoars = $contentService->publishVersion($draft->getVersionInfo());
0 ignored issues
show
Unused Code introduced by
$wildBoars is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
594
595
        $createStruct = $contentService->newContentCreateStruct($contentType, 'eng-GB');
596
        $createStruct->alwaysAvailable = false;
597
        $createStruct->mainLanguageCode = 'eng-GB';
598
        $createStruct->setField(
599
            'maplocation',
600
            [
601
                'latitude' => 45.927334,
602
                'longitude' => 15.934847,
603
                'address' => 'A lone tree',
604
            ],
605
            'eng-GB'
606
        );
607
608
        $draft = $contentService->createContent($createStruct, [$locationCreateStruct]);
609
        $tree = $contentService->publishVersion($draft->getVersionInfo());
610
611
        $this->refreshSearch($repository);
612
613
        $query = new LocationQuery(
614
            [
615
                'filter' => new Criterion\LogicalAnd(
616
                    [
617
                        new Criterion\ContentTypeId($contentType->id),
618
                        new Criterion\MapLocationDistance(
619
                            'maplocation',
620
                            Criterion\Operator::GTE,
621
                            240,
622
                            43.756825,
623
                            15.775074
624
                        ),
625
                    ]
626
                ),
627
                'offset' => 0,
628
                'limit' => 10,
629
                'sortClauses' => [],
630
            ]
631
        );
632
633
        $searchService = $repository->getSearchService();
634
        $result = $searchService->findLocations($query);
635
636
        $this->assertEquals(1, $result->totalCount);
637
        $this->assertEquals(
638
            $tree->contentInfo->mainLocationId,
639
            $result->searchHits[0]->valueObject->id
0 ignored issues
show
Documentation introduced by
The property id does not exist on object<eZ\Publish\API\Re...ory\Values\ValueObject>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
640
        );
641
    }
642
643
    /**
644
     * Test for the findLocations() method.
645
     *
646
     * @see \eZ\Publish\API\Repository\SearchService::findLocations()
647
     * @group maplocation
648
     */
649
    public function testMapLocationDistanceBetween()
650
    {
651
        $contentType = $this->createTestPlaceContentType();
652
653
        // Create a draft to account for behaviour with ContentType in different states
654
        $repository = $this->getRepository();
655
        $contentTypeService = $repository->getContentTypeService();
656
        $contentService = $repository->getContentService();
657
        $contentTypeService->createContentTypeDraft($contentType);
658
        $locationCreateStruct = $repository->getLocationService()->newLocationCreateStruct(2);
659
660
        $createStruct = $contentService->newContentCreateStruct($contentType, 'eng-GB');
661
        $createStruct->alwaysAvailable = false;
662
        $createStruct->mainLanguageCode = 'eng-GB';
663
        $createStruct->setField(
664
            'maplocation',
665
            [
666
                'latitude' => 45.894877,
667
                'longitude' => 15.972699,
668
                'address' => 'Here be wild boars',
669
            ],
670
            'eng-GB'
671
        );
672
673
        $draft = $contentService->createContent($createStruct, [$locationCreateStruct]);
674
        $wildBoars = $contentService->publishVersion($draft->getVersionInfo());
0 ignored issues
show
Unused Code introduced by
$wildBoars is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
675
676
        $createStruct = $contentService->newContentCreateStruct($contentType, 'eng-GB');
677
        $createStruct->alwaysAvailable = false;
678
        $createStruct->mainLanguageCode = 'eng-GB';
679
        $createStruct->setField(
680
            'maplocation',
681
            [
682
                'latitude' => 45.927334,
683
                'longitude' => 15.934847,
684
                'address' => 'A lone tree',
685
            ],
686
            'eng-GB'
687
        );
688
689
        $draft = $contentService->createContent($createStruct, [$locationCreateStruct]);
690
        $tree = $contentService->publishVersion($draft->getVersionInfo());
0 ignored issues
show
Unused Code introduced by
$tree is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
691
692
        $createStruct = $contentService->newContentCreateStruct($contentType, 'eng-GB');
693
        $createStruct->alwaysAvailable = false;
694
        $createStruct->mainLanguageCode = 'eng-GB';
695
        $createStruct->setField(
696
            'maplocation',
697
            [
698
                'latitude' => 45.903777,
699
                'longitude' => 15.958788,
700
                'address' => 'Meadow with mushrooms',
701
            ],
702
            'eng-GB'
703
        );
704
705
        $draft = $contentService->createContent($createStruct, [$locationCreateStruct]);
706
        $mushrooms = $contentService->publishVersion($draft->getVersionInfo());
707
708
        $this->refreshSearch($repository);
709
710
        $query = new LocationQuery(
711
            [
712
                'filter' => new Criterion\LogicalAnd(
713
                    [
714
                        new Criterion\ContentTypeId($contentType->id),
715
                        new Criterion\MapLocationDistance(
716
                            'maplocation',
717
                            Criterion\Operator::BETWEEN,
718
                            [239, 241],
719
                            43.756825,
720
                            15.775074
721
                        ),
722
                    ]
723
                ),
724
                'offset' => 0,
725
                'limit' => 10,
726
                'sortClauses' => [],
727
            ]
728
        );
729
730
        $searchService = $repository->getSearchService();
731
        $result = $searchService->findLocations($query);
732
733
        $this->assertEquals(1, $result->totalCount);
734
        $this->assertEquals(
735
            $mushrooms->contentInfo->mainLocationId,
736
            $result->searchHits[0]->valueObject->id
0 ignored issues
show
Documentation introduced by
The property id does not exist on object<eZ\Publish\API\Re...ory\Values\ValueObject>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
737
        );
738
    }
739
740
    /**
741
     * Test for the findLocations() method.
742
     *
743
     * @see \eZ\Publish\API\Repository\SearchService::findLocations()
744
     * @group maplocation
745
     */
746 View Code Duplication
    public function testMapLocationDistanceSortAscending()
747
    {
748
        $contentType = $this->createTestPlaceContentType();
749
750
        // Create a draft to account for behaviour with ContentType in different states
751
        $repository = $this->getRepository();
752
        $contentTypeService = $repository->getContentTypeService();
753
        $contentService = $repository->getContentService();
754
        $contentTypeService->createContentTypeDraft($contentType);
755
        $locationCreateStruct = $repository->getLocationService()->newLocationCreateStruct(2);
756
757
        $createStruct = $contentService->newContentCreateStruct($contentType, 'eng-GB');
758
        $createStruct->alwaysAvailable = false;
759
        $createStruct->mainLanguageCode = 'eng-GB';
760
        $createStruct->setField(
761
            'maplocation',
762
            [
763
                'latitude' => 45.894877,
764
                'longitude' => 15.972699,
765
                'address' => 'Here be wild boars',
766
            ],
767
            'eng-GB'
768
        );
769
770
        $draft = $contentService->createContent($createStruct, [$locationCreateStruct]);
771
        $wildBoars = $contentService->publishVersion($draft->getVersionInfo());
772
773
        $createStruct = $contentService->newContentCreateStruct($contentType, 'eng-GB');
774
        $createStruct->alwaysAvailable = false;
775
        $createStruct->mainLanguageCode = 'eng-GB';
776
        $createStruct->setField(
777
            'maplocation',
778
            [
779
                'latitude' => 45.927334,
780
                'longitude' => 15.934847,
781
                'address' => 'A lone tree',
782
            ],
783
            'eng-GB'
784
        );
785
786
        $draft = $contentService->createContent($createStruct, [$locationCreateStruct]);
787
        $tree = $contentService->publishVersion($draft->getVersionInfo());
788
789
        $createStruct = $contentService->newContentCreateStruct($contentType, 'eng-GB');
790
        $createStruct->alwaysAvailable = false;
791
        $createStruct->mainLanguageCode = 'eng-GB';
792
        $createStruct->setField(
793
            'maplocation',
794
            [
795
                'latitude' => 45.903777,
796
                'longitude' => 15.958788,
797
                'address' => 'Meadow with mushrooms',
798
            ],
799
            'eng-GB'
800
        );
801
802
        $draft = $contentService->createContent($createStruct, [$locationCreateStruct]);
803
        $mushrooms = $contentService->publishVersion($draft->getVersionInfo());
804
805
        $this->refreshSearch($repository);
806
807
        $wellInVodice = [
808
            'latitude' => 43.756825,
809
            'longitude' => 15.775074,
810
        ];
811
812
        $query = new LocationQuery(
813
            [
814
                'filter' => new Criterion\LogicalAnd(
815
                    [
816
                        new Criterion\ContentTypeId($contentType->id),
817
                        new Criterion\MapLocationDistance(
818
                            'maplocation',
819
                            Criterion\Operator::GTE,
820
                            235,
821
                            $wellInVodice['latitude'],
822
                            $wellInVodice['longitude']
823
                        ),
824
                    ]
825
                ),
826
                'offset' => 0,
827
                'limit' => 10,
828
                'sortClauses' => [
829
                    new SortClause\MapLocationDistance(
830
                        'testtype',
831
                        'maplocation',
832
                        $wellInVodice['latitude'],
833
                        $wellInVodice['longitude'],
834
                        LocationQuery::SORT_ASC
835
                    ),
836
                ],
837
            ]
838
        );
839
840
        $searchService = $repository->getSearchService();
841
        $result = $searchService->findLocations($query);
842
843
        $this->assertEquals(3, $result->totalCount);
844
        $this->assertEquals(
845
            $wildBoars->contentInfo->mainLocationId,
846
            $result->searchHits[0]->valueObject->id
0 ignored issues
show
Documentation introduced by
The property id does not exist on object<eZ\Publish\API\Re...ory\Values\ValueObject>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
847
        );
848
        $this->assertEquals(
849
            $mushrooms->contentInfo->mainLocationId,
850
            $result->searchHits[1]->valueObject->id
0 ignored issues
show
Documentation introduced by
The property id does not exist on object<eZ\Publish\API\Re...ory\Values\ValueObject>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
851
        );
852
        $this->assertEquals(
853
            $tree->contentInfo->mainLocationId,
854
            $result->searchHits[2]->valueObject->id
0 ignored issues
show
Documentation introduced by
The property id does not exist on object<eZ\Publish\API\Re...ory\Values\ValueObject>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
855
        );
856
    }
857
858
    /**
859
     * Test for the findLocations() method.
860
     *
861
     * @see \eZ\Publish\API\Repository\SearchService::findLocations()
862
     * @group maplocation
863
     */
864 View Code Duplication
    public function testMapLocationDistanceSortDescending()
865
    {
866
        $contentType = $this->createTestPlaceContentType();
867
868
        // Create a draft to account for behaviour with ContentType in different states
869
        $repository = $this->getRepository();
870
        $contentTypeService = $repository->getContentTypeService();
871
        $contentService = $repository->getContentService();
872
        $contentTypeService->createContentTypeDraft($contentType);
873
        $locationCreateStruct = $repository->getLocationService()->newLocationCreateStruct(2);
874
875
        $createStruct = $contentService->newContentCreateStruct($contentType, 'eng-GB');
876
        $createStruct->alwaysAvailable = false;
877
        $createStruct->mainLanguageCode = 'eng-GB';
878
        $createStruct->setField(
879
            'maplocation',
880
            [
881
                'latitude' => 45.894877,
882
                'longitude' => 15.972699,
883
                'address' => 'Here be wild boars',
884
            ],
885
            'eng-GB'
886
        );
887
888
        $draft = $contentService->createContent($createStruct, [$locationCreateStruct]);
889
        $wildBoars = $contentService->publishVersion($draft->getVersionInfo());
890
891
        $createStruct = $contentService->newContentCreateStruct($contentType, 'eng-GB');
892
        $createStruct->alwaysAvailable = false;
893
        $createStruct->mainLanguageCode = 'eng-GB';
894
        $createStruct->setField(
895
            'maplocation',
896
            [
897
                'latitude' => 45.927334,
898
                'longitude' => 15.934847,
899
                'address' => 'A lone tree',
900
            ],
901
            'eng-GB'
902
        );
903
904
        $draft = $contentService->createContent($createStruct, [$locationCreateStruct]);
905
        $tree = $contentService->publishVersion($draft->getVersionInfo());
906
907
        $createStruct = $contentService->newContentCreateStruct($contentType, 'eng-GB');
908
        $createStruct->alwaysAvailable = false;
909
        $createStruct->mainLanguageCode = 'eng-GB';
910
        $createStruct->setField(
911
            'maplocation',
912
            [
913
                'latitude' => 45.903777,
914
                'longitude' => 15.958788,
915
                'address' => 'Meadow with mushrooms',
916
            ],
917
            'eng-GB'
918
        );
919
920
        $draft = $contentService->createContent($createStruct, [$locationCreateStruct]);
921
        $mushrooms = $contentService->publishVersion($draft->getVersionInfo());
922
923
        $this->refreshSearch($repository);
924
925
        $well = [
926
            'latitude' => 43.756825,
927
            'longitude' => 15.775074,
928
        ];
929
930
        $query = new LocationQuery(
931
            [
932
                'filter' => new Criterion\LogicalAnd(
933
                    [
934
                        new Criterion\ContentTypeId($contentType->id),
935
                        new Criterion\MapLocationDistance(
936
                            'maplocation',
937
                            Criterion\Operator::GTE,
938
                            235,
939
                            $well['latitude'],
940
                            $well['longitude']
941
                        ),
942
                    ]
943
                ),
944
                'offset' => 0,
945
                'limit' => 10,
946
                'sortClauses' => [
947
                    new SortClause\MapLocationDistance(
948
                        'testtype',
949
                        'maplocation',
950
                        $well['latitude'],
951
                        $well['longitude'],
952
                        LocationQuery::SORT_DESC
953
                    ),
954
                ],
955
            ]
956
        );
957
958
        $searchService = $repository->getSearchService();
959
        $result = $searchService->findLocations($query);
960
961
        $this->assertEquals(3, $result->totalCount);
962
        $this->assertEquals(
963
            $wildBoars->contentInfo->mainLocationId,
964
            $result->searchHits[2]->valueObject->id
0 ignored issues
show
Documentation introduced by
The property id does not exist on object<eZ\Publish\API\Re...ory\Values\ValueObject>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
965
        );
966
        $this->assertEquals(
967
            $mushrooms->contentInfo->mainLocationId,
968
            $result->searchHits[1]->valueObject->id
0 ignored issues
show
Documentation introduced by
The property id does not exist on object<eZ\Publish\API\Re...ory\Values\ValueObject>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
969
        );
970
        $this->assertEquals(
971
            $tree->contentInfo->mainLocationId,
972
            $result->searchHits[0]->valueObject->id
0 ignored issues
show
Documentation introduced by
The property id does not exist on object<eZ\Publish\API\Re...ory\Values\ValueObject>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
973
        );
974
    }
975
976
    /**
977
     * Test for the findLocations() method.
978
     *
979
     * @see \eZ\Publish\API\Repository\SearchService::findLocations()
980
     * @group maplocation
981
     */
982
    public function testMapLocationDistanceWithCustomField()
983
    {
984
        $contentType = $this->createTestPlaceContentType();
985
986
        // Create a draft to account for behaviour with ContentType in different states
987
        $repository = $this->getRepository();
988
        $contentTypeService = $repository->getContentTypeService();
989
        $contentService = $repository->getContentService();
990
        $contentTypeService->createContentTypeDraft($contentType);
991
        $locationCreateStruct = $repository->getLocationService()->newLocationCreateStruct(2);
992
993
        $createStruct = $contentService->newContentCreateStruct($contentType, 'eng-GB');
994
        $createStruct->alwaysAvailable = false;
995
        $createStruct->mainLanguageCode = 'eng-GB';
996
        $createStruct->setField(
997
            'maplocation',
998
            [
999
                'latitude' => 45.894877,
1000
                'longitude' => 15.972699,
1001
                'address' => 'Here be wild boars',
1002
            ],
1003
            'eng-GB'
1004
        );
1005
1006
        $draft = $contentService->createContent($createStruct, [$locationCreateStruct]);
1007
        $wildBoars = $contentService->publishVersion($draft->getVersionInfo());
1008
1009
        $createStruct = $contentService->newContentCreateStruct($contentType, 'eng-GB');
1010
        $createStruct->alwaysAvailable = false;
1011
        $createStruct->mainLanguageCode = 'eng-GB';
1012
        $createStruct->setField(
1013
            'maplocation',
1014
            [
1015
                'latitude' => 45.927334,
1016
                'longitude' => 15.934847,
1017
                'address' => 'A lone tree',
1018
            ],
1019
            'eng-GB'
1020
        );
1021
1022
        $draft = $contentService->createContent($createStruct, [$locationCreateStruct]);
1023
        $tree = $contentService->publishVersion($draft->getVersionInfo());
0 ignored issues
show
Unused Code introduced by
$tree is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
1024
1025
        $this->refreshSearch($repository);
1026
1027
        $distanceCriterion = new Criterion\MapLocationDistance(
1028
            'maplocation',
1029
            Criterion\Operator::LTE,
1030
            240,
1031
            43.756825,
1032
            15.775074
1033
        );
1034
        $distanceCriterion->setCustomField('testtype', 'maplocation', 'custom_geolocation_field');
1035
1036
        $query = new LocationQuery(
1037
            [
1038
                'filter' => new Criterion\LogicalAnd(
1039
                    [
1040
                        new Criterion\ContentTypeId($contentType->id),
1041
                        $distanceCriterion,
1042
                    ]
1043
                ),
1044
                'offset' => 0,
1045
                'limit' => 10,
1046
                'sortClauses' => [],
1047
            ]
1048
        );
1049
1050
        $searchService = $repository->getSearchService();
1051
        $result = $searchService->findLocations($query);
1052
1053
        $this->assertEquals(1, $result->totalCount);
1054
        $this->assertEquals(
1055
            $wildBoars->contentInfo->mainLocationId,
1056
            $result->searchHits[0]->valueObject->id
0 ignored issues
show
Documentation introduced by
The property id does not exist on object<eZ\Publish\API\Re...ory\Values\ValueObject>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
1057
        );
1058
    }
1059
1060
    /**
1061
     * Test for the findLocations() method.
1062
     *
1063
     * @see \eZ\Publish\API\Repository\SearchService::findLocations()
1064
     * @group maplocation
1065
     */
1066
    public function testMapLocationDistanceWithCustomFieldSort()
1067
    {
1068
        $contentType = $this->createTestPlaceContentType();
1069
1070
        // Create a draft to account for behaviour with ContentType in different states
1071
        $repository = $this->getRepository();
1072
        $contentTypeService = $repository->getContentTypeService();
1073
        $contentService = $repository->getContentService();
1074
        $contentTypeService->createContentTypeDraft($contentType);
1075
        $locationCreateStruct = $repository->getLocationService()->newLocationCreateStruct(2);
1076
1077
        $createStruct = $contentService->newContentCreateStruct($contentType, 'eng-GB');
1078
        $createStruct->alwaysAvailable = false;
1079
        $createStruct->mainLanguageCode = 'eng-GB';
1080
        $createStruct->setField(
1081
            'maplocation',
1082
            [
1083
                'latitude' => 45.894877,
1084
                'longitude' => 15.972699,
1085
                'address' => 'Here be wild boars',
1086
            ],
1087
            'eng-GB'
1088
        );
1089
1090
        $draft = $contentService->createContent($createStruct, [$locationCreateStruct]);
1091
        $wildBoars = $contentService->publishVersion($draft->getVersionInfo());
1092
1093
        $createStruct = $contentService->newContentCreateStruct($contentType, 'eng-GB');
1094
        $createStruct->alwaysAvailable = false;
1095
        $createStruct->mainLanguageCode = 'eng-GB';
1096
        $createStruct->setField(
1097
            'maplocation',
1098
            [
1099
                'latitude' => 45.927334,
1100
                'longitude' => 15.934847,
1101
                'address' => 'A lone tree',
1102
            ],
1103
            'eng-GB'
1104
        );
1105
1106
        $draft = $contentService->createContent($createStruct, [$locationCreateStruct]);
1107
        $tree = $contentService->publishVersion($draft->getVersionInfo());
1108
1109
        $createStruct = $contentService->newContentCreateStruct($contentType, 'eng-GB');
1110
        $createStruct->alwaysAvailable = false;
1111
        $createStruct->mainLanguageCode = 'eng-GB';
1112
        $createStruct->setField(
1113
            'maplocation',
1114
            [
1115
                'latitude' => 45.903777,
1116
                'longitude' => 15.958788,
1117
                'address' => 'Meadow with mushrooms',
1118
            ],
1119
            'eng-GB'
1120
        );
1121
1122
        $draft = $contentService->createContent($createStruct, [$locationCreateStruct]);
1123
        $mushrooms = $contentService->publishVersion($draft->getVersionInfo());
1124
1125
        $this->refreshSearch($repository);
1126
1127
        $well = [
1128
            'latitude' => 43.756825,
1129
            'longitude' => 15.775074,
1130
        ];
1131
1132
        $sortClause = new SortClause\MapLocationDistance(
1133
            'testtype',
1134
            'maplocation',
1135
            $well['latitude'],
1136
            $well['longitude'],
1137
            LocationQuery::SORT_DESC
1138
        );
1139
        $sortClause->setCustomField('testtype', 'maplocation', 'custom_geolocation_field');
1140
1141
        $query = new LocationQuery(
1142
            [
1143
                'filter' => new Criterion\LogicalAnd(
1144
                    [
1145
                        new Criterion\ContentTypeId($contentType->id),
1146
                        new Criterion\MapLocationDistance(
1147
                            'maplocation',
1148
                            Criterion\Operator::GTE,
1149
                            235,
1150
                            $well['latitude'],
1151
                            $well['longitude']
1152
                        ),
1153
                    ]
1154
                ),
1155
                'offset' => 0,
1156
                'limit' => 10,
1157
                'sortClauses' => [
1158
                    $sortClause,
1159
                ],
1160
            ]
1161
        );
1162
1163
        $searchService = $repository->getSearchService();
1164
        $result = $searchService->findLocations($query);
1165
1166
        $this->assertEquals(3, $result->totalCount);
1167
        $this->assertEquals(
1168
            $wildBoars->contentInfo->mainLocationId,
1169
            $result->searchHits[2]->valueObject->id
0 ignored issues
show
Documentation introduced by
The property id does not exist on object<eZ\Publish\API\Re...ory\Values\ValueObject>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
1170
        );
1171
        $this->assertEquals(
1172
            $mushrooms->contentInfo->mainLocationId,
1173
            $result->searchHits[1]->valueObject->id
0 ignored issues
show
Documentation introduced by
The property id does not exist on object<eZ\Publish\API\Re...ory\Values\ValueObject>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
1174
        );
1175
        $this->assertEquals(
1176
            $tree->contentInfo->mainLocationId,
1177
            $result->searchHits[0]->valueObject->id
0 ignored issues
show
Documentation introduced by
The property id does not exist on object<eZ\Publish\API\Re...ory\Values\ValueObject>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
1178
        );
1179
    }
1180
1181
    /**
1182
     * Test for the findLocations() method.
1183
     *
1184
     * @see \eZ\Publish\API\Repository\SearchService::findLocations()
1185
     */
1186
    public function testVisibilityCriterionWithHiddenContent()
1187
    {
1188
        $repository = $this->getRepository();
1189
        $contentTypeService = $repository->getContentTypeService();
1190
        $contentType = $contentTypeService->loadContentTypeByIdentifier('folder');
1191
1192
        $contentService = $repository->getContentService();
1193
        $locationService = $repository->getLocationService();
1194
        $searchService = $repository->getSearchService();
1195
1196
        $testRootContentCreate = $contentService->newContentCreateStruct($contentType, 'eng-US');
1197
        $testRootContentCreate->setField('name', 'Root for test');
1198
1199
        $rootContent = $contentService->createContent(
1200
            $testRootContentCreate,
1201
            [
1202
                $locationService->newLocationCreateStruct(
1203
                    $this->generateId('location', 2)
1204
                ),
1205
            ]
1206
        );
1207
1208
        $publishedRootContent = $contentService->publishVersion($rootContent->versionInfo);
1209
1210
        $contentCreate = $contentService->newContentCreateStruct($contentType, 'eng-US');
1211
        $contentCreate->setField('name', 'To Hide');
1212
1213
        $content = $contentService->createContent(
1214
            $contentCreate,
1215
            [
1216
                $locationService->newLocationCreateStruct(
1217
                    $publishedRootContent->contentInfo->mainLocationId
1218
                ),
1219
            ]
1220
        );
1221
        $publishedContent = $contentService->publishVersion($content->versionInfo);
1222
1223
        $childContentCreate = $contentService->newContentCreateStruct($contentType, 'eng-US');
1224
        $childContentCreate->setField('name', 'Invisible Child');
1225
1226
        $childContent = $contentService->createContent(
1227
            $childContentCreate,
1228
            [
1229
                $locationService->newLocationCreateStruct(
1230
                    $publishedContent->contentInfo->mainLocationId
1231
                ),
1232
            ]
1233
        );
1234
        $rootLocation = $locationService->loadLocation($publishedRootContent->contentInfo->mainLocationId);
1235
1236
        $contentService->publishVersion($childContent->versionInfo);
1237
        $this->refreshSearch($repository);
1238
1239
        $query = new LocationQuery([
1240
            'query' => new Criterion\LogicalAnd([
1241
                new Criterion\Visibility(
1242
                    Criterion\Visibility::VISIBLE
1243
                ),
1244
                new Criterion\Subtree(
1245
                    $rootLocation->pathString
1246
                ),
1247
            ]),
1248
        ]);
1249
1250
        //Sanity check for visible locations
1251
        $result = $searchService->findLocations($query);
1252
        $this->assertEquals(3, $result->totalCount);
1253
1254
        //Hide main content
1255
        $contentService->hideContent($publishedContent->contentInfo);
1256
        $this->refreshSearch($repository);
1257
1258
        $result = $searchService->findLocations($query);
1259
        $this->assertEquals(1, $result->totalCount);
1260
1261
        //Query for invisible content
1262
        $hiddenQuery = new LocationQuery([
1263
            'query' => new Criterion\LogicalAnd([
1264
                new Criterion\Visibility(
1265
                    Criterion\Visibility::HIDDEN
1266
                ),
1267
                new Criterion\Subtree(
1268
                    $rootLocation->pathString
1269
                ),
1270
            ]),
1271
        ]);
1272
1273
        $result = $searchService->findLocations($hiddenQuery);
1274
        $this->assertEquals(2, $result->totalCount);
1275
    }
1276
1277
    /**
1278
     * Assert that query result matches the given fixture.
1279
     *
1280
     * @param LocationQuery $query
1281
     * @param string $fixture
1282
     * @param callable|null $closure
1283
     */
1284
    protected function assertQueryFixture(LocationQuery $query, $fixture, $closure = null, $ignoreScore = true)
1285
    {
1286
        $repository = $this->getRepository();
1287
        $searchService = $repository->getSearchService();
1288
1289
        try {
1290
            $result = $searchService->findLocations($query);
1291
            $this->simplifySearchResult($result);
1292
        } catch (NotImplementedException $e) {
1293
            $this->markTestSkipped(
1294
                'This feature is not supported by the current search backend: ' . $e->getMessage()
1295
            );
1296
        }
1297
1298 View Code Duplication
        if (!is_file($fixture)) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
1299
            if (isset($_ENV['ez_tests_record'])) {
1300
                file_put_contents(
1301
                    $record = $fixture . '.recording',
1302
                    "<?php\n\nreturn " . var_export($result, true) . ";\n\n"
1303
                );
1304
                $this->markTestIncomplete("No fixture available. Result recorded at $record. Result: \n" . $this->printResult($result));
1305
            } else {
1306
                $this->markTestIncomplete("No fixture available. Set \$_ENV['ez_tests_record'] to generate:\n " . $fixture);
1307
            }
1308
        }
1309
1310
        $fixture = include $fixture;
1311
1312
        if ($closure !== null) {
1313
            $closure($result);
1314
        }
1315
1316 View Code Duplication
        if ($ignoreScore) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
1317
            foreach ([$fixture, $result] as $result) {
1318
                $property = new \ReflectionProperty(get_class($result), 'maxScore');
1319
                $property->setAccessible(true);
1320
                $property->setValue($result, 0.0);
1321
1322
                foreach ($result->searchHits as $hit) {
1323
                    $property = new \ReflectionProperty(get_class($hit), 'score');
1324
                    $property->setAccessible(true);
1325
                    $property->setValue($hit, 0.0);
1326
                }
1327
            }
1328
        }
1329
1330
        foreach ([$fixture, $result] as $set) {
1331
            foreach ($set->searchHits as $hit) {
1332
                $property = new \ReflectionProperty(get_class($hit), 'index');
1333
                $property->setAccessible(true);
1334
                $property->setValue($hit, null);
1335
1336
                $property = new \ReflectionProperty(get_class($hit), 'matchedTranslation');
1337
                $property->setAccessible(true);
1338
                $property->setValue($hit, null);
1339
            }
1340
        }
1341
1342
        $this->assertEquals(
1343
            $fixture,
1344
            $result,
1345
            'Search results do not match.',
1346
            .2 // Be quite generous regarding delay -- most important for scores
1347
        );
1348
    }
1349
1350
    /**
1351
     * Show a simplified view of the search result for manual introspection.
1352
     *
1353
     * @param SearchResult $result
1354
     *
1355
     * @return string
1356
     */
1357 View Code Duplication
    protected function printResult(SearchResult $result)
1358
    {
1359
        $printed = '';
1360
        foreach ($result->searchHits as $hit) {
1361
            $printed .= sprintf(" - %s (%s)\n", $hit->valueObject['title'], $hit->valueObject['id']);
1362
        }
1363
1364
        return $printed;
1365
    }
1366
1367
    /**
1368
     * Simplify search result.
1369
     *
1370
     * This leads to saner comparisons of results, since we do not get the full
1371
     * content objects every time.
1372
     *
1373
     * @param SearchResult $result
1374
     */
1375
    protected function simplifySearchResult(SearchResult $result)
1376
    {
1377
        $result->time = 1;
1378
1379
        foreach ($result->searchHits as $hit) {
1380
            switch (true) {
1381 View Code Duplication
                case $hit->valueObject instanceof Location:
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
1382
                    $hit->valueObject = [
0 ignored issues
show
Documentation Bug introduced by
It seems like array('id' => $hit->valu...ect->contentInfo->name) of type array<string,*,{"id":"*","title":"string"}> is incompatible with the declared type object<eZ\Publish\API\Re...ory\Values\ValueObject> of property $valueObject.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
1383
                        'id' => $hit->valueObject->contentInfo->id,
1384
                        'title' => $hit->valueObject->contentInfo->name,
1385
                    ];
1386
                    break;
1387
1388
                default:
1389
                    throw new \RuntimeException('Unknown search result hit type: ' . get_class($hit->valueObject));
1390
            }
1391
        }
1392
    }
1393
1394
    /**
1395
     * Get fixture directory.
1396
     *
1397
     * @return string
1398
     */
1399
    protected function getFixtureDir()
1400
    {
1401
        return __DIR__ . '/_fixtures/' . getenv('fixtureDir') . '/';
1402
    }
1403
}
1404