Passed
Push — sheepy/elevation-configuration ( bdeab0...bcf7bc )
by Marco
18:34
created

BaseIndexTest::testIndexName()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 0
dl 0
loc 3
rs 10
c 0
b 0
f 0
1
<?php
2
3
4
namespace Firesphere\SolrSearch\Tests;
5
6
use CircleCITestIndex;
7
use Firesphere\SolrSearch\Compat\SubsitesExtension;
8
use Firesphere\SolrSearch\Extensions\DataObjectExtension;
9
use Firesphere\SolrSearch\Helpers\Synonyms;
10
use Firesphere\SolrSearch\Indexes\BaseIndex;
11
use Firesphere\SolrSearch\Queries\BaseQuery;
12
use Firesphere\SolrSearch\Results\SearchResult;
13
use Firesphere\SolrSearch\Stores\FileConfigStore;
14
use Firesphere\SolrSearch\Tasks\SolrConfigureTask;
15
use Firesphere\SolrSearch\Tasks\SolrIndexTask;
16
use Page;
17
use Psr\Log\NullLogger;
18
use SilverStripe\CMS\Model\SiteTree;
19
use SilverStripe\Control\Director;
20
use SilverStripe\Control\HTTPRequest;
21
use SilverStripe\Control\NullHTTPRequest;
22
use SilverStripe\Core\Injector\Injector;
23
use SilverStripe\Dev\Debug;
24
use SilverStripe\Dev\SapphireTest;
25
use SilverStripe\ORM\ArrayList;
26
use SilverStripe\ORM\DataObject;
27
use SilverStripe\ORM\PaginatedList;
28
use SilverStripe\Security\DefaultAdminService;
29
use SilverStripe\View\ArrayData;
30
use Solarium\Component\Result\Highlighting\Highlighting;
31
use Solarium\Core\Client\Client;
32
33
class BaseIndexTest extends SapphireTest
34
{
35
    protected static $fixture_file = '../fixtures/DataResolver.yml';
36
    /**
37
     * @var array
38
     */
39
    protected static $extra_dataobjects = [
40
        TestObject::class,
41
        TestPage::class,
42
        TestRelationObject::class,
43
    ];
44
45
    /**
46
     * @var array
47
     */
48
    protected static $required_extensions = [
49
        DataObject::class => [DataObjectExtension::class],
50
        BaseIndex::class  => [SubsitesExtension::class],
51
    ];
52
53
    /**
54
     * @var BaseIndex
55
     */
56
    protected $index;
57
58
    public function testConstruct()
59
    {
60
        $this->assertInstanceOf(Client::class, $this->index->getClient());
61
        $this->assertCount(1, $this->index->getClasses());
62
        $this->assertCount(2, $this->index->getFulltextFields());
63
        $this->assertContains(SiteTree::class, $this->index->getClasses());
64
    }
65
66
    public function testInit()
67
    {
68
        $this->assertNull($this->index->init());
69
        $this->assertNotEmpty($this->index->getFulltextFields());
70
        $this->assertNotEmpty($this->index->getFieldsForIndexing());
71
        $expected = [
72
            'Title',
73
            'Content',
74
            'ParentID',
75
            'SubsiteID',
76
            'Created',
77
        ];
78
79
        $this->assertEquals($expected, array_values($this->index->getFieldsForIndexing()));
80
81
        $index = new TestIndexTwo();
82
83
        $this->assertCount(3, $index->getFulltextFields());
84
        $this->assertCount(1, $index->getFacetFields());
85
    }
86
87
    public function testFacetFields()
88
    {
89
        /** @var Page $parent */
90
        $parent = $this->objFromFixture(Page::class, 'homepage');
91
        $id = $parent->write();
92
        $parent->publishRecursive();
93
        $page1 = Page::create(['Title' => 'Test 1', 'ParentID' => $id, 'ShowInSearch' => true]);
94
        $page1->write();
95
        $page1->publishRecursive();
96
        $page2 = Page::create(['Title' => 'Test 2', 'ParentID' => $id, 'ShowInSearch' => true]);
97
        $page2->write();
98
        $page2->publishRecursive();
99
        $task = new SolrIndexTask();
100
        $index = new TestIndex();
101
        $request = new HTTPRequest('GET', 'dev/tasks/SolrIndexTask', ['index' => TestIndex::class]);
102
        $task->run($request);
103
        $facets = $index->getFacetFields();
104
        $this->assertEquals([
105
            'Title' => 'Parent',
106
            'Field' => 'ParentID'
107
        ], $facets[SiteTree::class]);
108
        $query = new BaseQuery();
109
        $query->addTerm('Test');
110
        $clientQuery = $index->buildSolrQuery($query);
111
        $this->arrayHasKey('facet-Parent', $clientQuery->getFacetSet()->getFacets());
112
        $result = $index->doSearch($query);
113
        $this->assertInstanceOf(ArrayData::class, $result->getFacets());
114
        $facets = $result->getFacets();
115
        /** @var ArrayList $parents */
116
        $parents = $facets->Parent;
117
        $this->assertEquals('Home', $parents->first()->Title);
118
        $this->assertEquals(2, $parents->first()->FacetCount);
119
        $this->assertCount(1, $parents);
120
        $query->addFacetFilter('Parent', $id);
121
        $result = $index->buildSolrQuery($query);
122
        $filterQuery = $result->getFilterQuery('facet-Parent');
123
        $this->assertEquals('SiteTree_ParentID:' . $id, $filterQuery->getQuery());
124
    }
125
126
    public function testStoredFields()
127
    {
128
        $ftsFields = $this->index->getFulltextFields();
129
        $this->index->addStoredField('Test');
130
        $fields = $this->index->getStoredFields();
131
132
        $this->assertContains('Test', $fields);
133
134
        $this->index->setStoredFields(['Test', 'Test1']);
135
136
        $this->assertEquals(['Test', 'Test1'], $this->index->getStoredFields());
137
138
        $this->index->setFulltextFields($ftsFields);
139
    }
140
141
    public function testGetSynonyms()
142
    {
143
        $this->assertEquals(Synonyms::getSynonymsAsString(), $this->index->getSynonyms());
144
145
        $this->assertEmpty(trim($this->index->getSynonyms(false)));
146
    }
147
148
    public function testIndexName()
149
    {
150
        $this->assertEquals('TestIndex', $this->index->getIndexName());
151
    }
152
153
    public function testUploadConfig()
154
    {
155
        $config = [
156
            'mode' => 'file',
157
            'path' => '.solr'
158
        ];
159
160
        /** @var FileConfigStore $configStore */
161
        $configStore = Injector::inst()->create(FileConfigStore::class, $config);
162
163
        $this->index->uploadConfig($configStore);
164
165
        $this->assertFileExists(Director::baseFolder() . '/.solr/TestIndex/conf/schema.xml');
166
        $this->assertFileExists(Director::baseFolder() . '/.solr/TestIndex/conf/synonyms.txt');
167
        $this->assertFileExists(Director::baseFolder() . '/.solr/TestIndex/conf/stopwords.txt');
168
169
        $xml = file_get_contents(Director::baseFolder() . '/.solr/TestIndex/conf/schema.xml');
170
        $this->assertContains(
171
            '<field name=\'SiteTree_Title\' type=\'string\' indexed=\'true\' stored=\'true\' multiValued=\'false\'/>',
172
            $xml
173
        );
174
175
        $original = $configStore->getConfig();
176
        $configStore->setConfig([]);
177
        $this->assertEquals([], $configStore->getConfig());
178
        // Unhappy path, the config is not updated
179
        $this->assertNotEquals($original, $configStore->getConfig());
180
    }
181
182
    public function testGetFieldsForIndexing()
183
    {
184
        $expected = [
185
            'Title',
186
            'Content',
187
            'ParentID',
188
            'SubsiteID',
189
            'Created',
190
        ];
191
        $this->assertEquals($expected, array_values($this->index->getFieldsForIndexing()));
192
    }
193
194
    public function testGetSetClient()
195
    {
196
        $client = $this->index->getClient();
197
        // set client to something stupid
198
        $this->index->setClient('test');
199
        $this->assertEquals('test', $this->index->getClient());
200
        $this->index->setClient($client);
201
        $this->assertInstanceOf(Client::class, $this->index->getClient());
202
    }
203
204
    public function testDoSearch()
205
    {
206
        $index = new CircleCITestIndex();
207
208
        $query = new BaseQuery();
209
        $query->addTerm('Home');
210
211
        $result = $index->doSearch($query);
212
        $this->assertInstanceOf(SearchResult::class, $result);
213
        $this->assertEquals(1, $result->getTotalItems());
214
215
        $admin = singleton(DefaultAdminService::class)->findOrCreateDefaultAdmin();
216
        $this->loginAs($admin);
217
        // Result should be the same for now
218
        $result2 = $index->doSearch($query);
219
        $this->assertEquals($result, $result2);
220
221
        $query->addClass(SiteTree::class);
222
223
        $result3 = $index->doSearch($query);
224
        $request = new NullHTTPRequest();
225
        $this->assertInstanceOf(PaginatedList::class, $result3->getPaginatedMatches($request));
226
        $this->assertEquals($result3->getTotalItems(), $result3->getPaginatedMatches($request)->getTotalItems());
227
        $this->assertInstanceOf(ArrayData::class, $result3->getFacets());
228
        $this->assertInstanceOf(ArrayList::class, $result3->getSpellcheck());
229
        $this->assertInstanceOf(Highlighting::class, $result3->getHighlight());
230
231
        $result3->setCustomisedMatches([]);
232
        $this->assertInstanceOf(ArrayList::class, $result3->getMatches());
233
        $this->assertCount(0, $result3->getMatches());
234
235
        $index = new CircleCITestIndex();
236
        $query = new BaseQuery();
237
        $query->addTerm('Home', ['SiteTree_Title'], 5);
238
        $result4 = $index->doSearch($query);
239
240
        $this->assertContains('SiteTree_Title:Home^5.0', $index->getQueryFactory()->getBoostTerms());
241
        $this->assertContains('Home', $index->getQueryTerms());
242
        $this->assertEquals(1, $result4->getTotalItems());
243
244
        $index = new CircleCITestIndex();
245
        $query = new BaseQuery();
246
        $query->addTerm('Home', ['SiteTree.Title'], 3);
247
        $result4 = $index->doSearch($query);
248
249
        $this->assertContains('SiteTree_Title:Home^3.0', $index->getQueryFactory()->getBoostTerms());
250
        $this->assertContains('Home', $index->getQueryTerms());
251
        $this->assertEquals(1, $result4->getTotalItems());
252
253
        $index = new CircleCITestIndex();
254
        $query = new BaseQuery();
255
        $query->addTerm('Home', [], 0, true);
256
        $index->doSearch($query);
257
258
        $this->assertContains('Home~', $index->getQueryTerms());
259
260
        $index = new CircleCITestIndex();
261
        $query = new BaseQuery();
262
        $query->addTerm('Home', [], 0, 2);
263
        $index->doSearch($query);
264
265
        $this->assertContains('Home~2', $index->getQueryTerms());
266
    }
267
268
    public function testGetFieldsForSubsites()
269
    {
270
        $this->assertContains('SubsiteID', $this->index->getFilterFields());
271
    }
272
273
    public function testSetFacets()
274
    {
275
        $this->index->addFacetField(Page::class, ['Title' => 'Title', 'Field' => 'Content']);
276
277
        $expected = [
278
            SiteTree::class => [
279
                'Title' => 'Parent',
280
                'Field' => 'ParentID'
281
            ],
282
            Page::class     => [
283
                'Title' => 'Title',
284
                'Field' => 'Content'
285
            ]
286
        ];
287
        $this->assertEquals($expected, $this->index->getFacetFields());
288
    }
289
290
    public function testAddCopyField()
291
    {
292
        $this->index->addCopyField('mycopyfield', ['Content']);
293
        $expected = [
294
            '_text'       => ['*'],
295
            'mycopyfield' => ['Content']
296
        ];
297
        $this->assertEquals($expected, $this->index->getCopyFields());
298
    }
299
300
    protected function setUp()
301
    {
302
        $task = new SolrConfigureTask();
303
        $task->setLogger(new NullLogger());
304
        $task->run(new NullHTTPRequest());
305
306
        $this->index = Injector::inst()->get(TestIndex::class, false);
307
308
        parent::setUp();
309
    }
310
}
311