Passed
Pull Request — master (#136)
by Robbie
03:40
created

ResourceTest::pageBasePathProvider()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 9
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 7
nc 1
nop 0
dl 0
loc 9
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace SilverStripe\CKANRegistry\Tests\Model;
4
5
use PHPUnit_Framework_MockObject_MockObject;
6
use SilverStripe\CKANRegistry\Model\Resource;
7
use SilverStripe\CKANRegistry\Model\ResourceField;
8
use SilverStripe\CKANRegistry\Model\ResourceFilter;
9
use SilverStripe\CKANRegistry\Page\CKANRegistryPage;
10
use SilverStripe\CKANRegistry\Service\ResourcePopulator;
11
use SilverStripe\CKANRegistry\Service\ResourcePopulatorInterface;
12
use SilverStripe\Core\Injector\Injector;
13
use SilverStripe\Dev\SapphireTest;
14
15
class ResourceTest extends SapphireTest
16
{
17
    protected static $fixture_file = 'ResourceTest.yml';
18
19
    protected function setUp()
20
    {
21
        $populator = $this->createMock(ResourcePopulator::class);
22
        Injector::inst()->registerService($populator, ResourcePopulatorInterface::class);
23
24
        parent::setUp();
25
    }
26
27
    public function testFieldsAndFiltersAreRemovedAfterChangingIdentifier()
28
    {
29
        /** @var Resource $resource */
30
        $resource = $this->objFromFixture(Resource::class, 'teachers');
31
32
        $this->assertGreaterThan(0, $resource->Fields()->count(), 'Fixtures should load relationships');
33
        $this->assertGreaterThan(0, $resource->Filters()->count(), 'Fixtures should load relationships');
34
35
        // Change name, relationships should be retained
36
        $resource->Name = 'Primary Teachers';
37
        $resource->write();
38
39
        $this->assertGreaterThan(0, $resource->Fields()->count(), 'Changing name should not affect relations');
40
        $this->assertGreaterThan(0, $resource->Filters()->count(), 'Changing name should not affect relations');
41
42
        // Change identifier, relationships should be removed
43
        $resource->Identifier = 'something-different';
44
        $resource->write();
45
46
        $this->assertCount(0, $resource->Fields(), 'Changing identifier should clear fields');
47
        $this->assertCount(
48
            1,
49
            $resource->Filters(),
50
            'Changing identifier should clear filters (note that a default filter is added again as well)'
51
        );
52
    }
53
54
    public function testFieldsAndFiltersAreDeletedRatherThanJustUnassociated()
55
    {
56
        /** @var Resource $resource */
57
        $resource = $this->objFromFixture(Resource::class, 'teachers');
58
59
        $this->assertGreaterThan(0, $resource->Fields()->count(), 'Fixtures should load relationships');
60
        $this->assertGreaterThan(0, $resource->Filters()->count(), 'Fixtures should load relationships');
61
62
        // Change identifier, relationships should be deleted from the database
63
        $resource->Identifier = 'something-different';
64
        $resource->write();
65
66
        $this->assertCount(0, ResourceField::get(), 'Resource fields should be deleted');
67
        $this->assertCount(1, ResourceFilter::get(), 'Resource filters should be deleted (one gets added)');
68
    }
69
70
    public function testGetCKANClientConfig()
71
    {
72
        /** @var Resource $resource */
73
        $resource = $this->objFromFixture(Resource::class, 'teachers');
74
        $config = $resource->getCKANClientConfig();
75
76
        $this->assertSame([
77
            'endpoint' => 'https://foo.ckan.gov/',
78
            'dataset' => 'teachers',
79
            'identifier' => '26f44973-b06d-479d-b697-8d7943c97c5a',
80
        ], $config['spec'], 'CKAN endpoint specification should be provided');
81
        $this->assertSame('Teachers', $config['name'], 'Name should be provided');
82
        $this->assertSame('Class sizes', $config['resourceName'], 'Resource name should be provided');
83
        $this->assertSame('/', $config['basePath'],'Without a page, basePath should be root');
84
    }
85
86
    /**
87
     * @param string $relativeLink
88
     * @param string $expected
89
     * @dataProvider pageBasePathProvider
90
     */
91
    public function testGetPageBasePath($relativeLink, $expected)
92
    {
93
        /** @var CKANRegistryPage|PHPUnit_Framework_MockObject_MockObject */
94
        $page = $this->createMock(CKANRegistryPage::class);
95
        $page->expects($this->once())->method('RelativeLink')->willReturn($relativeLink);
96
97
        /** @var Resource|PHPUnit_Framework_MockObject_MockObject $resource */
98
        $resource = $this->getMockBuilder(Resource::class)->setMethods(['getComponent'])->getMock();
99
        $resource->expects($this->once())->method('getComponent')->with('Page')->willReturn($page);
100
101
        $this->assertSame($expected, $resource->getPageBasePath());
102
    }
103
104
    /**
105
     * @return array[]
106
     */
107
    public function pageBasePathProvider()
108
    {
109
        return [
110
            ['/', '/'],
111
            ['/my-page', '/my-page'],
112
            ['my-page', '/my-page'],
113
            ['my-page/', '/my-page'],
114
            ['/my-page/', '/my-page'],
115
            ['/my-page/my-resources/', '/my-page/my-resources'],
116
        ];
117
    }
118
}
119