1 var mockjax = require('jquery-mockjax')(jQuery, window);
3 var utils_for_test = require('./utils_for_test');
5 var example_data = utils_for_test.example_data;
6 var example_data2 = utils_for_test.example_data2;
7 var formatNodes = utils_for_test.formatNodes;
8 var formatTitles = utils_for_test.formatTitles;
9 var isNodeOpen = utils_for_test.isNodeOpen;
10 var isNodeClosed = utils_for_test.isNodeClosed;
12 var tree_vars = utils_for_test.getTreeVariables();
14 var Position = tree_vars.Position;
16 var test = QUnit.test;
19 QUnit.module("jqtree", {
20 beforeEach: function() {
21 $('body').append('<div id="tree1"></div>');
24 afterEach: function() {
25 var $tree = $('#tree1');
26 $tree.tree('destroy');
33 test("create jqtree from data", function(assert) {
39 $('#tree1').children().length, 1,
40 'number of children on level 0'
43 $('#tree1').children().is('ul.jqtree-tree'),
44 'first element is ul.jqtree-tree'
47 $('#tree1 ul.jqtree-tree > li').length, 2,
48 'number of children on level 1'
51 $('#tree1 ul.jqtree-tree li:eq(0)').is('li.jqtree-folder.jqtree-closed'),
52 'first child is li.jqtree-folder.jqtree-closed'
55 $('#tree1 ul.jqtree-tree li:eq(0) > .jqtree-element > a.jqtree-toggler').is('a.jqtree-toggler.jqtree-closed'),
56 'button in first folder'
59 $('#tree1 ul.jqtree-tree li:eq(0) > .jqtree-element span.jqtree-title').text(),
64 test('toggle', function(assert) {
66 var done = assert.async();
69 var $tree = $('#tree1');
80 assert.ok(! isNodeClosed($node1), 'node1 is open');
83 $tree.tree('toggle', node1);
90 assert.ok(isNodeClosed($node1), 'node1 is closed');
96 var tree = $tree.tree('getTree');
97 node1 = tree.children[0];
98 $node1 = $tree.find('ul.jqtree-tree li:eq(0)');
100 // node1 is initially closed
101 assert.ok(isNodeClosed($node1), 'node1 is closed');
104 $tree.tree('toggle', node1);
107 test("click event", function(assert) {
108 var select_count = 0;
111 var $tree = $('#tree1');
118 var $node1 = $tree.find('ul.jqtree-tree li:first');
119 var $text_span = $node1.find('span:first');
121 $tree.bind('tree.click', function(e) {
122 assert.equal(e.node.name, 'node1');
125 var done = assert.async();
127 $tree.bind('tree.select', function(e) {
130 if (select_count == 1) {
131 assert.equal(e.node.name, 'node1');
133 assert.equal($tree.tree('getSelectedNode').name, 'node1');
139 assert.equal(e.node, null);
140 assert.equal(e.previous_node.name, 'node1');
141 assert.equal($tree.tree('getSelectedNode'), false);
151 test('saveState', function(assert) {
152 var $tree = $('#tree1');
156 function setState(state) {
160 function getState() {
164 function createTree() {
168 onSetStateFromStorage: setState,
169 onGetStateFromStorage: getState,
177 // nodes are initially closed
178 var tree = $tree.tree('getTree');
179 tree.iterate(function(node) {
180 assert.ok(! node.is_open, 'jqtree-closed');
185 $tree.tree('toggle', tree.children[0]);
188 assert.ok(tree.children[0].is_open, 'node1 is_open');
191 $tree.tree('selectNode', tree.children[1]);
195 $tree.tree('getSelectedNode').name,
197 'getSelectedNode (1)'
201 $tree.tree('destroy');
204 tree = $tree.tree('getTree');
205 assert.ok(tree.children[0].is_open, 'node1 is_open');
206 assert.ok(! tree.children[1].is_open, 'node2 is closed');
210 $tree.tree('getSelectedNode').name,
212 'getSelectedNode (2)'
216 test('getSelectedNode', function(assert) {
217 var $tree = $('#tree1');
225 // there is no node selected
227 $tree.tree('getSelectedNode'),
233 var tree = $tree.tree('getTree');
234 var node1 = tree.children[0];
235 $tree.tree('selectNode', node1);
239 $tree.tree('getSelectedNode').name,
245 test("toJson", function(assert) {
247 var $tree = $('#tree1');
254 $tree.tree('toJson'),
255 '[{"name":"node1","id":123,"int_property":1,"str_property":"1",'+
256 '"children":[{"name":"child1","id":125,"int_property":2},{"name":'+
257 '"child2","id":126}]},{"name":"node2","id":124,"int_property":3,'+
258 '"str_property":"3","children":[{"name":"child3","id":127}]}]'
261 // Check that properties 'children', 'parent' and 'element' still exist.
262 var tree = $tree.tree('getTree');
263 assert.equal(tree.children.length, 2);
264 assert.ok(tree.children[0].parent != undefined, 'parent');
265 assert.ok($(tree.children[0].element).is('li'), 'element');
268 test('loadData', function(assert) {
270 var $tree = $('#tree1');
276 // first node is 'node1'
278 $tree.find('> ul > li:first .jqtree-element:first > span').text(),
283 $tree.tree('loadData', example_data2);
285 // first node is 'main'
287 $tree.find('> ul > li:first .jqtree-element:first > span').text(),
291 // - load new data under node 'child3'
292 $tree.tree('loadData', example_data);
294 var child3 = $tree.tree('getNodeByName', 'child3');
297 { label: 'c4', id: 200 },
299 label: 'c5', id: 201,
301 { label: 'c6', id: 202 }
305 $tree.tree('loadData', data, child3);
307 // first node in html is still 'node1'
309 $tree.find('li:eq(0)').find('.jqtree-element:eq(0) span.jqtree-title').text(),
313 // Node 'child3' now has a children 'c4' and 'c5'
314 var $child3 = $tree.find('span:contains(child3)');
315 var $li = $child3.closest('li');
317 $li.children('ul').children('li:eq(0)').find('.jqtree-element span.jqtree-title').text(),
321 // Node 'child3' must have toggler button
323 $child3.prev().is('a.jqtree-toggler'),
324 "node 'child3' must have toggler button"
327 // - select node 'c5' and load new data under 'child3'
328 var c5 = $tree.tree('getNodeByName', 'c5');
329 $tree.tree('selectNode', c5);
331 assert.equal($tree.tree('getSelectedNode').name, 'c5');
337 $tree.tree('loadData', data2, child3);
339 // c5 must be deselected
340 assert.equal($tree.tree('getSelectedNode'), false);
342 // - select c7; load new data under child3; note that c7 has no id
343 $tree.tree('selectNode', $tree.tree('getNodeByName', 'c7'));
345 assert.equal($tree.tree('getSelectedNode').name, 'c7');
347 $tree.tree('loadData', [ 'c9' ], child3);
349 assert.equal($tree.tree('getSelectedNode'), false);
351 // - select c9 (which has no id); load new nodes under child2
352 $tree.tree('selectNode', $tree.tree('getNodeByName', 'c9'));
354 var child2 = $tree.tree('getNodeByName', 'child2');
355 $tree.tree('loadData', [ 'c10' ], child2);
357 assert.equal($tree.tree('getSelectedNode').name, 'c9');
360 test('openNode and closeNode', function(assert) {
362 var $tree = $('#tree1');
367 var node2 = $tree.tree('getNodeByName', 'node2');
368 assert.equal(node2.name, 'node2');
369 assert.equal(node2.is_open, undefined);
372 $tree.tree('openNode', node2, false);
373 assert.equal(node2.is_open, true);
374 assert.equal(isNodeOpen($(node2.element)), true);
377 $tree.tree('closeNode', node2, false);
378 assert.equal(node2.is_open, false);
379 assert.equal(isNodeClosed($(node2.element)), true);
382 var node1 = $tree.tree('getNodeByName', 'node1');
383 var child1 = $tree.tree('getNodeByName', 'child1');
385 // add a child to child1 so it is a folder
386 $tree.tree('appendNode', 'child1a', child1);
388 // node1 is initialy closed
389 assert.equal(node1.is_open, undefined);
392 $tree.tree('openNode', child1, false);
394 // node1 and child1 are now open1
395 assert.equal(node1.is_open, true);
396 assert.equal(child1.is_open, true);
399 function test_open_node_with_callback(slide, include_slide_param, assert) {
401 var $tree = $('#tree1');
406 var node2 = $tree.tree('getNodeByName', 'node2');
409 var done = assert.async();
411 function handleOpenNode(node) {
412 assert.equal(node.name, 'node2');
413 assert.ok(node.is_open);
418 if (include_slide_param) {
419 $tree.tree('openNode', node2, slide, handleOpenNode);
422 $tree.tree('openNode', node2, handleOpenNode);
426 test('openNode with callback with slide true', function(assert) {
427 test_open_node_with_callback(true, true, assert);
430 test('openNode with callback with slide false', function(assert) {
431 test_open_node_with_callback(false, true, assert);
434 test('openNode with callback with slide null', function(assert) {
435 test_open_node_with_callback(null, true, assert);
438 test('openNode with callback without slide param', function(assert) {
439 test_open_node_with_callback(null, false, assert);
442 test('selectNode', function(assert) {
444 var $tree = $('#tree1');
450 var node1 = $tree.tree('getTree').children[0];
451 var node2 = $tree.tree('getTree').children[1];
452 var child3 = node2.children[0];
454 assert.equal(child3.name, 'child3');
455 assert.equal(node1.is_open, undefined);
456 assert.equal(node2.is_open, undefined);
457 assert.equal(child3.is_open, undefined);
459 // -- select node 'child3', which is a child of 'node2'; must_open_parents = true
460 $tree.tree('selectNode', child3, true);
461 assert.equal($tree.tree('getSelectedNode').name, 'child3');
463 assert.equal(node1.is_open, undefined);
464 assert.equal(node2.is_open, true);
465 assert.equal(child3.is_open, undefined);
467 // -- select node 'node1'
468 $tree.tree('selectNode', node1);
469 assert.equal($tree.tree('getSelectedNode').name, 'node1');
471 // -- is 'node1' selected?
472 assert.equal($tree.tree('isNodeSelected', node1), true);
475 $tree.tree('selectNode', null);
476 assert.equal($tree.tree('getSelectedNode'), false);
478 // -- is 'node1' selected?
479 assert.equal($tree.tree('isNodeSelected', node1), false);
482 test('selectNode when another node is selected', function(assert) {
484 var $tree = $('#tree1');
490 var node1 = $tree.tree('getTree').children[0];
491 var node2 = $tree.tree('getTree').children[1];
493 // -- select node 'node2'
494 $tree.tree('selectNode', node2);
495 assert.equal($tree.tree('getSelectedNode').name, 'node2');
498 // -- is node 'node2' named 'deselected_node' in object's attributes?
499 var is_select_event_fired = false;
501 $tree.bind('tree.select', function(e) {
502 assert.equal(e.deselected_node, node2);
503 is_select_event_fired = true;
506 // -- select node 'node1'; node 'node2' is selected before it
507 $tree.tree('selectNode', node1);
508 assert.equal($tree.tree('getSelectedNode').name, 'node1');
510 assert.equal($tree.tree('isNodeSelected', node1), true);
513 assert.ok(is_select_event_fired);
516 test('click toggler', function(assert) {
518 var done = assert.async();
520 var $tree = $('#tree1');
526 var $title = $tree.find('li:eq(0)').find('> .jqtree-element > span.jqtree-title');
527 assert.equal($title.text(), 'node1');
528 var $toggler = $title.prev();
529 assert.ok($toggler.is('a.jqtree-toggler.jqtree-closed'));
531 $tree.bind('tree.open', function(e) {
532 // 2. handle 'open' event
533 assert.equal(e.node.name, 'node1');
535 // 3. click toggler again
539 $tree.bind('tree.close', function(e) {
540 assert.equal(e.node.name, 'node1');
544 // 1. click toggler of 'node1'
548 test('getNodeById', function(assert) {
550 var $tree = $('#tree1');
554 var node2 = $tree.tree('getNodeByName', 'node2');
556 // 1. get 'node2' by id
558 $tree.tree('getNodeById', 124).name,
562 // 2. get id that does not exist
563 assert.equal($tree.tree('getNodeById', 333), null);
565 // 3. get id by string
567 $tree.tree('getNodeById', '124').name,
571 // 4. add node with string id; search by int
581 $tree.tree('getNodeById', 234).name,
585 $tree.tree('getNodeById', '234').name,
589 // 5. load subtree in node2
595 {label: 'sub2', id: 201}
599 $tree.tree('loadData', subtree_data, node2);
600 var t = $tree.tree('getTree');
603 $tree.tree('getNodeById', 200).name,
607 $tree.tree('getNodeById', 201).name,
612 test('autoOpen', function(assert) {
613 var $tree = $('#tree1');
615 function formatOpenFolders() {
617 $tree.find('li').each(function() {
619 if ($li.is('.jqtree-folder') && ! $li.is('.jqtree-closed')) {
620 var label = $li.children('.jqtree-element').find('span').text();
621 open_nodes.push(label);
625 return open_nodes.join(';');
657 // 1. autoOpen is false
662 assert.equal(formatOpenFolders(), '');
664 $tree.tree('destroy');
666 // 2. autoOpen is true
671 assert.equal(formatOpenFolders(), 'l1n1;l2n2;l3n1');
673 $tree.tree('destroy');
675 // 3. autoOpen level 1
680 assert.equal(formatOpenFolders(), 'l1n1;l2n2');
683 test('onCreateLi', function(assert) {
684 // 1. init tree with onCreateLi
685 var $tree = $('#tree1');
688 onCreateLi: function(node, $li) {
689 var $span = $li.children('.jqtree-element').find('span');
690 $span.html('_' + node.name + '_');
695 $tree.find('span:eq(0)').text(),
700 test('save state', function(assert) {
704 // Fake $.cookie plugin for browsers that do not support localstorage
705 $.cookie = function(key, param2, param3) {
706 if (typeof param3 == 'object') {
716 // Remove state from localstorage
717 if (typeof localStorage != 'undefined') {
718 localStorage.setItem('my_tree', null);
722 var $tree = $('#tree1');
729 var tree = $tree.tree('getTree');
730 assert.equal($tree.tree('getSelectedNode'), false);
732 // 2. select node -> state is saved
733 $tree.tree('selectNode', tree.children[0]);
734 assert.equal($tree.tree('getSelectedNode').name, 'node1');
736 // 3. init tree again
737 $tree.tree('destroy');
745 assert.equal($tree.tree('getSelectedNode').name, 'node1');
750 test('generate hit areas', function(assert) {
752 var $tree = $('#tree1');
758 var node = $tree.tree('getNodeById', 123);
759 var hit_areas = $tree.tree('testGenerateHitAreas', node);
761 var strings = $.map(hit_areas, function(hit_area) {
762 return hit_area.node.name + ' ' + Position.getName(hit_area.position);
764 assert.equal(strings.join(';'), 'node1 none;node2 inside;node2 after');
767 test('removeNode', function(assert) {
769 var $tree = $('#tree1');
775 // 1. Remove selected node; node is 'child1'
776 var child1 = $tree.tree('getNodeByName', 'child1');
777 $tree.tree('selectNode', child1);
779 assert.equal($tree.tree('getSelectedNode').name, 'child1');
781 $tree.tree('removeNode', child1);
785 'node1 child2 node2 child3'
788 // getSelectedNode must now return false
789 assert.equal($tree.tree('getSelectedNode'), false);
791 // 2. No node is selected; remove child3
792 $tree.tree('loadData', example_data);
794 var child3 = $tree.tree('getNodeByName', 'child3');
795 $tree.tree('removeNode', child3);
799 'node1 child1 child2 node2'
802 assert.equal($tree.tree('getSelectedNode'), false);
804 // 3. Remove parent of selected node
805 $tree.tree('loadData', example_data);
807 child1 = $tree.tree('getNodeByName', 'child1');
808 var node1 = $tree.tree('getNodeByName', 'node1');
810 $tree.tree('selectNode', child1);
812 $tree.tree('removeNode', node1);
814 // node is unselected
815 assert.equal($tree.tree('getSelectedNode'), false);
817 // 4. Remove unselected node without an id
818 $tree.tree('loadData', example_data2);
820 var c1 = $tree.tree('getNodeByName', 'c1');
822 $tree.tree('removeNode', c1);
830 test('appendNode', function(assert) {
832 var $tree = $('#tree1');
837 var node1 = $tree.tree('getNodeByName', 'node1');
839 // 1. Add child3 to node1
840 $tree.tree('appendNode', 'child3', node1);
843 formatTitles($(node1.element)),
844 'node1 child1 child2 child3'
847 // 2. Add child4 to child1
848 var child1 = $tree.tree('getNodeByName', 'child1');
850 // Node 'child1' does not have a toggler button
852 $(child1.element).find('> .jqtree-element > .jqtree-toggler').length,
856 $tree.tree('appendNode', 'child4', child1);
858 assert.equal(formatTitles($(child1.element)), 'child1 child4');
860 // Node 'child1' must get a toggler button
862 $(child1.element).find('> .jqtree-element > .jqtree-toggler').length,
867 test('prependNode', function(assert) {
869 var $tree = $('#tree1');
874 var node1 = $tree.tree('getNodeByName', 'node1');
876 // 1. Prepend child0 to node1
877 $tree.tree('prependNode', 'child0', node1);
880 formatTitles($(node1.element)),
881 'node1 child0 child1 child2'
885 test('init event for local data', function(assert) {
887 var done = assert.async();
889 var $tree = $('#tree1');
891 $tree.bind('tree.init', function() {
892 // Check that we can call functions in 'tree.init' event
893 assert.equal($tree.tree('getNodeByName', 'node2').name, 'node2');
904 test('init event for ajax', function(assert) {
906 var done = assert.async();
908 var $tree = $('#tree1');
912 responseText: example_data,
916 $tree.bind('tree.init', function() {
917 assert.equal($tree.tree('getNodeByName', 'node2').name, 'node2');
928 test('updateNode', function(assert) {
930 var $tree = $('#tree1');
932 $tree.tree({ data: example_data });
934 assert.equal(formatTitles($tree), 'node1 child1 child2 node2 child3');
937 var node2 = $tree.tree('getNodeByName', 'node2');
938 $tree.tree('updateNode', node2, 'CHANGED');
940 assert.equal(formatTitles($tree), 'node1 child1 child2 CHANGED child3');
941 assert.equal(node2.name, 'CHANGED');
953 assert.equal(formatTitles($tree), 'node1 child1 child2 xyz child3');
954 assert.equal(node2.name, 'xyz');
955 assert.equal(node2.tag1, 'abc');
958 assert.equal(node2.id, 124);
960 $tree.tree('updateNode', node2, {id: 555});
962 assert.equal(node2.id, 555);
963 assert.equal(node2.name, 'xyz');
966 var node_555 = $tree.tree('getNodeById', 555);
967 assert.equal(node_555.name, 'xyz');
969 var node_124 = $tree.tree('getNodeById', 124);
970 assert.equal(node_124, undefined);
973 var child1 = $tree.tree('getNodeByName', 'child1');
975 $tree.tree('updateNode', child1, 'child1a');
977 assert.equal(formatTitles($tree), 'node1 child1a child2 xyz child3');
980 $tree.tree('selectNode', child1);
981 $tree.tree('updateNode', child1, 'child1b');
983 assert.ok($(child1.element).hasClass('jqtree-selected'));
985 // add children to child1
993 { id: 5, name: 'child1-1' }
998 assert.equal(formatTitles($tree), 'node1 child1 child1-1 child2 xyz child3');
1011 assert.equal(formatTitles($tree), 'node1 child1 child2 xyz child3');
1014 test('moveNode', function(assert) {
1016 var $tree = $('#tree1');
1018 $tree.tree({ data: example_data });
1020 var child1 = $tree.tree('getNodeByName', 'child1');
1021 var child2 = $tree.tree('getNodeByName', 'child2');
1022 var node1 = $tree.tree('getNodeByName', 'node1');
1023 var node2 = $tree.tree('getNodeByName', 'node2');
1025 // -- Move child1 after node2
1026 $tree.tree('moveNode', child1, node2, 'after');
1028 assert.equal(formatTitles($tree), 'node1 child2 node2 child3 child1');
1030 // -- Check that illegal moves are skipped
1031 $tree.tree('moveNode', node1, child2, 'inside');
1034 test('load on demand', function(assert) {
1036 var done = assert.async();
1038 var $tree = $('#tree1');
1045 load_on_demand: true
1053 response: function(options) {
1054 assert.equal(options.url, '/tree/', '2');
1055 assert.deepEqual(options.data, { 'node' : 1 }, '3');
1057 this.responseText = [
1068 function handleOpenNode(node) {
1069 assert.equal(node.name, 'node1');
1070 assert.equal(formatTitles($tree), 'node1 child1', '4');
1075 var node1 = $tree.tree('getNodeByName', 'node1');
1076 assert.equal(formatTitles($tree), 'node1', '1');
1078 $tree.tree('openNode', node1, handleOpenNode);
1081 test('addNodeAfter', function(assert) {
1083 var $tree = $('#tree1');
1085 $tree.tree({ data: example_data });
1086 var node1 = $tree.tree('getNodeByName', 'node1');
1088 // -- add node after node1
1089 $tree.tree('addNodeAfter', 'node3', node1);
1091 assert.equal(formatTitles($tree), 'node1 child1 child2 node3 node2 child3');
1094 test('addNodeBefore', function(assert) {
1096 var $tree = $('#tree1');
1098 $tree.tree({ data: example_data });
1099 var node1 = $tree.tree('getNodeByName', 'node1');
1101 // -- add node before node1
1102 var new_node = $tree.tree('addNodeBefore', 'node3', node1);
1104 assert.equal(formatTitles($tree), 'node3 node1 child1 child2 node2 child3');
1107 test('addParentNode', function(assert) {
1109 var $tree = $('#tree1');
1111 $tree.tree({ data: example_data });
1112 var child3 = $tree.tree('getNodeByName', 'child3');
1114 // -- add parent to child3
1115 $tree.tree('addParentNode', 'node3', child3);
1117 assert.equal(formatTitles($tree), 'node1 child1 child2 node2 node3 child3');
1120 test('mouse events', function(assert) {
1122 var $tree = $('#tree1');
1128 $tree.tree('setMouseDelay', 0);
1130 function getTitleElement(node_name) {
1131 var node = $tree.tree('getNodeByName', node_name);
1132 var $el = $(node.element);
1133 return $($el.find('.jqtree-title'));
1136 var $node1 = getTitleElement('node1');
1137 var $child3 = getTitleElement('child3');
1139 // Move node1 inside child3
1140 // trigger mousedown event on node1
1142 $.Event('mousedown', { which: 1 })
1145 // trigger mouse move to child3
1146 var child3_offset = $child3.offset();
1148 $.Event('mousemove', { pageX: child3_offset.left, pageY: child3_offset.top })
1150 $tree.trigger('mouseup');
1153 formatTitles($tree),
1154 'node2 child3 node1 child1 child2'
1158 test('multiple select', function(assert) {
1160 var $tree = $('#tree1');
1161 $tree.tree({ data: example_data });
1163 var child1 = $tree.tree('getNodeByName', 'child1');
1164 var child2 = $tree.tree('getNodeByName', 'child2');
1166 // -- add nodes to selection
1167 // todo: more nodes as parameters?
1168 // todo: rename to 'selection.add' or 'selection' 'add'?
1169 $tree.tree('addToSelection', child1);
1170 $tree.tree('addToSelection', child2);
1172 // -- get selected nodes
1173 var selected_nodes = $tree.tree('getSelectedNodes');
1175 formatNodes(selected_nodes),
1180 test('keyboard', function(assert) {
1182 var $tree = $('#tree1');
1184 function keyDown(key) {
1186 $.Event('keydown', { which: key })
1190 $tree.tree({ data: example_data });
1192 var node1 = $tree.tree('getNodeByName', 'node1');
1195 $tree.tree('selectNode', node1);
1196 assert.equal(node1.is_open, undefined);
1198 // - move down; -> node2
1200 assert.equal($tree.tree('getSelectedNode').name, 'node2');
1202 // - move up; -> back to node1
1204 assert.equal($tree.tree('getSelectedNode').name, 'node1');
1206 // - move right; open node1
1208 assert.equal(node1.is_open, true);
1209 assert.equal($tree.tree('getSelectedNode').name, 'node1');
1211 // - select child3 and move up -> node2
1212 $tree.tree('selectNode', $tree.tree('getNodeByName', 'child3'));
1214 assert.equal($tree.tree('getSelectedNode').name, 'node2');
1216 // - move up -> child2
1218 assert.equal($tree.tree('getSelectedNode').name, 'child2');
1220 // - select node1 and move left -> close
1221 $tree.tree('selectNode', node1);
1223 assert.equal(node1.is_open, false);
1224 assert.equal($tree.tree('getSelectedNode').name, 'node1');
1227 test('getNodesByProperty', function(assert) {
1229 var $tree = $('#tree1');
1233 var node2 = $tree.tree('getNodeByName', 'node2');
1235 // 1. get 'node1' by property
1237 $tree.tree('getNodesByProperty', 'int_property', 1)[0].name,
1241 // 2. get property that does not exist in any node
1242 assert.equal($tree.tree('getNodesByProperty', 'int_property', 123).length, 0);
1244 // 3. get string property
1246 $tree.tree('getNodesByProperty', 'str_property', '1')[0].name,
1250 // 4. add node with string id; search by int
1256 str_property: '111',
1262 $tree.tree('getNodesByProperty', 'int_property', 111)[0].name,
1266 $tree.tree('getNodesByProperty', 'str_property', '111')[0].name,
1270 // 5. load subtree in node2
1271 var subtree_data = [
1277 {label: 'sub2', id: 201, int_property: 444}
1281 $tree.tree('loadData', subtree_data, node2);
1282 var t = $tree.tree('getTree');
1285 $tree.tree('getNodesByProperty', 'int_property', 222)[0].name,
1289 $tree.tree('getNodesByProperty', 'int_property', 444)[0].name,
1294 test('dataUrl extra options', function(assert) {
1295 var done = assert.async();
1297 var $tree = $('#tree1');
1301 response: function(options) {
1302 // 2. handle ajax request
1303 // expect 'headers' option
1304 assert.equal(options.url, '/tree2/');
1305 assert.deepEqual(options.headers, {'abc': 'def'});
1313 // dataUrl contains 'headers' option
1317 'headers': {'abc': 'def'}
1322 test('dataUrl is function', function(assert) {
1323 var done = assert.async();
1325 var $tree = $('#tree1');
1329 response: function(options) {
1330 // 2. handle ajax request
1331 // expect 'headers' option
1332 assert.equal(options.url, '/tree3/');
1333 assert.deepEqual(options.headers, {'abc': 'def'});
1341 // dataUrl is a function
1343 dataUrl: function(node) {
1346 'headers': {'abc': 'def'}
1352 test('getNodeByHtmlElement', function(assert) {
1353 var $tree = $('#tree1');
1358 var $el = $('.jqtree-title');
1360 // Get node for jquery element
1361 var node = $tree.tree('getNodeByHtmlElement', $el);
1362 assert.equal(node.name, 'node1');
1364 // Same for html element
1365 node = $tree.tree('getNodeByHtmlElement', $el[0]);
1366 assert.equal(node.name, 'node1');
1369 test('onLoadFailed', function(assert) {
1373 responseText: 'test error',
1377 var done = assert.async();
1379 function handleLoadFailed(e) {
1380 assert.equal(e.responseText, 'test error');
1385 var $tree = $('#tree1');
1388 onLoadFailed: handleLoadFailed