JsonableBehaviorTest.php 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. <?php
  2. namespace Tools\Test\TestCase\Model\Behavior;
  3. use Cake\ORM\TableRegistry;
  4. use Tools\TestSuite\TestCase;
  5. use Cake\Core\Configure;
  6. use Tools\Model\Behavior\JsonableBehavior;
  7. class JsonableBehaviorTest extends TestCase {
  8. public $fixtures = [
  9. 'plugin.tools.jsonable_comments'
  10. ];
  11. public $Comments;
  12. public function setUp() {
  13. parent::setUp();
  14. Configure::write('App.namespace', 'TestApp');
  15. $this->Comments = TableRegistry::get('JsonableComments');
  16. $this->Comments->addBehavior('Tools.Jsonable', ['fields' => ['details']]);
  17. }
  18. /**
  19. * JsonableBehaviorTest::testBasic()
  20. *
  21. * @return void
  22. */
  23. public function testBasic() {
  24. // accuracy >= 5
  25. $data = [
  26. 'comment' => 'blabla',
  27. 'url' => 'www.dereuromark.de',
  28. 'title' => 'some Name',
  29. 'details' => ['x' => 'y'],
  30. ];
  31. $entity = $this->Comments->newEntity($data);
  32. $res = $this->Comments->save($entity);
  33. $this->assertTrue((bool)$res);
  34. $this->assertSame('{"x":"y"}', $res['details']);
  35. }
  36. /**
  37. * JsonableBehaviorTest::testFieldsWithList()
  38. *
  39. * @return void
  40. */
  41. public function testFieldsWithList() {
  42. //echo $this->_header(__FUNCTION__);
  43. $this->Comments->removeBehavior('Jsonable');
  44. $this->Comments->addBehavior('Tools.Jsonable', ['fields' => ['details'], 'input' => 'list']);
  45. $data = [
  46. 'comment' => 'blabla',
  47. 'url' => 'www.dereuromark.de',
  48. 'title' => 'some Name',
  49. 'details' => 'z|y|x',
  50. ];
  51. $entity = $this->Comments->newEntity($data);
  52. $res = $this->Comments->save($entity);
  53. $this->assertTrue((bool)$res);
  54. $this->assertSame('["z","y","x"]', $res['details']);
  55. // with sort and unique
  56. $data = [
  57. 'comment' => 'blabla',
  58. 'url' => 'www.dereuromark.de',
  59. 'title' => 'some Name',
  60. 'details' => 'z|x|y|x',
  61. ];
  62. $this->Comments->removeBehavior('Jsonable');
  63. $this->Comments->addBehavior('Tools.Jsonable', ['fields' => ['details'], 'input' => 'list', 'sort' => true]);
  64. $entity = $this->Comments->newEntity($data);
  65. $res = $this->Comments->save($entity);
  66. $this->assertTrue((bool)$res);
  67. $this->assertSame('["x","y","z"]', $res['details']);
  68. }
  69. /**
  70. * JsonableBehaviorTest::testFieldsWithParam()
  71. *
  72. * @return void
  73. */
  74. public function testFieldsWithParam() {
  75. $this->Comments->removeBehavior('Jsonable');
  76. $this->Comments->addBehavior('Tools.Jsonable', ['fields' => ['details'], 'input' => 'param']);
  77. $data = [
  78. 'comment' => 'blabla',
  79. 'url' => 'www.dereuromark.de',
  80. 'title' => 'some Name',
  81. 'details' => 'z:vz|y:yz|x:xz',
  82. ];
  83. $entity = $this->Comments->newEntity($data);
  84. $res = $this->Comments->save($entity);
  85. $this->assertTrue((bool)$res);
  86. $this->assertSame('{"z":"vz","y":"yz","x":"xz"}', $res['details']);
  87. }
  88. /**
  89. * JsonableBehaviorTest::testFieldsOnFind()
  90. *
  91. * @return void
  92. */
  93. public function testFieldsOnFind() {
  94. //echo $this->_header(__FUNCTION__);
  95. // array
  96. $this->Comments->removeBehavior('Jsonable');
  97. $this->Comments->addBehavior('Tools.Jsonable', ['fields' => ['details']]);
  98. $data = [
  99. 'comment' => 'blabla',
  100. 'url' => 'www.dereuromark.de',
  101. 'title' => 'param',
  102. 'details' => ['x' => 'y'],
  103. ];
  104. $entity = $this->Comments->newEntity($data);
  105. $res = $this->Comments->save($entity);
  106. $this->assertTrue((bool)$res);
  107. $res = $this->Comments->find('all', ['conditions' => ['title' => 'param']])->first();
  108. $this->assertEquals(['x' => 'y'], $res['details']);
  109. // param
  110. $this->Comments->removeBehavior('Jsonable');
  111. $res = $this->Comments->find('all', ['conditions' => ['title' => 'param']])->first();
  112. $this->assertEquals('{"x":"y"}', $res['details']);
  113. $this->Comments->addBehavior('Tools.Jsonable', ['output' => 'param', 'fields' => ['details']]);
  114. $res = $this->Comments->find('all', ['conditions' => ['title' => 'param']])->first();
  115. $this->assertEquals('x:y', $res['details']);
  116. // list
  117. $this->Comments->removeBehavior('Jsonable');
  118. $this->Comments->addBehavior('Tools.Jsonable', ['output' => 'list', 'fields' => ['details']]);
  119. $data = [
  120. 'comment' => 'blabla',
  121. 'url' => 'www.dereuromark.de',
  122. 'title' => 'list',
  123. 'details' => ['z', 'y', 'x'],
  124. ];
  125. $entity = $this->Comments->newEntity($data);
  126. $res = $this->Comments->save($entity);
  127. $this->assertTrue((bool)$res);
  128. $this->Comments->removeBehavior('Jsonable');
  129. $res = $this->Comments->find('all', ['conditions' => ['title' => 'list']])->first();
  130. $this->assertEquals('["z","y","x"]', $res['details']);
  131. $this->Comments->addBehavior('Tools.Jsonable', ['output' => 'list', 'fields' => ['details']]);
  132. $res = $this->Comments->find('all', ['conditions' => ['title' => 'list']])->first();
  133. $this->assertEquals('z|y|x', $res['details']);
  134. // custom separator
  135. $this->Comments->removeBehavior('Jsonable');
  136. $this->Comments->addBehavior('Tools.Jsonable', ['output' => 'list', 'separator' => ', ', 'fields' => ['details']]);
  137. // find first
  138. $res = $this->Comments->find('all', ['conditions' => ['title' => 'list']])->first();
  139. $this->assertEquals('z, y, x', $res['details']);
  140. // find all
  141. $res = $this->Comments->find('all', ['order' => ['title' => 'ASC']])->toArray();
  142. $this->assertEquals('z, y, x', $res[0]['details']);
  143. }
  144. /**
  145. * JsonableBehaviorTest::testEncodeParams()
  146. *
  147. * @return void
  148. */
  149. public function testEncodeParams() {
  150. // $depth param added in 5.5.0
  151. $this->skipIf(!version_compare(PHP_VERSION, '5.5.0', '>='));
  152. // Test encode depth = 1
  153. $this->Comments->removeBehavior('Jsonable');
  154. $this->Comments->addBehavior('Tools.Jsonable', ['fields' => ['details'], 'encodeParams' => ['depth' => 1]]);
  155. $data = [
  156. 'comment' => 'blabla',
  157. 'url' => 'www.dereuromark.de',
  158. 'title' => 'param',
  159. 'details' => ['x' => ['y' => 'z']],
  160. ];
  161. $entity = $this->Comments->newEntity($data);
  162. $this->Comments->save($entity);
  163. $res = $this->Comments->find('all', ['conditions' => ['title' => 'param']])->first();
  164. $expected = [];
  165. $this->assertEquals($expected, $res['details']);
  166. $this->Comments->truncate();
  167. // Test encode depth = 2
  168. $this->Comments->removeBehavior('Jsonable');
  169. $this->Comments->addBehavior('Tools.Jsonable', ['fields' => ['details'], 'encodeParams' => ['depth' => 2], 'decodeParams' => ['assoc' => false]]);
  170. $data = [
  171. 'comment' => 'blabla',
  172. 'url' => 'www.dereuromark.de',
  173. 'title' => 'param',
  174. 'details' => ['x' => ['y' => 'z']],
  175. ];
  176. $entity = $this->Comments->newEntity($data);
  177. $this->Comments->save($entity);
  178. $res = $this->Comments->find('all', ['conditions' => ['title' => 'param']])->first();
  179. $obj = new \stdClass();
  180. $obj->x = new \stdClass();
  181. $obj->x->y = 'z';
  182. $expected = $obj;
  183. $this->assertEquals($expected, $res['details']);
  184. }
  185. public function testEncodeParamsAssocFalse() {
  186. // Test encode depth = 1
  187. $this->Comments->removeBehavior('Jsonable');
  188. $this->Comments->addBehavior('Tools.Jsonable', ['fields' => ['details'], 'encodeParams' => ['depth' => 1], 'decodeParams' => ['assoc' => false]]);
  189. $data = [
  190. 'comment' => 'blabla',
  191. 'url' => 'www.dereuromark.de',
  192. 'title' => 'param',
  193. 'details' => ['y' => 'yy'],
  194. ];
  195. $entity = $this->Comments->newEntity($data);
  196. $this->Comments->save($entity);
  197. $res = $this->Comments->find('all', ['conditions' => ['title' => 'param']])->first();
  198. $obj = new \stdClass();
  199. $obj->y = 'yy';
  200. $expected = $obj;
  201. $this->assertEquals($expected, $res['details']);
  202. $this->Comments->truncate();
  203. $this->Comments->removeBehavior('Jsonable');
  204. $this->Comments->addBehavior('Tools.Jsonable', ['fields' => ['details'], 'encodeParams' => ['depth' => 1], 'decodeParams' => ['assoc' => false]]);
  205. $data = [
  206. 'comment' => 'blabla',
  207. 'url' => 'www.dereuromark.de',
  208. 'title' => 'param',
  209. 'details' => ['y' => ['yy' => 'yyy']],
  210. ];
  211. $entity = $this->Comments->newEntity($data);
  212. $this->Comments->save($entity);
  213. $res = $this->Comments->find('all', ['conditions' => ['title' => 'param']])->first();
  214. $expected = null;
  215. $this->assertEquals($expected, $res['details']);
  216. }
  217. /**
  218. * JsonableBehaviorTest::testDecodeParams()
  219. *
  220. * @return void
  221. */
  222. public function testDecodeParams() {
  223. $this->Comments->removeBehavior('Jsonable');
  224. $this->Comments->addBehavior('Tools.Jsonable', ['output' => 'array', 'fields' => ['details'], 'decodeParams' => ['assoc'=> false]]);
  225. $data = [
  226. 'comment' => 'blabla',
  227. 'url' => 'www.dereuromark.de',
  228. 'title' => 'param',
  229. 'details' => ['x' => ['y' => 'z']],
  230. ];
  231. $entity = $this->Comments->newEntity($data);
  232. $this->Comments->save($entity);
  233. // Test decode with default params
  234. $res = $this->Comments->find('all', ['conditions' => ['title' => 'param']])->first();
  235. $obj = new \stdClass();
  236. $obj->x = new \stdClass();
  237. $obj->x->y = 'z';
  238. $expected = $obj;
  239. $this->assertEquals($expected, $res['details']);
  240. // Test decode with assoc = true
  241. $this->Comments->removeBehavior('Jsonable');
  242. $this->Comments->addBehavior('Tools.Jsonable', ['fields' => ['details'], 'decodeParams' => ['assoc' => true]]);
  243. $res = $this->Comments->find('all', ['conditions' => ['title' => 'param']])->first();
  244. $expected = ['x' => ['y' => 'z']];
  245. $this->assertEquals($expected, $res['details']);
  246. // Test decode with assoc = true and depth = 2
  247. $this->Comments->removeBehavior('Jsonable');
  248. $this->Comments->addBehavior('Tools.Jsonable', ['fields' => ['details'], 'decodeParams' => ['assoc' => true, 'depth' => 2]]);
  249. $res = $this->Comments->find('all', ['conditions' => ['title' => 'param']])->first();
  250. $expected = [];
  251. $this->assertEquals($expected, $res['details']);
  252. // Test decode with assoc = true and depth = 3
  253. $this->Comments->removeBehavior('Jsonable');
  254. $this->Comments->addBehavior('Tools.Jsonable', ['fields' => ['details'], 'decodeParams' => ['assoc' => true, 'depth' => 3]]);
  255. $res = $this->Comments->find('all', ['conditions' => ['title' => 'param']])->first();
  256. $expected = ['x' => ['y' => 'z']];
  257. $this->assertEquals($expected, $res['details']);
  258. }
  259. }