mixer-insert.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395
  1. 'use strict';
  2. require('jsdom-global')();
  3. const chai = require('chai');
  4. const dom = require('../mock/dom');
  5. const mixitup = require('../../dist/mixitup.js');
  6. chai.use(require('chai-shallow-deep-equal'));
  7. chai.use(require('chai-as-promised'));
  8. describe('mixitup.Mixer', () => {
  9. describe('#insert()', () => {
  10. it('should accept an element as an argument', () => {
  11. let container = dom.getContainer();
  12. let mixer = mixitup(container);
  13. let newTarget = dom.getTarget();
  14. return mixer.insert(newTarget)
  15. .then(state => {
  16. chai.assert.equal(state.show[0].id, 7);
  17. mixer.destroy();
  18. });
  19. });
  20. it('should accept an element and an index as arguments', () => {
  21. let container = dom.getContainer();
  22. let mixer = mixitup(container);
  23. let newTarget = dom.getTarget();
  24. return mixer.insert(newTarget, 3)
  25. .then(state => {
  26. chai.assert.equal(state.show[3].id, 7);
  27. mixer.destroy();
  28. });
  29. });
  30. it('should accept an html string as an argument', () => {
  31. let container = dom.getContainer();
  32. let mixer = mixitup(container);
  33. let newTarget = dom.getTarget();
  34. return mixer.insert(newTarget.outerHTML)
  35. .then(state => {
  36. chai.assert.equal(state.show[0].id, 7);
  37. mixer.destroy();
  38. });
  39. });
  40. it('should accept an html and an index as arguments', () => {
  41. let container = dom.getContainer();
  42. let mixer = mixitup(container);
  43. let newTarget = dom.getTarget();
  44. return mixer.insert(newTarget.outerHTML, 5)
  45. .then(state => {
  46. chai.assert.equal(state.show[5].id, 7);
  47. mixer.destroy();
  48. });
  49. });
  50. it('should accept accept an element collection as an argument', () => {
  51. let container = dom.getContainer();
  52. let mixer = mixitup(container);
  53. let newTarget1 = dom.getTarget();
  54. let newTarget2 = dom.getTarget();
  55. newTarget2.id = '8';
  56. return mixer.insert([newTarget1, newTarget2])
  57. .then(state => {
  58. chai.assert.equal(state.show[0].id, 7);
  59. chai.assert.equal(state.show[1].id, 8);
  60. mixer.destroy();
  61. });
  62. });
  63. it('should accept accept a document fragment as an argument', () => {
  64. let container = dom.getContainer();
  65. let mixer = mixitup(container);
  66. let newTarget = dom.getTarget();
  67. let frag = document.createDocumentFragment();
  68. frag.appendChild(newTarget);
  69. return mixer.insert(frag)
  70. .then(state => {
  71. chai.assert.equal(state.show[0].id, 7);
  72. mixer.destroy();
  73. });
  74. });
  75. it('should accept accept an element collection and an index as an argument', () => {
  76. let container = dom.getContainer();
  77. let mixer = mixitup(container);
  78. let newTarget1 = dom.getTarget();
  79. let newTarget2 = dom.getTarget();
  80. newTarget2.id = '8';
  81. return mixer.insert([newTarget1, newTarget2], 4)
  82. .then(state => {
  83. chai.assert.equal(state.show[4].id, 7);
  84. chai.assert.equal(state.show[5].id, 8);
  85. mixer.destroy();
  86. });
  87. });
  88. it('should throw an error if an element, index and sibling are passed simultaneously', () => {
  89. let container = dom.getContainer();
  90. let mixer = mixitup(container);
  91. let newTarget = dom.getTarget();
  92. let sibling = container.children[4];
  93. chai.assert.throws(() => {
  94. mixer.insert(newTarget, 4, sibling);
  95. }, Error, mixitup.messages.errorInsertInvalidArguments());
  96. });
  97. it('should accept an element and sibling reference to insert before', () => {
  98. let container = dom.getContainer();
  99. let mixer = mixitup(container);
  100. let newTarget = dom.getTarget();
  101. let sibling = container.children[4];
  102. return mixer.insert(newTarget, sibling)
  103. .then(state => {
  104. chai.assert.equal(state.show[4].id, '7');
  105. mixer.destroy();
  106. });
  107. });
  108. it('should accept an element, sibling reference and position string', () => {
  109. let container = dom.getContainer();
  110. let mixer = mixitup(container);
  111. let newTarget = dom.getTarget();
  112. let sibling = container.children[4];
  113. return mixer.insert(newTarget, sibling, 'after')
  114. .then(state => {
  115. chai.assert.equal(state.show[5].id, '7');
  116. mixer.destroy();
  117. });
  118. });
  119. it('should insert at end if the insertion index is above range', () => {
  120. let container = dom.getContainer();
  121. let mixer = mixitup(container);
  122. let newTarget = dom.getTarget();
  123. return mixer.insert(newTarget, 10)
  124. .then(state => {
  125. chai.assert.equal(state.show[6].id, '7');
  126. mixer.destroy();
  127. });
  128. });
  129. it('should insert at start if the insertion index is below range', () => {
  130. let container = dom.getContainer();
  131. let mixer = mixitup(container);
  132. let newTarget = dom.getTarget();
  133. return mixer.insert(newTarget, -2)
  134. .then(state => {
  135. chai.assert.equal(state.show[0].id, '7');
  136. mixer.destroy();
  137. });
  138. });
  139. it('should throw an error if the element to insert already exists', () => {
  140. let container = dom.getContainer();
  141. let mixer = mixitup(container);
  142. let newTarget = container.children[1];
  143. chai.assert.throws(() => {
  144. mixer.insert(newTarget);
  145. }, Error, mixitup.messages.errorInsertPreexistingElement());
  146. });
  147. it('should allow no elements to be inserted with a warning', () => {
  148. let container = dom.getContainer();
  149. let totalTargets = container.children.length;
  150. let mixer = mixitup(container);
  151. return mixer.insert()
  152. .then(state => {
  153. chai.assert.equal(state.totalShow, totalTargets);
  154. mixer.destroy();
  155. });
  156. });
  157. it('should accept a callback function which is invoked after insertion', () => {
  158. let container = dom.getContainer();
  159. let mixer = mixitup(container);
  160. let newTarget = dom.getTarget();
  161. let promise = new Promise(resolve => mixer.insert(newTarget, resolve));
  162. chai.assert.isFulfilled(promise);
  163. return promise
  164. .then(() => {
  165. chai.assert.equal(newTarget.parentElement, container);
  166. mixer.destroy();
  167. });
  168. });
  169. it('should accept a boolean allowing toggling off of animation', () => {
  170. let container = dom.getContainer();
  171. let mixer = mixitup(container);
  172. let newTarget = dom.getTarget();
  173. return mixer.insert(newTarget, false)
  174. .then(() => {
  175. chai.assert.equal(newTarget.parentElement, container);
  176. mixer.destroy();
  177. });
  178. });
  179. it('should accept a HTML with padding whitespace as an argument', () => {
  180. let container = dom.getContainer();
  181. let mixer = mixitup(container);
  182. let newTarget = ' ' + dom.getTarget().outerHTML + ' ';
  183. return mixer.insert(newTarget)
  184. .then(state => {
  185. chai.assert.equal(state.show[0].id, 7);
  186. mixer.destroy();
  187. });
  188. });
  189. });
  190. describe('#prepend()', () => {
  191. it('should insert an element at the start', () => {
  192. let container = dom.getContainer();
  193. let mixer = mixitup(container);
  194. let newTarget = dom.getTarget();
  195. return mixer.prepend(newTarget)
  196. .then(state => {
  197. chai.assert.equal(state.show[0].id, 7);
  198. mixer.destroy();
  199. });
  200. });
  201. it('should insert a collection of elements at the start', () => {
  202. let container = dom.getContainer();
  203. let mixer = mixitup(container);
  204. let newTarget1 = dom.getTarget();
  205. let newTarget2 = dom.getTarget();
  206. newTarget2.id = '8';
  207. return mixer.prepend([newTarget1, newTarget2])
  208. .then(state => {
  209. chai.assert.equal(state.show[0].id, 7);
  210. chai.assert.equal(state.show[1].id, 8);
  211. mixer.destroy();
  212. });
  213. });
  214. });
  215. describe('#append()', () => {
  216. it('should insert an element at the end', () => {
  217. let container = dom.getContainer();
  218. let mixer = mixitup(container);
  219. let newTarget = dom.getTarget();
  220. return mixer.append(newTarget)
  221. .then(state => {
  222. chai.assert.equal(state.show[6].id, 7);
  223. mixer.destroy();
  224. });
  225. });
  226. it('should insert a collection of elements at the end', () => {
  227. let container = dom.getContainer();
  228. let mixer = mixitup(container);
  229. let newTarget1 = dom.getTarget();
  230. let newTarget2 = dom.getTarget();
  231. newTarget2.id = '8';
  232. return mixer.append([newTarget1, newTarget2])
  233. .then(state => {
  234. chai.assert.equal(state.show[6].id, 7);
  235. chai.assert.equal(state.show[7].id, 8);
  236. mixer.destroy();
  237. });
  238. });
  239. it('should accept accept a document fragment as an argument to append', () => {
  240. let container = dom.getContainer();
  241. let mixer = mixitup(container);
  242. let newTarget = dom.getTarget();
  243. let frag = document.createDocumentFragment();
  244. frag.appendChild(newTarget);
  245. return mixer.append(frag)
  246. .then(state => {
  247. chai.assert.equal(state.show[6].id, 7);
  248. mixer.destroy();
  249. });
  250. });
  251. });
  252. describe('#insertBefore()', () => {
  253. it('should insert an element before the referenced element', () => {
  254. let container = dom.getContainer();
  255. let mixer = mixitup(container);
  256. let newTarget = dom.getTarget();
  257. let sibling = container.children[3];
  258. return mixer.insertBefore(newTarget, sibling)
  259. .then(state => {
  260. chai.assert.equal(state.show[3].id, 7);
  261. mixer.destroy();
  262. });
  263. });
  264. it('should insert a collection of elements before the referenced element', () => {
  265. let container = dom.getContainer();
  266. let mixer = mixitup(container);
  267. let newTarget1 = dom.getTarget();
  268. let newTarget2 = dom.getTarget();
  269. let sibling = container.children[3];
  270. newTarget2.id = '8';
  271. return mixer.insertBefore([newTarget1, newTarget2], sibling)
  272. .then(state => {
  273. chai.assert.equal(state.show[3].id, 7);
  274. chai.assert.equal(state.show[4].id, 8);
  275. mixer.destroy();
  276. });
  277. });
  278. });
  279. describe('#insertAfter()', () => {
  280. it('should insert an element after the referenced element', () => {
  281. let container = dom.getContainer();
  282. let mixer = mixitup(container);
  283. let newTarget = dom.getTarget();
  284. let sibling = container.children[3];
  285. return mixer.insertAfter(newTarget, sibling)
  286. .then(state => {
  287. chai.assert.equal(state.show[4].id, 7);
  288. mixer.destroy();
  289. });
  290. });
  291. it('should insert a collection of elements after the referenced element', () => {
  292. let container = dom.getContainer();
  293. let mixer = mixitup(container);
  294. let newTarget1 = dom.getTarget();
  295. let newTarget2 = dom.getTarget();
  296. let sibling = container.children[3];
  297. newTarget2.id = '8';
  298. return mixer.insertAfter([newTarget1, newTarget2], sibling)
  299. .then(state => {
  300. chai.assert.equal(state.show[4].id, 7);
  301. chai.assert.equal(state.show[5].id, 8);
  302. mixer.destroy();
  303. });
  304. });
  305. });
  306. });