Passed
Push — master ( fcb909...cb681d )
by Robbie
02:26
created

UpdatePackageInfoTest::mockModuleHealthLoader()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 4
nc 1
nop 0
dl 0
loc 8
rs 9.4285
c 0
b 0
f 0
1
<?php
2
3
namespace BringYourOwnIdeas\Maintenance\Tests\Tasks;
4
5
use BringYourOwnIdeas\Maintenance\Util\ComposerLoader;
6
use BringYourOwnIdeas\Maintenance\Util\ModuleHealthLoader;
7
use BringYourOwnIdeas\Maintenance\Util\SupportedAddonsLoader;
8
use PHPUnit_Framework_TestCase;
9
use RuntimeException;
10
use BringYourOwnIdeas\Maintenance\Tasks\UpdatePackageInfoTask;
11
use BringYourOwnIdeas\Maintenance\Model\Package;
12
use SilverStripe\Dev\SapphireTest;
13
14
/**
15
 * @mixin PHPUnit_Framework_TestCase
16
 */
17
class UpdatePackageInfoTest extends SapphireTest
18
{
19
    protected $usesDatabase = true;
20
21
    protected function mockSupportedAddonsLoader()
22
    {
23
        $supportedAddonsLoader = $this->getMockBuilder(SupportedAddonsLoader::class)
24
            ->setMethods(['getAddonNames'])
25
            ->getMock();
26
        return $supportedAddonsLoader;
27
    }
28
    protected function mockModuleHealthLoader()
29
    {
30
31
        $moduleHealthLoader = $this->getMockBuilder(ModuleHealthLoader::class)
32
            ->setMethods(['getModuleHealthInfo'])
33
            ->getMock();
34
35
        return $moduleHealthLoader;
36
    }
37
38
39
    public function testGetPackageInfo()
40
    {
41
        $lockOutput = [(object) [
42
            "name" => "fake/package",
43
            "description" => "A faux package from a mocked composer.lock for testing purposes",
44
            "version" => "1.0.0",
45
        ]];
46
47
        /** @var UpdatePackageInfoTask $processor */
48
        $processor = UpdatePackageInfoTask::create();
49
        $output = $processor->getPackageInfo($lockOutput);
50
        $this->assertInternalType('array', $output);
51
        $this->assertCount(1, $output);
52
        $this->assertContains([
53
            "Name" => "fake/package",
54
            "Description" => "A faux package from a mocked composer.lock for testing purposes",
55
            "Version" => "1.0.0"
56
        ], $output);
57
    }
58
59
    public function testGetSupportedPackagesEchosErrors()
60
    {
61
        $supportedAddonsLoader = $this->mockSupportedAddonsLoader();
62
        $moduleHealthLoader = $this->mockModuleHealthLoader();
63
64
        $supportedAddonsLoader->expects($this->once())
65
            ->method('getAddonNames')
66
            ->will($this->throwException(new RuntimeException('A test message')));
67
68
        /** @var UpdatePackageInfoTask $task */
69
        $task = UpdatePackageInfoTask::create();
70
        $task->setSupportedAddonsLoader($supportedAddonsLoader);
71
        $task->setModuleHealthLoader($moduleHealthLoader);
72
73
        ob_start();
74
        $task->getSupportedPackages();
75
        $output = ob_get_clean();
76
77
        $this->assertContains('A test message', $output);
78
    }
79
80
    public function testPackagesAreAddedCorrectly()
81
    {
82
83
        $task = UpdatePackageInfoTask::create();
84
85
        $composerLoader = $this->getMockBuilder(ComposerLoader::class)
86
            ->setMethods(['getLock'])->getMock();
87
        $composerLoader->expects($this->any())->method('getLock')->will($this->returnValue(json_decode(<<<LOCK
88
{
89
    "packages": [
90
        {
91
            "name": "fake/supported-package",
92
            "description": "A faux package from a mocked composer.lock for testing purposes",
93
            "version": "1.0.0"
94
        },
95
        {
96
            "name": "fake/unsupported-package",
97
            "description": "A faux package from a mocked composer.lock for testing purposes",
98
            "version": "1.0.0"
99
        }
100
    ],
101
    "packages-dev": null
102
}
103
LOCK
104
        )));
105
        $task->setComposerLoader($composerLoader);
106
107
        $supportedAddonsLoader = $this->mockSupportedAddonsLoader();
108
        $moduleHealthLoader = $this->mockModuleHealthLoader();
0 ignored issues
show
Unused Code introduced by
The assignment to $moduleHealthLoader is dead and can be removed.
Loading history...
109
110
        $supportedAddonsLoader->expects($this->once())
111
            ->method('getAddonNames')
112
            ->will($this->returnValue(['fake/supported-package']));
113
        $task->setSupportedAddonsLoader($supportedAddonsLoader);
114
115
        $task->run(null);
116
117
        $packages = Package::get();
118
        $this->assertCount(2, $packages);
119
120
        $package = $packages->find('Name', 'fake/supported-package');
121
        $this->assertInstanceOf(Package::class, $package);
122
        $this->assertEquals(1, $package->Supported);
123
124
        $package = $packages->find('Name', 'fake/unsupported-package');
125
        $this->assertInstanceOf(Package::class, $package);
126
        $this->assertEquals(0, $package->Supported);
127
    }
128
}
129