1<?php
2
3/*
4 * This file is part of the Fxp Composer Asset Plugin package.
5 *
6 * (c) François Pluchino <francois.pluchino@gmail.com>
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12namespace Fxp\Composer\AssetPlugin\Tests\Converter;
13
14use Fxp\Composer\AssetPlugin\Converter\NpmPackageConverter;
15use Fxp\Composer\AssetPlugin\Converter\NpmPackageUtil;
16use Fxp\Composer\AssetPlugin\Type\AssetTypeInterface;
17
18/**
19 * Tests of npm package converter.
20 *
21 * @author François Pluchino <francois.pluchino@gmail.com>
22 *
23 * @internal
24 */
25final class NpmPackageConverterTest extends AbstractPackageConverterTest
26{
27    protected function setUp()
28    {
29        parent::setUp();
30
31        /** @var AssetTypeInterface $type */
32        $type = $this->type;
33        $this->converter = new NpmPackageConverter($type);
34        $this->asset = $this->loadPackage();
35    }
36
37    public function testConvert()
38    {
39        $composer = $this->converter->convert($this->asset);
40
41        $this->assertArrayHasKey('name', $composer);
42        $this->assertSame('ASSET/'.$this->asset['name'], $composer['name']);
43
44        $this->assertArrayHasKey('type', $composer);
45        $this->assertSame('ASSET_TYPE', $composer['type']);
46
47        $this->assertArrayHasKey('description', $composer);
48        $this->assertSame($this->asset['description'], $composer['description']);
49
50        $this->assertArrayHasKey('version', $composer);
51        $this->assertSame('1.0.0-pre', $composer['version']);
52
53        $this->assertArrayHasKey('keywords', $composer);
54        $this->assertSame($this->asset['keywords'], $composer['keywords']);
55
56        $this->assertArrayHasKey('homepage', $composer);
57        $this->assertSame($this->asset['homepage'], $composer['homepage']);
58
59        $this->assertArrayHasKey('license', $composer);
60        $this->assertSame($this->asset['license'], $composer['license']);
61
62        $this->assertArrayHasKey('authors', $composer);
63        $this->assertSame(array_merge(array($this->asset['author']), $this->asset['contributors']), $composer['authors']);
64
65        $this->assertArrayHasKey('require', $composer);
66        $this->assertSame(array(
67            'ASSET/library1' => '>= 1.0.0',
68            'ASSET/library2' => '>= 1.0.0',
69            'ASSET/library2-0.9.0' => '0.9.0',
70            'ASSET/library3' => '*',
71            'ASSET/library4' => '1.2.3',
72            'ASSET/library5' => 'dev-default#0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b',
73            'ASSET/library6' => 'dev-branch',
74            'ASSET/library7' => 'dev-1.2.* || 1.2.*',
75            'ASSET/library8' => 'dev-1.2.x || 1.2.x',
76            'ASSET/library9' => 'dev-master',
77            'ASSET/library10' => '1.0.0',
78            'ASSET/library11' => '*',
79            'ASSET/library12' => '>=1 <2',
80            'ASSET/library13' => '>=1 <2',
81            'ASSET/library14' => '*',
82            'ASSET/library15' => '*',
83            'ASSET/library16' => '>=1 <2',
84            'ASSET/test-library17-file' => '*',
85            'ASSET/test-library18-file' => '1.2.3',
86            'ASSET/test-library19-file' => '*',
87            'ASSET/test-library20-file' => '*',
88            'ASSET/library21' => '1 || 2',
89        ), $composer['require']);
90
91        $this->assertArrayNotHasKey('require-dev', $composer);
92
93        $this->assertArrayHasKey('bin', $composer);
94        $this->assertInternalType('array', $composer['bin']);
95        $this->assertSame($this->asset['bin'], $composer['bin'][0]);
96
97        $this->assertArrayHasKey('extra', $composer);
98
99        $this->assertArrayHasKey('npm-asset-bugs', $composer['extra']);
100        $this->assertSame($this->asset['bugs'], $composer['extra']['npm-asset-bugs']);
101
102        $this->assertArrayHasKey('npm-asset-files', $composer['extra']);
103        $this->assertSame($this->asset['files'], $composer['extra']['npm-asset-files']);
104
105        $this->assertArrayHasKey('npm-asset-main', $composer['extra']);
106        $this->assertSame($this->asset['main'], $composer['extra']['npm-asset-main']);
107
108        $this->assertArrayHasKey('npm-asset-man', $composer['extra']);
109        $this->assertSame($this->asset['man'], $composer['extra']['npm-asset-man']);
110
111        $this->assertArrayHasKey('npm-asset-directories', $composer['extra']);
112        $this->assertSame($this->asset['directories'], $composer['extra']['npm-asset-directories']);
113
114        $this->assertArrayHasKey('npm-asset-repository', $composer['extra']);
115        $this->assertSame($this->asset['repository'], $composer['extra']['npm-asset-repository']);
116
117        $this->assertArrayHasKey('npm-asset-scripts', $composer['extra']);
118        $this->assertSame($this->asset['scripts'], $composer['extra']['npm-asset-scripts']);
119
120        $this->assertArrayHasKey('npm-asset-config', $composer['extra']);
121        $this->assertSame($this->asset['config'], $composer['extra']['npm-asset-config']);
122
123        $this->assertArrayHasKey('npm-asset-bundled-dependencies', $composer['extra']);
124        $this->assertSame($this->asset['bundledDependencies'], $composer['extra']['npm-asset-bundled-dependencies']);
125
126        $this->assertArrayHasKey('npm-asset-optional-dependencies', $composer['extra']);
127        $this->assertSame($this->asset['optionalDependencies'], $composer['extra']['npm-asset-optional-dependencies']);
128
129        $this->assertArrayHasKey('npm-asset-engines', $composer['extra']);
130        $this->assertSame($this->asset['engines'], $composer['extra']['npm-asset-engines']);
131
132        $this->assertArrayHasKey('npm-asset-engine-strict', $composer['extra']);
133        $this->assertSame($this->asset['engineStrict'], $composer['extra']['npm-asset-engine-strict']);
134
135        $this->assertArrayHasKey('npm-asset-os', $composer['extra']);
136        $this->assertSame($this->asset['os'], $composer['extra']['npm-asset-os']);
137
138        $this->assertArrayHasKey('npm-asset-cpu', $composer['extra']);
139        $this->assertSame($this->asset['cpu'], $composer['extra']['npm-asset-cpu']);
140
141        $this->assertArrayHasKey('npm-asset-prefer-global', $composer['extra']);
142        $this->assertSame($this->asset['preferGlobal'], $composer['extra']['npm-asset-prefer-global']);
143
144        $this->assertArrayHasKey('npm-asset-private', $composer['extra']);
145        $this->assertSame($this->asset['private'], $composer['extra']['npm-asset-private']);
146
147        $this->assertArrayHasKey('npm-asset-publish-config', $composer['extra']);
148        $this->assertSame($this->asset['publishConfig'], $composer['extra']['npm-asset-publish-config']);
149
150        $this->assertArrayNotHasKey('time', $composer);
151        $this->assertArrayNotHasKey('support', $composer);
152        $this->assertArrayNotHasKey('conflict', $composer);
153        $this->assertArrayNotHasKey('replace', $composer);
154        $this->assertArrayNotHasKey('provide', $composer);
155        $this->assertArrayNotHasKey('suggest', $composer);
156        $this->assertArrayNotHasKey('autoload', $composer);
157        $this->assertArrayNotHasKey('autoload-dev', $composer);
158        $this->assertArrayNotHasKey('include-path', $composer);
159        $this->assertArrayNotHasKey('target-dir', $composer);
160        $this->assertArrayNotHasKey('archive', $composer);
161    }
162
163    public function testConvertWithScope()
164    {
165        $this->asset = $this->loadPackage('npm-scope.json');
166        $composer = $this->converter->convert($this->asset);
167
168        $this->assertArrayHasKey('name', $composer);
169        $this->assertSame('ASSET/scope--test', $composer['name']);
170
171        $this->assertArrayHasKey('require', $composer);
172        $this->assertSame(array(
173            'ASSET/scope--library1' => '>= 1.0.0',
174            'ASSET/scope2--library2' => '>= 1.0.0',
175        ), $composer['require']);
176
177        $this->assertArrayNotHasKey('require-dev', $composer);
178    }
179
180    public function getConvertDistData()
181    {
182        return array(
183            array(array('type' => null), array()),
184            array(array('foo' => 'http://example.com'), array()), // unknown downloader type
185            array(array('gzip' => 'http://example.com'), array('type' => 'gzip', 'url' => 'https://example.com')),
186            array(array('tarball' => 'http://example.com'), array('type' => 'tar', 'url' => 'https://example.com')),
187            array(
188                array('shasum' => 'abcdef0123456789abcdef0123456789abcdef01'),
189                array('shasum' => 'abcdef0123456789abcdef0123456789abcdef01'),
190            ),
191        );
192    }
193
194    /**
195     * @dataProvider getConvertDistData
196     *
197     * @param array $value  The value must be converted
198     * @param array $result The result of convertion
199     */
200    public function testConvertDist($value, $result)
201    {
202        $this->assertSame($result, NpmPackageUtil::convertDist($value));
203    }
204
205    /**
206     * Load the package.
207     *
208     * @param string $package The package file name
209     *
210     * @return array
211     */
212    private function loadPackage($package = 'npm.json')
213    {
214        return (array) json_decode(file_get_contents(__DIR__.'/../Fixtures/package/'.$package), true);
215    }
216}
217