Passed
Pull Request — master (#105)
by
unknown
02:33
created

testPackagesAreAddedCorrectly()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 47
Code Lines 36

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 36
nc 1
nop 0
dl 0
loc 47
rs 9.0303
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
        $moduleHealthLoader = $this->getMockBuilder(ModuleHealthLoader::class)
31
            ->setMethods(['getModuleHealthInfo'])
32
            ->getMock();
33
34
        return $moduleHealthLoader;
35
    }
36
37
38
    public function testGetPackageInfo()
39
    {
40
        $lockOutput = [(object) [
41
            "name" => "fake/package",
42
            "description" => "A faux package from a mocked composer.lock for testing purposes",
43
            "version" => "1.0.0",
44
        ]];
45
46
        /** @var UpdatePackageInfoTask $processor */
47
        $processor = UpdatePackageInfoTask::create();
48
        $output = $processor->getPackageInfo($lockOutput);
49
        $this->assertInternalType('array', $output);
50
        $this->assertCount(1, $output);
51
        $this->assertContains([
52
            "Name" => "fake/package",
53
            "Description" => "A faux package from a mocked composer.lock for testing purposes",
54
            "Version" => "1.0.0"
55
        ], $output);
56
    }
57
58
    public function testGetSupportedPackagesEchosErrors()
59
    {
60
        $supportedAddonsLoader = $this->mockSupportedAddonsLoader();
61
        $moduleHealthLoader = $this->mockModuleHealthLoader();
62
63
        $supportedAddonsLoader->expects($this->once())
64
            ->method('getAddonNames')
65
            ->will($this->throwException(new RuntimeException('A test message')));
66
67
        /** @var UpdatePackageInfoTask $task */
68
        $task = UpdatePackageInfoTask::create();
69
        $task->setSupportedAddonsLoader($supportedAddonsLoader);
70
        $task->setModuleHealthLoader($moduleHealthLoader);
71
72
        ob_start();
73
        $task->getSupportedPackages();
74
        $output = ob_get_clean();
75
76
        $this->assertContains('A test message', $output);
77
    }
78
79
    public function testPackagesAreAddedCorrectly()
80
    {
81
82
        $task = UpdatePackageInfoTask::create();
83
84
        $composerLoader = $this->getMockBuilder(ComposerLoader::class)
85
            ->setMethods(['getLock'])->getMock();
86
        $composerLoader->expects($this->any())->method('getLock')->will($this->returnValue(json_decode(<<<LOCK
87
{
88
    "packages": [
89
        {
90
            "name": "fake/supported-package",
91
            "description": "A faux package from a mocked composer.lock for testing purposes",
92
            "version": "1.0.0"
93
        },
94
        {
95
            "name": "fake/unsupported-package",
96
            "description": "A faux package from a mocked composer.lock for testing purposes",
97
            "version": "1.0.0"
98
        }
99
    ],
100
    "packages-dev": null
101
}
102
LOCK
103
        )));
104
        $task->setComposerLoader($composerLoader);
105
106
        $supportedAddonsLoader = $this->mockSupportedAddonsLoader();
107
        $moduleHealthLoader = $this->mockModuleHealthLoader();
0 ignored issues
show
Unused Code introduced by
The assignment to $moduleHealthLoader is dead and can be removed.
Loading history...
108
109
        $supportedAddonsLoader->expects($this->once())
110
            ->method('getAddonNames')
111
            ->will($this->returnValue(['fake/supported-package']));
112
        $task->setSupportedAddonsLoader($supportedAddonsLoader);
113
114
        $task->run(null);
115
116
        $packages = Package::get();
117
        $this->assertCount(2, $packages);
118
119
        $package = $packages->find('Name', 'fake/supported-package');
120
        $this->assertInstanceOf(Package::class, $package);
121
        $this->assertEquals(1, $package->Supported);
122
123
        $package = $packages->find('Name', 'fake/unsupported-package');
124
        $this->assertInstanceOf(Package::class, $package);
125
        $this->assertEquals(0, $package->Supported);
126
    }
127
}
128