JsonManipulatorTest.php 23 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129
  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. 'require',
  30. 'vendor/baz',
  31. 'qux',
  32. '{
  33. "require": {
  34. "vendor/baz": "qux"
  35. }
  36. }
  37. '
  38. ),
  39. array(
  40. '{
  41. "foo": "bar"
  42. }',
  43. 'require',
  44. 'vendor/baz',
  45. 'qux',
  46. '{
  47. "foo": "bar",
  48. "require": {
  49. "vendor/baz": "qux"
  50. }
  51. }
  52. '
  53. ),
  54. array(
  55. '{
  56. "require": {
  57. }
  58. }',
  59. 'require',
  60. 'vendor/baz',
  61. 'qux',
  62. '{
  63. "require": {
  64. "vendor/baz": "qux"
  65. }
  66. }
  67. '
  68. ),
  69. array(
  70. '{
  71. "empty": "",
  72. "require": {
  73. "foo": "bar"
  74. }
  75. }',
  76. 'require',
  77. 'vendor/baz',
  78. 'qux',
  79. '{
  80. "empty": "",
  81. "require": {
  82. "foo": "bar",
  83. "vendor/baz": "qux"
  84. }
  85. }
  86. '
  87. ),
  88. array(
  89. '{
  90. "require":
  91. {
  92. "foo": "bar",
  93. "vendor/baz": "baz"
  94. }
  95. }',
  96. 'require',
  97. 'vendor/baz',
  98. 'qux',
  99. '{
  100. "require":
  101. {
  102. "foo": "bar",
  103. "vendor/baz": "qux"
  104. }
  105. }
  106. '
  107. ),
  108. array(
  109. '{
  110. "require":
  111. {
  112. "foo": "bar",
  113. "vendor\/baz": "baz"
  114. }
  115. }',
  116. 'require',
  117. 'vendor/baz',
  118. 'qux',
  119. '{
  120. "require":
  121. {
  122. "foo": "bar",
  123. "vendor/baz": "qux"
  124. }
  125. }
  126. '
  127. ),
  128. array(
  129. '{
  130. "require": {
  131. "foo": "bar"
  132. },
  133. "repositories": [{
  134. "type": "package",
  135. "package": {
  136. "require": {
  137. "foo": "bar"
  138. }
  139. }
  140. }]
  141. }',
  142. 'require',
  143. 'foo',
  144. 'qux',
  145. '{
  146. "require": {
  147. "foo": "qux"
  148. },
  149. "repositories": [{
  150. "type": "package",
  151. "package": {
  152. "require": {
  153. "foo": "bar"
  154. }
  155. }
  156. }]
  157. }
  158. '
  159. ),
  160. array(
  161. '{
  162. "repositories": [{
  163. "type": "package",
  164. "package": {
  165. "require": {
  166. "foo": "bar"
  167. }
  168. }
  169. }]
  170. }',
  171. 'require',
  172. 'foo',
  173. 'qux',
  174. '{
  175. "repositories": [{
  176. "type": "package",
  177. "package": {
  178. "require": {
  179. "foo": "bar"
  180. }
  181. }
  182. }],
  183. "require": {
  184. "foo": "qux"
  185. }
  186. }
  187. '
  188. ),
  189. array(
  190. '{
  191. "require": {
  192. "php": "5.*"
  193. }
  194. }',
  195. 'require-dev',
  196. 'foo',
  197. 'qux',
  198. '{
  199. "require": {
  200. "php": "5.*"
  201. },
  202. "require-dev": {
  203. "foo": "qux"
  204. }
  205. }
  206. '
  207. ),
  208. array(
  209. '{
  210. "require": {
  211. "php": "5.*"
  212. },
  213. "require-dev": {
  214. "foo": "bar"
  215. }
  216. }',
  217. 'require-dev',
  218. 'foo',
  219. 'qux',
  220. '{
  221. "require": {
  222. "php": "5.*"
  223. },
  224. "require-dev": {
  225. "foo": "qux"
  226. }
  227. }
  228. '
  229. ),
  230. array(
  231. '{
  232. "repositories": [{
  233. "type": "package",
  234. "package": {
  235. "bar": "ba[z",
  236. "dist": {
  237. "url": "http...",
  238. "type": "zip"
  239. },
  240. "autoload": {
  241. "classmap": [ "foo/bar" ]
  242. }
  243. }
  244. }],
  245. "require": {
  246. "php": "5.*"
  247. },
  248. "require-dev": {
  249. "foo": "bar"
  250. }
  251. }',
  252. 'require-dev',
  253. 'foo',
  254. 'qux',
  255. '{
  256. "repositories": [{
  257. "type": "package",
  258. "package": {
  259. "bar": "ba[z",
  260. "dist": {
  261. "url": "http...",
  262. "type": "zip"
  263. },
  264. "autoload": {
  265. "classmap": [ "foo/bar" ]
  266. }
  267. }
  268. }],
  269. "require": {
  270. "php": "5.*"
  271. },
  272. "require-dev": {
  273. "foo": "qux"
  274. }
  275. }
  276. '
  277. ),
  278. );
  279. }
  280. /**
  281. * @dataProvider providerAddLinkAndSortPackages
  282. */
  283. public function testAddLinkAndSortPackages($json, $type, $package, $constraint, $sortPackages, $expected)
  284. {
  285. $manipulator = new JsonManipulator($json);
  286. $this->assertTrue($manipulator->addLink($type, $package, $constraint, $sortPackages));
  287. $this->assertEquals($expected, $manipulator->getContents());
  288. }
  289. public function providerAddLinkAndSortPackages()
  290. {
  291. return array(
  292. array(
  293. '{
  294. "require": {
  295. "vendor/baz": "qux"
  296. }
  297. }',
  298. 'require',
  299. 'foo',
  300. 'bar',
  301. true,
  302. '{
  303. "require": {
  304. "foo": "bar",
  305. "vendor/baz": "qux"
  306. }
  307. }
  308. '
  309. ),
  310. array(
  311. '{
  312. "require": {
  313. "vendor/baz": "qux"
  314. }
  315. }',
  316. 'require',
  317. 'foo',
  318. 'bar',
  319. false,
  320. '{
  321. "require": {
  322. "vendor/baz": "qux",
  323. "foo": "bar"
  324. }
  325. }
  326. '
  327. ),
  328. array(
  329. '{
  330. "require": {
  331. "foo": "baz",
  332. "ext-mcrypt": "*",
  333. "ext-gd": "*",
  334. "lib-foo": "*",
  335. "hhvm": "*",
  336. "php": ">=5.5"
  337. }
  338. }',
  339. 'require',
  340. 'igorw/retry',
  341. '*',
  342. true,
  343. '{
  344. "require": {
  345. "php": ">=5.5",
  346. "hhvm": "*",
  347. "ext-gd": "*",
  348. "ext-mcrypt": "*",
  349. "lib-foo": "*",
  350. "foo": "baz",
  351. "igorw/retry": "*"
  352. }
  353. }
  354. ',
  355. ),
  356. );
  357. }
  358. /**
  359. * @dataProvider removeSubNodeProvider
  360. */
  361. public function testRemoveSubNode($json, $name, $expected, $expectedContent = null)
  362. {
  363. $manipulator = new JsonManipulator($json);
  364. $this->assertEquals($expected, $manipulator->removeSubNode('repositories', $name));
  365. if (null !== $expectedContent) {
  366. $this->assertEquals($expectedContent, $manipulator->getContents());
  367. }
  368. }
  369. public function removeSubNodeProvider()
  370. {
  371. return array(
  372. 'works on simple ones first' => array(
  373. '{
  374. "repositories": {
  375. "foo": {
  376. "foo": "bar",
  377. "bar": "baz"
  378. },
  379. "bar": {
  380. "foo": "bar",
  381. "bar": "baz"
  382. }
  383. }
  384. }',
  385. 'foo',
  386. true,
  387. '{
  388. "repositories": {
  389. "bar": {
  390. "foo": "bar",
  391. "bar": "baz"
  392. }
  393. }
  394. }
  395. '
  396. ),
  397. 'works on simple ones last' => array(
  398. '{
  399. "repositories": {
  400. "foo": {
  401. "foo": "bar",
  402. "bar": "baz"
  403. },
  404. "bar": {
  405. "foo": "bar",
  406. "bar": "baz"
  407. }
  408. }
  409. }',
  410. 'bar',
  411. true,
  412. '{
  413. "repositories": {
  414. "foo": {
  415. "foo": "bar",
  416. "bar": "baz"
  417. }
  418. }
  419. }
  420. '
  421. ),
  422. 'works on simple ones unique' => array(
  423. '{
  424. "repositories": {
  425. "foo": {
  426. "foo": "bar",
  427. "bar": "baz"
  428. }
  429. }
  430. }',
  431. 'foo',
  432. true,
  433. '{
  434. "repositories": {
  435. }
  436. }
  437. '
  438. ),
  439. 'works on simple ones middle' => array(
  440. '{
  441. "repositories": {
  442. "foo": {
  443. "foo": "bar",
  444. "bar": "baz"
  445. },
  446. "bar": {
  447. "foo": "bar",
  448. "bar": "baz"
  449. },
  450. "baz": {
  451. "foo": "bar",
  452. "bar": "baz"
  453. }
  454. }
  455. }',
  456. 'bar',
  457. true,
  458. '{
  459. "repositories": {
  460. "foo": {
  461. "foo": "bar",
  462. "bar": "baz"
  463. },
  464. "baz": {
  465. "foo": "bar",
  466. "bar": "baz"
  467. }
  468. }
  469. }
  470. '
  471. ),
  472. 'works on undefined ones' => array(
  473. '{
  474. "repositories": {
  475. "main": {
  476. "foo": "bar",
  477. "bar": "baz"
  478. }
  479. }
  480. }',
  481. 'removenotthere',
  482. true,
  483. '{
  484. "repositories": {
  485. "main": {
  486. "foo": "bar",
  487. "bar": "baz"
  488. }
  489. }
  490. }
  491. '
  492. ),
  493. 'works on child having unmatched name' => array(
  494. '{
  495. "repositories": {
  496. "baz": {
  497. "foo": "bar",
  498. "bar": "baz"
  499. }
  500. }
  501. }',
  502. 'bar',
  503. true,
  504. '{
  505. "repositories": {
  506. "baz": {
  507. "foo": "bar",
  508. "bar": "baz"
  509. }
  510. }
  511. }
  512. '
  513. ),
  514. 'works on child having duplicate name' => array(
  515. '{
  516. "repositories": {
  517. "foo": {
  518. "baz": "qux"
  519. },
  520. "baz": {
  521. "foo": "bar",
  522. "bar": "baz"
  523. }
  524. }
  525. }',
  526. 'baz',
  527. true,
  528. '{
  529. "repositories": {
  530. "foo": {
  531. "baz": "qux"
  532. }
  533. }
  534. }
  535. '
  536. ),
  537. 'works on empty repos' => array(
  538. '{
  539. "repositories": {
  540. }
  541. }',
  542. 'bar',
  543. true
  544. ),
  545. 'works on empty repos2' => array(
  546. '{
  547. "repositories": {}
  548. }',
  549. 'bar',
  550. true
  551. ),
  552. 'works on missing repos' => array(
  553. "{\n}",
  554. 'bar',
  555. true
  556. ),
  557. 'works on deep repos' => array(
  558. '{
  559. "repositories": {
  560. "foo": {
  561. "package": { "bar": "baz" }
  562. }
  563. }
  564. }',
  565. 'foo',
  566. true,
  567. '{
  568. "repositories": {
  569. }
  570. }
  571. '
  572. ),
  573. 'fails on deep repos with borked texts' => array(
  574. '{
  575. "repositories": {
  576. "foo": {
  577. "package": { "bar": "ba{z" }
  578. }
  579. }
  580. }',
  581. 'bar',
  582. false
  583. ),
  584. 'fails on deep repos with borked texts2' => array(
  585. '{
  586. "repositories": {
  587. "foo": {
  588. "package": { "bar": "ba}z" }
  589. }
  590. }
  591. }',
  592. 'bar',
  593. false
  594. ),
  595. 'fails on deep arrays with borked texts' => array(
  596. '{
  597. "repositories": [
  598. {
  599. "package": { "bar": "ba[z" }
  600. }
  601. ]
  602. }',
  603. 'bar',
  604. false
  605. ),
  606. 'fails on deep arrays with borked texts2' => array(
  607. '{
  608. "repositories": [
  609. {
  610. "package": { "bar": "ba]z" }
  611. }
  612. ]
  613. }',
  614. 'bar',
  615. false
  616. ),
  617. );
  618. }
  619. public function testRemoveSubNodeFromRequire()
  620. {
  621. $manipulator = new JsonManipulator('{
  622. "repositories": [
  623. {
  624. "package": {
  625. "require": {
  626. "this/should-not-end-up-in-root-require": "~2.0"
  627. },
  628. "require-dev": {
  629. "this/should-not-end-up-in-root-require-dev": "~2.0"
  630. }
  631. }
  632. }
  633. ],
  634. "require": {
  635. "package/a": "*",
  636. "package/b": "*",
  637. "package/c": "*"
  638. },
  639. "require-dev": {
  640. "package/d": "*"
  641. }
  642. }');
  643. $this->assertTrue($manipulator->removeSubNode('require', 'package/c'));
  644. $this->assertTrue($manipulator->removeSubNode('require-dev', 'package/d'));
  645. $this->assertEquals('{
  646. "repositories": [
  647. {
  648. "package": {
  649. "require": {
  650. "this/should-not-end-up-in-root-require": "~2.0"
  651. },
  652. "require-dev": {
  653. "this/should-not-end-up-in-root-require-dev": "~2.0"
  654. }
  655. }
  656. }
  657. ],
  658. "require": {
  659. "package/a": "*",
  660. "package/b": "*"
  661. },
  662. "require-dev": {
  663. }
  664. }
  665. ', $manipulator->getContents());
  666. }
  667. public function testAddSubNodeInRequire()
  668. {
  669. $manipulator = new JsonManipulator('{
  670. "repositories": [
  671. {
  672. "package": {
  673. "require": {
  674. "this/should-not-end-up-in-root-require": "~2.0"
  675. },
  676. "require-dev": {
  677. "this/should-not-end-up-in-root-require-dev": "~2.0"
  678. }
  679. }
  680. }
  681. ],
  682. "require": {
  683. "package/a": "*",
  684. "package/b": "*"
  685. },
  686. "require-dev": {
  687. "package/d": "*"
  688. }
  689. }');
  690. $this->assertTrue($manipulator->addSubNode('require', 'package/c', '*'));
  691. $this->assertTrue($manipulator->addSubNode('require-dev', 'package/e', '*'));
  692. $this->assertEquals('{
  693. "repositories": [
  694. {
  695. "package": {
  696. "require": {
  697. "this/should-not-end-up-in-root-require": "~2.0"
  698. },
  699. "require-dev": {
  700. "this/should-not-end-up-in-root-require-dev": "~2.0"
  701. }
  702. }
  703. }
  704. ],
  705. "require": {
  706. "package/a": "*",
  707. "package/b": "*",
  708. "package/c": "*"
  709. },
  710. "require-dev": {
  711. "package/d": "*",
  712. "package/e": "*"
  713. }
  714. }
  715. ', $manipulator->getContents());
  716. }
  717. public function testAddRepositoryCanInitializeEmptyRepositories()
  718. {
  719. $manipulator = new JsonManipulator('{
  720. "repositories": {
  721. }
  722. }');
  723. $this->assertTrue($manipulator->addRepository('bar', array('type' => 'composer')));
  724. $this->assertEquals('{
  725. "repositories": {
  726. "bar": {
  727. "type": "composer"
  728. }
  729. }
  730. }
  731. ', $manipulator->getContents());
  732. }
  733. public function testAddRepositoryCanInitializeFromScratch()
  734. {
  735. $manipulator = new JsonManipulator("{
  736. \t\"a\": \"b\"
  737. }");
  738. $this->assertTrue($manipulator->addRepository('bar2', array('type' => 'composer')));
  739. $this->assertEquals("{
  740. \t\"a\": \"b\",
  741. \t\"repositories\": {
  742. \t\t\"bar2\": {
  743. \t\t\t\"type\": \"composer\"
  744. \t\t}
  745. \t}
  746. }
  747. ", $manipulator->getContents());
  748. }
  749. public function testAddRepositoryCanAdd()
  750. {
  751. $manipulator = new JsonManipulator('{
  752. "repositories": {
  753. "foo": {
  754. "type": "vcs",
  755. "url": "lala"
  756. }
  757. }
  758. }');
  759. $this->assertTrue($manipulator->addRepository('bar', array('type' => 'composer')));
  760. $this->assertEquals('{
  761. "repositories": {
  762. "foo": {
  763. "type": "vcs",
  764. "url": "lala"
  765. },
  766. "bar": {
  767. "type": "composer"
  768. }
  769. }
  770. }
  771. ', $manipulator->getContents());
  772. }
  773. public function testAddRepositoryCanOverrideDeepRepos()
  774. {
  775. $manipulator = new JsonManipulator('{
  776. "repositories": {
  777. "baz": {
  778. "type": "package",
  779. "package": {}
  780. }
  781. }
  782. }');
  783. $this->assertTrue($manipulator->addRepository('baz', array('type' => 'composer')));
  784. $this->assertEquals('{
  785. "repositories": {
  786. "baz": {
  787. "type": "composer"
  788. }
  789. }
  790. }
  791. ', $manipulator->getContents());
  792. }
  793. public function testAddConfigSettingEscapes()
  794. {
  795. $manipulator = new JsonManipulator('{
  796. "config": {
  797. }
  798. }');
  799. $this->assertTrue($manipulator->addConfigSetting('test', 'a\b'));
  800. $this->assertTrue($manipulator->addConfigSetting('test2', "a\nb\fa"));
  801. $this->assertEquals('{
  802. "config": {
  803. "test": "a\\\\b",
  804. "test2": "a\nb\fa"
  805. }
  806. }
  807. ', $manipulator->getContents());
  808. }
  809. public function testAddConfigSettingCanAdd()
  810. {
  811. $manipulator = new JsonManipulator('{
  812. "config": {
  813. "foo": "bar"
  814. }
  815. }');
  816. $this->assertTrue($manipulator->addConfigSetting('bar', 'baz'));
  817. $this->assertEquals('{
  818. "config": {
  819. "foo": "bar",
  820. "bar": "baz"
  821. }
  822. }
  823. ', $manipulator->getContents());
  824. }
  825. public function testAddConfigSettingCanOverwrite()
  826. {
  827. $manipulator = new JsonManipulator('{
  828. "config": {
  829. "foo": "bar",
  830. "bar": "baz"
  831. }
  832. }');
  833. $this->assertTrue($manipulator->addConfigSetting('foo', 'zomg'));
  834. $this->assertEquals('{
  835. "config": {
  836. "foo": "zomg",
  837. "bar": "baz"
  838. }
  839. }
  840. ', $manipulator->getContents());
  841. }
  842. public function testAddConfigSettingCanOverwriteNumbers()
  843. {
  844. $manipulator = new JsonManipulator('{
  845. "config": {
  846. "foo": 500
  847. }
  848. }');
  849. $this->assertTrue($manipulator->addConfigSetting('foo', 50));
  850. $this->assertEquals('{
  851. "config": {
  852. "foo": 50
  853. }
  854. }
  855. ', $manipulator->getContents());
  856. }
  857. public function testAddConfigSettingCanOverwriteArrays()
  858. {
  859. $manipulator = new JsonManipulator('{
  860. "config": {
  861. "github-oauth": {
  862. "github.com": "foo"
  863. },
  864. "github-protocols": ["https"]
  865. }
  866. }');
  867. $this->assertTrue($manipulator->addConfigSetting('github-protocols', array('https', 'http')));
  868. $this->assertEquals('{
  869. "config": {
  870. "github-oauth": {
  871. "github.com": "foo"
  872. },
  873. "github-protocols": ["https", "http"]
  874. }
  875. }
  876. ', $manipulator->getContents());
  877. $this->assertTrue($manipulator->addConfigSetting('github-oauth', array('github.com' => 'bar', 'alt.example.org' => 'baz')));
  878. $this->assertEquals('{
  879. "config": {
  880. "github-oauth": {
  881. "github.com": "bar",
  882. "alt.example.org": "baz"
  883. },
  884. "github-protocols": ["https", "http"]
  885. }
  886. }
  887. ', $manipulator->getContents());
  888. }
  889. public function testAddConfigSettingCanAddSubKeyInEmptyConfig()
  890. {
  891. $manipulator = new JsonManipulator('{
  892. "config": {
  893. }
  894. }');
  895. $this->assertTrue($manipulator->addConfigSetting('github-oauth.bar', 'baz'));
  896. $this->assertEquals('{
  897. "config": {
  898. "github-oauth": {
  899. "bar": "baz"
  900. }
  901. }
  902. }
  903. ', $manipulator->getContents());
  904. }
  905. public function testAddConfigSettingCanAddSubKeyInEmptyVal()
  906. {
  907. $manipulator = new JsonManipulator('{
  908. "config": {
  909. "github-oauth": {},
  910. "github-oauth2": {
  911. }
  912. }
  913. }');
  914. $this->assertTrue($manipulator->addConfigSetting('github-oauth.bar', 'baz'));
  915. $this->assertTrue($manipulator->addConfigSetting('github-oauth2.a.bar', 'baz2'));
  916. $this->assertTrue($manipulator->addConfigSetting('github-oauth3.b', 'c'));
  917. $this->assertEquals('{
  918. "config": {
  919. "github-oauth": {
  920. "bar": "baz"
  921. },
  922. "github-oauth2": {
  923. "a.bar": "baz2"
  924. },
  925. "github-oauth3": {
  926. "b": "c"
  927. }
  928. }
  929. }
  930. ', $manipulator->getContents());
  931. }
  932. public function testAddConfigSettingCanAddSubKeyInHash()
  933. {
  934. $manipulator = new JsonManipulator('{
  935. "config": {
  936. "github-oauth": {
  937. "github.com": "foo"
  938. }
  939. }
  940. }');
  941. $this->assertTrue($manipulator->addConfigSetting('github-oauth.bar', 'baz'));
  942. $this->assertEquals('{
  943. "config": {
  944. "github-oauth": {
  945. "github.com": "foo",
  946. "bar": "baz"
  947. }
  948. }
  949. }
  950. ', $manipulator->getContents());
  951. }
  952. public function testAddRootSettingDoesNotBreakDots()
  953. {
  954. $manipulator = new JsonManipulator('{
  955. "github-oauth": {
  956. "github.com": "foo"
  957. }
  958. }');
  959. $this->assertTrue($manipulator->addSubNode('github-oauth', 'bar', 'baz'));
  960. $this->assertEquals('{
  961. "github-oauth": {
  962. "github.com": "foo",
  963. "bar": "baz"
  964. }
  965. }
  966. ', $manipulator->getContents());
  967. }
  968. public function testRemoveConfigSettingCanRemoveSubKeyInHash()
  969. {
  970. $manipulator = new JsonManipulator('{
  971. "config": {
  972. "github-oauth": {
  973. "github.com": "foo",
  974. "bar": "baz"
  975. }
  976. }
  977. }');
  978. $this->assertTrue($manipulator->removeConfigSetting('github-oauth.bar'));
  979. $this->assertEquals('{
  980. "config": {
  981. "github-oauth": {
  982. "github.com": "foo"
  983. }
  984. }
  985. }
  986. ', $manipulator->getContents());
  987. }
  988. public function testRemoveConfigSettingCanRemoveSubKeyInHashWithSiblings()
  989. {
  990. $manipulator = new JsonManipulator('{
  991. "config": {
  992. "foo": "bar",
  993. "github-oauth": {
  994. "github.com": "foo",
  995. "bar": "baz"
  996. }
  997. }
  998. }');
  999. $this->assertTrue($manipulator->removeConfigSetting('github-oauth.bar'));
  1000. $this->assertEquals('{
  1001. "config": {
  1002. "foo": "bar",
  1003. "github-oauth": {
  1004. "github.com": "foo"
  1005. }
  1006. }
  1007. }
  1008. ', $manipulator->getContents());
  1009. }
  1010. public function testAddMainKey()
  1011. {
  1012. $manipulator = new JsonManipulator('{
  1013. "foo": "bar"
  1014. }');
  1015. $this->assertTrue($manipulator->addMainKey('bar', 'baz'));
  1016. $this->assertEquals('{
  1017. "foo": "bar",
  1018. "bar": "baz"
  1019. }
  1020. ', $manipulator->getContents());
  1021. }
  1022. public function testUpdateMainKey()
  1023. {
  1024. $manipulator = new JsonManipulator('{
  1025. "foo": "bar"
  1026. }');
  1027. $this->assertTrue($manipulator->addMainKey('foo', 'baz'));
  1028. $this->assertEquals('{
  1029. "foo": "baz"
  1030. }
  1031. ', $manipulator->getContents());
  1032. }
  1033. public function testUpdateMainKey2()
  1034. {
  1035. $manipulator = new JsonManipulator('{
  1036. "a": {
  1037. "foo": "bar",
  1038. "baz": "qux"
  1039. },
  1040. "foo": "bar",
  1041. "baz": "bar"
  1042. }');
  1043. $this->assertTrue($manipulator->addMainKey('foo', 'baz'));
  1044. $this->assertTrue($manipulator->addMainKey('baz', 'quux'));
  1045. $this->assertEquals('{
  1046. "a": {
  1047. "foo": "bar",
  1048. "baz": "qux"
  1049. },
  1050. "foo": "baz",
  1051. "baz": "quux"
  1052. }
  1053. ', $manipulator->getContents());
  1054. }
  1055. public function testUpdateMainKey3()
  1056. {
  1057. $manipulator = new JsonManipulator('{
  1058. "require": {
  1059. "php": "5.*"
  1060. },
  1061. "require-dev": {
  1062. "foo": "bar"
  1063. }
  1064. }');
  1065. $this->assertTrue($manipulator->addMainKey('require-dev', array('foo' => 'qux')));
  1066. $this->assertEquals('{
  1067. "require": {
  1068. "php": "5.*"
  1069. },
  1070. "require-dev": {
  1071. "foo": "qux"
  1072. }
  1073. }
  1074. ', $manipulator->getContents());
  1075. }
  1076. }