PaletteSpec.js 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441
  1. /* global sinon */
  2. import {
  3. bootstrapDiagram,
  4. getDiagramJS,
  5. inject
  6. } from 'test/TestHelper';
  7. import paletteModule from 'lib/features/palette';
  8. import {
  9. query as domQuery,
  10. classes as domClasses
  11. } from 'min-dom';
  12. var spy = sinon.spy;
  13. describe('features/palette', function() {
  14. describe('bootstrap', function() {
  15. beforeEach(bootstrapDiagram({
  16. modules: [
  17. paletteModule
  18. ]
  19. }));
  20. it('should not attach without provider', inject(function(canvas, palette) {
  21. // given
  22. var paletteEl = domQuery('.djs-palette', canvas.getContainer());
  23. // then
  24. expect(paletteEl).not.to.exist;
  25. }));
  26. it('should create + attach with provider', inject(function(eventBus, canvas, palette) {
  27. // given
  28. var createSpy = spy(function(event) {
  29. expect(event.container).to.equal(palette._container);
  30. });
  31. eventBus.on('palette.create', createSpy);
  32. // when
  33. palette.registerProvider(new Provider());
  34. // then
  35. var paletteEl = domQuery('.djs-palette', canvas.getContainer());
  36. expect(paletteEl).to.exist;
  37. expect(createSpy).to.have.been.called;
  38. }));
  39. });
  40. describe('create on bootstrap', function() {
  41. beforeEach(bootstrapDiagram({
  42. modules: [
  43. paletteModule,
  44. {
  45. __init__: [
  46. 'paletteProvider',
  47. 'paletteCreateListener'
  48. ],
  49. paletteCreateListener: [ 'type', function(eventBus) {
  50. var self = this;
  51. eventBus.on('palette.create', function() {
  52. self.createCalled = true;
  53. });
  54. } ],
  55. paletteProvider: [ 'type', function(palette) {
  56. palette.registerProvider(new Provider());
  57. }]
  58. }
  59. ]
  60. }));
  61. it('should emit palette.create', inject(function(paletteCreateListener) {
  62. expect(paletteCreateListener.createCalled).to.be.true;
  63. }));
  64. });
  65. describe('providers', function() {
  66. beforeEach(bootstrapDiagram({
  67. modules: [
  68. paletteModule
  69. ]
  70. }));
  71. it('should register provider', inject(function(palette) {
  72. // given
  73. var provider = new Provider();
  74. // when
  75. palette.registerProvider(provider);
  76. // then
  77. expect(palette._providers).to.eql([ provider ]);
  78. }));
  79. it('should query provider for entries', inject(function(palette) {
  80. // given
  81. var provider = new Provider();
  82. palette.registerProvider(provider);
  83. var getSpy = spy(provider, 'getPaletteEntries');
  84. // when
  85. var entries = palette.getEntries();
  86. // then
  87. expect(entries).to.eql({});
  88. // pass over providers
  89. expect(getSpy).to.have.been.called;
  90. }));
  91. it('should add palette entries', inject(function(canvas, palette) {
  92. // given
  93. var entries = {
  94. 'entryA': {
  95. alt: 'A',
  96. className: 'FOO',
  97. action: function() {
  98. console.log('click entryA', arguments);
  99. }
  100. },
  101. 'entryB': {
  102. alt: 'B',
  103. imageUrl: 'http://placehold.it/40x40',
  104. action: {
  105. click: function() {
  106. console.log('click entryB');
  107. },
  108. dragstart: function(event) {
  109. console.log('dragstart entryB');
  110. event.preventDefault();
  111. }
  112. }
  113. }
  114. };
  115. var provider = new Provider(entries);
  116. // when
  117. palette.registerProvider(provider);
  118. palette.open();
  119. // then data structure should set
  120. var pEntries = palette.getEntries();
  121. expect(pEntries.entryA).to.exist;
  122. expect(pEntries.entryB).to.exist;
  123. // then DOM should contain entries
  124. var entryA = domQuery('[data-action="entryA"]', palette._container);
  125. expect(entryA).to.exist;
  126. expect(domClasses(entryA).has('FOO')).to.be.true;
  127. var entryB = domQuery('[data-action="entryB"]', palette._container);
  128. expect(entryB).to.exist;
  129. expect(domQuery('img', entryB)).to.exist;
  130. }));
  131. describe('entry className', function() {
  132. function testClassName(options) {
  133. var set = options.set,
  134. expected = options.expect;
  135. return inject(function(palette) {
  136. // given
  137. var entries = {
  138. 'entryA': {
  139. alt: 'A',
  140. className: set
  141. }
  142. };
  143. var provider = new Provider(entries);
  144. // when
  145. palette.registerProvider(provider);
  146. palette.open();
  147. // then DOM should contain entries
  148. var entryA = domQuery('[data-action="entryA"]', palette._container);
  149. expect(entryA).to.exist;
  150. // expect all classes to be set
  151. expected.forEach(function(cls) {
  152. expect(domClasses(entryA).has(cls)).to.be.true;
  153. });
  154. });
  155. }
  156. it('should recognize Array<String> as className', testClassName({
  157. set: [ 'FOO', 'BAAAR' ],
  158. expect: [ 'FOO', 'BAAAR' ]
  159. }));
  160. it('should recognize <space separated classes> as className', testClassName({
  161. set: 'FOO BAAAR blub',
  162. expect: [ 'FOO', 'BAAAR', 'blub' ]
  163. }));
  164. });
  165. });
  166. describe('lifecycle', function() {
  167. beforeEach(bootstrapDiagram({
  168. modules: [
  169. paletteModule
  170. ]
  171. }));
  172. beforeEach(inject(function(palette) {
  173. palette.registerProvider(new Provider());
  174. }));
  175. it('should be opened (default)', inject(function(palette) {
  176. // then
  177. expect(palette.isOpen()).to.be.true;
  178. // marker class on .djs-container
  179. expectPaletteCls('open', true);
  180. }));
  181. it('should close', inject(function(eventBus, palette) {
  182. // given
  183. var changedSpy = spy(function(event) {
  184. expect(event.open).to.be.false;
  185. expect(event.twoColumn).to.be.false;
  186. });
  187. eventBus.on('palette.changed', changedSpy);
  188. // when
  189. palette.close();
  190. // then
  191. expect(palette.isOpen()).to.be.false;
  192. // no marker class on .djs-container
  193. expectPaletteCls('open', false);
  194. expect(changedSpy).to.have.been.called;
  195. }));
  196. it('should re-open', inject(function(eventBus, palette) {
  197. // given
  198. palette.close();
  199. var changedSpy = spy(function(event) {
  200. expect(event.open).to.be.true;
  201. expect(event.twoColumn).to.be.false;
  202. });
  203. eventBus.on('palette.changed', changedSpy);
  204. // when
  205. palette.open();
  206. // then
  207. expect(palette.isOpen()).to.be.true;
  208. // no marker class on .djs-container
  209. expectPaletteCls('open', true);
  210. expect(changedSpy).to.have.been.called;
  211. }));
  212. });
  213. describe('column layout', function() {
  214. var entries = {
  215. 'entryA': {
  216. action: function() {}
  217. },
  218. 'entryB': {
  219. action: function() {}
  220. },
  221. 'entryC': {
  222. action: function() {}
  223. },
  224. 'entryD': {
  225. action: function() {}
  226. },
  227. 'entryE': {
  228. action: function() {}
  229. }
  230. };
  231. beforeEach(bootstrapDiagram({
  232. modules: [ paletteModule ]
  233. }));
  234. beforeEach(inject(function(palette) {
  235. palette.registerProvider(new Provider(entries));
  236. }));
  237. it('should be single column if enough space for entries',
  238. inject(function(eventBus, canvas, palette) {
  239. // given
  240. var parent = canvas.getContainer();
  241. parent.style.height = '300px';
  242. var changedSpy = spy(function(event) {
  243. expect(event.open).to.be.true;
  244. expect(event.twoColumn).to.be.false;
  245. });
  246. eventBus.on('palette.changed', changedSpy);
  247. // when
  248. canvas.resized();
  249. // then
  250. expectPaletteCls('two-column', false);
  251. expect(changedSpy).to.have.been.called;
  252. })
  253. );
  254. it('should collapse into two columns',
  255. inject(function(eventBus, canvas, palette) {
  256. // given
  257. var parent = canvas.getContainer();
  258. parent.style.height = '270px';
  259. var changedSpy = spy(function(event) {
  260. expect(event.open).to.be.true;
  261. expect(event.twoColumn).to.be.true;
  262. });
  263. eventBus.on('palette.changed', changedSpy);
  264. // when
  265. canvas.resized();
  266. // then
  267. expectPaletteCls('two-column', true);
  268. expect(changedSpy).to.have.been.called;
  269. })
  270. );
  271. it('should turn the palette into a one column layout',
  272. inject(function(canvas, eventBus, palette) {
  273. var parent = canvas.getContainer();
  274. parent.style.height = '270px';
  275. canvas.resized();
  276. var changedSpy = spy(function(event) {
  277. expect(event.open).to.be.true;
  278. expect(event.twoColumn).to.be.false;
  279. });
  280. eventBus.on('palette.changed', changedSpy);
  281. // when
  282. parent.style.height = '300px';
  283. canvas.resized();
  284. // then
  285. expectPaletteCls('two-column', false);
  286. expect(changedSpy).to.have.been.called;
  287. })
  288. );
  289. });
  290. });
  291. // helpers //////////////////////
  292. function Provider(entries) {
  293. this.getPaletteEntries = function() {
  294. return entries || {};
  295. };
  296. }
  297. function is(node, cls) {
  298. return domClasses(node).has(cls);
  299. }
  300. function expectPaletteCls(marker, expectedActive) {
  301. getDiagramJS().invoke(function(palette) {
  302. var isActive = is(palette._container, marker);
  303. expect(isActive).to.eql(expectedActive);
  304. });
  305. }