JsonableBehaviorTest.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406
  1. <?php
  2. namespace Tools\Test\TestCase\Model\Behavior;
  3. use Cake\Core\Configure;
  4. use Cake\ORM\TableRegistry;
  5. use stdClass;
  6. use Tools\TestSuite\TestCase;
  7. class JsonableBehaviorTest extends TestCase {
  8. /**
  9. * @var array
  10. */
  11. public $fixtures = [
  12. 'plugin.tools.jsonable_comments'
  13. ];
  14. /**
  15. * @var \Tools\Model\Table\Table
  16. */
  17. public $Comments;
  18. /**
  19. * @return void
  20. */
  21. public function setUp() {
  22. parent::setUp();
  23. $this->Comments = TableRegistry::get('JsonableComments');
  24. $this->Comments->addBehavior('Tools.Jsonable', ['fields' => ['details']]);
  25. }
  26. /**
  27. * JsonableBehaviorTest::testBasic()
  28. *
  29. * @return void
  30. */
  31. public function testBasic() {
  32. // accuracy >= 5
  33. $data = [
  34. 'comment' => 'blabla',
  35. 'url' => 'www.dereuromark.de',
  36. 'title' => 'some Name',
  37. 'details' => ['x' => 'y'],
  38. ];
  39. $entity = $this->Comments->newEntity($data);
  40. $res = $this->Comments->save($entity);
  41. $this->assertTrue((bool)$res);
  42. $this->assertSame('{"x":"y"}', $res['details']);
  43. }
  44. /**
  45. * Find list should still work
  46. *
  47. * @return void
  48. */
  49. public function testList() {
  50. $data = [
  51. 'comment' => 'blabla',
  52. 'url' => 'www.dereuromark.de',
  53. 'title' => 'some Name',
  54. 'details' => ['x' => 'y'],
  55. ];
  56. $entity = $this->Comments->newEntity($data);
  57. $res = $this->Comments->save($entity);
  58. $this->assertTrue((bool)$res);
  59. $result = $this->Comments->find('list');
  60. $expected = [1 => 'some Name'];
  61. $this->assertSame($expected, $result->toArray());
  62. }
  63. /**
  64. * @return void
  65. */
  66. public function testFieldsWithList() {
  67. //echo $this->_header(__FUNCTION__);
  68. $this->Comments->removeBehavior('Jsonable');
  69. $this->Comments->addBehavior('Tools.Jsonable', ['fields' => ['details'], 'input' => 'list']);
  70. $data = [
  71. 'comment' => 'blabla',
  72. 'url' => 'www.dereuromark.de',
  73. 'title' => 'some Name',
  74. 'details' => 'z|y|x',
  75. ];
  76. $entity = $this->Comments->newEntity($data);
  77. $res = $this->Comments->save($entity);
  78. $this->assertTrue((bool)$res);
  79. $this->assertSame('["z","y","x"]', $res['details']);
  80. // with sort and unique
  81. $data = [
  82. 'comment' => 'blabla',
  83. 'url' => 'www.dereuromark.de',
  84. 'title' => 'some Name',
  85. 'details' => 'z|x|y|x',
  86. ];
  87. $this->Comments->removeBehavior('Jsonable');
  88. $this->Comments->addBehavior('Tools.Jsonable', ['fields' => ['details'], 'input' => 'list', 'sort' => true]);
  89. $entity = $this->Comments->newEntity($data);
  90. $res = $this->Comments->save($entity);
  91. $this->assertTrue((bool)$res);
  92. $this->assertSame('["x","y","z"]', $res['details']);
  93. }
  94. /**
  95. * @return void
  96. */
  97. public function testFieldsWithParam() {
  98. $this->Comments->removeBehavior('Jsonable');
  99. $this->Comments->addBehavior('Tools.Jsonable', ['fields' => ['details'], 'input' => 'param']);
  100. $data = [
  101. 'comment' => 'blabla',
  102. 'url' => 'www.dereuromark.de',
  103. 'title' => 'some Name',
  104. 'details' => 'z:vz|y:yz|x:xz',
  105. ];
  106. $entity = $this->Comments->newEntity($data);
  107. $res = $this->Comments->save($entity);
  108. $this->assertTrue((bool)$res);
  109. $this->assertSame('{"z":"vz","y":"yz","x":"xz"}', $res['details']);
  110. }
  111. /**
  112. * @return void
  113. */
  114. public function testFieldsOnFind() {
  115. // array
  116. $this->Comments->removeBehavior('Jsonable');
  117. $this->Comments->addBehavior('Tools.Jsonable', ['fields' => ['details']]);
  118. $data = [
  119. 'comment' => 'blabla',
  120. 'url' => 'www.dereuromark.de',
  121. 'title' => 'param',
  122. 'details' => ['x' => 'y'],
  123. ];
  124. $entity = $this->Comments->newEntity($data);
  125. $res = $this->Comments->save($entity);
  126. $this->assertTrue((bool)$res);
  127. $res = $this->Comments->find('all', ['conditions' => ['title' => 'param']])->first();
  128. $this->assertEquals(['x' => 'y'], $res['details']);
  129. // param
  130. $this->Comments->removeBehavior('Jsonable');
  131. $res = $this->Comments->find('all', ['conditions' => ['title' => 'param']])->first();
  132. $this->assertEquals('{"x":"y"}', $res['details']);
  133. $this->Comments->addBehavior('Tools.Jsonable', ['output' => 'param', 'fields' => ['details']]);
  134. $res = $this->Comments->find('all', ['conditions' => ['title' => 'param']])->first();
  135. $this->assertEquals('x:y', $res['details']);
  136. // list
  137. $this->Comments->removeBehavior('Jsonable');
  138. $this->Comments->addBehavior('Tools.Jsonable', ['output' => 'list', 'fields' => ['details']]);
  139. $data = [
  140. 'comment' => 'blabla',
  141. 'url' => 'www.dereuromark.de',
  142. 'title' => 'list',
  143. 'details' => ['z', 'y', 'x'],
  144. ];
  145. $entity = $this->Comments->newEntity($data);
  146. $res = $this->Comments->save($entity);
  147. $this->assertTrue((bool)$res);
  148. $this->Comments->removeBehavior('Jsonable');
  149. $res = $this->Comments->find('all', ['conditions' => ['title' => 'list']])->first();
  150. $this->assertEquals('["z","y","x"]', $res['details']);
  151. $this->Comments->addBehavior('Tools.Jsonable', ['output' => 'list', 'fields' => ['details']]);
  152. $res = $this->Comments->find('all', ['conditions' => ['title' => 'list']])->first();
  153. $this->assertEquals('z|y|x', $res['details']);
  154. // custom separator
  155. $this->Comments->removeBehavior('Jsonable');
  156. $this->Comments->addBehavior('Tools.Jsonable', ['output' => 'list', 'separator' => ', ', 'fields' => ['details']]);
  157. // find first
  158. $res = $this->Comments->find('all', ['conditions' => ['title' => 'list']])->first();
  159. $this->assertEquals('z, y, x', $res['details']);
  160. // find all
  161. $res = $this->Comments->find('all', ['order' => ['title' => 'ASC']])->toArray();
  162. $this->assertEquals('z, y, x', $res[0]['details']);
  163. }
  164. /**
  165. * @return void
  166. */
  167. public function testEncodeParams() {
  168. // Test encode depth = 1
  169. $this->Comments->removeBehavior('Jsonable');
  170. $this->Comments->addBehavior('Tools.Jsonable', ['fields' => ['details'], 'encodeParams' => ['depth' => 1]]);
  171. $data = [
  172. 'comment' => 'blabla',
  173. 'url' => 'www.dereuromark.de',
  174. 'title' => 'param',
  175. 'details' => ['x' => ['y' => 'z']],
  176. ];
  177. $entity = $this->Comments->newEntity($data);
  178. $this->Comments->save($entity);
  179. $res = $this->Comments->find('all', ['conditions' => ['title' => 'param']])->first();
  180. $expected = ['x' => ['y' => 'z']];
  181. $this->assertEquals($expected, $res['details']);
  182. $this->Comments->truncate();
  183. // Test encode depth = 2
  184. $this->Comments->removeBehavior('Jsonable');
  185. $this->Comments->addBehavior('Tools.Jsonable', ['fields' => ['details'], 'encodeParams' => ['depth' => 2], 'decodeParams' => ['assoc' => false]]);
  186. $data = [
  187. 'comment' => 'blabla',
  188. 'url' => 'www.dereuromark.de',
  189. 'title' => 'param',
  190. 'details' => ['x' => ['y' => 'z']],
  191. ];
  192. $entity = $this->Comments->newEntity($data);
  193. $this->Comments->save($entity);
  194. $res = $this->Comments->find('all', ['conditions' => ['title' => 'param']])->first();
  195. $obj = new stdClass();
  196. $obj->x = new stdClass();
  197. $obj->x->y = 'z';
  198. $expected = $obj;
  199. $this->assertEquals($expected, $res['details']);
  200. }
  201. /**
  202. * @return void
  203. */
  204. public function testEncodeParamsAssocFalse() {
  205. // Test encode depth = 1
  206. $this->Comments->removeBehavior('Jsonable');
  207. $this->Comments->addBehavior('Tools.Jsonable', ['fields' => ['details'], 'encodeParams' => ['depth' => 1], 'decodeParams' => ['assoc' => false]]);
  208. $data = [
  209. 'comment' => 'blabla',
  210. 'url' => 'www.dereuromark.de',
  211. 'title' => 'param',
  212. 'details' => ['y' => 'yy'],
  213. ];
  214. $entity = $this->Comments->newEntity($data);
  215. $this->Comments->save($entity);
  216. $res = $this->Comments->find('all', ['conditions' => ['title' => 'param']])->first();
  217. $obj = new stdClass();
  218. $obj->y = 'yy';
  219. $expected = $obj;
  220. $this->assertEquals($expected, $res['details']);
  221. $this->Comments->truncate();
  222. $this->Comments->removeBehavior('Jsonable');
  223. $this->Comments->addBehavior('Tools.Jsonable', ['fields' => ['details'], 'encodeParams' => ['depth' => 1], 'decodeParams' => ['assoc' => false]]);
  224. $data = [
  225. 'comment' => 'blabla',
  226. 'url' => 'www.dereuromark.de',
  227. 'title' => 'param',
  228. 'details' => ['y' => ['yy' => 'yyy']],
  229. ];
  230. $entity = $this->Comments->newEntity($data);
  231. $this->Comments->save($entity);
  232. $res = $this->Comments->find('all', ['conditions' => ['title' => 'param']])->first();
  233. $expected = new stdClass();
  234. $expected->y = new stdClass();
  235. $expected->y->yy = 'yyy';
  236. $this->assertEquals($expected, $res['details']);
  237. }
  238. /**
  239. * @return void
  240. */
  241. public function testDecodeParams() {
  242. $this->Comments->removeBehavior('Jsonable');
  243. $this->Comments->addBehavior('Tools.Jsonable', ['output' => 'array', 'fields' => ['details'], 'decodeParams' => ['assoc' => false]]);
  244. $data = [
  245. 'comment' => 'blabla',
  246. 'url' => 'www.dereuromark.de',
  247. 'title' => 'param',
  248. 'details' => ['x' => ['y' => 'z']],
  249. ];
  250. $entity = $this->Comments->newEntity($data);
  251. $this->Comments->save($entity);
  252. // Test decode with default params
  253. $res = $this->Comments->find('all', ['conditions' => ['title' => 'param']])->first();
  254. $obj = new stdClass();
  255. $obj->x = new stdClass();
  256. $obj->x->y = 'z';
  257. $expected = $obj;
  258. $this->assertEquals($expected, $res['details']);
  259. // Test decode with assoc = true
  260. $this->Comments->removeBehavior('Jsonable');
  261. $this->Comments->addBehavior('Tools.Jsonable', ['fields' => ['details'], 'decodeParams' => ['assoc' => true]]);
  262. $res = $this->Comments->find('all', ['conditions' => ['title' => 'param']])->first();
  263. $expected = ['x' => ['y' => 'z']];
  264. $this->assertEquals($expected, $res['details']);
  265. // Test decode with assoc = true and depth = 2
  266. $this->Comments->removeBehavior('Jsonable');
  267. $this->Comments->addBehavior('Tools.Jsonable', ['fields' => ['details'], 'decodeParams' => ['assoc' => true, 'depth' => 2]]);
  268. $res = $this->Comments->find('all', ['conditions' => ['title' => 'param']])->first();
  269. $expected = [];
  270. $this->assertEquals($expected, $res['details']);
  271. // Test decode with assoc = true and depth = 3
  272. $this->Comments->removeBehavior('Jsonable');
  273. $this->Comments->addBehavior('Tools.Jsonable', ['fields' => ['details'], 'decodeParams' => ['assoc' => true, 'depth' => 3]]);
  274. $res = $this->Comments->find('all', ['conditions' => ['title' => 'param']])->first();
  275. $expected = ['x' => ['y' => 'z']];
  276. $this->assertEquals($expected, $res['details']);
  277. }
  278. /**
  279. * @return void
  280. */
  281. public function testEncodeWithComplexContent() {
  282. $this->Comments->removeBehavior('Jsonable');
  283. $this->Comments->addBehavior('Tools.Jsonable', [
  284. 'output' => 'array',
  285. 'fields' => ['details'],
  286. ]);
  287. $data = [
  288. 'comment' => 'blabla',
  289. 'url' => 'www.dereuromark.de',
  290. 'title' => 'param',
  291. 'details' => [
  292. 'foo' => 'bar',
  293. 'nan' => NAN,
  294. 'inf' => INF,
  295. ],
  296. ];
  297. $entity = $this->Comments->newEntity($data);
  298. $result = $this->Comments->save($entity);
  299. $this->assertTrue((bool)$result);
  300. $res = $this->Comments->get($entity->id);
  301. $expected = [
  302. 'foo' => 'bar',
  303. 'nan' => 0,
  304. 'inf' => 0,
  305. ];
  306. $this->assertSame($expected, $res->details);
  307. }
  308. /**
  309. * @return void
  310. */
  311. public function testEncodeWithNoParamsComplexContent() {
  312. $this->Comments->removeBehavior('Jsonable');
  313. $this->Comments->addBehavior('Tools.Jsonable', [
  314. 'output' => 'array',
  315. 'fields' => ['details'],
  316. 'encodeParams' => [
  317. 'options' => 0
  318. ]
  319. ]);
  320. $data = [
  321. 'comment' => 'blabla',
  322. 'url' => 'www.dereuromark.de',
  323. 'title' => 'param',
  324. 'details' => [
  325. 'foo' => 'bar',
  326. 'nan' => NAN,
  327. 'inf' => INF,
  328. ],
  329. ];
  330. $entity = $this->Comments->newEntity($data);
  331. $result = $this->Comments->save($entity);
  332. $this->assertTrue((bool)$result);
  333. $res = $this->Comments->get($entity->id);
  334. $expected = [
  335. ];
  336. $this->assertSame($expected, $res->details);
  337. }
  338. }