inlines.test.js 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. /* global QUnit */
  2. /* eslint global-strict: 0, strict: 0 */
  3. 'use strict';
  4. QUnit.module('admin.inlines: tabular formsets', {
  5. beforeEach: function() {
  6. var $ = django.jQuery;
  7. var that = this;
  8. this.addText = 'Add another';
  9. $('#qunit-fixture').append($('#tabular-formset').text());
  10. this.table = $('table.inline');
  11. this.inlineRow = this.table.find('tr');
  12. this.inlineRow.tabularFormset('table.inline tr.form-row', {
  13. prefix: 'first',
  14. addText: that.addText,
  15. deleteText: 'Remove'
  16. });
  17. }
  18. });
  19. QUnit.test('no forms', function(assert) {
  20. assert.ok(this.inlineRow.hasClass('dynamic-first'));
  21. assert.equal(this.table.find('.add-row a').text(), this.addText);
  22. });
  23. QUnit.test('add form', function(assert) {
  24. var addButton = this.table.find('.add-row a');
  25. assert.equal(addButton.text(), this.addText);
  26. addButton.click();
  27. assert.ok(this.table.find('#first-1'));
  28. });
  29. QUnit.test('added form has remove button', function(assert) {
  30. var addButton = this.table.find('.add-row a');
  31. assert.equal(addButton.text(), this.addText);
  32. addButton.click();
  33. assert.equal(this.table.find('#first-1 .inline-deletelink').length, 1);
  34. });
  35. QUnit.test('add/remove form events', function(assert) {
  36. assert.expect(6);
  37. var $ = django.jQuery;
  38. var $document = $(document);
  39. var addButton = this.table.find('.add-row a');
  40. $document.on('formset:added', function(event, $row, formsetName) {
  41. assert.ok(true, 'event `formset:added` triggered');
  42. assert.equal(true, $row.is('#first-1'));
  43. assert.equal(formsetName, 'first');
  44. });
  45. addButton.click();
  46. var deletedRow = $('#first-1');
  47. var deleteLink = this.table.find('.inline-deletelink');
  48. $document.on('formset:removed', function(event, $row, formsetName) {
  49. assert.ok(true, 'event `formset:removed` triggered');
  50. assert.equal(true, $row.is(deletedRow));
  51. assert.equal(formsetName, 'first');
  52. });
  53. deleteLink.trigger($.Event('click', {target: deleteLink}));
  54. });
  55. QUnit.test('existing add button', function(assert) {
  56. var $ = django.jQuery;
  57. $('#qunit-fixture').empty(); // Clear the table added in beforeEach
  58. $('#qunit-fixture').append($('#tabular-formset').text());
  59. this.table = $('table.inline');
  60. this.inlineRow = this.table.find('tr');
  61. this.table.append('<i class="add-button"></i>');
  62. var addButton = this.table.find('.add-button');
  63. this.inlineRow.tabularFormset('table.inline tr', {
  64. prefix: 'first',
  65. deleteText: 'Remove',
  66. addButton: addButton
  67. });
  68. assert.equal(this.table.find('.add-row a').length, 0);
  69. addButton.click();
  70. assert.ok(this.table.find('#first-1'));
  71. });
  72. QUnit.module('admin.inlines: tabular formsets with validation errors', {
  73. beforeEach: function() {
  74. var $ = django.jQuery;
  75. $('#qunit-fixture').append($('#tabular-formset-with-validation-error').text());
  76. this.table = $('table.inline');
  77. this.inlineRows = this.table.find('tr.form-row');
  78. this.inlineRows.tabularFormset('table.inline tr.form-row', {
  79. prefix: 'second'
  80. });
  81. }
  82. });
  83. QUnit.test('first form has delete checkbox and no button', function(assert) {
  84. var tr = this.inlineRows.slice(0, 1);
  85. assert.ok(tr.hasClass('dynamic-second'));
  86. assert.ok(tr.hasClass('has_original'));
  87. assert.equal(tr.find('td.delete input').length, 1);
  88. assert.equal(tr.find('td.delete .inline-deletelink').length, 0);
  89. });
  90. QUnit.test('dynamic form has remove button', function(assert) {
  91. var tr = this.inlineRows.slice(1, 2);
  92. assert.ok(tr.hasClass('dynamic-second'));
  93. assert.notOk(tr.hasClass('has_original'));
  94. assert.equal(tr.find('.inline-deletelink').length, 1);
  95. });
  96. QUnit.test('dynamic template has nothing', function(assert) {
  97. var tr = this.inlineRows.slice(2, 3);
  98. assert.ok(tr.hasClass('empty-form'));
  99. assert.notOk(tr.hasClass('dynamic-second'));
  100. assert.notOk(tr.hasClass('has_original'));
  101. assert.equal(tr.find('td.delete')[0].innerHTML, '');
  102. });
  103. QUnit.test('removing a form-row also removed related row with non-field errors', function(assert) {
  104. var $ = django.jQuery;
  105. assert.ok(this.table.find('.row-form-errors').length);
  106. var tr = this.inlineRows.slice(1, 2);
  107. var trWithErrors = tr.prev();
  108. assert.ok(trWithErrors.hasClass('row-form-errors'));
  109. var deleteLink = tr.find('a.inline-deletelink');
  110. deleteLink.trigger($.Event('click', {target: deleteLink}));
  111. assert.notOk(this.table.find('.row-form-errors').length);
  112. });
  113. QUnit.module('admin.inlines: tabular formsets with max_num', {
  114. beforeEach: function() {
  115. var $ = django.jQuery;
  116. $('#qunit-fixture').append($('#tabular-formset-with-validation-error').text());
  117. this.table = $('table.inline');
  118. this.maxNum = $('input.id_second-MAX_NUM_FORMS');
  119. this.maxNum.val(2);
  120. this.inlineRows = this.table.find('tr.form-row');
  121. this.inlineRows.tabularFormset('table.inline tr.form-row', {
  122. prefix: 'second'
  123. });
  124. }
  125. });
  126. QUnit.test('does not show the add button if already at max_num', function(assert) {
  127. var addButton = this.table.find('tr.add_row > td > a');
  128. assert.notOk(addButton.is(':visible'));
  129. });
  130. QUnit.test('make addButton visible again', function(assert) {
  131. var $ = django.jQuery;
  132. var addButton = this.table.find('tr.add_row > td > a');
  133. var removeButton = this.table.find('tr.form-row:first').find('a.inline-deletelink');
  134. removeButton.trigger($.Event( "click", { target: removeButton } ));
  135. assert.notOk(addButton.is(':visible'));
  136. });
  137. QUnit.module('admin.inlines: tabular formsets with min_num', {
  138. beforeEach: function() {
  139. var $ = django.jQuery;
  140. $('#qunit-fixture').append($('#tabular-formset-with-validation-error').text());
  141. this.table = $('table.inline');
  142. this.minNum = $('input#id_second-MIN_NUM_FORMS');
  143. this.minNum.val(2);
  144. this.inlineRows = this.table.find('tr.form-row');
  145. this.inlineRows.tabularFormset('table.inline tr.form-row', {
  146. prefix: 'second'
  147. });
  148. }
  149. });
  150. QUnit.test('does not show the remove buttons if already at min_num', function(assert) {
  151. assert.notOk(this.table.find('.inline-deletelink:visible').length);
  152. });
  153. QUnit.test('make removeButtons visible again', function(assert) {
  154. var $ = django.jQuery;
  155. var addButton = this.table.find('tr.add-row > td > a');
  156. addButton.trigger($.Event( "click", { target: addButton } ));
  157. assert.equal(this.table.find('.inline-deletelink:visible').length, 2);
  158. });