JsonManipulatorTest.php 56 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129
  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. array(
  278. '{
  279. "config": {
  280. "cache-files-ttl": 0,
  281. "discard-changes": true
  282. },
  283. "minimum-stability": "stable",
  284. "prefer-stable": false,
  285. "provide": {
  286. "heroku-sys/cedar": "14.2016.03.22"
  287. },
  288. "repositories": [
  289. {
  290. "packagist": false
  291. },
  292. {
  293. "type": "package",
  294. "package": [
  295. {
  296. "type": "metapackage",
  297. "name": "anthonymartin/geo-location",
  298. "version": "v1.0.0",
  299. "require": {
  300. "heroku-sys/php": ">=5.3.0"
  301. },
  302. "replace": [],
  303. "provide": [],
  304. "conflict": []
  305. },
  306. {
  307. "type": "metapackage",
  308. "name": "aws/aws-sdk-php",
  309. "version": "3.9.4",
  310. "require": {
  311. "heroku-sys/php": ">=5.5"
  312. },
  313. "replace": [],
  314. "provide": [],
  315. "conflict": []
  316. },
  317. {
  318. "type": "metapackage",
  319. "name": "cloudinary/cloudinary_php",
  320. "version": "dev-master",
  321. "require": {
  322. "heroku-sys/ext-curl": "*",
  323. "heroku-sys/ext-json": "*",
  324. "heroku-sys/php": ">=5.3.0"
  325. },
  326. "replace": [],
  327. "provide": [],
  328. "conflict": []
  329. },
  330. {
  331. "type": "metapackage",
  332. "name": "doctrine/annotations",
  333. "version": "v1.2.7",
  334. "require": {
  335. "heroku-sys/php": ">=5.3.2"
  336. },
  337. "replace": [],
  338. "provide": [],
  339. "conflict": []
  340. },
  341. {
  342. "type": "metapackage",
  343. "name": "doctrine/cache",
  344. "version": "v1.6.0",
  345. "require": {
  346. "heroku-sys/php": "~5.5|~7.0"
  347. },
  348. "replace": [],
  349. "provide": [],
  350. "conflict": []
  351. },
  352. {
  353. "type": "metapackage",
  354. "name": "doctrine/collections",
  355. "version": "v1.3.0",
  356. "require": {
  357. "heroku-sys/php": ">=5.3.2"
  358. },
  359. "replace": [],
  360. "provide": [],
  361. "conflict": []
  362. },
  363. {
  364. "type": "metapackage",
  365. "name": "doctrine/common",
  366. "version": "v2.6.1",
  367. "require": {
  368. "heroku-sys/php": "~5.5|~7.0"
  369. },
  370. "replace": [],
  371. "provide": [],
  372. "conflict": []
  373. },
  374. {
  375. "type": "metapackage",
  376. "name": "doctrine/inflector",
  377. "version": "v1.1.0",
  378. "require": {
  379. "heroku-sys/php": ">=5.3.2"
  380. },
  381. "replace": [],
  382. "provide": [],
  383. "conflict": []
  384. },
  385. {
  386. "type": "metapackage",
  387. "name": "doctrine/lexer",
  388. "version": "v1.0.1",
  389. "require": {
  390. "heroku-sys/php": ">=5.3.2"
  391. },
  392. "replace": [],
  393. "provide": [],
  394. "conflict": []
  395. },
  396. {
  397. "type": "metapackage",
  398. "name": "geoip/geoip",
  399. "version": "v1.16",
  400. "require": [],
  401. "replace": [],
  402. "provide": [],
  403. "conflict": {
  404. "heroku-sys/ext-geoip": "*"
  405. }
  406. },
  407. {
  408. "type": "metapackage",
  409. "name": "giggsey/libphonenumber-for-php",
  410. "version": "7.2.5",
  411. "require": {
  412. "heroku-sys/ext-mbstring": "*"
  413. },
  414. "replace": [],
  415. "provide": [],
  416. "conflict": []
  417. },
  418. {
  419. "type": "metapackage",
  420. "name": "guzzlehttp/guzzle",
  421. "version": "5.3.0",
  422. "require": {
  423. "heroku-sys/php": ">=5.4.0"
  424. },
  425. "replace": [],
  426. "provide": [],
  427. "conflict": []
  428. },
  429. {
  430. "type": "metapackage",
  431. "name": "guzzlehttp/promises",
  432. "version": "1.0.3",
  433. "require": {
  434. "heroku-sys/php": ">=5.5.0"
  435. },
  436. "replace": [],
  437. "provide": [],
  438. "conflict": []
  439. },
  440. {
  441. "type": "metapackage",
  442. "name": "guzzlehttp/psr7",
  443. "version": "1.2.3",
  444. "require": {
  445. "heroku-sys/php": ">=5.4.0"
  446. },
  447. "replace": [],
  448. "provide": [],
  449. "conflict": []
  450. },
  451. {
  452. "type": "metapackage",
  453. "name": "guzzlehttp/ringphp",
  454. "version": "1.1.0",
  455. "require": {
  456. "heroku-sys/php": ">=5.4.0"
  457. },
  458. "replace": [],
  459. "provide": [],
  460. "conflict": []
  461. },
  462. {
  463. "type": "metapackage",
  464. "name": "guzzlehttp/streams",
  465. "version": "3.0.0",
  466. "require": {
  467. "heroku-sys/php": ">=5.4.0"
  468. },
  469. "replace": [],
  470. "provide": [],
  471. "conflict": []
  472. },
  473. {
  474. "type": "metapackage",
  475. "name": "hipchat/hipchat-php",
  476. "version": "v1.4",
  477. "require": {
  478. "heroku-sys/php": ">=5.3.0"
  479. },
  480. "replace": [],
  481. "provide": [],
  482. "conflict": []
  483. },
  484. {
  485. "type": "metapackage",
  486. "name": "kriswallsmith/buzz",
  487. "version": "v0.15",
  488. "require": {
  489. "heroku-sys/php": ">=5.3.0"
  490. },
  491. "replace": [],
  492. "provide": [],
  493. "conflict": []
  494. },
  495. {
  496. "type": "metapackage",
  497. "name": "league/csv",
  498. "version": "8.0.0",
  499. "require": {
  500. "heroku-sys/ext-mbstring": "*",
  501. "heroku-sys/php": ">=5.5.0"
  502. },
  503. "replace": [],
  504. "provide": [],
  505. "conflict": []
  506. },
  507. {
  508. "type": "metapackage",
  509. "name": "league/fractal",
  510. "version": "0.13.0",
  511. "require": {
  512. "heroku-sys/php": ">=5.4"
  513. },
  514. "replace": [],
  515. "provide": [],
  516. "conflict": []
  517. },
  518. {
  519. "type": "metapackage",
  520. "name": "mashape/unirest-php",
  521. "version": "1.2.1",
  522. "require": {
  523. "heroku-sys/ext-curl": "*",
  524. "heroku-sys/ext-json": "*",
  525. "heroku-sys/php": ">=5.3.0"
  526. },
  527. "replace": [],
  528. "provide": [],
  529. "conflict": []
  530. },
  531. {
  532. "type": "metapackage",
  533. "name": "mtdowling/jmespath.php",
  534. "version": "2.3.0",
  535. "require": {
  536. "heroku-sys/php": ">=5.4.0"
  537. },
  538. "replace": [],
  539. "provide": [],
  540. "conflict": []
  541. },
  542. {
  543. "type": "metapackage",
  544. "name": "palex/phpstructureddata",
  545. "version": "v2.0.1",
  546. "require": {
  547. "heroku-sys/php": ">=5.3.0"
  548. },
  549. "replace": [],
  550. "provide": [],
  551. "conflict": []
  552. },
  553. {
  554. "type": "metapackage",
  555. "name": "psr/http-message",
  556. "version": "1.0",
  557. "require": {
  558. "heroku-sys/php": ">=5.3.0"
  559. },
  560. "replace": [],
  561. "provide": [],
  562. "conflict": []
  563. },
  564. {
  565. "type": "metapackage",
  566. "name": "react/promise",
  567. "version": "v2.2.1",
  568. "require": {
  569. "heroku-sys/php": ">=5.4.0"
  570. },
  571. "replace": [],
  572. "provide": [],
  573. "conflict": []
  574. },
  575. {
  576. "type": "metapackage",
  577. "name": "rollbar/rollbar",
  578. "version": "v0.15.0",
  579. "require": {
  580. "heroku-sys/ext-curl": "*"
  581. },
  582. "replace": [],
  583. "provide": [],
  584. "conflict": []
  585. },
  586. {
  587. "type": "metapackage",
  588. "name": "ronanguilloux/isocodes",
  589. "version": "1.2.0",
  590. "require": {
  591. "heroku-sys/ext-bcmath": "*",
  592. "heroku-sys/php": ">=5.4.0"
  593. },
  594. "replace": [],
  595. "provide": [],
  596. "conflict": []
  597. },
  598. {
  599. "type": "metapackage",
  600. "name": "sendgrid/sendgrid",
  601. "version": "2.1.1",
  602. "require": {
  603. "heroku-sys/php": ">=5.3"
  604. },
  605. "replace": [],
  606. "provide": [],
  607. "conflict": []
  608. },
  609. {
  610. "type": "metapackage",
  611. "name": "sendgrid/smtpapi",
  612. "version": "0.0.1",
  613. "require": {
  614. "heroku-sys/php": ">=5.3"
  615. },
  616. "replace": [],
  617. "provide": [],
  618. "conflict": []
  619. },
  620. {
  621. "type": "metapackage",
  622. "name": "symfony/css-selector",
  623. "version": "v2.8.2",
  624. "require": {
  625. "heroku-sys/php": ">=5.3.9"
  626. },
  627. "replace": [],
  628. "provide": [],
  629. "conflict": []
  630. },
  631. {
  632. "type": "metapackage",
  633. "name": "symfony/http-foundation",
  634. "version": "v2.8.2",
  635. "require": {
  636. "heroku-sys/php": ">=5.3.9"
  637. },
  638. "replace": [],
  639. "provide": [],
  640. "conflict": []
  641. },
  642. {
  643. "type": "metapackage",
  644. "name": "symfony/polyfill-php54",
  645. "version": "v1.1.0",
  646. "require": {
  647. "heroku-sys/php": ">=5.3.3"
  648. },
  649. "replace": [],
  650. "provide": [],
  651. "conflict": []
  652. },
  653. {
  654. "type": "metapackage",
  655. "name": "symfony/polyfill-php55",
  656. "version": "v1.1.0",
  657. "require": {
  658. "heroku-sys/php": ">=5.3.3"
  659. },
  660. "replace": [],
  661. "provide": [],
  662. "conflict": []
  663. },
  664. {
  665. "type": "metapackage",
  666. "name": "thepixeldeveloper/sitemap",
  667. "version": "3.0.0",
  668. "require": {
  669. "heroku-sys/php": ">=5.3.0"
  670. },
  671. "replace": [],
  672. "provide": [],
  673. "conflict": []
  674. },
  675. {
  676. "type": "metapackage",
  677. "name": "tijsverkoyen/css-to-inline-styles",
  678. "version": "1.5.5",
  679. "require": {
  680. "heroku-sys/php": ">=5.3.0"
  681. },
  682. "replace": [],
  683. "provide": [],
  684. "conflict": []
  685. },
  686. {
  687. "type": "metapackage",
  688. "name": "yiisoft/yii",
  689. "version": "1.1.17",
  690. "require": {
  691. "heroku-sys/php": ">=5.1.0"
  692. },
  693. "replace": [],
  694. "provide": [],
  695. "conflict": []
  696. },
  697. {
  698. "type": "metapackage",
  699. "name": "composer.json/composer.lock",
  700. "version": "dev-597511d6d51b96e4a8afeba2c79982e5",
  701. "require": {
  702. "heroku-sys/php": "~5.6.0",
  703. "heroku-sys/ext-newrelic": "*",
  704. "heroku-sys/ext-gd": "*",
  705. "heroku-sys/ext-redis": "*"
  706. },
  707. "replace": [],
  708. "provide": [],
  709. "conflict": []
  710. }
  711. ]
  712. }
  713. ],
  714. "require": {
  715. "composer.json/composer.lock": "dev-597511d6d51b96e4a8afeba2c79982e5",
  716. "anthonymartin/geo-location": "v1.0.0",
  717. "aws/aws-sdk-php": "3.9.4",
  718. "cloudinary/cloudinary_php": "dev-master",
  719. "doctrine/annotations": "v1.2.7",
  720. "doctrine/cache": "v1.6.0",
  721. "doctrine/collections": "v1.3.0",
  722. "doctrine/common": "v2.6.1",
  723. "doctrine/inflector": "v1.1.0",
  724. "doctrine/lexer": "v1.0.1",
  725. "geoip/geoip": "v1.16",
  726. "giggsey/libphonenumber-for-php": "7.2.5",
  727. "guzzlehttp/guzzle": "5.3.0",
  728. "guzzlehttp/promises": "1.0.3",
  729. "guzzlehttp/psr7": "1.2.3",
  730. "guzzlehttp/ringphp": "1.1.0",
  731. "guzzlehttp/streams": "3.0.0",
  732. "hipchat/hipchat-php": "v1.4",
  733. "kriswallsmith/buzz": "v0.15",
  734. "league/csv": "8.0.0",
  735. "league/fractal": "0.13.0",
  736. "mashape/unirest-php": "1.2.1",
  737. "mtdowling/jmespath.php": "2.3.0",
  738. "palex/phpstructureddata": "v2.0.1",
  739. "psr/http-message": "1.0",
  740. "react/promise": "v2.2.1",
  741. "rollbar/rollbar": "v0.15.0",
  742. "ronanguilloux/isocodes": "1.2.0",
  743. "sendgrid/sendgrid": "2.1.1",
  744. "sendgrid/smtpapi": "0.0.1",
  745. "symfony/css-selector": "v2.8.2",
  746. "symfony/http-foundation": "v2.8.2",
  747. "symfony/polyfill-php54": "v1.1.0",
  748. "symfony/polyfill-php55": "v1.1.0",
  749. "thepixeldeveloper/sitemap": "3.0.0",
  750. "tijsverkoyen/css-to-inline-styles": "1.5.5",
  751. "yiisoft/yii": "1.1.17",
  752. "heroku-sys/apache": "^2.4.10",
  753. "heroku-sys/nginx": "~1.8.0"
  754. }
  755. }',
  756. 'require',
  757. 'foo',
  758. 'qux',
  759. '{
  760. "config": {
  761. "cache-files-ttl": 0,
  762. "discard-changes": true
  763. },
  764. "minimum-stability": "stable",
  765. "prefer-stable": false,
  766. "provide": {
  767. "heroku-sys/cedar": "14.2016.03.22"
  768. },
  769. "repositories": [
  770. {
  771. "packagist": false
  772. },
  773. {
  774. "type": "package",
  775. "package": [
  776. {
  777. "type": "metapackage",
  778. "name": "anthonymartin/geo-location",
  779. "version": "v1.0.0",
  780. "require": {
  781. "heroku-sys/php": ">=5.3.0"
  782. },
  783. "replace": [],
  784. "provide": [],
  785. "conflict": []
  786. },
  787. {
  788. "type": "metapackage",
  789. "name": "aws/aws-sdk-php",
  790. "version": "3.9.4",
  791. "require": {
  792. "heroku-sys/php": ">=5.5"
  793. },
  794. "replace": [],
  795. "provide": [],
  796. "conflict": []
  797. },
  798. {
  799. "type": "metapackage",
  800. "name": "cloudinary/cloudinary_php",
  801. "version": "dev-master",
  802. "require": {
  803. "heroku-sys/ext-curl": "*",
  804. "heroku-sys/ext-json": "*",
  805. "heroku-sys/php": ">=5.3.0"
  806. },
  807. "replace": [],
  808. "provide": [],
  809. "conflict": []
  810. },
  811. {
  812. "type": "metapackage",
  813. "name": "doctrine/annotations",
  814. "version": "v1.2.7",
  815. "require": {
  816. "heroku-sys/php": ">=5.3.2"
  817. },
  818. "replace": [],
  819. "provide": [],
  820. "conflict": []
  821. },
  822. {
  823. "type": "metapackage",
  824. "name": "doctrine/cache",
  825. "version": "v1.6.0",
  826. "require": {
  827. "heroku-sys/php": "~5.5|~7.0"
  828. },
  829. "replace": [],
  830. "provide": [],
  831. "conflict": []
  832. },
  833. {
  834. "type": "metapackage",
  835. "name": "doctrine/collections",
  836. "version": "v1.3.0",
  837. "require": {
  838. "heroku-sys/php": ">=5.3.2"
  839. },
  840. "replace": [],
  841. "provide": [],
  842. "conflict": []
  843. },
  844. {
  845. "type": "metapackage",
  846. "name": "doctrine/common",
  847. "version": "v2.6.1",
  848. "require": {
  849. "heroku-sys/php": "~5.5|~7.0"
  850. },
  851. "replace": [],
  852. "provide": [],
  853. "conflict": []
  854. },
  855. {
  856. "type": "metapackage",
  857. "name": "doctrine/inflector",
  858. "version": "v1.1.0",
  859. "require": {
  860. "heroku-sys/php": ">=5.3.2"
  861. },
  862. "replace": [],
  863. "provide": [],
  864. "conflict": []
  865. },
  866. {
  867. "type": "metapackage",
  868. "name": "doctrine/lexer",
  869. "version": "v1.0.1",
  870. "require": {
  871. "heroku-sys/php": ">=5.3.2"
  872. },
  873. "replace": [],
  874. "provide": [],
  875. "conflict": []
  876. },
  877. {
  878. "type": "metapackage",
  879. "name": "geoip/geoip",
  880. "version": "v1.16",
  881. "require": [],
  882. "replace": [],
  883. "provide": [],
  884. "conflict": {
  885. "heroku-sys/ext-geoip": "*"
  886. }
  887. },
  888. {
  889. "type": "metapackage",
  890. "name": "giggsey/libphonenumber-for-php",
  891. "version": "7.2.5",
  892. "require": {
  893. "heroku-sys/ext-mbstring": "*"
  894. },
  895. "replace": [],
  896. "provide": [],
  897. "conflict": []
  898. },
  899. {
  900. "type": "metapackage",
  901. "name": "guzzlehttp/guzzle",
  902. "version": "5.3.0",
  903. "require": {
  904. "heroku-sys/php": ">=5.4.0"
  905. },
  906. "replace": [],
  907. "provide": [],
  908. "conflict": []
  909. },
  910. {
  911. "type": "metapackage",
  912. "name": "guzzlehttp/promises",
  913. "version": "1.0.3",
  914. "require": {
  915. "heroku-sys/php": ">=5.5.0"
  916. },
  917. "replace": [],
  918. "provide": [],
  919. "conflict": []
  920. },
  921. {
  922. "type": "metapackage",
  923. "name": "guzzlehttp/psr7",
  924. "version": "1.2.3",
  925. "require": {
  926. "heroku-sys/php": ">=5.4.0"
  927. },
  928. "replace": [],
  929. "provide": [],
  930. "conflict": []
  931. },
  932. {
  933. "type": "metapackage",
  934. "name": "guzzlehttp/ringphp",
  935. "version": "1.1.0",
  936. "require": {
  937. "heroku-sys/php": ">=5.4.0"
  938. },
  939. "replace": [],
  940. "provide": [],
  941. "conflict": []
  942. },
  943. {
  944. "type": "metapackage",
  945. "name": "guzzlehttp/streams",
  946. "version": "3.0.0",
  947. "require": {
  948. "heroku-sys/php": ">=5.4.0"
  949. },
  950. "replace": [],
  951. "provide": [],
  952. "conflict": []
  953. },
  954. {
  955. "type": "metapackage",
  956. "name": "hipchat/hipchat-php",
  957. "version": "v1.4",
  958. "require": {
  959. "heroku-sys/php": ">=5.3.0"
  960. },
  961. "replace": [],
  962. "provide": [],
  963. "conflict": []
  964. },
  965. {
  966. "type": "metapackage",
  967. "name": "kriswallsmith/buzz",
  968. "version": "v0.15",
  969. "require": {
  970. "heroku-sys/php": ">=5.3.0"
  971. },
  972. "replace": [],
  973. "provide": [],
  974. "conflict": []
  975. },
  976. {
  977. "type": "metapackage",
  978. "name": "league/csv",
  979. "version": "8.0.0",
  980. "require": {
  981. "heroku-sys/ext-mbstring": "*",
  982. "heroku-sys/php": ">=5.5.0"
  983. },
  984. "replace": [],
  985. "provide": [],
  986. "conflict": []
  987. },
  988. {
  989. "type": "metapackage",
  990. "name": "league/fractal",
  991. "version": "0.13.0",
  992. "require": {
  993. "heroku-sys/php": ">=5.4"
  994. },
  995. "replace": [],
  996. "provide": [],
  997. "conflict": []
  998. },
  999. {
  1000. "type": "metapackage",
  1001. "name": "mashape/unirest-php",
  1002. "version": "1.2.1",
  1003. "require": {
  1004. "heroku-sys/ext-curl": "*",
  1005. "heroku-sys/ext-json": "*",
  1006. "heroku-sys/php": ">=5.3.0"
  1007. },
  1008. "replace": [],
  1009. "provide": [],
  1010. "conflict": []
  1011. },
  1012. {
  1013. "type": "metapackage",
  1014. "name": "mtdowling/jmespath.php",
  1015. "version": "2.3.0",
  1016. "require": {
  1017. "heroku-sys/php": ">=5.4.0"
  1018. },
  1019. "replace": [],
  1020. "provide": [],
  1021. "conflict": []
  1022. },
  1023. {
  1024. "type": "metapackage",
  1025. "name": "palex/phpstructureddata",
  1026. "version": "v2.0.1",
  1027. "require": {
  1028. "heroku-sys/php": ">=5.3.0"
  1029. },
  1030. "replace": [],
  1031. "provide": [],
  1032. "conflict": []
  1033. },
  1034. {
  1035. "type": "metapackage",
  1036. "name": "psr/http-message",
  1037. "version": "1.0",
  1038. "require": {
  1039. "heroku-sys/php": ">=5.3.0"
  1040. },
  1041. "replace": [],
  1042. "provide": [],
  1043. "conflict": []
  1044. },
  1045. {
  1046. "type": "metapackage",
  1047. "name": "react/promise",
  1048. "version": "v2.2.1",
  1049. "require": {
  1050. "heroku-sys/php": ">=5.4.0"
  1051. },
  1052. "replace": [],
  1053. "provide": [],
  1054. "conflict": []
  1055. },
  1056. {
  1057. "type": "metapackage",
  1058. "name": "rollbar/rollbar",
  1059. "version": "v0.15.0",
  1060. "require": {
  1061. "heroku-sys/ext-curl": "*"
  1062. },
  1063. "replace": [],
  1064. "provide": [],
  1065. "conflict": []
  1066. },
  1067. {
  1068. "type": "metapackage",
  1069. "name": "ronanguilloux/isocodes",
  1070. "version": "1.2.0",
  1071. "require": {
  1072. "heroku-sys/ext-bcmath": "*",
  1073. "heroku-sys/php": ">=5.4.0"
  1074. },
  1075. "replace": [],
  1076. "provide": [],
  1077. "conflict": []
  1078. },
  1079. {
  1080. "type": "metapackage",
  1081. "name": "sendgrid/sendgrid",
  1082. "version": "2.1.1",
  1083. "require": {
  1084. "heroku-sys/php": ">=5.3"
  1085. },
  1086. "replace": [],
  1087. "provide": [],
  1088. "conflict": []
  1089. },
  1090. {
  1091. "type": "metapackage",
  1092. "name": "sendgrid/smtpapi",
  1093. "version": "0.0.1",
  1094. "require": {
  1095. "heroku-sys/php": ">=5.3"
  1096. },
  1097. "replace": [],
  1098. "provide": [],
  1099. "conflict": []
  1100. },
  1101. {
  1102. "type": "metapackage",
  1103. "name": "symfony/css-selector",
  1104. "version": "v2.8.2",
  1105. "require": {
  1106. "heroku-sys/php": ">=5.3.9"
  1107. },
  1108. "replace": [],
  1109. "provide": [],
  1110. "conflict": []
  1111. },
  1112. {
  1113. "type": "metapackage",
  1114. "name": "symfony/http-foundation",
  1115. "version": "v2.8.2",
  1116. "require": {
  1117. "heroku-sys/php": ">=5.3.9"
  1118. },
  1119. "replace": [],
  1120. "provide": [],
  1121. "conflict": []
  1122. },
  1123. {
  1124. "type": "metapackage",
  1125. "name": "symfony/polyfill-php54",
  1126. "version": "v1.1.0",
  1127. "require": {
  1128. "heroku-sys/php": ">=5.3.3"
  1129. },
  1130. "replace": [],
  1131. "provide": [],
  1132. "conflict": []
  1133. },
  1134. {
  1135. "type": "metapackage",
  1136. "name": "symfony/polyfill-php55",
  1137. "version": "v1.1.0",
  1138. "require": {
  1139. "heroku-sys/php": ">=5.3.3"
  1140. },
  1141. "replace": [],
  1142. "provide": [],
  1143. "conflict": []
  1144. },
  1145. {
  1146. "type": "metapackage",
  1147. "name": "thepixeldeveloper/sitemap",
  1148. "version": "3.0.0",
  1149. "require": {
  1150. "heroku-sys/php": ">=5.3.0"
  1151. },
  1152. "replace": [],
  1153. "provide": [],
  1154. "conflict": []
  1155. },
  1156. {
  1157. "type": "metapackage",
  1158. "name": "tijsverkoyen/css-to-inline-styles",
  1159. "version": "1.5.5",
  1160. "require": {
  1161. "heroku-sys/php": ">=5.3.0"
  1162. },
  1163. "replace": [],
  1164. "provide": [],
  1165. "conflict": []
  1166. },
  1167. {
  1168. "type": "metapackage",
  1169. "name": "yiisoft/yii",
  1170. "version": "1.1.17",
  1171. "require": {
  1172. "heroku-sys/php": ">=5.1.0"
  1173. },
  1174. "replace": [],
  1175. "provide": [],
  1176. "conflict": []
  1177. },
  1178. {
  1179. "type": "metapackage",
  1180. "name": "composer.json/composer.lock",
  1181. "version": "dev-597511d6d51b96e4a8afeba2c79982e5",
  1182. "require": {
  1183. "heroku-sys/php": "~5.6.0",
  1184. "heroku-sys/ext-newrelic": "*",
  1185. "heroku-sys/ext-gd": "*",
  1186. "heroku-sys/ext-redis": "*"
  1187. },
  1188. "replace": [],
  1189. "provide": [],
  1190. "conflict": []
  1191. }
  1192. ]
  1193. }
  1194. ],
  1195. "require": {
  1196. "composer.json/composer.lock": "dev-597511d6d51b96e4a8afeba2c79982e5",
  1197. "anthonymartin/geo-location": "v1.0.0",
  1198. "aws/aws-sdk-php": "3.9.4",
  1199. "cloudinary/cloudinary_php": "dev-master",
  1200. "doctrine/annotations": "v1.2.7",
  1201. "doctrine/cache": "v1.6.0",
  1202. "doctrine/collections": "v1.3.0",
  1203. "doctrine/common": "v2.6.1",
  1204. "doctrine/inflector": "v1.1.0",
  1205. "doctrine/lexer": "v1.0.1",
  1206. "geoip/geoip": "v1.16",
  1207. "giggsey/libphonenumber-for-php": "7.2.5",
  1208. "guzzlehttp/guzzle": "5.3.0",
  1209. "guzzlehttp/promises": "1.0.3",
  1210. "guzzlehttp/psr7": "1.2.3",
  1211. "guzzlehttp/ringphp": "1.1.0",
  1212. "guzzlehttp/streams": "3.0.0",
  1213. "hipchat/hipchat-php": "v1.4",
  1214. "kriswallsmith/buzz": "v0.15",
  1215. "league/csv": "8.0.0",
  1216. "league/fractal": "0.13.0",
  1217. "mashape/unirest-php": "1.2.1",
  1218. "mtdowling/jmespath.php": "2.3.0",
  1219. "palex/phpstructureddata": "v2.0.1",
  1220. "psr/http-message": "1.0",
  1221. "react/promise": "v2.2.1",
  1222. "rollbar/rollbar": "v0.15.0",
  1223. "ronanguilloux/isocodes": "1.2.0",
  1224. "sendgrid/sendgrid": "2.1.1",
  1225. "sendgrid/smtpapi": "0.0.1",
  1226. "symfony/css-selector": "v2.8.2",
  1227. "symfony/http-foundation": "v2.8.2",
  1228. "symfony/polyfill-php54": "v1.1.0",
  1229. "symfony/polyfill-php55": "v1.1.0",
  1230. "thepixeldeveloper/sitemap": "3.0.0",
  1231. "tijsverkoyen/css-to-inline-styles": "1.5.5",
  1232. "yiisoft/yii": "1.1.17",
  1233. "heroku-sys/apache": "^2.4.10",
  1234. "heroku-sys/nginx": "~1.8.0",
  1235. "foo": "qux"
  1236. }
  1237. }
  1238. ',
  1239. ),
  1240. );
  1241. }
  1242. /**
  1243. * @dataProvider providerAddLinkAndSortPackages
  1244. */
  1245. public function testAddLinkAndSortPackages($json, $type, $package, $constraint, $sortPackages, $expected)
  1246. {
  1247. $manipulator = new JsonManipulator($json);
  1248. $this->assertTrue($manipulator->addLink($type, $package, $constraint, $sortPackages));
  1249. $this->assertEquals($expected, $manipulator->getContents());
  1250. }
  1251. public function providerAddLinkAndSortPackages()
  1252. {
  1253. return array(
  1254. array(
  1255. '{
  1256. "require": {
  1257. "vendor/baz": "qux"
  1258. }
  1259. }',
  1260. 'require',
  1261. 'foo',
  1262. 'bar',
  1263. true,
  1264. '{
  1265. "require": {
  1266. "foo": "bar",
  1267. "vendor/baz": "qux"
  1268. }
  1269. }
  1270. ',
  1271. ),
  1272. array(
  1273. '{
  1274. "require": {
  1275. "vendor/baz": "qux"
  1276. }
  1277. }',
  1278. 'require',
  1279. 'foo',
  1280. 'bar',
  1281. false,
  1282. '{
  1283. "require": {
  1284. "vendor/baz": "qux",
  1285. "foo": "bar"
  1286. }
  1287. }
  1288. ',
  1289. ),
  1290. array(
  1291. '{
  1292. "require": {
  1293. "foo": "baz",
  1294. "ext-10gd": "*",
  1295. "ext-2mcrypt": "*",
  1296. "lib-foo": "*",
  1297. "hhvm": "*",
  1298. "php": ">=5.5"
  1299. }
  1300. }',
  1301. 'require',
  1302. 'igorw/retry',
  1303. '*',
  1304. true,
  1305. '{
  1306. "require": {
  1307. "php": ">=5.5",
  1308. "hhvm": "*",
  1309. "ext-2mcrypt": "*",
  1310. "ext-10gd": "*",
  1311. "lib-foo": "*",
  1312. "foo": "baz",
  1313. "igorw/retry": "*"
  1314. }
  1315. }
  1316. ',
  1317. ),
  1318. );
  1319. }
  1320. /**
  1321. * @dataProvider removeSubNodeProvider
  1322. */
  1323. public function testRemoveSubNode($json, $name, $expected, $expectedContent = null)
  1324. {
  1325. $manipulator = new JsonManipulator($json);
  1326. $this->assertEquals($expected, $manipulator->removeSubNode('repositories', $name));
  1327. if (null !== $expectedContent) {
  1328. $this->assertEquals($expectedContent, $manipulator->getContents());
  1329. }
  1330. }
  1331. public function removeSubNodeProvider()
  1332. {
  1333. return array(
  1334. 'works on simple ones first' => array(
  1335. '{
  1336. "repositories": {
  1337. "foo": {
  1338. "foo": "bar",
  1339. "bar": "baz"
  1340. },
  1341. "bar": {
  1342. "foo": "bar",
  1343. "bar": "baz"
  1344. }
  1345. }
  1346. }',
  1347. 'foo',
  1348. true,
  1349. '{
  1350. "repositories": {
  1351. "bar": {
  1352. "foo": "bar",
  1353. "bar": "baz"
  1354. }
  1355. }
  1356. }
  1357. ',
  1358. ),
  1359. 'works on simple ones last' => array(
  1360. '{
  1361. "repositories": {
  1362. "foo": {
  1363. "foo": "bar",
  1364. "bar": "baz"
  1365. },
  1366. "bar": {
  1367. "foo": "bar",
  1368. "bar": "baz"
  1369. }
  1370. }
  1371. }',
  1372. 'bar',
  1373. true,
  1374. '{
  1375. "repositories": {
  1376. "foo": {
  1377. "foo": "bar",
  1378. "bar": "baz"
  1379. }
  1380. }
  1381. }
  1382. ',
  1383. ),
  1384. 'works on simple ones unique' => array(
  1385. '{
  1386. "repositories": {
  1387. "foo": {
  1388. "foo": "bar",
  1389. "bar": "baz"
  1390. }
  1391. }
  1392. }',
  1393. 'foo',
  1394. true,
  1395. '{
  1396. "repositories": {
  1397. }
  1398. }
  1399. ',
  1400. ),
  1401. 'works on simple ones middle' => array(
  1402. '{
  1403. "repositories": {
  1404. "foo": {
  1405. "foo": "bar",
  1406. "bar": "baz"
  1407. },
  1408. "bar": {
  1409. "foo": "bar",
  1410. "bar": "baz"
  1411. },
  1412. "baz": {
  1413. "foo": "bar",
  1414. "bar": "baz"
  1415. }
  1416. }
  1417. }',
  1418. 'bar',
  1419. true,
  1420. '{
  1421. "repositories": {
  1422. "foo": {
  1423. "foo": "bar",
  1424. "bar": "baz"
  1425. },
  1426. "baz": {
  1427. "foo": "bar",
  1428. "bar": "baz"
  1429. }
  1430. }
  1431. }
  1432. ',
  1433. ),
  1434. 'works on undefined ones' => array(
  1435. '{
  1436. "repositories": {
  1437. "main": {
  1438. "foo": "bar",
  1439. "bar": "baz"
  1440. }
  1441. }
  1442. }',
  1443. 'removenotthere',
  1444. true,
  1445. '{
  1446. "repositories": {
  1447. "main": {
  1448. "foo": "bar",
  1449. "bar": "baz"
  1450. }
  1451. }
  1452. }
  1453. ',
  1454. ),
  1455. 'works on child having unmatched name' => array(
  1456. '{
  1457. "repositories": {
  1458. "baz": {
  1459. "foo": "bar",
  1460. "bar": "baz"
  1461. }
  1462. }
  1463. }',
  1464. 'bar',
  1465. true,
  1466. '{
  1467. "repositories": {
  1468. "baz": {
  1469. "foo": "bar",
  1470. "bar": "baz"
  1471. }
  1472. }
  1473. }
  1474. ',
  1475. ),
  1476. 'works on child having duplicate name' => array(
  1477. '{
  1478. "repositories": {
  1479. "foo": {
  1480. "baz": "qux"
  1481. },
  1482. "baz": {
  1483. "foo": "bar",
  1484. "bar": "baz"
  1485. }
  1486. }
  1487. }',
  1488. 'baz',
  1489. true,
  1490. '{
  1491. "repositories": {
  1492. "foo": {
  1493. "baz": "qux"
  1494. }
  1495. }
  1496. }
  1497. ',
  1498. ),
  1499. 'works on empty repos' => array(
  1500. '{
  1501. "repositories": {
  1502. }
  1503. }',
  1504. 'bar',
  1505. true,
  1506. ),
  1507. 'works on empty repos2' => array(
  1508. '{
  1509. "repositories": {}
  1510. }',
  1511. 'bar',
  1512. true,
  1513. ),
  1514. 'works on missing repos' => array(
  1515. "{\n}",
  1516. 'bar',
  1517. true,
  1518. ),
  1519. 'works on deep repos' => array(
  1520. '{
  1521. "repositories": {
  1522. "foo": {
  1523. "package": { "bar": "baz" }
  1524. }
  1525. }
  1526. }',
  1527. 'foo',
  1528. true,
  1529. '{
  1530. "repositories": {
  1531. }
  1532. }
  1533. ',
  1534. ),
  1535. 'fails on deep repos with borked texts' => array(
  1536. '{
  1537. "repositories": {
  1538. "foo": {
  1539. "package": { "bar": "ba{z" }
  1540. }
  1541. }
  1542. }',
  1543. 'bar',
  1544. false,
  1545. ),
  1546. 'fails on deep repos with borked texts2' => array(
  1547. '{
  1548. "repositories": {
  1549. "foo": {
  1550. "package": { "bar": "ba}z" }
  1551. }
  1552. }
  1553. }',
  1554. 'bar',
  1555. false,
  1556. ),
  1557. 'fails on deep arrays with borked texts' => array(
  1558. '{
  1559. "repositories": [
  1560. {
  1561. "package": { "bar": "ba[z" }
  1562. }
  1563. ]
  1564. }',
  1565. 'bar',
  1566. false,
  1567. ),
  1568. 'fails on deep arrays with borked texts2' => array(
  1569. '{
  1570. "repositories": [
  1571. {
  1572. "package": { "bar": "ba]z" }
  1573. }
  1574. ]
  1575. }',
  1576. 'bar',
  1577. false,
  1578. ),
  1579. );
  1580. }
  1581. public function testRemoveSubNodeFromRequire()
  1582. {
  1583. $manipulator = new JsonManipulator('{
  1584. "repositories": [
  1585. {
  1586. "package": {
  1587. "require": {
  1588. "this/should-not-end-up-in-root-require": "~2.0"
  1589. },
  1590. "require-dev": {
  1591. "this/should-not-end-up-in-root-require-dev": "~2.0"
  1592. }
  1593. }
  1594. }
  1595. ],
  1596. "require": {
  1597. "package/a": "*",
  1598. "package/b": "*",
  1599. "package/c": "*"
  1600. },
  1601. "require-dev": {
  1602. "package/d": "*"
  1603. }
  1604. }');
  1605. $this->assertTrue($manipulator->removeSubNode('require', 'package/c'));
  1606. $this->assertTrue($manipulator->removeSubNode('require-dev', 'package/d'));
  1607. $this->assertEquals('{
  1608. "repositories": [
  1609. {
  1610. "package": {
  1611. "require": {
  1612. "this/should-not-end-up-in-root-require": "~2.0"
  1613. },
  1614. "require-dev": {
  1615. "this/should-not-end-up-in-root-require-dev": "~2.0"
  1616. }
  1617. }
  1618. }
  1619. ],
  1620. "require": {
  1621. "package/a": "*",
  1622. "package/b": "*"
  1623. },
  1624. "require-dev": {
  1625. }
  1626. }
  1627. ', $manipulator->getContents());
  1628. }
  1629. public function testAddSubNodeInRequire()
  1630. {
  1631. $manipulator = new JsonManipulator('{
  1632. "repositories": [
  1633. {
  1634. "package": {
  1635. "require": {
  1636. "this/should-not-end-up-in-root-require": "~2.0"
  1637. },
  1638. "require-dev": {
  1639. "this/should-not-end-up-in-root-require-dev": "~2.0"
  1640. }
  1641. }
  1642. }
  1643. ],
  1644. "require": {
  1645. "package/a": "*",
  1646. "package/b": "*"
  1647. },
  1648. "require-dev": {
  1649. "package/d": "*"
  1650. }
  1651. }');
  1652. $this->assertTrue($manipulator->addSubNode('require', 'package/c', '*'));
  1653. $this->assertTrue($manipulator->addSubNode('require-dev', 'package/e', '*'));
  1654. $this->assertEquals('{
  1655. "repositories": [
  1656. {
  1657. "package": {
  1658. "require": {
  1659. "this/should-not-end-up-in-root-require": "~2.0"
  1660. },
  1661. "require-dev": {
  1662. "this/should-not-end-up-in-root-require-dev": "~2.0"
  1663. }
  1664. }
  1665. }
  1666. ],
  1667. "require": {
  1668. "package/a": "*",
  1669. "package/b": "*",
  1670. "package/c": "*"
  1671. },
  1672. "require-dev": {
  1673. "package/d": "*",
  1674. "package/e": "*"
  1675. }
  1676. }
  1677. ', $manipulator->getContents());
  1678. }
  1679. public function testAddRepositoryCanInitializeEmptyRepositories()
  1680. {
  1681. $manipulator = new JsonManipulator('{
  1682. "repositories": {
  1683. }
  1684. }');
  1685. $this->assertTrue($manipulator->addRepository('bar', array('type' => 'composer')));
  1686. $this->assertEquals('{
  1687. "repositories": {
  1688. "bar": {
  1689. "type": "composer"
  1690. }
  1691. }
  1692. }
  1693. ', $manipulator->getContents());
  1694. }
  1695. public function testAddRepositoryCanInitializeFromScratch()
  1696. {
  1697. $manipulator = new JsonManipulator("{
  1698. \t\"a\": \"b\"
  1699. }");
  1700. $this->assertTrue($manipulator->addRepository('bar2', array('type' => 'composer')));
  1701. $this->assertEquals("{
  1702. \t\"a\": \"b\",
  1703. \t\"repositories\": {
  1704. \t\t\"bar2\": {
  1705. \t\t\t\"type\": \"composer\"
  1706. \t\t}
  1707. \t}
  1708. }
  1709. ", $manipulator->getContents());
  1710. }
  1711. public function testAddRepositoryCanAdd()
  1712. {
  1713. $manipulator = new JsonManipulator('{
  1714. "repositories": {
  1715. "foo": {
  1716. "type": "vcs",
  1717. "url": "lala"
  1718. }
  1719. }
  1720. }');
  1721. $this->assertTrue($manipulator->addRepository('bar', array('type' => 'composer')));
  1722. $this->assertEquals('{
  1723. "repositories": {
  1724. "foo": {
  1725. "type": "vcs",
  1726. "url": "lala"
  1727. },
  1728. "bar": {
  1729. "type": "composer"
  1730. }
  1731. }
  1732. }
  1733. ', $manipulator->getContents());
  1734. }
  1735. public function testAddRepositoryCanOverrideDeepRepos()
  1736. {
  1737. $manipulator = new JsonManipulator('{
  1738. "repositories": {
  1739. "baz": {
  1740. "type": "package",
  1741. "package": {}
  1742. }
  1743. }
  1744. }');
  1745. $this->assertTrue($manipulator->addRepository('baz', array('type' => 'composer')));
  1746. $this->assertEquals('{
  1747. "repositories": {
  1748. "baz": {
  1749. "type": "composer"
  1750. }
  1751. }
  1752. }
  1753. ', $manipulator->getContents());
  1754. }
  1755. public function testAddConfigSettingEscapes()
  1756. {
  1757. $manipulator = new JsonManipulator('{
  1758. "config": {
  1759. }
  1760. }');
  1761. $this->assertTrue($manipulator->addConfigSetting('test', 'a\b'));
  1762. $this->assertTrue($manipulator->addConfigSetting('test2', "a\nb\fa"));
  1763. $this->assertEquals('{
  1764. "config": {
  1765. "test": "a\\\\b",
  1766. "test2": "a\nb\fa"
  1767. }
  1768. }
  1769. ', $manipulator->getContents());
  1770. }
  1771. public function testAddConfigSettingWorksFromScratch()
  1772. {
  1773. $manipulator = new JsonManipulator('{
  1774. }');
  1775. $this->assertTrue($manipulator->addConfigSetting('foo.bar', 'baz'));
  1776. $this->assertEquals('{
  1777. "config": {
  1778. "foo": {
  1779. "bar": "baz"
  1780. }
  1781. }
  1782. }
  1783. ', $manipulator->getContents());
  1784. }
  1785. public function testAddConfigSettingCanAdd()
  1786. {
  1787. $manipulator = new JsonManipulator('{
  1788. "config": {
  1789. "foo": "bar"
  1790. }
  1791. }');
  1792. $this->assertTrue($manipulator->addConfigSetting('bar', 'baz'));
  1793. $this->assertEquals('{
  1794. "config": {
  1795. "foo": "bar",
  1796. "bar": "baz"
  1797. }
  1798. }
  1799. ', $manipulator->getContents());
  1800. }
  1801. public function testAddConfigSettingCanOverwrite()
  1802. {
  1803. $manipulator = new JsonManipulator('{
  1804. "config": {
  1805. "foo": "bar",
  1806. "bar": "baz"
  1807. }
  1808. }');
  1809. $this->assertTrue($manipulator->addConfigSetting('foo', 'zomg'));
  1810. $this->assertEquals('{
  1811. "config": {
  1812. "foo": "zomg",
  1813. "bar": "baz"
  1814. }
  1815. }
  1816. ', $manipulator->getContents());
  1817. }
  1818. public function testAddConfigSettingCanOverwriteNumbers()
  1819. {
  1820. $manipulator = new JsonManipulator('{
  1821. "config": {
  1822. "foo": 500
  1823. }
  1824. }');
  1825. $this->assertTrue($manipulator->addConfigSetting('foo', 50));
  1826. $this->assertEquals('{
  1827. "config": {
  1828. "foo": 50
  1829. }
  1830. }
  1831. ', $manipulator->getContents());
  1832. }
  1833. public function testAddConfigSettingCanOverwriteArrays()
  1834. {
  1835. $manipulator = new JsonManipulator('{
  1836. "config": {
  1837. "github-oauth": {
  1838. "github.com": "foo"
  1839. },
  1840. "github-protocols": ["https"]
  1841. }
  1842. }');
  1843. $this->assertTrue($manipulator->addConfigSetting('github-protocols', array('https', 'http')));
  1844. $this->assertEquals('{
  1845. "config": {
  1846. "github-oauth": {
  1847. "github.com": "foo"
  1848. },
  1849. "github-protocols": ["https", "http"]
  1850. }
  1851. }
  1852. ', $manipulator->getContents());
  1853. $this->assertTrue($manipulator->addConfigSetting('github-oauth', array('github.com' => 'bar', 'alt.example.org' => 'baz')));
  1854. $this->assertEquals('{
  1855. "config": {
  1856. "github-oauth": {
  1857. "github.com": "bar",
  1858. "alt.example.org": "baz"
  1859. },
  1860. "github-protocols": ["https", "http"]
  1861. }
  1862. }
  1863. ', $manipulator->getContents());
  1864. }
  1865. public function testAddConfigSettingCanAddSubKeyInEmptyConfig()
  1866. {
  1867. $manipulator = new JsonManipulator('{
  1868. "config": {
  1869. }
  1870. }');
  1871. $this->assertTrue($manipulator->addConfigSetting('github-oauth.bar', 'baz'));
  1872. $this->assertEquals('{
  1873. "config": {
  1874. "github-oauth": {
  1875. "bar": "baz"
  1876. }
  1877. }
  1878. }
  1879. ', $manipulator->getContents());
  1880. }
  1881. public function testAddConfigSettingCanAddSubKeyInEmptyVal()
  1882. {
  1883. $manipulator = new JsonManipulator('{
  1884. "config": {
  1885. "github-oauth": {},
  1886. "github-oauth2": {
  1887. }
  1888. }
  1889. }');
  1890. $this->assertTrue($manipulator->addConfigSetting('github-oauth.bar', 'baz'));
  1891. $this->assertTrue($manipulator->addConfigSetting('github-oauth2.a.bar', 'baz2'));
  1892. $this->assertTrue($manipulator->addConfigSetting('github-oauth3.b', 'c'));
  1893. $this->assertEquals('{
  1894. "config": {
  1895. "github-oauth": {
  1896. "bar": "baz"
  1897. },
  1898. "github-oauth2": {
  1899. "a.bar": "baz2"
  1900. },
  1901. "github-oauth3": {
  1902. "b": "c"
  1903. }
  1904. }
  1905. }
  1906. ', $manipulator->getContents());
  1907. }
  1908. public function testAddConfigSettingCanAddSubKeyInHash()
  1909. {
  1910. $manipulator = new JsonManipulator('{
  1911. "config": {
  1912. "github-oauth": {
  1913. "github.com": "foo"
  1914. }
  1915. }
  1916. }');
  1917. $this->assertTrue($manipulator->addConfigSetting('github-oauth.bar', 'baz'));
  1918. $this->assertEquals('{
  1919. "config": {
  1920. "github-oauth": {
  1921. "github.com": "foo",
  1922. "bar": "baz"
  1923. }
  1924. }
  1925. }
  1926. ', $manipulator->getContents());
  1927. }
  1928. public function testAddRootSettingDoesNotBreakDots()
  1929. {
  1930. $manipulator = new JsonManipulator('{
  1931. "github-oauth": {
  1932. "github.com": "foo"
  1933. }
  1934. }');
  1935. $this->assertTrue($manipulator->addSubNode('github-oauth', 'bar', 'baz'));
  1936. $this->assertEquals('{
  1937. "github-oauth": {
  1938. "github.com": "foo",
  1939. "bar": "baz"
  1940. }
  1941. }
  1942. ', $manipulator->getContents());
  1943. }
  1944. public function testRemoveConfigSettingCanRemoveSubKeyInHash()
  1945. {
  1946. $manipulator = new JsonManipulator('{
  1947. "config": {
  1948. "github-oauth": {
  1949. "github.com": "foo",
  1950. "bar": "baz"
  1951. }
  1952. }
  1953. }');
  1954. $this->assertTrue($manipulator->removeConfigSetting('github-oauth.bar'));
  1955. $this->assertEquals('{
  1956. "config": {
  1957. "github-oauth": {
  1958. "github.com": "foo"
  1959. }
  1960. }
  1961. }
  1962. ', $manipulator->getContents());
  1963. }
  1964. public function testRemoveConfigSettingCanRemoveSubKeyInHashWithSiblings()
  1965. {
  1966. $manipulator = new JsonManipulator('{
  1967. "config": {
  1968. "foo": "bar",
  1969. "github-oauth": {
  1970. "github.com": "foo",
  1971. "bar": "baz"
  1972. }
  1973. }
  1974. }');
  1975. $this->assertTrue($manipulator->removeConfigSetting('github-oauth.bar'));
  1976. $this->assertEquals('{
  1977. "config": {
  1978. "foo": "bar",
  1979. "github-oauth": {
  1980. "github.com": "foo"
  1981. }
  1982. }
  1983. }
  1984. ', $manipulator->getContents());
  1985. }
  1986. public function testAddMainKey()
  1987. {
  1988. $manipulator = new JsonManipulator('{
  1989. "foo": "bar"
  1990. }');
  1991. $this->assertTrue($manipulator->addMainKey('bar', 'baz'));
  1992. $this->assertEquals('{
  1993. "foo": "bar",
  1994. "bar": "baz"
  1995. }
  1996. ', $manipulator->getContents());
  1997. }
  1998. public function testUpdateMainKey()
  1999. {
  2000. $manipulator = new JsonManipulator('{
  2001. "foo": "bar"
  2002. }');
  2003. $this->assertTrue($manipulator->addMainKey('foo', 'baz'));
  2004. $this->assertEquals('{
  2005. "foo": "baz"
  2006. }
  2007. ', $manipulator->getContents());
  2008. }
  2009. public function testUpdateMainKey2()
  2010. {
  2011. $manipulator = new JsonManipulator('{
  2012. "a": {
  2013. "foo": "bar",
  2014. "baz": "qux"
  2015. },
  2016. "foo": "bar",
  2017. "baz": "bar"
  2018. }');
  2019. $this->assertTrue($manipulator->addMainKey('foo', 'baz'));
  2020. $this->assertTrue($manipulator->addMainKey('baz', 'quux'));
  2021. $this->assertEquals('{
  2022. "a": {
  2023. "foo": "bar",
  2024. "baz": "qux"
  2025. },
  2026. "foo": "baz",
  2027. "baz": "quux"
  2028. }
  2029. ', $manipulator->getContents());
  2030. }
  2031. public function testUpdateMainKey3()
  2032. {
  2033. $manipulator = new JsonManipulator('{
  2034. "require": {
  2035. "php": "5.*"
  2036. },
  2037. "require-dev": {
  2038. "foo": "bar"
  2039. }
  2040. }');
  2041. $this->assertTrue($manipulator->addMainKey('require-dev', array('foo' => 'qux')));
  2042. $this->assertEquals('{
  2043. "require": {
  2044. "php": "5.*"
  2045. },
  2046. "require-dev": {
  2047. "foo": "qux"
  2048. }
  2049. }
  2050. ', $manipulator->getContents());
  2051. }
  2052. public function testIndentDetection()
  2053. {
  2054. $manipulator = new JsonManipulator('{
  2055. "require": {
  2056. "php": "5.*"
  2057. }
  2058. }');
  2059. $this->assertTrue($manipulator->addMainKey('require-dev', array('foo' => 'qux')));
  2060. $this->assertEquals('{
  2061. "require": {
  2062. "php": "5.*"
  2063. },
  2064. "require-dev": {
  2065. "foo": "qux"
  2066. }
  2067. }
  2068. ', $manipulator->getContents());
  2069. }
  2070. }