Passed
Pull Request — master (#192)
by Matthew
04:24
created

APIControllerTest::createRequest()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
nc 1
nop 1
dl 0
loc 9
rs 9.9666
c 0
b 0
f 0
1
<?php
2
3
namespace Dynamic\Locator\Tests\Control;
4
5
use DOMDocument;
6
use Dynamic\Locator\Control\APIController;
7
use Dynamic\Locator\Location;
8
use SilverStripe\Control\Director;
9
use SilverStripe\Control\HTTPRequest;
10
use SilverStripe\Control\Session;
11
use SilverStripe\Core\Config\Config;
12
use SilverStripe\Dev\FunctionalTest;
13
use SilverStripe\View\ViewableData;
14
15
/**
16
 * Class APIControllerTest
17
 * @package Dynamic\Locator\Tests\Control
18
 */
19
class APIControllerTest extends FunctionalTest
20
{
21
    /**
22
     * @var string
23
     */
24
    protected static $fixture_file = '../fixtures.yml';
25
26
    /**
27
     * @var bool
28
     */
29
    protected static $use_draft_site = true;
30
31
    /**
32
     *
33
     */
34
    public function testIndex()
35
    {
36
        $controller = APIController::create();
37
        $this->assertInstanceOf(ViewableData::class, $controller->index($controller->getRequest()));
38
    }
39
40
    /**
41
     *
42
     */
43
    public function testXml()
44
    {
45
        /** @var APIController $controller */
46
        $controller = APIController::create();
47
        $page = $this->get($controller->Link('xml'));
48
49
        $this->assertEquals(200, $page->getStatusCode());
50
        $this->assertEquals('application/xml', $page->getHeader('content-type'));
51
52
        $dom = new DOMDocument();
53
        // true if it loads, false if it doesn't
54
        $valid = $dom->loadXML($page->getBody());
55
        $this->assertTrue($valid);
56
    }
57
58
    /**
59
     *
60
     */
61
    public function testJson()
62
    {
63
        /** @var APIController $controller */
64
        $controller = APIController::create();
65
        $page = $this->get($controller->Link('json'));
66
67
        $this->assertEquals(200, $page->getStatusCode());
68
        $this->assertEquals('application/json', $page->getHeader('content-type'));
69
70
        $json = json_decode($page->getBody());
71
        // if it is null its not valid
72
        $this->assertNotNull($json);
73
    }
74
75
    /**
76
     *
77
     */
78
    public function testGetLocations()
79
    {
80
        /** @var APIController $controller */
81
        $controller = APIController::create();
82
83
        $filter = Config::inst()->get(APIController::class, 'base_filter');
84
        $filterAny = Config::inst()->get(APIController::class, 'base_filter_any');
85
        $exclude = Config::inst()->get(APIController::class, 'base_exclude');
86
87
        $locations = Location::get()->filter($filter)->filterAny($filterAny)->exclude($exclude);
88
        $this->assertEquals($locations->count(), $controller->getLocationList($this->createRequest())->count());
89
    }
90
91
    /**
92
     *
93
     */
94
    public function testGetLocationList()
95
    {
96
        /** @var APIController $controller */
97
        $controller = APIController::create();
98
99
        $filter = Config::inst()->get(APIController::class, 'base_filter');
100
        $filterAny = Config::inst()->get(APIController::class, 'base_filter_any');
101
        $exclude = Config::inst()->get(APIController::class, 'base_exclude');
102
103
        $locations = Location::get()->filter($filter)->filterAny($filterAny)->exclude($exclude);
104
        $locationsB = $locations->limit(2);
105
106
        $this->assertEquals($locations->count(), $controller->getLocationList($this->createRequest(array(
107
            'Limit' => 2,
108
        )))->count());
109
110
        $this->assertEquals($locationsB->count(), $controller->getLocationList($this->createRequest(array(
111
            'Limit' => -50,
112
        )))->count());
113
    }
114
115
    /**
116
     *
117
     */
118
    public function testGetFilter()
119
    {
120
        /** @var APIController $controller */
121
        $controller = APIController::create();
122
        $this->assertEquals(array(), $controller->getFilter($this->createRequest()));
123
124
        $this->assertEquals(array(
125
            'Categories.ID' => '1',
126
        ), $controller->getFilter($this->createRequest(array(
127
            'CategoryID' => '1',
128
        ))));
129
    }
130
131
    /**
132
     *
133
     */
134
    public function testGetFilterAny()
135
    {
136
        /** @var APIController $controller */
137
        $controller = APIController::create();
138
        $request = $this->createRequest();
139
140
        $this->assertEquals(array(), $controller->getFilterAny($request));
141
142
        $controller->config()->update('base_filter_any', array(
143
            'Any' => 'one',
144
        ));
145
146
        $this->assertEquals(array(
147
            'Any' => 'one',
148
        ), $controller->getFilterAny($request));
149
    }
150
151
    /**
152
     *
153
     */
154
    public function testGetExclude()
155
    {
156
        /** @var APIController $controller */
157
        $controller = APIController::create();
158
        $request = $this->createRequest();
159
160
        $this->assertEquals(array(
161
            'Lat' => 0,
162
            'Lng' => 0,
163
        ), $controller->getExclude($request));
164
165
        $controller->config()->update('base_exclude', array(
166
            'Any' => 'one',
167
        ));
168
169
        $this->assertEquals(array(
170
            'Any' => 'one',
171
            'Lat' => 0,
172
            'Lng' => 0,
173
        ), $controller->getExclude($request));
174
    }
175
176
    /**
177
     *
178
     */
179
    public function testGetLimit()
180
    {
181
        /** @var APIController $controller */
182
        $controller = APIController::create();
183
184
        $this->assertEquals(50, $controller->getLimit($this->createRequest()));
185
186
        $this->assertEquals(50, $controller->getLimit(
187
            $this->createRequest(array(
188
                'Limit' => 109,
189
            ))
190
        ));
191
192
        $this->assertEquals(25, $controller->getLimit(
193
            $this->createRequest(array(
194
                'Limit' => 25,
195
            ))
196
        ));
197
    }
198
199
    /**
200
     *
201
     */
202
    public function testLink()
203
    {
204
        /** @var APIController $controller */
205
        $controller = APIController::create();
206
207
        Director::config()->set('rules', array(
208
            'api' => APIController::class,
209
        ));
210
        
211
        $this->assertEquals('api/action', $controller->Link('action'));
212
    }
213
214
    /**
215
     *
216
     */
217
    public function testGetRoute()
218
    {
219
        Director::config()->set('rules', array());
220
        $this->assertEquals('', APIController::getRoute());
221
222
        Director::config()->set('rules', array(
223
            'api' => APIController::class,
224
        ));
225
        $this->assertEquals('api', APIController::getRoute());
226
227
        Director::config()->set('rules', array(
228
            'api' => array(
229
                'Controller' => APIController::class,
230
            ),
231
        ));
232
        $this->assertEquals('api', APIController::getRoute());
233
    }
234
235
    /**
236
     * @param array $getVars
237
     * @return \SilverStripe\Control\HTTPRequest
238
     */
239
    private function createRequest($getVars = array())
240
    {
241
        $link = APIController::create()->Link();
242
243
        $request = new HTTPRequest('GET', $link, $getVars);
244
        $session = new Session([]);
245
        $request->setSession($session);
246
247
        return $request;
248
    }
249
}
250