SearchTest   A
last analyzed

Complexity

Total Complexity 7

Size/Duplication

Total Lines 161
Duplicated Lines 0 %

Importance

Changes 5
Bugs 1 Features 0
Metric Value
eloc 83
c 5
b 1
f 0
dl 0
loc 161
rs 10
wmc 7

7 Methods

Rating   Name   Duplication   Size   Complexity  
A setUpBeforeClass() 0 15 1
A testHighlights() 0 27 1
A testIndexOneMemberAndSuggest() 0 21 1
A testIndexOneDocumentAndSuggest() 0 15 1
A testIndexOneDocumentAndNullSearch() 0 18 1
A setUp() 0 12 1
A testIndexOneDocumentAndSearch() 0 21 1
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\FlickrPhoto;
14
15
class SearchTest extends SapphireTest
16
{
17
    protected static $extra_dataobjects = [
18
        FlickrPhoto::class,
19
    ];
20
21
    /** @var int */
22
    private static $pageID;
23
24
    public function setUp(): void
25
    {
26
        parent::setUp();
27
28
        /** @var \Suilven\FreeTextSearch\Indexes $indexesService */
29
        $indexesService = new Indexes();
30
        $indexesArray = $indexesService->getIndexes();
31
32
       // error_log('++++ INDEXES ARRAY ++++');
33
      //  error_log(print_r($indexesArray, true));
34
        $helper = new ReconfigureIndexesHelper();
35
        $helper->reconfigureIndexes($indexesArray);
36
    }
37
38
39
    /**
40
     * This test will hopefully deal with the hardwired sitetree index name
41
     *
42
     * @throws \SilverStripe\ORM\ValidationException
43
     */
44
    public function testIndexOneMemberAndSuggest(): void
45
    {
46
        $member = new Member();
47
        $member->FirstName = 'Gordon';
48
        $member->Surname = 'Anderson';
49
50
        // a fake address!
51
        $member->Email = '[email protected]';
52
53
        $member->write();
54
55
        $factory = new IndexerFactory();
56
        $indexer = $factory->getIndexer();
57
        $indexer->setIndexName('members');
58
        $indexer->index($member);
59
60
        /** @var \Suilven\ManticoreSearch\Service\Suggester $suggester */
61
        $suggester = new Suggester();
62
        $suggester->setIndex('members');
63
        $result = $suggester->suggest('Andersin');
64
        $this->assertEquals(['anderson'], $result->getResults());
65
    }
66
67
68
    public function testIndexOneDocumentAndSuggest(): void
69
    {
70
        $doc = DataObject::get_by_id(\Page::class, self::$pageID);
0 ignored issues
show
Bug introduced by
The type Page was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
71
72
        $factory = new IndexerFactory();
73
        $indexer = $factory->getIndexer();
74
        $indexer->setIndexName('sitetree');
75
        $indexer->index($doc);
76
77
        // search for webmister, a deliberate error (should be webmaster)
78
        /** @var \Suilven\ManticoreSearch\Service\Suggester $suggester */
79
        $suggester = new Suggester();
80
        $suggester->setIndex('sitetree');
81
        $result = $suggester->suggest('webmister');
82
        $this->assertEquals(['webmaster'], $result->getResults());
83
    }
84
85
86
    public function testIndexOneDocumentAndSearch(): void
87
    {
88
89
        $doc = DataObject::get_by_id(\Page::class, self::$pageID);
90
        $factory = new IndexerFactory();
91
        $indexer = $factory->getIndexer();
92
        $indexer->setIndexName('sitetree');
93
        $indexer->index($doc);
94
95
        $searcher = new Searcher();
96
        $searcher->setIndexName('sitetree');
97
98
        /** @var \Suilven\FreeTextSearch\Container\SearchResults $result */
99
        $result = $searcher->search('Webmaster disconnections');
100
101
        $this->assertInstanceOf('Suilven\FreeTextSearch\Container\SearchResults', $result);
102
        $this->assertEquals(1, $result->getTotaNumberOfResults());
103
        $records = $result->getRecords();
104
        $first = $records->first();
105
        $this->assertContains('Webmaster fakes disconnections overdose', $first->Content);
106
        $this->assertEquals(self::$pageID, $first->ID);
107
    }
108
109
110
    public function testIndexOneDocumentAndNullSearch(): void
111
    {
112
        $doc = DataObject::get_by_id(\Page::class, self::$pageID);
113
        $factory = new IndexerFactory();
114
        $indexer = $factory->getIndexer();
115
        $indexer->setIndexName('sitetree');
116
        $indexer->index($doc);
117
118
        $searcher = new Searcher();
119
        $searcher->setIndexName('sitetree');
120
121
        /** @var \Suilven\FreeTextSearch\Container\SearchResults $result */
122
        $result = $searcher->search(null);
123
        $records = $result->getRecords();
124
        $first = $records->first();
125
126
        // null search returns only document in the index
127
        $this->assertContains('Webmaster fakes disconnections overdose', $first->Content);
128
    }
129
130
131
    public function testHighlights(): void
132
    {
133
        $doc = DataObject::get_by_id(\Page::class, self::$pageID);
134
        $factory = new IndexerFactory();
135
        $indexer = $factory->getIndexer();
136
        $indexer->setIndexName('sitetree');
137
        $indexer->index($doc);
138
139
        $searcher = new Searcher();
140
        $searcher->setIndexName('sitetree');
141
142
        /** @var \Suilven\FreeTextSearch\Container\SearchResults $result */
143
        $result = $searcher->search('knitted');
144
        $this->assertEquals(1, $result->getTotaNumberOfResults());
145
146
        $records = $result->getRecords();
147
        $first = $records->first();
148
149
150
        // null search returns only document in the index
151
        $this->assertContains('Webmaster fakes disconnections overdose', $first->Content);
152
153
        $this->assertEquals([
154
            'Title' => ['Hometown Sandlot <b>Knitted</b> Saddens Days'],
155
            'Content' => ['Webmaster fakes disconnections overdose. Windowing preschooler malfunctions dolts' .
156
                ' statutes.'],
157
        ], $first->Highlights);
158
    }
159
160
161
    public static function setUpBeforeClass(): void
162
    {
163
        parent::setUpBeforeClass();
164
165
        $flickrPhoto = new FlickrPhoto();
166
        $flickrPhoto->Title = 'This is a photo';
167
        $flickrPhoto->Description = 'taken by a camera';
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...
168
        $flickrPhoto->write();
169
170
171
        $page = new \Page();
172
        $page->Title = 'Hometown Sandlot Knitted Saddens Days';
173
        $page->Content = 'Webmaster fakes disconnections overdose.  Windowing preschooler malfunctions dolts statutes.';
174
        $page->write();
175
        self::$pageID = $page->ID;
176
    }
177
}
178