JsonManipulatorTest.php 60 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293
  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. 'works on deep repos with borked texts' => array(
  1536. '{
  1537. "repositories": {
  1538. "foo": {
  1539. "package": { "bar": "ba{z" }
  1540. }
  1541. }
  1542. }',
  1543. 'bar',
  1544. true,
  1545. '{
  1546. "repositories": {
  1547. "foo": {
  1548. "package": { "bar": "ba{z" }
  1549. }
  1550. }
  1551. }
  1552. ',
  1553. '{
  1554. }
  1555. ',
  1556. ),
  1557. 'works on deep repos with borked texts2' => array(
  1558. '{
  1559. "repositories": {
  1560. "foo": {
  1561. "package": { "bar": "ba}z" }
  1562. }
  1563. }
  1564. }',
  1565. 'bar',
  1566. true,
  1567. '{
  1568. "repositories": {
  1569. "foo": {
  1570. "package": { "bar": "ba}z" }
  1571. }
  1572. }
  1573. }
  1574. ',
  1575. '{
  1576. }
  1577. ',
  1578. ),
  1579. 'fails on deep arrays with borked texts' => array(
  1580. '{
  1581. "repositories": [
  1582. {
  1583. "package": { "bar": "ba[z" }
  1584. }
  1585. ]
  1586. }',
  1587. 'bar',
  1588. false,
  1589. ),
  1590. 'fails on deep arrays with borked texts2' => array(
  1591. '{
  1592. "repositories": [
  1593. {
  1594. "package": { "bar": "ba]z" }
  1595. }
  1596. ]
  1597. }',
  1598. 'bar',
  1599. false,
  1600. ),
  1601. );
  1602. }
  1603. public function testRemoveSubNodeFromRequire()
  1604. {
  1605. $manipulator = new JsonManipulator('{
  1606. "repositories": [
  1607. {
  1608. "package": {
  1609. "require": {
  1610. "this/should-not-end-up-in-root-require": "~2.0"
  1611. },
  1612. "require-dev": {
  1613. "this/should-not-end-up-in-root-require-dev": "~2.0"
  1614. }
  1615. }
  1616. }
  1617. ],
  1618. "require": {
  1619. "package/a": "*",
  1620. "package/b": "*",
  1621. "package/c": "*"
  1622. },
  1623. "require-dev": {
  1624. "package/d": "*"
  1625. }
  1626. }');
  1627. $this->assertTrue($manipulator->removeSubNode('require', 'package/c'));
  1628. $this->assertTrue($manipulator->removeSubNode('require-dev', 'package/d'));
  1629. $this->assertEquals('{
  1630. "repositories": [
  1631. {
  1632. "package": {
  1633. "require": {
  1634. "this/should-not-end-up-in-root-require": "~2.0"
  1635. },
  1636. "require-dev": {
  1637. "this/should-not-end-up-in-root-require-dev": "~2.0"
  1638. }
  1639. }
  1640. }
  1641. ],
  1642. "require": {
  1643. "package/a": "*",
  1644. "package/b": "*"
  1645. },
  1646. "require-dev": {
  1647. }
  1648. }
  1649. ', $manipulator->getContents());
  1650. }
  1651. public function testAddSubNodeInRequire()
  1652. {
  1653. $manipulator = new JsonManipulator('{
  1654. "repositories": [
  1655. {
  1656. "package": {
  1657. "require": {
  1658. "this/should-not-end-up-in-root-require": "~2.0"
  1659. },
  1660. "require-dev": {
  1661. "this/should-not-end-up-in-root-require-dev": "~2.0"
  1662. }
  1663. }
  1664. }
  1665. ],
  1666. "require": {
  1667. "package/a": "*",
  1668. "package/b": "*"
  1669. },
  1670. "require-dev": {
  1671. "package/d": "*"
  1672. }
  1673. }');
  1674. $this->assertTrue($manipulator->addSubNode('require', 'package/c', '*'));
  1675. $this->assertTrue($manipulator->addSubNode('require-dev', 'package/e', '*'));
  1676. $this->assertEquals('{
  1677. "repositories": [
  1678. {
  1679. "package": {
  1680. "require": {
  1681. "this/should-not-end-up-in-root-require": "~2.0"
  1682. },
  1683. "require-dev": {
  1684. "this/should-not-end-up-in-root-require-dev": "~2.0"
  1685. }
  1686. }
  1687. }
  1688. ],
  1689. "require": {
  1690. "package/a": "*",
  1691. "package/b": "*",
  1692. "package/c": "*"
  1693. },
  1694. "require-dev": {
  1695. "package/d": "*",
  1696. "package/e": "*"
  1697. }
  1698. }
  1699. ', $manipulator->getContents());
  1700. }
  1701. public function testAddExtraWithPackage()
  1702. {
  1703. //$this->markTestSkipped();
  1704. $manipulator = new JsonManipulator('{
  1705. "repositories": [
  1706. {
  1707. "type": "package",
  1708. "package": {
  1709. "authors": [],
  1710. "extra": {
  1711. "package-xml": "package.xml"
  1712. }
  1713. }
  1714. }
  1715. ],
  1716. "extra": {
  1717. "auto-append-gitignore": true
  1718. }
  1719. }');
  1720. $this->assertTrue($manipulator->addProperty('extra.foo-bar', true));
  1721. $this->assertEquals('{
  1722. "repositories": [
  1723. {
  1724. "type": "package",
  1725. "package": {
  1726. "authors": [],
  1727. "extra": {
  1728. "package-xml": "package.xml"
  1729. }
  1730. }
  1731. }
  1732. ],
  1733. "extra": {
  1734. "auto-append-gitignore": true,
  1735. "foo-bar": true
  1736. }
  1737. }
  1738. ', $manipulator->getContents());
  1739. }
  1740. public function testAddRepositoryCanInitializeEmptyRepositories()
  1741. {
  1742. $manipulator = new JsonManipulator('{
  1743. "repositories": {
  1744. }
  1745. }');
  1746. $this->assertTrue($manipulator->addRepository('bar', array('type' => 'composer')));
  1747. $this->assertEquals('{
  1748. "repositories": {
  1749. "bar": {
  1750. "type": "composer"
  1751. }
  1752. }
  1753. }
  1754. ', $manipulator->getContents());
  1755. }
  1756. public function testAddRepositoryCanInitializeFromScratch()
  1757. {
  1758. $manipulator = new JsonManipulator("{
  1759. \t\"a\": \"b\"
  1760. }");
  1761. $this->assertTrue($manipulator->addRepository('bar2', array('type' => 'composer')));
  1762. $this->assertEquals("{
  1763. \t\"a\": \"b\",
  1764. \t\"repositories\": {
  1765. \t\t\"bar2\": {
  1766. \t\t\t\"type\": \"composer\"
  1767. \t\t}
  1768. \t}
  1769. }
  1770. ", $manipulator->getContents());
  1771. }
  1772. public function testAddRepositoryCanAdd()
  1773. {
  1774. $manipulator = new JsonManipulator('{
  1775. "repositories": {
  1776. "foo": {
  1777. "type": "vcs",
  1778. "url": "lala"
  1779. }
  1780. }
  1781. }');
  1782. $this->assertTrue($manipulator->addRepository('bar', array('type' => 'composer')));
  1783. $this->assertEquals('{
  1784. "repositories": {
  1785. "foo": {
  1786. "type": "vcs",
  1787. "url": "lala"
  1788. },
  1789. "bar": {
  1790. "type": "composer"
  1791. }
  1792. }
  1793. }
  1794. ', $manipulator->getContents());
  1795. }
  1796. public function testAddRepositoryCanOverrideDeepRepos()
  1797. {
  1798. $manipulator = new JsonManipulator('{
  1799. "repositories": {
  1800. "baz": {
  1801. "type": "package",
  1802. "package": {}
  1803. }
  1804. }
  1805. }');
  1806. $this->assertTrue($manipulator->addRepository('baz', array('type' => 'composer')));
  1807. $this->assertEquals('{
  1808. "repositories": {
  1809. "baz": {
  1810. "type": "composer"
  1811. }
  1812. }
  1813. }
  1814. ', $manipulator->getContents());
  1815. }
  1816. public function testAddConfigSettingEscapes()
  1817. {
  1818. $manipulator = new JsonManipulator('{
  1819. "config": {
  1820. }
  1821. }');
  1822. $this->assertTrue($manipulator->addConfigSetting('test', 'a\b'));
  1823. $this->assertTrue($manipulator->addConfigSetting('test2', "a\nb\fa"));
  1824. $this->assertEquals('{
  1825. "config": {
  1826. "test": "a\\\\b",
  1827. "test2": "a\nb\fa"
  1828. }
  1829. }
  1830. ', $manipulator->getContents());
  1831. }
  1832. public function testAddConfigSettingWorksFromScratch()
  1833. {
  1834. $manipulator = new JsonManipulator('{
  1835. }');
  1836. $this->assertTrue($manipulator->addConfigSetting('foo.bar', 'baz'));
  1837. $this->assertEquals('{
  1838. "config": {
  1839. "foo": {
  1840. "bar": "baz"
  1841. }
  1842. }
  1843. }
  1844. ', $manipulator->getContents());
  1845. }
  1846. public function testAddConfigSettingCanAdd()
  1847. {
  1848. $manipulator = new JsonManipulator('{
  1849. "config": {
  1850. "foo": "bar"
  1851. }
  1852. }');
  1853. $this->assertTrue($manipulator->addConfigSetting('bar', 'baz'));
  1854. $this->assertEquals('{
  1855. "config": {
  1856. "foo": "bar",
  1857. "bar": "baz"
  1858. }
  1859. }
  1860. ', $manipulator->getContents());
  1861. }
  1862. public function testAddConfigSettingCanOverwrite()
  1863. {
  1864. $manipulator = new JsonManipulator('{
  1865. "config": {
  1866. "foo": "bar",
  1867. "bar": "baz"
  1868. }
  1869. }');
  1870. $this->assertTrue($manipulator->addConfigSetting('foo', 'zomg'));
  1871. $this->assertEquals('{
  1872. "config": {
  1873. "foo": "zomg",
  1874. "bar": "baz"
  1875. }
  1876. }
  1877. ', $manipulator->getContents());
  1878. }
  1879. public function testAddConfigSettingCanOverwriteNumbers()
  1880. {
  1881. $manipulator = new JsonManipulator('{
  1882. "config": {
  1883. "foo": 500
  1884. }
  1885. }');
  1886. $this->assertTrue($manipulator->addConfigSetting('foo', 50));
  1887. $this->assertEquals('{
  1888. "config": {
  1889. "foo": 50
  1890. }
  1891. }
  1892. ', $manipulator->getContents());
  1893. }
  1894. public function testAddConfigSettingCanOverwriteArrays()
  1895. {
  1896. $manipulator = new JsonManipulator('{
  1897. "config": {
  1898. "github-oauth": {
  1899. "github.com": "foo"
  1900. },
  1901. "github-protocols": ["https"]
  1902. }
  1903. }');
  1904. $this->assertTrue($manipulator->addConfigSetting('github-protocols', array('https', 'http')));
  1905. $this->assertEquals('{
  1906. "config": {
  1907. "github-oauth": {
  1908. "github.com": "foo"
  1909. },
  1910. "github-protocols": ["https", "http"]
  1911. }
  1912. }
  1913. ', $manipulator->getContents());
  1914. $this->assertTrue($manipulator->addConfigSetting('github-oauth', array('github.com' => 'bar', 'alt.example.org' => 'baz')));
  1915. $this->assertEquals('{
  1916. "config": {
  1917. "github-oauth": {
  1918. "github.com": "bar",
  1919. "alt.example.org": "baz"
  1920. },
  1921. "github-protocols": ["https", "http"]
  1922. }
  1923. }
  1924. ', $manipulator->getContents());
  1925. }
  1926. public function testAddConfigSettingCanAddSubKeyInEmptyConfig()
  1927. {
  1928. $manipulator = new JsonManipulator('{
  1929. "config": {
  1930. }
  1931. }');
  1932. $this->assertTrue($manipulator->addConfigSetting('github-oauth.bar', 'baz'));
  1933. $this->assertEquals('{
  1934. "config": {
  1935. "github-oauth": {
  1936. "bar": "baz"
  1937. }
  1938. }
  1939. }
  1940. ', $manipulator->getContents());
  1941. }
  1942. public function testAddConfigSettingCanAddSubKeyInEmptyVal()
  1943. {
  1944. $manipulator = new JsonManipulator('{
  1945. "config": {
  1946. "github-oauth": {},
  1947. "github-oauth2": {
  1948. }
  1949. }
  1950. }');
  1951. $this->assertTrue($manipulator->addConfigSetting('github-oauth.bar', 'baz'));
  1952. $this->assertTrue($manipulator->addConfigSetting('github-oauth2.a.bar', 'baz2'));
  1953. $this->assertTrue($manipulator->addConfigSetting('github-oauth3.b', 'c'));
  1954. $this->assertEquals('{
  1955. "config": {
  1956. "github-oauth": {
  1957. "bar": "baz"
  1958. },
  1959. "github-oauth2": {
  1960. "a.bar": "baz2"
  1961. },
  1962. "github-oauth3": {
  1963. "b": "c"
  1964. }
  1965. }
  1966. }
  1967. ', $manipulator->getContents());
  1968. }
  1969. public function testAddConfigSettingCanAddSubKeyInHash()
  1970. {
  1971. $manipulator = new JsonManipulator('{
  1972. "config": {
  1973. "github-oauth": {
  1974. "github.com": "foo"
  1975. }
  1976. }
  1977. }');
  1978. $this->assertTrue($manipulator->addConfigSetting('github-oauth.bar', 'baz'));
  1979. $this->assertEquals('{
  1980. "config": {
  1981. "github-oauth": {
  1982. "github.com": "foo",
  1983. "bar": "baz"
  1984. }
  1985. }
  1986. }
  1987. ', $manipulator->getContents());
  1988. }
  1989. public function testAddRootSettingDoesNotBreakDots()
  1990. {
  1991. $manipulator = new JsonManipulator('{
  1992. "github-oauth": {
  1993. "github.com": "foo"
  1994. }
  1995. }');
  1996. $this->assertTrue($manipulator->addSubNode('github-oauth', 'bar', 'baz'));
  1997. $this->assertEquals('{
  1998. "github-oauth": {
  1999. "github.com": "foo",
  2000. "bar": "baz"
  2001. }
  2002. }
  2003. ', $manipulator->getContents());
  2004. }
  2005. public function testRemoveConfigSettingCanRemoveSubKeyInHash()
  2006. {
  2007. $manipulator = new JsonManipulator('{
  2008. "config": {
  2009. "github-oauth": {
  2010. "github.com": "foo",
  2011. "bar": "baz"
  2012. }
  2013. }
  2014. }');
  2015. $this->assertTrue($manipulator->removeConfigSetting('github-oauth.bar'));
  2016. $this->assertEquals('{
  2017. "config": {
  2018. "github-oauth": {
  2019. "github.com": "foo"
  2020. }
  2021. }
  2022. }
  2023. ', $manipulator->getContents());
  2024. }
  2025. public function testRemoveConfigSettingCanRemoveSubKeyInHashWithSiblings()
  2026. {
  2027. $manipulator = new JsonManipulator('{
  2028. "config": {
  2029. "foo": "bar",
  2030. "github-oauth": {
  2031. "github.com": "foo",
  2032. "bar": "baz"
  2033. }
  2034. }
  2035. }');
  2036. $this->assertTrue($manipulator->removeConfigSetting('github-oauth.bar'));
  2037. $this->assertEquals('{
  2038. "config": {
  2039. "foo": "bar",
  2040. "github-oauth": {
  2041. "github.com": "foo"
  2042. }
  2043. }
  2044. }
  2045. ', $manipulator->getContents());
  2046. }
  2047. public function testAddMainKey()
  2048. {
  2049. $manipulator = new JsonManipulator('{
  2050. "foo": "bar"
  2051. }');
  2052. $this->assertTrue($manipulator->addMainKey('bar', 'baz'));
  2053. $this->assertEquals('{
  2054. "foo": "bar",
  2055. "bar": "baz"
  2056. }
  2057. ', $manipulator->getContents());
  2058. }
  2059. public function testAddMainKeyWithContentHavingDollarSignFollowedByDigit()
  2060. {
  2061. $manipulator = new JsonManipulator('{
  2062. "foo": "bar"
  2063. }');
  2064. $this->assertTrue($manipulator->addMainKey('bar', '$1baz'));
  2065. $this->assertEquals('{
  2066. "foo": "bar",
  2067. "bar": "$1baz"
  2068. }
  2069. ', $manipulator->getContents());
  2070. }
  2071. public function testAddMainKeyWithContentHavingDollarSignFollowedByDigit2()
  2072. {
  2073. $manipulator = new JsonManipulator('{}');
  2074. $this->assertTrue($manipulator->addMainKey('foo', '$1bar'));
  2075. $this->assertEquals('{
  2076. "foo": "$1bar"
  2077. }
  2078. ', $manipulator->getContents());
  2079. }
  2080. public function testUpdateMainKey()
  2081. {
  2082. $manipulator = new JsonManipulator('{
  2083. "foo": "bar"
  2084. }');
  2085. $this->assertTrue($manipulator->addMainKey('foo', 'baz'));
  2086. $this->assertEquals('{
  2087. "foo": "baz"
  2088. }
  2089. ', $manipulator->getContents());
  2090. }
  2091. public function testUpdateMainKey2()
  2092. {
  2093. $manipulator = new JsonManipulator('{
  2094. "a": {
  2095. "foo": "bar",
  2096. "baz": "qux"
  2097. },
  2098. "foo": "bar",
  2099. "baz": "bar"
  2100. }');
  2101. $this->assertTrue($manipulator->addMainKey('foo', 'baz'));
  2102. $this->assertTrue($manipulator->addMainKey('baz', 'quux'));
  2103. $this->assertEquals('{
  2104. "a": {
  2105. "foo": "bar",
  2106. "baz": "qux"
  2107. },
  2108. "foo": "baz",
  2109. "baz": "quux"
  2110. }
  2111. ', $manipulator->getContents());
  2112. }
  2113. public function testUpdateMainKey3()
  2114. {
  2115. $manipulator = new JsonManipulator('{
  2116. "require": {
  2117. "php": "5.*"
  2118. },
  2119. "require-dev": {
  2120. "foo": "bar"
  2121. }
  2122. }');
  2123. $this->assertTrue($manipulator->addMainKey('require-dev', array('foo' => 'qux')));
  2124. $this->assertEquals('{
  2125. "require": {
  2126. "php": "5.*"
  2127. },
  2128. "require-dev": {
  2129. "foo": "qux"
  2130. }
  2131. }
  2132. ', $manipulator->getContents());
  2133. }
  2134. public function testUpdateMainKeyWithContentHavingDollarSignFollowedByDigit()
  2135. {
  2136. $manipulator = new JsonManipulator('{
  2137. "foo": "bar"
  2138. }');
  2139. $this->assertTrue($manipulator->addMainKey('foo', '$1bar'));
  2140. $this->assertEquals('{
  2141. "foo": "$1bar"
  2142. }
  2143. ', $manipulator->getContents());
  2144. }
  2145. public function testRemoveMainKey()
  2146. {
  2147. $manipulator = new JsonManipulator('{
  2148. "repositories": [
  2149. {
  2150. "package": {
  2151. "require": {
  2152. "this/should-not-end-up-in-root-require": "~2.0"
  2153. },
  2154. "require-dev": {
  2155. "this/should-not-end-up-in-root-require-dev": "~2.0"
  2156. }
  2157. }
  2158. }
  2159. ],
  2160. "require": {
  2161. "package/a": "*",
  2162. "package/b": "*",
  2163. "package/c": "*"
  2164. },
  2165. "foo": "bar",
  2166. "require-dev": {
  2167. "package/d": "*"
  2168. }
  2169. }');
  2170. $this->assertTrue($manipulator->removeMainKey('repositories'));
  2171. $this->assertEquals('{
  2172. "require": {
  2173. "package/a": "*",
  2174. "package/b": "*",
  2175. "package/c": "*"
  2176. },
  2177. "foo": "bar",
  2178. "require-dev": {
  2179. "package/d": "*"
  2180. }
  2181. }
  2182. ', $manipulator->getContents());
  2183. $this->assertTrue($manipulator->removeMainKey('foo'));
  2184. $this->assertEquals('{
  2185. "require": {
  2186. "package/a": "*",
  2187. "package/b": "*",
  2188. "package/c": "*"
  2189. },
  2190. "require-dev": {
  2191. "package/d": "*"
  2192. }
  2193. }
  2194. ', $manipulator->getContents());
  2195. $this->assertTrue($manipulator->removeMainKey('require'));
  2196. $this->assertTrue($manipulator->removeMainKey('require-dev'));
  2197. $this->assertEquals('{
  2198. }
  2199. ', $manipulator->getContents());
  2200. }
  2201. public function testIndentDetection()
  2202. {
  2203. $manipulator = new JsonManipulator('{
  2204. "require": {
  2205. "php": "5.*"
  2206. }
  2207. }');
  2208. $this->assertTrue($manipulator->addMainKey('require-dev', array('foo' => 'qux')));
  2209. $this->assertEquals('{
  2210. "require": {
  2211. "php": "5.*"
  2212. },
  2213. "require-dev": {
  2214. "foo": "qux"
  2215. }
  2216. }
  2217. ', $manipulator->getContents());
  2218. }
  2219. }