JsonableBehaviorTest.php 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  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. // $depth param added in 5.5.0
  187. $this->skipIf(!version_compare(PHP_VERSION, '5.5.0', '>='));
  188. // Test encode depth = 1
  189. $this->Comments->removeBehavior('Jsonable');
  190. $this->Comments->addBehavior('Tools.Jsonable', ['fields' => ['details'], 'encodeParams' => ['depth' => 1], 'decodeParams' => ['assoc' => false]]);
  191. $data = [
  192. 'comment' => 'blabla',
  193. 'url' => 'www.dereuromark.de',
  194. 'title' => 'param',
  195. 'details' => ['y' => 'yy'],
  196. ];
  197. $entity = $this->Comments->newEntity($data);
  198. $this->Comments->save($entity);
  199. $res = $this->Comments->find('all', ['conditions' => ['title' => 'param']])->first();
  200. $obj = new \stdClass();
  201. $obj->y = 'yy';
  202. $expected = $obj;
  203. $this->assertEquals($expected, $res['details']);
  204. $this->Comments->truncate();
  205. $this->Comments->removeBehavior('Jsonable');
  206. $this->Comments->addBehavior('Tools.Jsonable', ['fields' => ['details'], 'encodeParams' => ['depth' => 1], 'decodeParams' => ['assoc' => false]]);
  207. $data = [
  208. 'comment' => 'blabla',
  209. 'url' => 'www.dereuromark.de',
  210. 'title' => 'param',
  211. 'details' => ['y' => ['yy' => 'yyy']],
  212. ];
  213. $entity = $this->Comments->newEntity($data);
  214. $this->Comments->save($entity);
  215. $res = $this->Comments->find('all', ['conditions' => ['title' => 'param']])->first();
  216. $expected = null;
  217. $this->assertEquals($expected, $res['details']);
  218. }
  219. /**
  220. * JsonableBehaviorTest::testDecodeParams()
  221. *
  222. * @return void
  223. */
  224. public function testDecodeParams() {
  225. $this->Comments->removeBehavior('Jsonable');
  226. $this->Comments->addBehavior('Tools.Jsonable', ['output' => 'array', 'fields' => ['details'], 'decodeParams' => ['assoc'=> false]]);
  227. $data = [
  228. 'comment' => 'blabla',
  229. 'url' => 'www.dereuromark.de',
  230. 'title' => 'param',
  231. 'details' => ['x' => ['y' => 'z']],
  232. ];
  233. $entity = $this->Comments->newEntity($data);
  234. $this->Comments->save($entity);
  235. // Test decode with default params
  236. $res = $this->Comments->find('all', ['conditions' => ['title' => 'param']])->first();
  237. $obj = new \stdClass();
  238. $obj->x = new \stdClass();
  239. $obj->x->y = 'z';
  240. $expected = $obj;
  241. $this->assertEquals($expected, $res['details']);
  242. // Test decode with assoc = true
  243. $this->Comments->removeBehavior('Jsonable');
  244. $this->Comments->addBehavior('Tools.Jsonable', ['fields' => ['details'], 'decodeParams' => ['assoc' => true]]);
  245. $res = $this->Comments->find('all', ['conditions' => ['title' => 'param']])->first();
  246. $expected = ['x' => ['y' => 'z']];
  247. $this->assertEquals($expected, $res['details']);
  248. // Test decode with assoc = true and depth = 2
  249. $this->Comments->removeBehavior('Jsonable');
  250. $this->Comments->addBehavior('Tools.Jsonable', ['fields' => ['details'], 'decodeParams' => ['assoc' => true, 'depth' => 2]]);
  251. $res = $this->Comments->find('all', ['conditions' => ['title' => 'param']])->first();
  252. $expected = [];
  253. $this->assertEquals($expected, $res['details']);
  254. // Test decode with assoc = true and depth = 3
  255. $this->Comments->removeBehavior('Jsonable');
  256. $this->Comments->addBehavior('Tools.Jsonable', ['fields' => ['details'], 'decodeParams' => ['assoc' => true, 'depth' => 3]]);
  257. $res = $this->Comments->find('all', ['conditions' => ['title' => 'param']])->first();
  258. $expected = ['x' => ['y' => 'z']];
  259. $this->assertEquals($expected, $res['details']);
  260. }
  261. }