JsonManipulatorTest.php 24 KB

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