Completed
Push — master ( ecb4e1...854f7d )
by Gordon
06:36 queued 03:11
created

SearchTest::testIndexOneDocumentAndSuggest()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 15
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 9
c 0
b 0
f 0
nc 1
nop 0
dl 0
loc 15
rs 9.9666
1
<?php declare(strict_types = 1);
2
3
namespace Suilven\ManticoreSearch\Tests\Service;
4
5
use SilverStripe\Dev\SapphireTest;
6
use SilverStripe\ORM\DataObject;
7
use SilverStripe\Security\Member;
8
use Suilven\FreeTextSearch\Factory\IndexerFactory;
9
use Suilven\FreeTextSearch\Indexes;
10
use Suilven\ManticoreSearch\Helper\ReconfigureIndexesHelper;
11
use Suilven\ManticoreSearch\Service\Searcher;
12
use Suilven\ManticoreSearch\Service\Suggester;
13
use Suilven\ManticoreSearch\Tests\Models\FlickrAuthor;
14
use Suilven\ManticoreSearch\Tests\Models\FlickrPhoto;
15
use Suilven\ManticoreSearch\Tests\Models\FlickrSet;
16
use Suilven\ManticoreSearch\Tests\Models\FlickrTag;
17
18
class SearchTest extends SapphireTest
19
{
20
    protected static $extra_dataobjects = [
21
        FlickrPhoto::class,
22
        FlickrTag::class,
23
        FlickrSet::class,
24
        FlickrAuthor::class,
25
    ];
26
27
    /** @var int */
28
    private static $pageID;
29
30
    public function setUp(): void
31
    {
32
        parent::setUp();
33
34
        /** @var \Suilven\FreeTextSearch\Indexes $indexesService */
35
        $indexesService = new Indexes();
36
        $indexesArray = $indexesService->getIndexes();
37
        $helper = new ReconfigureIndexesHelper();
38
        $helper->reconfigureIndexes($indexesArray);
39
    }
40
41
42
    /**
43
     * This test will hopefully deal with the hardwired sitetree index name
44
     *
45
     * @throws \SilverStripe\ORM\ValidationException
46
     */
47
    public function testIndexOneMemberAndSuggest(): void
48
    {
49
        $member = new Member();
50
        $member->FirstName = 'Gordon';
51
        $member->Surname = 'Anderson';
52
53
        // a fake address!
54
        $member->Email = '[email protected]';
55
56
        $member->write();
57
58
        $factory = new IndexerFactory();
59
        $indexer = $factory->getIndexer();
60
        $indexer->setIndexName('members');
61
        $indexer->index($member);
62
63
        /** @var \Suilven\ManticoreSearch\Service\Suggester $suggester */
64
        $suggester = new Suggester();
65
        $suggester->setIndex('members');
66
        $result = $suggester->suggest('Andersin');
67
        $this->assertEquals(['anderson'], $result->getResults());
68
    }
69
70
71
    public function testIndexOneDocumentAndSuggest(): void
72
    {
73
        $doc = DataObject::get_by_id(\Page::class, self::$pageID);
74
75
        $factory = new IndexerFactory();
76
        $indexer = $factory->getIndexer();
77
        $indexer->setIndexName('sitetree');
78
        $indexer->index($doc);
79
80
        // search for webmister, a deliberate error (should be webmaster)
81
        /** @var \Suilven\ManticoreSearch\Service\Suggester $suggester */
82
        $suggester = new Suggester();
83
        $suggester->setIndex('sitetree');
84
        $result = $suggester->suggest('webmister');
85
        $this->assertEquals(['webmaster'], $result->getResults());
86
    }
87
88
89
    public function testIndexOneDocumentAndSearch(): void
90
    {
91
92
        $doc = DataObject::get_by_id(\Page::class, self::$pageID);
93
        $factory = new IndexerFactory();
94
        $indexer = $factory->getIndexer();
95
        $indexer->setIndexName('sitetree');
96
        $indexer->index($doc);
97
98
        $searcher = new Searcher();
99
        $searcher->setIndexName('sitetree');
100
101
        /** @var \Suilven\FreeTextSearch\Container\SearchResults $result */
102
        $result = $searcher->search('Webmaster disconnections');
103
104
        $this->assertInstanceOf('Suilven\FreeTextSearch\Container\SearchResults', $result);
105
        $this->assertEquals(1, $result->getTotaNumberOfResults());
106
        $records = $result->getRecords();
107
        $first = $records->first();
108
        $this->assertContains('Webmaster fakes disconnections overdose', $first->Content);
109
        $this->assertEquals(self::$pageID, $first->ID);
110
    }
111
112
113
    public function testIndexOneDocumentAndNullSearch(): void
114
    {
115
        $doc = DataObject::get_by_id(\Page::class, self::$pageID);
116
        $factory = new IndexerFactory();
117
        $indexer = $factory->getIndexer();
118
        $indexer->setIndexName('sitetree');
119
        $indexer->index($doc);
120
121
        $searcher = new Searcher();
122
        $searcher->setIndexName('sitetree');
123
124
        /** @var \Suilven\FreeTextSearch\Container\SearchResults $result */
125
        $result = $searcher->search(null);
126
        $records = $result->getRecords();
127
        $first = $records->first();
128
129
        // null search returns only document in the index
130
        $this->assertContains('Webmaster fakes disconnections overdose', $first->Content);
131
    }
132
133
134
    public function testHighlights(): void
135
    {
136
        $doc = DataObject::get_by_id(\Page::class, self::$pageID);
137
        $factory = new IndexerFactory();
138
        $indexer = $factory->getIndexer();
139
        $indexer->setIndexName('sitetree');
140
        $indexer->index($doc);
141
142
        $searcher = new Searcher();
143
        $searcher->setIndexName('sitetree');
144
145
        /** @var \Suilven\FreeTextSearch\Container\SearchResults $result */
146
        $result = $searcher->search('knitted');
147
        $this->assertEquals(1, $result->getTotaNumberOfResults());
148
149
        $records = $result->getRecords();
150
        $first = $records->first();
151
152
153
        // null search returns only document in the index
154
        $this->assertContains('Webmaster fakes disconnections overdose', $first->Content);
155
156
        $this->assertEquals([
157
            'Title' => ['Hometown Sandlot <b>Knitted</b> Saddens Days'],
158
            'Content' => ['Webmaster fakes disconnections overdose. Windowing preschooler malfunctions dolts statutes.']
159
        ], $first->Highlights);
160
    }
161
162
163
    public static function setUpBeforeClass(): void
164
    {
165
        parent::setUpBeforeClass();
166
167
        $flickrPhoto = new FlickrPhoto();
168
        $flickrPhoto->Title = 'test';
169
        $flickrPhoto->Description = 'test';
0 ignored issues
show
Bug Best Practice introduced by
The property Description does not exist on Suilven\ManticoreSearch\Tests\Models\FlickrPhoto. Since you implemented __set, consider adding a @property annotation.
Loading history...
170
        $flickrPhoto->write();
171
172
173
        $page = new \Page();
174
        $page->Title = 'Hometown Sandlot Knitted Saddens Days';
175
        $page->Content = 'Webmaster fakes disconnections overdose.  Windowing preschooler malfunctions dolts statutes.';
176
        $page->write();
177
        self::$pageID = $page->ID;
178
    }
179
}
180