ManagerTest.php 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. <?php namespace League\Fractal\Test;
  2. use League\Fractal\Resource\Item;
  3. use League\Fractal\Resource\Collection;
  4. use League\Fractal\Manager;
  5. use Mockery;
  6. class ManagerTest extends \PHPUnit_Framework_TestCase
  7. {
  8. public function testParseIncludeSelfie()
  9. {
  10. $manager = new Manager();
  11. // Test that some includes provided returns self
  12. $this->assertInstanceOf(get_class($manager), $manager->parseIncludes(array('foo')));
  13. }
  14. /**
  15. * @expectedException InvalidArgumentException
  16. * @expectedExceptionMessage The parseIncludes() method expects a string or an array. NULL given
  17. */
  18. public function testInvalidParseInclude()
  19. {
  20. $manager = new Manager();
  21. $manager->parseIncludes(null);
  22. }
  23. /**
  24. * @expectedException InvalidArgumentException
  25. * @expectedExceptionMessage The parseIncludes() method expects a string or an array. integer given
  26. */
  27. public function testIceTParseInclude()
  28. {
  29. $manager = new Manager();
  30. $manager->parseIncludes(99);
  31. }
  32. public function testParseIncludes()
  33. {
  34. $manager = new Manager();
  35. // Does a CSV string work
  36. $manager->parseIncludes('foo,bar');
  37. $this->assertEquals(array('foo', 'bar'), $manager->getRequestedIncludes());
  38. // Does a big array of stuff work
  39. $manager->parseIncludes(array('foo', 'bar', 'bar.baz'));
  40. $this->assertEquals(array('foo', 'bar', 'bar.baz'), $manager->getRequestedIncludes());
  41. // Are repeated things stripped
  42. $manager->parseIncludes(array('foo', 'foo', 'bar'));
  43. $this->assertEquals(array('foo', 'bar'), $manager->getRequestedIncludes());
  44. // Do requests for `baz.bart` also request `baz`?
  45. $manager->parseIncludes(array('foo.bar'));
  46. $this->assertEquals(array('foo', 'foo.bar'), $manager->getRequestedIncludes());
  47. // See if fancy syntax works
  48. $manager->parseIncludes('foo:limit(5|1):order(-something)');
  49. $this->assertEquals(array('limit' => array('5', '1'), 'order' => array('-something')), $manager->getIncludeParams('foo'));
  50. }
  51. public function testRecursionLimiting()
  52. {
  53. $manager = new Manager();
  54. // Should limit to 10 by default
  55. $manager->parseIncludes('a.b.c.d.e.f.g.h.i.j.NEVER');
  56. $this->assertEquals(
  57. array(
  58. 'a',
  59. 'a.b',
  60. 'a.b.c',
  61. 'a.b.c.d',
  62. 'a.b.c.d.e',
  63. 'a.b.c.d.e.f',
  64. 'a.b.c.d.e.f.g',
  65. 'a.b.c.d.e.f.g.h',
  66. 'a.b.c.d.e.f.g.h.i',
  67. 'a.b.c.d.e.f.g.h.i.j',
  68. ),
  69. $manager->getRequestedIncludes()
  70. );
  71. // Try setting to 3 and see what happens
  72. $manager->setRecursionLimit(3);
  73. $manager->parseIncludes('a.b.c.NEVER');
  74. $this->assertEquals(
  75. array(
  76. 'a',
  77. 'a.b',
  78. 'a.b.c',
  79. ),
  80. $manager->getRequestedIncludes()
  81. );
  82. }
  83. public function testCreateDataWithCallback()
  84. {
  85. $manager = new Manager();
  86. // Item
  87. $resource = new Item(array('foo' => 'bar'), function (array $data) {
  88. return $data;
  89. });
  90. $rootScope = $manager->createData($resource);
  91. $this->assertInstanceOf('League\Fractal\Scope', $rootScope);
  92. $this->assertEquals(array('data' => array('foo' => 'bar')), $rootScope->toArray());
  93. $this->assertEquals('{"data":{"foo":"bar"}}', $rootScope->toJson());
  94. // Collection
  95. $resource = new Collection(array(array('foo' => 'bar')), function (array $data) {
  96. return $data;
  97. });
  98. $rootScope = $manager->createData($resource);
  99. $this->assertInstanceOf('League\Fractal\Scope', $rootScope);
  100. $this->assertEquals(array('data' => array(array('foo' => 'bar'))), $rootScope->toArray());
  101. $this->assertEquals('{"data":[{"foo":"bar"}]}', $rootScope->toJson());
  102. }
  103. public function tearDown()
  104. {
  105. Mockery::close();
  106. }
  107. }