Passed
Push — feature/Logging ( 59c536...77a350 )
by Simon
05:01
created

SolrCoreServiceTest   A

Complexity

Total Complexity 11

Size/Duplication

Total Lines 131
Duplicated Lines 0 %

Importance

Changes 14
Bugs 2 Features 0
Metric Value
wmc 11
eloc 66
c 14
b 2
f 0
dl 0
loc 131
rs 10
1
<?php
2
3
4
namespace Firesphere\SolrSearch\Tests;
5
6
use CircleCITestIndex;
7
use Firesphere\SolrSearch\Extensions\DataObjectExtension;
8
use Firesphere\SolrSearch\Queries\BaseQuery;
9
use Firesphere\SolrSearch\Services\SolrCoreService;
10
use Firesphere\SolrSearch\Tasks\SolrConfigureTask;
11
use Firesphere\SolrSearch\Tasks\SolrIndexTask;
12
use GuzzleHttp\Handler\MockHandler;
13
use GuzzleHttp\HandlerStack;
14
use GuzzleHttp\Psr7\Response;
15
use Page;
16
use SilverStripe\CMS\Model\SiteTree;
17
use SilverStripe\Control\NullHTTPRequest;
18
use SilverStripe\Core\Config\Config;
19
use SilverStripe\Core\Injector\Injector;
20
use SilverStripe\Dev\SapphireTest;
21
use SilverStripe\ORM\ArrayList;
22
use SilverStripe\ORM\DB;
23
use Solarium\Core\Client\Client;
24
25
class SolrCoreServiceTest extends SapphireTest
26
{
27
    protected static $fixture_file = '../fixtures/DataResolver.yml';
28
    protected static $extra_dataobjects = [
29
        TestObject::class,
30
        TestPage::class,
31
        TestRelationObject::class,
32
    ];
33
34
    /**
35
     * @var SolrCoreService
36
     */
37
    protected $service;
38
39
    public function testIndexes()
40
    {
41
        $service = new SolrCoreService();
42
43
        $expected = [
44
            CircleCITestIndex::class,
45
            TestIndex::class,
46
            TestIndexTwo::class,
47
        ];
48
49
        $this->assertEquals($expected, $service->getValidIndexes());
50
        $this->assertEquals([CircleCITestIndex::class], $service->getValidIndexes(CircleCITestIndex::class));
51
    }
52
53
    public function testUpdateItems()
54
    {
55
        $index = new CircleCITestIndex();
56
        $query = new BaseQuery();
57
        $query->addTerm('*:*');
58
        $items = SiteTree::get();
59
60
        $result = $this->service->updateItems($items, SolrCoreService::UPDATE_TYPE, CircleCITestIndex::class);
61
        $this->assertEquals(200, $result->getResponse()->getStatusCode());
62
63
        $this->service->updateItems($items, SolrCoreService::DELETE_TYPE, CircleCITestIndex::class);
64
        $this->assertEquals(0, $index->doSearch($query)->getTotalItems());
65
    }
66
67
    public function testUpdateItemsEmptyArray()
68
    {
69
        $index = new CircleCITestIndex();
70
        $query = new BaseQuery();
71
        $this->service->doManipulate(ArrayList::create(), SolrCoreService::DELETE_TYPE_ALL, $index);
72
        $this->assertEquals(0, $index->doSearch($query)->getTotalItems());
73
    }
74
75
    /**
76
     * @expectedException \LogicException
77
     */
78
    public function testWrongUpdateItems()
79
    {
80
        $items = SiteTree::get();
81
82
        $this->service->updateItems($items, SolrCoreService::UPDATE_TYPE, 'NonExisting');
83
    }
84
85
    public function testCoreStatus()
86
    {
87
        $status = $this->service->coreStatus(CircleCITestIndex::class);
88
        $deprecatedStatus = $this->service->coreIsActive(CircleCITestIndex::class);
89
        $this->assertEquals($status->getVersion(), $deprecatedStatus->getVersion());
90
        $this->assertEquals($status->getNumberOfDocuments(), $deprecatedStatus->getNumberOfDocuments());
91
        $this->assertEquals($status->getCoreName(), $deprecatedStatus->getCoreName());
92
93
        $this->assertEquals('CircleCITestIndex', $status->getCoreName());
94
    }
95
96
    public function testCoreUnload()
97
    {
98
        $status1 = $this->service->coreStatus(CircleCITestIndex::class);
99
        $this->service->coreUnload(CircleCITestIndex::class);
100
        $status2 = $this->service->coreStatus(CircleCITestIndex::class);
101
        $this->assertEquals(0, $status2->getUptime());
102
        $this->assertNotEquals($status1->getUptime(), $status2->getUptime());
103
    }
104
105
    public function testGetSetClient()
106
    {
107
        $client = $this->service->getClient();
108
        $this->assertInstanceOf(Client::class, $client);
109
        $service = $this->service->setClient($client);
110
        $this->assertInstanceOf(SolrCoreService::class, $service);
111
    }
112
113
    public function testGetSolrVersion()
114
    {
115
        $this->assertEquals(5, $this->service->getSolrVersion());
116
        $version4 = [
117
            'responseHeader' =>
118
                [
119
                    'status' => 0,
120
                    'QTime'  => 10,
121
                ],
122
            'mode'           => 'std',
123
            'solr_home'      => '/var/solr/data',
124
            'lucene'         =>
125
                [
126
                    'solr-spec-version' => '4.3.2',
127
                ]
128
        ];
129
        $mock = new MockHandler([
130
            new Response(200, ['X-Foo' => 'Bar'], json_encode($version4)),
131
        ]);
132
        $handler = HandlerStack::create($mock);
133
134
        $this->assertEquals(4, $this->service->getSolrVersion($handler));
135
    }
136
137
    protected function setUp()
138
    {
139
        parent::setUp();
140
        Injector::inst()->get(Page::class)->requireDefaultRecords();
141
        foreach (self::$extra_dataobjects as $className) {
142
            Config::modify()->merge($className, 'extensions', [DataObjectExtension::class]);
143
        }
144
        $this->service = new SolrCoreService();
145
    }
146
147
    protected function tearDown()
148
    {
149
        /** @var SolrConfigureTask $task */
150
        $task = Injector::inst()->get(SolrConfigureTask::class);
151
        $task->run(new NullHTTPRequest());
152
        /** @var SolrIndexTask $task */
153
        $task = Injector::inst()->get(SolrIndexTask::class);
154
        $task->run(new NullHTTPRequest());
155
        parent::tearDown();
156
    }
157
}
158