JsonManipulatorTest.php 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167
  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 testAddConfigSettingWorksFromScratch()
  810. {
  811. $manipulator = new JsonManipulator('{
  812. }');
  813. $this->assertTrue($manipulator->addConfigSetting('foo.bar', 'baz'));
  814. $this->assertEquals('{
  815. "config": {
  816. "foo": {
  817. "bar": "baz"
  818. }
  819. }
  820. }
  821. ', $manipulator->getContents());
  822. }
  823. public function testAddConfigSettingCanAdd()
  824. {
  825. $manipulator = new JsonManipulator('{
  826. "config": {
  827. "foo": "bar"
  828. }
  829. }');
  830. $this->assertTrue($manipulator->addConfigSetting('bar', 'baz'));
  831. $this->assertEquals('{
  832. "config": {
  833. "foo": "bar",
  834. "bar": "baz"
  835. }
  836. }
  837. ', $manipulator->getContents());
  838. }
  839. public function testAddConfigSettingCanOverwrite()
  840. {
  841. $manipulator = new JsonManipulator('{
  842. "config": {
  843. "foo": "bar",
  844. "bar": "baz"
  845. }
  846. }');
  847. $this->assertTrue($manipulator->addConfigSetting('foo', 'zomg'));
  848. $this->assertEquals('{
  849. "config": {
  850. "foo": "zomg",
  851. "bar": "baz"
  852. }
  853. }
  854. ', $manipulator->getContents());
  855. }
  856. public function testAddConfigSettingCanOverwriteNumbers()
  857. {
  858. $manipulator = new JsonManipulator('{
  859. "config": {
  860. "foo": 500
  861. }
  862. }');
  863. $this->assertTrue($manipulator->addConfigSetting('foo', 50));
  864. $this->assertEquals('{
  865. "config": {
  866. "foo": 50
  867. }
  868. }
  869. ', $manipulator->getContents());
  870. }
  871. public function testAddConfigSettingCanOverwriteArrays()
  872. {
  873. $manipulator = new JsonManipulator('{
  874. "config": {
  875. "github-oauth": {
  876. "github.com": "foo"
  877. },
  878. "github-protocols": ["https"]
  879. }
  880. }');
  881. $this->assertTrue($manipulator->addConfigSetting('github-protocols', array('https', 'http')));
  882. $this->assertEquals('{
  883. "config": {
  884. "github-oauth": {
  885. "github.com": "foo"
  886. },
  887. "github-protocols": ["https", "http"]
  888. }
  889. }
  890. ', $manipulator->getContents());
  891. $this->assertTrue($manipulator->addConfigSetting('github-oauth', array('github.com' => 'bar', 'alt.example.org' => 'baz')));
  892. $this->assertEquals('{
  893. "config": {
  894. "github-oauth": {
  895. "github.com": "bar",
  896. "alt.example.org": "baz"
  897. },
  898. "github-protocols": ["https", "http"]
  899. }
  900. }
  901. ', $manipulator->getContents());
  902. }
  903. public function testAddConfigSettingCanAddSubKeyInEmptyConfig()
  904. {
  905. $manipulator = new JsonManipulator('{
  906. "config": {
  907. }
  908. }');
  909. $this->assertTrue($manipulator->addConfigSetting('github-oauth.bar', 'baz'));
  910. $this->assertEquals('{
  911. "config": {
  912. "github-oauth": {
  913. "bar": "baz"
  914. }
  915. }
  916. }
  917. ', $manipulator->getContents());
  918. }
  919. public function testAddConfigSettingCanAddSubKeyInEmptyVal()
  920. {
  921. $manipulator = new JsonManipulator('{
  922. "config": {
  923. "github-oauth": {},
  924. "github-oauth2": {
  925. }
  926. }
  927. }');
  928. $this->assertTrue($manipulator->addConfigSetting('github-oauth.bar', 'baz'));
  929. $this->assertTrue($manipulator->addConfigSetting('github-oauth2.a.bar', 'baz2'));
  930. $this->assertTrue($manipulator->addConfigSetting('github-oauth3.b', 'c'));
  931. $this->assertEquals('{
  932. "config": {
  933. "github-oauth": {
  934. "bar": "baz"
  935. },
  936. "github-oauth2": {
  937. "a.bar": "baz2"
  938. },
  939. "github-oauth3": {
  940. "b": "c"
  941. }
  942. }
  943. }
  944. ', $manipulator->getContents());
  945. }
  946. public function testAddConfigSettingCanAddSubKeyInHash()
  947. {
  948. $manipulator = new JsonManipulator('{
  949. "config": {
  950. "github-oauth": {
  951. "github.com": "foo"
  952. }
  953. }
  954. }');
  955. $this->assertTrue($manipulator->addConfigSetting('github-oauth.bar', 'baz'));
  956. $this->assertEquals('{
  957. "config": {
  958. "github-oauth": {
  959. "github.com": "foo",
  960. "bar": "baz"
  961. }
  962. }
  963. }
  964. ', $manipulator->getContents());
  965. }
  966. public function testAddRootSettingDoesNotBreakDots()
  967. {
  968. $manipulator = new JsonManipulator('{
  969. "github-oauth": {
  970. "github.com": "foo"
  971. }
  972. }');
  973. $this->assertTrue($manipulator->addSubNode('github-oauth', 'bar', 'baz'));
  974. $this->assertEquals('{
  975. "github-oauth": {
  976. "github.com": "foo",
  977. "bar": "baz"
  978. }
  979. }
  980. ', $manipulator->getContents());
  981. }
  982. public function testRemoveConfigSettingCanRemoveSubKeyInHash()
  983. {
  984. $manipulator = new JsonManipulator('{
  985. "config": {
  986. "github-oauth": {
  987. "github.com": "foo",
  988. "bar": "baz"
  989. }
  990. }
  991. }');
  992. $this->assertTrue($manipulator->removeConfigSetting('github-oauth.bar'));
  993. $this->assertEquals('{
  994. "config": {
  995. "github-oauth": {
  996. "github.com": "foo"
  997. }
  998. }
  999. }
  1000. ', $manipulator->getContents());
  1001. }
  1002. public function testRemoveConfigSettingCanRemoveSubKeyInHashWithSiblings()
  1003. {
  1004. $manipulator = new JsonManipulator('{
  1005. "config": {
  1006. "foo": "bar",
  1007. "github-oauth": {
  1008. "github.com": "foo",
  1009. "bar": "baz"
  1010. }
  1011. }
  1012. }');
  1013. $this->assertTrue($manipulator->removeConfigSetting('github-oauth.bar'));
  1014. $this->assertEquals('{
  1015. "config": {
  1016. "foo": "bar",
  1017. "github-oauth": {
  1018. "github.com": "foo"
  1019. }
  1020. }
  1021. }
  1022. ', $manipulator->getContents());
  1023. }
  1024. public function testAddMainKey()
  1025. {
  1026. $manipulator = new JsonManipulator('{
  1027. "foo": "bar"
  1028. }');
  1029. $this->assertTrue($manipulator->addMainKey('bar', 'baz'));
  1030. $this->assertEquals('{
  1031. "foo": "bar",
  1032. "bar": "baz"
  1033. }
  1034. ', $manipulator->getContents());
  1035. }
  1036. public function testUpdateMainKey()
  1037. {
  1038. $manipulator = new JsonManipulator('{
  1039. "foo": "bar"
  1040. }');
  1041. $this->assertTrue($manipulator->addMainKey('foo', 'baz'));
  1042. $this->assertEquals('{
  1043. "foo": "baz"
  1044. }
  1045. ', $manipulator->getContents());
  1046. }
  1047. public function testUpdateMainKey2()
  1048. {
  1049. $manipulator = new JsonManipulator('{
  1050. "a": {
  1051. "foo": "bar",
  1052. "baz": "qux"
  1053. },
  1054. "foo": "bar",
  1055. "baz": "bar"
  1056. }');
  1057. $this->assertTrue($manipulator->addMainKey('foo', 'baz'));
  1058. $this->assertTrue($manipulator->addMainKey('baz', 'quux'));
  1059. $this->assertEquals('{
  1060. "a": {
  1061. "foo": "bar",
  1062. "baz": "qux"
  1063. },
  1064. "foo": "baz",
  1065. "baz": "quux"
  1066. }
  1067. ', $manipulator->getContents());
  1068. }
  1069. public function testUpdateMainKey3()
  1070. {
  1071. $manipulator = new JsonManipulator('{
  1072. "require": {
  1073. "php": "5.*"
  1074. },
  1075. "require-dev": {
  1076. "foo": "bar"
  1077. }
  1078. }');
  1079. $this->assertTrue($manipulator->addMainKey('require-dev', array('foo' => 'qux')));
  1080. $this->assertEquals('{
  1081. "require": {
  1082. "php": "5.*"
  1083. },
  1084. "require-dev": {
  1085. "foo": "qux"
  1086. }
  1087. }
  1088. ', $manipulator->getContents());
  1089. }
  1090. public function testIndentDetection()
  1091. {
  1092. $manipulator = new JsonManipulator('{
  1093. "require": {
  1094. "php": "5.*"
  1095. }
  1096. }');
  1097. $this->assertTrue($manipulator->addMainKey('require-dev', array('foo' => 'qux')));
  1098. $this->assertEquals('{
  1099. "require": {
  1100. "php": "5.*"
  1101. },
  1102. "require-dev": {
  1103. "foo": "qux"
  1104. }
  1105. }
  1106. ', $manipulator->getContents());
  1107. }
  1108. }