PageRenderTime 51ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/plugins/static/public/js/libs/backbone-forms/test/editors.js

http://github.com/jspears/bobamo
JavaScript | 805 lines | 580 code | 214 blank | 11 comment | 5 complexity | 29a9822738621d6390b292f7fa3e1241 MD5 | raw file
Possible License(s): Apache-2.0
  1. (function (factory) {
  2. if (typeof define === 'function' && define.amd) {
  3. // AMD. Register as an anonymous module.
  4. define(['Backbone.Form','Post'], factory);
  5. } else {
  6. // RequireJS isn't being used. Assume backbone is loaded in <script> tags
  7. factory(Backbone,Post);
  8. }
  9. }(function (Backbone, Post) {
  10. var Form = Backbone.Form,
  11. Field = Form.Field,
  12. editors = Form.editors;
  13. module('Base');
  14. test('commit() - returns validation errors', function () {
  15. var editor = new editors.Text({
  16. model:new Post,
  17. key:'title',
  18. validators:['required']
  19. }).render();
  20. editor.setValue(null);
  21. var err = editor.commit();
  22. equal(err.type, 'required');
  23. equal(err.message, 'Required');
  24. });
  25. test('commit() - sets value to model', function () {
  26. var post = new Post;
  27. var editor = new editors.Text({
  28. model:post,
  29. key:'title'
  30. }).render();
  31. //Change value
  32. editor.setValue('New Title');
  33. editor.commit();
  34. equal(post.get('title'), 'New Title');
  35. });
  36. test('commit() - returns model validation errors', function () {
  37. var post = new Post;
  38. post.validate = function () {
  39. return 'ERROR';
  40. };
  41. var editor = new editors.Text({
  42. model:post,
  43. key:'title'
  44. }).render();
  45. var err = editor.commit();
  46. equal(err, 'ERROR');
  47. });
  48. test('validate() - returns validation errors', function () {
  49. var editor = new editors.Text({
  50. key:'title',
  51. validators:['required']
  52. });
  53. ok(editor.validate());
  54. editor.setValue('a value');
  55. ok(_(editor.validate()).isUndefined());
  56. });
  57. module('Text');
  58. (function () {
  59. var editor = editors.Text;
  60. test('getValue() - Default value', function () {
  61. var field = new editor().render();
  62. equal(field.getValue(), '');
  63. });
  64. test('getValue() - Custom value', function () {
  65. var field = new editor({
  66. value:'Test'
  67. }).render();
  68. equal(field.getValue(), 'Test');
  69. });
  70. test('getValue() - Value from model', function () {
  71. var field = new editor({
  72. model:new Post,
  73. key:'title'
  74. }).render();
  75. equal(field.getValue(), 'Danger Zone!');
  76. });
  77. test("setValue() - updates the input value", function () {
  78. var field = new editor({
  79. model:new Post,
  80. key:'title'
  81. }).render();
  82. field.setValue('foobar');
  83. equal(field.getValue(), 'foobar');
  84. equal($(field.el).val(), 'foobar');
  85. });
  86. test('Default type is text', function () {
  87. var field = new editor().render();
  88. equal($(field.el).attr('type'), 'text');
  89. });
  90. test('Type can be changed', function () {
  91. var field = new editor({
  92. schema:{ dataType:'tel' }
  93. }).render();
  94. equal($(field.el).attr('type'), 'tel');
  95. });
  96. })();
  97. module('Number');
  98. (function () {
  99. var editor = editors.Number;
  100. test('Default value', function () {
  101. var field = new editor().render();
  102. deepEqual(field.getValue(), 0);
  103. });
  104. test('Null value', function () {
  105. var field = new editor().render();
  106. field.setValue(null);
  107. deepEqual(field.getValue(), null);
  108. });
  109. test('Custom value', function () {
  110. var field = new editor({
  111. value:100
  112. }).render();
  113. deepEqual(field.getValue(), 100);
  114. });
  115. test('Value from model', function () {
  116. var field = new editor({
  117. model:new Post({ title:99 }),
  118. key:'title'
  119. }).render();
  120. deepEqual(field.getValue(), 99);
  121. });
  122. test("TODO: Restricts non-numeric characters", function () {
  123. console.log('TODO')
  124. });
  125. test("setValue() - updates the input value", function () {
  126. var field = new editor({
  127. model:new Post,
  128. key:'title'
  129. }).render();
  130. field.setValue('2.4');
  131. deepEqual(field.getValue(), 2.4);
  132. equal($(field.el).val(), 2.4);
  133. });
  134. })();
  135. module('Password');
  136. (function () {
  137. var editor = editors.Password;
  138. test('Default value', function () {
  139. var field = new editor().render();
  140. equal(field.getValue(), '');
  141. });
  142. test('Custom value', function () {
  143. var field = new editor({
  144. value:'Test'
  145. }).render();
  146. equal(field.getValue(), 'Test');
  147. });
  148. test('Value from model', function () {
  149. var field = new editor({
  150. model:new Post,
  151. key:'title'
  152. }).render();
  153. equal(field.getValue(), 'Danger Zone!');
  154. });
  155. test('Correct type', function () {
  156. var field = new editor().render();
  157. equal($(field.el).attr('type'), 'password');
  158. });
  159. test("setValue() - updates the input value", function () {
  160. var field = new editor({
  161. model:new Post,
  162. key:'title'
  163. }).render();
  164. field.setValue('foobar');
  165. equal(field.getValue(), 'foobar');
  166. equal($(field.el).val(), 'foobar');
  167. });
  168. })();
  169. module('TextArea');
  170. (function () {
  171. var editor = editors.TextArea;
  172. test('Default value', function () {
  173. var field = new editor().render();
  174. equal(field.getValue(), '');
  175. });
  176. test('Custom value', function () {
  177. var field = new editor({
  178. value:'Test'
  179. }).render();
  180. equal(field.getValue(), 'Test');
  181. });
  182. test('Value from model', function () {
  183. var field = new editor({
  184. model:new Post,
  185. key:'title'
  186. }).render();
  187. equal(field.getValue(), 'Danger Zone!');
  188. });
  189. test('Correct type', function () {
  190. var field = new editor().render();
  191. equal($(field.el).get(0).tagName, 'TEXTAREA');
  192. });
  193. test("setValue() - updates the input value", function () {
  194. var field = new editor({
  195. model:new Post,
  196. key:'title'
  197. }).render();
  198. field.setValue('foobar');
  199. equal(field.getValue(), 'foobar');
  200. equal($(field.el).val(), 'foobar');
  201. });
  202. })();
  203. module('checkbox');
  204. (function () {
  205. var editor = editors.Checkbox;
  206. var Model = Backbone.Model.extend({
  207. schema:{
  208. enabled:{ type:'Checkbox' }
  209. }
  210. });
  211. test('Default value', function () {
  212. var field = new editor().render();
  213. deepEqual(field.getValue(), false);
  214. });
  215. test('Custom value', function () {
  216. var field = new editor({
  217. value:true
  218. }).render();
  219. deepEqual(field.getValue(), true);
  220. });
  221. test('Value from model', function () {
  222. var field = new editor({
  223. model:new Model({ enabled:true }),
  224. key:'enabled'
  225. }).render();
  226. deepEqual(field.getValue(), true);
  227. });
  228. test('Correct type', function () {
  229. var field = new editor().render();
  230. deepEqual($(field.el).get(0).tagName, 'INPUT');
  231. deepEqual($(field.el).attr('type'), 'checkbox');
  232. });
  233. test("getValue() - returns boolean", function () {
  234. var field1 = new editor({
  235. value:true
  236. }).render();
  237. var field2 = new editor({
  238. value:false
  239. }).render();
  240. deepEqual(field1.getValue(), true);
  241. deepEqual(field2.getValue(), false);
  242. });
  243. test("setValue() - updates the input value", function () {
  244. var field = new editor({
  245. model:new Model,
  246. key:'enabled'
  247. }).render();
  248. field.setValue(true);
  249. deepEqual(field.getValue(), true);
  250. deepEqual($(field.el).attr('checked'), 'checked');
  251. });
  252. })();
  253. module('Hidden');
  254. (function () {
  255. var editor = editors.Hidden;
  256. test('Default value', function () {
  257. var field = new editor().render();
  258. equal(field.getValue(), '');
  259. });
  260. test('Custom value', function () {
  261. var field = new editor({
  262. value:'Test'
  263. }).render();
  264. equal(field.getValue(), 'Test');
  265. });
  266. test('Value from model', function () {
  267. var field = new editor({
  268. model:new Post,
  269. key:'title'
  270. }).render();
  271. equal(field.getValue(), 'Danger Zone!');
  272. });
  273. test('Correct type', function () {
  274. var field = new editor().render();
  275. equal($(field.el).attr('type'), 'hidden');
  276. });
  277. test("setValue() - updates the field value", function () {
  278. var field = new editor({
  279. model:new Post,
  280. key:'title'
  281. }).render();
  282. field.setValue('foobar');
  283. equal(field.getValue(), 'foobar');
  284. });
  285. })();
  286. module('Select');
  287. (function () {
  288. var editor = editors.Select,
  289. schema = {
  290. options:['Sterling', 'Lana', 'Cyril', 'Cheryl', 'Pam']
  291. };
  292. test('Default value', function () {
  293. var field = new editor({
  294. schema:schema
  295. }).render();
  296. equal(field.getValue(), 'Sterling');
  297. });
  298. test('Custom value', function () {
  299. var field = new editor({
  300. value:'Cyril',
  301. schema:schema
  302. }).render();
  303. equal(field.getValue(), 'Cyril');
  304. });
  305. test('Value from model', function () {
  306. var field = new editor({
  307. model:new Backbone.Model({ name:'Lana' }),
  308. key:'name',
  309. schema:schema
  310. }).render();
  311. equal(field.getValue(), 'Lana');
  312. });
  313. test('Correct type', function () {
  314. var field = new editor({
  315. schema:schema
  316. }).render();
  317. equal($(field.el).get(0).tagName, 'SELECT');
  318. });
  319. test('TODO: Options as array of items', function () {
  320. console.log('TODO')
  321. });
  322. test('TODO: Options as array of objects', function () {
  323. console.log('TODO')
  324. });
  325. test('TODO: Options as function that calls back with options', function () {
  326. console.log('TODO')
  327. });
  328. test('TODO: Options as string of HTML', function () {
  329. console.log('TODO')
  330. });
  331. test('TODO: Options as a pre-populated collection', function () {
  332. console.log('TODO')
  333. });
  334. test('TODO: Options as a new collection (needs to be fetched)', function () {
  335. console.log('TODO')
  336. });
  337. test("setValue() - updates the input value", function () {
  338. var field = new editor({
  339. value:'Pam',
  340. schema:schema
  341. }).render();
  342. field.setValue('Lana');
  343. equal(field.getValue(), 'Lana');
  344. equal($(field.el).val(), 'Lana');
  345. });
  346. })();
  347. module('Radio');
  348. (function () {
  349. var editor = editors.Radio,
  350. schema = {
  351. options:['Sterling', 'Lana', 'Cyril', 'Cheryl', 'Pam']
  352. };
  353. test('Default value', function () {
  354. var field = new editor({
  355. schema:schema
  356. }).render();
  357. equal(field.getValue(), undefined);
  358. });
  359. test('Custom value', function () {
  360. var field = new editor({
  361. value:'Cyril',
  362. schema:schema
  363. }).render();
  364. equal(field.getValue(), 'Cyril');
  365. });
  366. test('Throws errors if no options', function () {
  367. raises(function () {
  368. var field = new editor({schema:{}});
  369. }, /^Missing required/, 'ERROR: Accepted a new Radio editor with no options.');
  370. });
  371. test('Value from model', function () {
  372. var field = new editor({
  373. model:new Backbone.Model({ name:'Lana' }),
  374. key:'name',
  375. schema:schema
  376. }).render();
  377. equal(field.getValue(), 'Lana');
  378. });
  379. test('Correct type', function () {
  380. var field = new editor({
  381. schema:schema
  382. }).render();
  383. equal($(field.el).get(0).tagName, 'UL');
  384. notEqual($(field.el).find('input[type=radio]').length, 0);
  385. });
  386. })();
  387. module('Checkboxes');
  388. (function () {
  389. var editor = editors.Checkboxes,
  390. schema = {
  391. options:['Sterling', 'Lana', 'Cyril', 'Cheryl', 'Pam', 'Doctor Krieger']
  392. };
  393. test('Default value', function () {
  394. var field = new editor({
  395. schema:schema
  396. }).render();
  397. var value = field.getValue();
  398. equal(_.isEqual(value, []), true);
  399. });
  400. test('Custom value', function () {
  401. var field = new editor({
  402. value:['Cyril'],
  403. schema:schema
  404. }).render();
  405. var value = field.getValue();
  406. var expected = ['Cyril'];
  407. equal(_.isEqual(expected, value), true);
  408. });
  409. test('Throws errors if no options', function () {
  410. raises(function () {
  411. var field = new editor({schema:{}});
  412. }, /^Missing required/, 'ERROR: Accepted a new Checkboxes editor with no options.');
  413. });
  414. // Value from model doesn't work here as the value must be an array.
  415. test('Correct type', function () {
  416. var field = new editor({
  417. schema:schema
  418. }).render();
  419. equal($(field.el).get(0).tagName, 'UL');
  420. notEqual($(field.el).find('input[type=checkbox]').length, 0);
  421. });
  422. test('setting value with one item', function () {
  423. var field = new editor({
  424. schema:schema
  425. }).render();
  426. field.setValue(['Lana']);
  427. deepEqual(field.getValue(), ['Lana']);
  428. equal($(field.el).find('input[type=checkbox]:checked').length, 1);
  429. });
  430. test('setting value with multiple items, including a value with a space', function () {
  431. var field = new editor({
  432. schema:schema
  433. }).render();
  434. field.setValue(['Lana', 'Doctor Krieger']);
  435. deepEqual(field.getValue(), ['Lana', 'Doctor Krieger']);
  436. equal($(field.el).find('input[type=checkbox]:checked').length, 2);
  437. });
  438. })();
  439. module('Object');
  440. (function () {
  441. var editor = editors.Object,
  442. schema = {
  443. subSchema:{
  444. id:{ type:'Number' },
  445. name:{ }
  446. }
  447. };
  448. test('Default value', function () {
  449. var field = new editor({
  450. schema:schema
  451. }).render();
  452. deepEqual(field.getValue(), { id:0, name:'' });
  453. });
  454. test('Custom value', function () {
  455. var field = new editor({
  456. schema:schema,
  457. value:{
  458. id:42,
  459. name:"Krieger"
  460. }
  461. }).render();
  462. deepEqual(field.getValue(), { id:42, name:"Krieger" });
  463. });
  464. test('Value from model', function () {
  465. var agency = new Backbone.Model({
  466. spy:{
  467. id:28,
  468. name:'Pam'
  469. }
  470. });
  471. var field = new editor({
  472. schema:schema,
  473. model:agency,
  474. key:'spy'
  475. }).render();
  476. deepEqual(field.getValue(), { id:28, name:'Pam' });
  477. });
  478. test("TODO: idPrefix is added to child form elements", function () {
  479. console.log('TODO')
  480. });
  481. test("TODO: remove() - Removes embedded form", function () {
  482. console.log('TODO')
  483. });
  484. test("setValue() - updates the input value", function () {
  485. var field = new editor({
  486. schema:schema,
  487. value:{
  488. id:42,
  489. name:"Krieger"
  490. }
  491. }).render();
  492. var newValue = {
  493. id:89,
  494. name:"Sterling"
  495. };
  496. field.setValue(newValue);
  497. deepEqual(field.getValue(), newValue);
  498. });
  499. test('validate() - returns validation errors', function () {
  500. var schema = {};
  501. schema.subSchema = {
  502. id:{ validators:['required'] },
  503. name:{},
  504. email:{ validators:['email'] }
  505. }
  506. var field = new editor({
  507. schema:schema,
  508. value:{
  509. id:null,
  510. email:'invalid'
  511. }
  512. }).render();
  513. var errs = field.validate();
  514. equal(errs.id.type, 'required');
  515. equal(errs.email.type, 'email');
  516. });
  517. })();
  518. module('NestedModel');
  519. (function () {
  520. var ChildModel = Backbone.Model.extend({
  521. schema:{
  522. id:{ type:'Number' },
  523. name:{}
  524. }
  525. });
  526. var editor = editors.NestedModel,
  527. schema = { model:ChildModel };
  528. test('Default value', function () {
  529. /*
  530. var field = new editor({
  531. schema: schema
  532. }).render();
  533. deepEqual(field.getValue(), { id: 0, name: '' });
  534. */
  535. console.log('TODO');
  536. });
  537. test('Custom value', function () {
  538. var field = new editor({
  539. schema:schema,
  540. value:{
  541. id:42,
  542. name:"Krieger"
  543. }
  544. }).render();
  545. deepEqual(field.getValue(), { id:42, name:"Krieger" });
  546. });
  547. test('Value from model', function () {
  548. var agency = new Backbone.Model({
  549. spy:{
  550. id:28,
  551. name:'Pam'
  552. }
  553. });
  554. var field = new editor({
  555. schema:schema,
  556. model:agency,
  557. key:'spy'
  558. }).render();
  559. deepEqual(field.getValue(), { id:28, name:'Pam' });
  560. });
  561. test("TODO: idPrefix is added to child form elements", function () {
  562. console.log('TODO')
  563. });
  564. test("TODO: Validation on nested model", function () {
  565. console.log('TODO')
  566. });
  567. test("TODO: remove() - Removes embedded form", function () {
  568. console.log('TODO')
  569. });
  570. test("setValue() - updates the input value", function () {
  571. var agency = new Backbone.Model({
  572. spy:{
  573. id:28,
  574. name:'Pam'
  575. }
  576. });
  577. var field = new editor({
  578. schema:schema,
  579. model:agency,
  580. key:'spy'
  581. }).render();
  582. var newValue = {
  583. id:89,
  584. name:"Sterling"
  585. };
  586. field.setValue(newValue);
  587. deepEqual(field.getValue(), newValue);
  588. });
  589. })();
  590. }));