Passed
Pull Request — master (#77)
by Marco
08:43
created

BaseIndexTest::testConstruct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 4
dl 0
loc 6
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 0
1
<?php
2
3
4
namespace Firesphere\SolrSearch\Tests;
5
6
use CircleCITestIndex;
7
use Firesphere\SolrSearch\Helpers\Synonyms;
8
use Firesphere\SolrSearch\Indexes\BaseIndex;
9
use Firesphere\SolrSearch\Queries\BaseQuery;
10
use Firesphere\SolrSearch\Results\SearchResult;
11
use Firesphere\SolrSearch\Stores\FileConfigStore;
12
use SilverStripe\CMS\Model\SiteTree;
13
use SilverStripe\Control\Director;
14
use SilverStripe\Control\HTTPRequestBuilder;
15
use SilverStripe\Control\NullHTTPRequest;
16
use SilverStripe\Core\Injector\Injector;
17
use SilverStripe\Dev\SapphireTest;
18
use SilverStripe\ORM\ArrayList;
19
use SilverStripe\ORM\DatabaseAdmin;
20
use SilverStripe\ORM\DB;
21
use SilverStripe\ORM\PaginatedList;
22
use SilverStripe\Security\DefaultAdminService;
23
use SilverStripe\View\ArrayData;
24
use Solarium\Component\Result\Highlighting\Highlighting;
25
use Solarium\Core\Client\Client;
26
27
class BaseIndexTest extends SapphireTest
28
{
29
    /**
30
     * @var BaseIndex
31
     */
32
    protected $index;
33
34
    public static function setUpBeforeClass()
35
    {
36
        parent::setUpBeforeClass();
37
        // This is a hack on my local dev to make fixtures populate temporary database
38
        $conn = DB::get_conn();
39
        $dbName = self::tempDB()->build();
40
        $conn->selectDatabase($dbName);
41
        $dbAdmin = new DatabaseAdmin();
42
        $dbAdmin->setRequest(HTTPRequestBuilder::createFromEnvironment());
43
        $dbAdmin->doBuild(true, true, true);
44
    }
45
46
    public function testConstruct()
47
    {
48
        $this->assertInstanceOf(Client::class, $this->index->getClient());
49
        $this->assertCount(1, $this->index->getClasses());
50
        $this->assertCount(1, $this->index->getFulltextFields());
51
        $this->assertContains(SiteTree::class, $this->index->getClasses());
52
    }
53
54
    public function testInit()
55
    {
56
        $this->assertNull($this->index->init());
57
        $this->assertNotEmpty($this->index->getFulltextFields());
58
        $this->assertNotEmpty($this->index->getFieldsForIndexing());
59
        $expected = [
60
            'Title',
61
            'Content',
62
            'Created',
63
            'SubsiteID'
64
        ];
65
66
        $this->assertEquals($expected, array_values($this->index->getFieldsForIndexing()));
67
68
        $index = new TestIndexTwo();
69
70
        $this->assertCount(3, $index->getFulltextFields());
71
        $this->assertCount(1, $index->getFacetFields());
72
        $facets = $index->getFacetFields();
73
        $this->assertEquals(['Field' => 'SiteTree_TestObjectID', 'Title' => 'TestObject'], $facets[TestObject::class]);
74
    }
75
76
    public function testGetSynonyms()
77
    {
78
        $this->assertEquals(Synonyms::getSynonymsAsString(), $this->index->getSynonyms());
79
80
        $this->assertEmpty($this->index->getSynonyms(false));
81
    }
82
83
    public function testIndexName()
84
    {
85
        $this->assertEquals('TestIndex', $this->index->getIndexName());
86
    }
87
88
    public function testUploadConfig()
89
    {
90
        $config = [
91
            'mode' => 'file',
92
            'path' => Director::baseFolder() . '/.solr'
93
        ];
94
95
        $configStore = Injector::inst()->create(FileConfigStore::class, $config);
96
97
        $this->index->uploadConfig($configStore);
98
99
        $this->assertFileExists(Director::baseFolder() . '/.solr/TestIndex/conf/schema.xml');
100
        $this->assertFileExists(Director::baseFolder() . '/.solr/TestIndex/conf/synonyms.txt');
101
        $this->assertFileExists(Director::baseFolder() . '/.solr/TestIndex/conf/stopwords.txt');
102
103
        $xml = file_get_contents(Director::baseFolder() . '/.solr/TestIndex/conf/schema.xml');
104
        $this->assertContains(
105
            '<field name=\'SiteTree_Title\' type=\'string\' indexed=\'true\' stored=\'true\' multiValued=\'false\'/>',
106
            $xml
107
        );
108
    }
109
110
    public function testEscapeTerms()
111
    {
112
        $term = '"test me" help';
113
114
        $helper = $this->index->getClient()->createSelect()->getHelper();
115
116
        $escaped = $this->index->escapeSearch($term, $helper);
117
        $this->assertEquals('"\"test me\"" help', $escaped);
118
119
        $term = 'help me';
120
121
        $this->assertEquals('help me', $this->index->escapeSearch($term, $helper));
122
    }
123
124
    public function testGetFieldsForIndexing()
125
    {
126
        $expected = [
127
            'Title',
128
            'Content',
129
            'Created',
130
            'SubsiteID'
131
        ];
132
        $this->assertEquals($expected, array_values($this->index->getFieldsForIndexing()));
133
    }
134
135
    public function testGetSetClient()
136
    {
137
        $client = $this->index->getClient();
138
        // set client to something stupid
139
        $this->index->setClient('test');
140
        $this->assertEquals('test', $this->index->getClient());
141
        $this->index->setClient($client);
142
        $this->assertInstanceOf(Client::class, $this->index->getClient());
143
    }
144
145
    public function testDoSearch()
146
    {
147
        $index = new CircleCITestIndex();
148
149
        $query = new BaseQuery();
150
        $query->addTerm('Home');
151
152
        $result = $index->doSearch($query);
153
        $this->assertInstanceOf(SearchResult::class, $result);
154
        $this->assertEquals(1, $result->getTotalItems());
155
156
        $admin = singleton(DefaultAdminService::class)->findOrCreateDefaultAdmin();
157
        $this->loginAs($admin);
158
        // Result should be the same for now
159
        $result2 = $index->doSearch($query);
160
        $this->assertEquals($result, $result2);
161
162
        $query->addClass(SiteTree::class);
163
164
        $result3 = $index->doSearch($query);
165
        $request = new NullHTTPRequest();
166
        $this->assertInstanceOf(PaginatedList::class, $result3->getPaginatedMatches($request));
167
        $this->assertEquals($result3->getTotalItems(), $result3->getPaginatedMatches($request)->getTotalItems());
168
        $this->assertInstanceOf(ArrayData::class, $result3->getFacets());
169
        $this->assertInstanceOf(CircleCITestIndex::class, $result3->getIndex());
170
        $this->assertInstanceOf(ArrayList::class, $result3->getSpellcheck());
171
        $this->assertInstanceOf(Highlighting::class, $result3->getHighlight());
172
173
        $this->assertContains(SiteTree::class, $result3->getQuery()->getClasses());
174
175
        $index = new CircleCITestIndex();
176
        $query = new BaseQuery();
177
        $query->addTerm('Home', ['SiteTree_Title'], 5);
178
        $result4 = $index->doSearch($query);
179
180
        $this->assertEquals(['SiteTree_Title:Home^5.0'], $index->getBoostTerms());
181
        $this->assertEquals(['Home'], $index->getQueryTerms());
182
        $this->assertEquals(1, $result4->getTotalItems());
183
184
        $index = new CircleCITestIndex();
185
        $query = new BaseQuery();
186
        $query->addTerm('Home', ['SiteTree.Title'], 3);
187
        $result4 = $index->doSearch($query);
188
189
        $this->assertEquals(['SiteTree_Title:Home^3.0'], $index->getBoostTerms());
190
        $this->assertEquals(['Home'], $index->getQueryTerms());
191
        $this->assertEquals(1, $result4->getTotalItems());
192
193
        $index = new CircleCITestIndex();
194
        $query = new BaseQuery();
195
        $query->addTerm('Home', [], 0, true);
196
        $index->doSearch($query);
197
198
        $this->assertContains('Home~', $index->getQueryTerms());
199
200
        $index = new CircleCITestIndex();
201
        $query = new BaseQuery();
202
        $query->addTerm('Home', [], 0, 2);
203
        $index->doSearch($query);
204
205
        $this->assertContains('Home~2', $index->getQueryTerms());
206
    }
207
208
    public function testGetFieldsForSubsites()
209
    {
210
        $this->assertContains('SubsiteID', $this->index->getFilterFields());
211
    }
212
213
    protected function setUp()
214
    {
215
        $this->index = Injector::inst()->get(TestIndex::class);
216
217
        return parent::setUp();
218
    }
219
}
220