JsonManipulatorTest.php 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449
  1. <?php
  2. /*
  3. * This file is part of Composer.
  4. *
  5. * (c) Nils Adermann <naderman@naderman.de>
  6. * Jordi Boggiano <j.boggiano@seld.be>
  7. *
  8. * For the full copyright and license information, please view the LICENSE
  9. * file that was distributed with this source code.
  10. */
  11. namespace Composer\Test\Json;
  12. use Composer\Json\JsonManipulator;
  13. class JsonManipulatorTest extends \PHPUnit_Framework_TestCase
  14. {
  15. /**
  16. * @dataProvider linkProvider
  17. */
  18. public function testAddLink($json, $type, $package, $constraint, $expected)
  19. {
  20. $manipulator = new JsonManipulator($json);
  21. $this->assertTrue($manipulator->addLink($type, $package, $constraint));
  22. $this->assertEquals($expected, $manipulator->getContents());
  23. }
  24. public function linkProvider()
  25. {
  26. return array(
  27. array(
  28. '{
  29. }',
  30. 'require',
  31. 'vendor/baz',
  32. 'qux',
  33. '{
  34. "require": {
  35. "vendor/baz": "qux"
  36. }
  37. }
  38. '
  39. ),
  40. array(
  41. '{
  42. "foo": "bar"
  43. }',
  44. 'require',
  45. 'vendor/baz',
  46. 'qux',
  47. '{
  48. "foo": "bar",
  49. "require": {
  50. "vendor/baz": "qux"
  51. }
  52. }
  53. '
  54. ),
  55. array(
  56. '{
  57. "require": {
  58. }
  59. }',
  60. 'require',
  61. 'vendor/baz',
  62. 'qux',
  63. '{
  64. "require": {
  65. "vendor/baz": "qux"
  66. }
  67. }
  68. '
  69. ),
  70. array(
  71. '{
  72. "require": {
  73. "foo": "bar"
  74. }
  75. }',
  76. 'require',
  77. 'vendor/baz',
  78. 'qux',
  79. '{
  80. "require": {
  81. "foo": "bar",
  82. "vendor/baz": "qux"
  83. }
  84. }
  85. '
  86. ),
  87. array(
  88. '{
  89. "require":
  90. {
  91. "foo": "bar",
  92. "vendor/baz": "baz"
  93. }
  94. }',
  95. 'require',
  96. 'vendor/baz',
  97. 'qux',
  98. '{
  99. "require":
  100. {
  101. "foo": "bar",
  102. "vendor/baz": "qux"
  103. }
  104. }
  105. '
  106. ),
  107. array(
  108. '{
  109. "require":
  110. {
  111. "foo": "bar",
  112. "vendor\/baz": "baz"
  113. }
  114. }',
  115. 'require',
  116. 'vendor/baz',
  117. 'qux',
  118. '{
  119. "require":
  120. {
  121. "foo": "bar",
  122. "vendor/baz": "qux"
  123. }
  124. }
  125. '
  126. ),
  127. );
  128. }
  129. /**
  130. * @dataProvider removeSubNodeProvider
  131. */
  132. public function testRemoveSubNode($json, $name, $expected, $expectedContent = null)
  133. {
  134. $manipulator = new JsonManipulator($json);
  135. $this->assertEquals($expected, $manipulator->removeSubNode('repositories', $name));
  136. if (null !== $expectedContent) {
  137. $this->assertEquals($expectedContent, $manipulator->getContents());
  138. }
  139. }
  140. public function removeSubNodeProvider()
  141. {
  142. return array(
  143. 'works on simple ones first' => array(
  144. '{
  145. "repositories": {
  146. "foo": {
  147. "foo": "bar",
  148. "bar": "baz"
  149. },
  150. "bar": {
  151. "foo": "bar",
  152. "bar": "baz"
  153. }
  154. }
  155. }',
  156. 'foo',
  157. true,
  158. '{
  159. "repositories": {
  160. "bar": {
  161. "foo": "bar",
  162. "bar": "baz"
  163. }
  164. }
  165. }
  166. '
  167. ),
  168. 'works on simple ones last' => array(
  169. '{
  170. "repositories": {
  171. "foo": {
  172. "foo": "bar",
  173. "bar": "baz"
  174. },
  175. "bar": {
  176. "foo": "bar",
  177. "bar": "baz"
  178. }
  179. }
  180. }',
  181. 'bar',
  182. true,
  183. '{
  184. "repositories": {
  185. "foo": {
  186. "foo": "bar",
  187. "bar": "baz"
  188. }
  189. }
  190. }
  191. '
  192. ),
  193. 'works on simple ones unique' => array(
  194. '{
  195. "repositories": {
  196. "foo": {
  197. "foo": "bar",
  198. "bar": "baz"
  199. }
  200. }
  201. }',
  202. 'foo',
  203. true,
  204. '{
  205. "repositories": {
  206. }
  207. }
  208. '
  209. ),
  210. 'works on simple ones middle' => array(
  211. '{
  212. "repositories": {
  213. "foo": {
  214. "foo": "bar",
  215. "bar": "baz"
  216. },
  217. "bar": {
  218. "foo": "bar",
  219. "bar": "baz"
  220. },
  221. "baz": {
  222. "foo": "bar",
  223. "bar": "baz"
  224. }
  225. }
  226. }',
  227. 'bar',
  228. true,
  229. '{
  230. "repositories": {
  231. "foo": {
  232. "foo": "bar",
  233. "bar": "baz"
  234. },
  235. "baz": {
  236. "foo": "bar",
  237. "bar": "baz"
  238. }
  239. }
  240. }
  241. '
  242. ),
  243. 'works on empty repos' => array(
  244. '{
  245. "repositories": {
  246. }
  247. }',
  248. 'bar',
  249. true
  250. ),
  251. 'works on empty repos2' => array(
  252. '{
  253. "repositories": {}
  254. }',
  255. 'bar',
  256. true
  257. ),
  258. 'works on missing repos' => array(
  259. "{\n}",
  260. 'bar',
  261. true
  262. ),
  263. 'works on deep repos' => array(
  264. '{
  265. "repositories": {
  266. "foo": {
  267. "package": { "bar": "baz" }
  268. }
  269. }
  270. }',
  271. 'foo',
  272. true,
  273. '{
  274. "repositories": {
  275. }
  276. }
  277. '
  278. ),
  279. 'fails on deep repos with borked texts' => array(
  280. '{
  281. "repositories": {
  282. "foo": {
  283. "package": { "bar": "ba{z" }
  284. }
  285. }
  286. }',
  287. 'bar',
  288. false
  289. ),
  290. 'fails on deep repos with borked texts2' => array(
  291. '{
  292. "repositories": {
  293. "foo": {
  294. "package": { "bar": "ba}z" }
  295. }
  296. }
  297. }',
  298. 'bar',
  299. false
  300. ),
  301. );
  302. }
  303. public function testAddRepositoryCanInitializeEmptyRepositories()
  304. {
  305. $manipulator = new JsonManipulator('{
  306. "repositories": {
  307. }
  308. }');
  309. $this->assertTrue($manipulator->addRepository('bar', array('type' => 'composer')));
  310. $this->assertEquals('{
  311. "repositories": {
  312. "bar": {
  313. "type": "composer"
  314. }
  315. }
  316. }
  317. ', $manipulator->getContents());
  318. }
  319. public function testAddRepositoryCanInitializeFromScratch()
  320. {
  321. $manipulator = new JsonManipulator('{
  322. "a": "b"
  323. }');
  324. $this->assertTrue($manipulator->addRepository('bar2', array('type' => 'composer')));
  325. $this->assertEquals('{
  326. "a": "b",
  327. "repositories": {
  328. "bar2": {
  329. "type": "composer"
  330. }
  331. }
  332. }
  333. ', $manipulator->getContents());
  334. }
  335. public function testAddRepositoryCanAdd()
  336. {
  337. $manipulator = new JsonManipulator('{
  338. "repositories": {
  339. "foo": {
  340. "type": "vcs",
  341. "url": "lala"
  342. }
  343. }
  344. }');
  345. $this->assertTrue($manipulator->addRepository('bar', array('type' => 'composer')));
  346. $this->assertEquals('{
  347. "repositories": {
  348. "foo": {
  349. "type": "vcs",
  350. "url": "lala"
  351. },
  352. "bar": {
  353. "type": "composer"
  354. }
  355. }
  356. }
  357. ', $manipulator->getContents());
  358. }
  359. public function testAddRepositoryCanOverrideDeepRepos()
  360. {
  361. $manipulator = new JsonManipulator('{
  362. "repositories": {
  363. "baz": {
  364. "type": "package",
  365. "package": {}
  366. }
  367. }
  368. }');
  369. $this->assertTrue($manipulator->addRepository('baz', array('type' => 'composer')));
  370. $this->assertEquals('{
  371. "repositories": {
  372. "baz": {
  373. "type": "composer"
  374. }
  375. }
  376. }
  377. ', $manipulator->getContents());
  378. }
  379. public function testAddConfigSettingCanAdd()
  380. {
  381. $manipulator = new JsonManipulator('{
  382. "config": {
  383. "foo": "bar"
  384. }
  385. }');
  386. $this->assertTrue($manipulator->addConfigSetting('bar', 'baz'));
  387. $this->assertEquals('{
  388. "config": {
  389. "foo": "bar",
  390. "bar": "baz"
  391. }
  392. }
  393. ', $manipulator->getContents());
  394. }
  395. public function testAddConfigSettingCanOverwrite()
  396. {
  397. $manipulator = new JsonManipulator('{
  398. "config": {
  399. "foo": "bar",
  400. "bar": "baz"
  401. }
  402. }');
  403. $this->assertTrue($manipulator->addConfigSetting('foo', 'zomg'));
  404. $this->assertEquals('{
  405. "config": {
  406. "foo": "zomg",
  407. "bar": "baz"
  408. }
  409. }
  410. ', $manipulator->getContents());
  411. }
  412. public function testAddConfigSettingCanOverwriteNumbers()
  413. {
  414. $manipulator = new JsonManipulator('{
  415. "config": {
  416. "foo": 500
  417. }
  418. }');
  419. $this->assertTrue($manipulator->addConfigSetting('foo', 50));
  420. $this->assertEquals('{
  421. "config": {
  422. "foo": 50
  423. }
  424. }
  425. ', $manipulator->getContents());
  426. }
  427. }