@nyaruka/temba-components 0.35.2 → 0.36.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (231) hide show
  1. package/.eslintrc.js +0 -2
  2. package/.github/workflows/build.yml +1 -0
  3. package/.github/workflows/publish.yml +2 -3
  4. package/CHANGELOG.md +26 -0
  5. package/demo/index.html +1 -3
  6. package/dist/4d30c7b8.js +1 -0
  7. package/dist/index.js +0 -5737
  8. package/dist/sw.js +1 -1
  9. package/dist/sw.js.map +1 -1
  10. package/dist/workbox-919adfb7.js +2 -0
  11. package/dist/workbox-919adfb7.js.map +1 -0
  12. package/out-tsc/src/FormElement.js +1 -1
  13. package/out-tsc/src/FormElement.js.map +1 -1
  14. package/out-tsc/src/RefreshElement.js +1 -1
  15. package/out-tsc/src/RefreshElement.js.map +1 -1
  16. package/out-tsc/src/alert/Alert.js +1 -1
  17. package/out-tsc/src/alert/Alert.js.map +1 -1
  18. package/out-tsc/src/aliaseditor/AliasEditor.js +6 -6
  19. package/out-tsc/src/aliaseditor/AliasEditor.js.map +1 -1
  20. package/out-tsc/src/anchor/Anchor.js +1 -1
  21. package/out-tsc/src/anchor/Anchor.js.map +1 -1
  22. package/out-tsc/src/button/Button.js +1 -1
  23. package/out-tsc/src/button/Button.js.map +1 -1
  24. package/out-tsc/src/charcount/CharCount.js +1 -1
  25. package/out-tsc/src/charcount/CharCount.js.map +1 -1
  26. package/out-tsc/src/checkbox/Checkbox.js +1 -1
  27. package/out-tsc/src/checkbox/Checkbox.js.map +1 -1
  28. package/out-tsc/src/completion/Completion.js +3 -3
  29. package/out-tsc/src/completion/Completion.js.map +1 -1
  30. package/out-tsc/src/completion/helpers.js +2 -2
  31. package/out-tsc/src/completion/helpers.js.map +1 -1
  32. package/out-tsc/src/contacts/ContactChat.js +184 -156
  33. package/out-tsc/src/contacts/ContactChat.js.map +1 -1
  34. package/out-tsc/src/contacts/ContactDetails.js +1 -1
  35. package/out-tsc/src/contacts/ContactDetails.js.map +1 -1
  36. package/out-tsc/src/contacts/ContactFieldEditor.js +1 -1
  37. package/out-tsc/src/contacts/ContactFieldEditor.js.map +1 -1
  38. package/out-tsc/src/contacts/ContactFields.js +1 -1
  39. package/out-tsc/src/contacts/ContactFields.js.map +1 -1
  40. package/out-tsc/src/contacts/ContactHistory.js +1 -1
  41. package/out-tsc/src/contacts/ContactHistory.js.map +1 -1
  42. package/out-tsc/src/contacts/ContactName.js +1 -1
  43. package/out-tsc/src/contacts/ContactName.js.map +1 -1
  44. package/out-tsc/src/contacts/ContactNameFetch.js +1 -1
  45. package/out-tsc/src/contacts/ContactNameFetch.js.map +1 -1
  46. package/out-tsc/src/contacts/ContactPending.js +13 -13
  47. package/out-tsc/src/contacts/ContactPending.js.map +1 -1
  48. package/out-tsc/src/contacts/ContactStoreElement.js +1 -1
  49. package/out-tsc/src/contacts/ContactStoreElement.js.map +1 -1
  50. package/out-tsc/src/contacts/ContactTickets.js +1 -1
  51. package/out-tsc/src/contacts/ContactTickets.js.map +1 -1
  52. package/out-tsc/src/contacts/ContactUrn.js +1 -1
  53. package/out-tsc/src/contacts/ContactUrn.js.map +1 -1
  54. package/out-tsc/src/contactsearch/ContactSearch.js +1 -1
  55. package/out-tsc/src/contactsearch/ContactSearch.js.map +1 -1
  56. package/out-tsc/src/date/TembaDate.js +1 -1
  57. package/out-tsc/src/date/TembaDate.js.map +1 -1
  58. package/out-tsc/src/datepicker/DatePicker.js +8 -8
  59. package/out-tsc/src/datepicker/DatePicker.js.map +1 -1
  60. package/out-tsc/src/dialog/Dialog.js +11 -11
  61. package/out-tsc/src/dialog/Dialog.js.map +1 -1
  62. package/out-tsc/src/dialog/Modax.js +16 -17
  63. package/out-tsc/src/dialog/Modax.js.map +1 -1
  64. package/out-tsc/src/dropdown/Dropdown.js +14 -11
  65. package/out-tsc/src/dropdown/Dropdown.js.map +1 -1
  66. package/out-tsc/src/fields/FieldManager.js +1 -1
  67. package/out-tsc/src/fields/FieldManager.js.map +1 -1
  68. package/out-tsc/src/flow/FlowStoreElement.js +1 -1
  69. package/out-tsc/src/flow/FlowStoreElement.js.map +1 -1
  70. package/out-tsc/src/formfield/FormField.js +1 -1
  71. package/out-tsc/src/formfield/FormField.js.map +1 -1
  72. package/out-tsc/src/label/Label.js +2 -2
  73. package/out-tsc/src/label/Label.js.map +1 -1
  74. package/out-tsc/src/leafletmap/LeafletMap.js +12 -12
  75. package/out-tsc/src/leafletmap/LeafletMap.js.map +1 -1
  76. package/out-tsc/src/list/ContentMenu.js +163 -0
  77. package/out-tsc/src/list/ContentMenu.js.map +1 -0
  78. package/out-tsc/src/list/RunList.js +13 -12
  79. package/out-tsc/src/list/RunList.js.map +1 -1
  80. package/out-tsc/src/list/SortableList.js +14 -14
  81. package/out-tsc/src/list/SortableList.js.map +1 -1
  82. package/out-tsc/src/list/TembaList.js +14 -16
  83. package/out-tsc/src/list/TembaList.js.map +1 -1
  84. package/out-tsc/src/list/TembaMenu.js +108 -108
  85. package/out-tsc/src/list/TembaMenu.js.map +1 -1
  86. package/out-tsc/src/list/TicketList.js +8 -8
  87. package/out-tsc/src/list/TicketList.js.map +1 -1
  88. package/out-tsc/src/loading/Loading.js +2 -2
  89. package/out-tsc/src/loading/Loading.js.map +1 -1
  90. package/out-tsc/src/omnibox/Omnibox.js +2 -2
  91. package/out-tsc/src/omnibox/Omnibox.js.map +1 -1
  92. package/out-tsc/src/options/Options.js +2 -2
  93. package/out-tsc/src/options/Options.js.map +1 -1
  94. package/out-tsc/src/remote/Remote.js +1 -1
  95. package/out-tsc/src/remote/Remote.js.map +1 -1
  96. package/out-tsc/src/select/Select.js +2 -2
  97. package/out-tsc/src/select/Select.js.map +1 -1
  98. package/out-tsc/src/shadowless/Shadowless.js +1 -1
  99. package/out-tsc/src/shadowless/Shadowless.js.map +1 -1
  100. package/out-tsc/src/slider/TembaSlider.js +2 -2
  101. package/out-tsc/src/slider/TembaSlider.js.map +1 -1
  102. package/out-tsc/src/store/Store.js +8 -5
  103. package/out-tsc/src/store/Store.js.map +1 -1
  104. package/out-tsc/src/store/StoreElement.js +1 -1
  105. package/out-tsc/src/store/StoreElement.js.map +1 -1
  106. package/out-tsc/src/tabpane/Tab.js +1 -1
  107. package/out-tsc/src/tabpane/Tab.js.map +1 -1
  108. package/out-tsc/src/tabpane/TabPane.js +1 -1
  109. package/out-tsc/src/tabpane/TabPane.js.map +1 -1
  110. package/out-tsc/src/textinput/TextInput.js +15 -15
  111. package/out-tsc/src/textinput/TextInput.js.map +1 -1
  112. package/out-tsc/src/tip/Tip.js +2 -2
  113. package/out-tsc/src/tip/Tip.js.map +1 -1
  114. package/out-tsc/src/utils/index.js +1 -6
  115. package/out-tsc/src/utils/index.js.map +1 -1
  116. package/out-tsc/src/vectoricon/VectorIcon.js +9 -9
  117. package/out-tsc/src/vectoricon/VectorIcon.js.map +1 -1
  118. package/out-tsc/temba-modules.js +3 -0
  119. package/out-tsc/temba-modules.js.map +1 -1
  120. package/out-tsc/test/MouseHelper.js +1 -1
  121. package/out-tsc/test/MouseHelper.js.map +1 -1
  122. package/out-tsc/test/temba-contact-chat.test.js +93 -50
  123. package/out-tsc/test/temba-contact-chat.test.js.map +1 -1
  124. package/out-tsc/test/temba-contact-history.test.js +1 -1
  125. package/out-tsc/test/temba-contact-history.test.js.map +1 -1
  126. package/out-tsc/test/temba-content-menu.test.js +57 -0
  127. package/out-tsc/test/temba-content-menu.test.js.map +1 -0
  128. package/out-tsc/test/temba-modax.test.js +18 -19
  129. package/out-tsc/test/temba-modax.test.js.map +1 -1
  130. package/out-tsc/test/temba-select.test.js +1 -0
  131. package/out-tsc/test/temba-select.test.js.map +1 -1
  132. package/out-tsc/test/temba-tip.test.js +4 -6
  133. package/out-tsc/test/temba-tip.test.js.map +1 -1
  134. package/out-tsc/test/utils.test.js +5 -17
  135. package/out-tsc/test/utils.test.js.map +1 -1
  136. package/package.json +16 -28
  137. package/rollup.config.js +1 -0
  138. package/screenshots/truth/contacts/{contact-active-show-chat-history.png → contact-active-show-chatbox.png} +0 -0
  139. package/screenshots/truth/contacts/contact-active-ticket-closed-show-reopen-button.png +0 -0
  140. package/screenshots/truth/contacts/contact-active-ticket-open-show-chatbox.png +0 -0
  141. package/screenshots/truth/contacts/{contact-archived-hide-chat-msg.png → contact-archived-hide-chatbox.png} +0 -0
  142. package/screenshots/truth/contacts/contact-archived-ticket-closed-hide-chatbox.png +0 -0
  143. package/screenshots/truth/contacts/{contact-archived-show-chat-history.png → contact-blocked-hide-chatbox.png} +0 -0
  144. package/screenshots/truth/contacts/{contact-blocked-hide-chat-msg.png → contact-stopped-hide-chatbox.png} +0 -0
  145. package/screenshots/truth/content-menu/button-no-items.png +0 -0
  146. package/screenshots/truth/content-menu/item-no-buttons.png +0 -0
  147. package/screenshots/truth/content-menu/items-and-buttons.png +0 -0
  148. package/src/FormElement.ts +1 -1
  149. package/src/RefreshElement.ts +1 -1
  150. package/src/alert/Alert.ts +1 -1
  151. package/src/aliaseditor/AliasEditor.ts +2 -2
  152. package/src/anchor/Anchor.ts +1 -1
  153. package/src/button/Button.ts +1 -1
  154. package/src/charcount/CharCount.ts +1 -1
  155. package/src/checkbox/Checkbox.ts +1 -1
  156. package/src/completion/Completion.ts +3 -3
  157. package/src/completion/helpers.ts +8 -2
  158. package/src/contacts/ContactChat.ts +185 -157
  159. package/src/contacts/ContactDetails.ts +1 -1
  160. package/src/contacts/ContactFieldEditor.ts +1 -1
  161. package/src/contacts/ContactFields.ts +1 -1
  162. package/src/contacts/ContactHistory.ts +1 -1
  163. package/src/contacts/ContactName.ts +1 -1
  164. package/src/contacts/ContactNameFetch.ts +1 -1
  165. package/src/contacts/ContactPending.ts +1 -1
  166. package/src/contacts/ContactStoreElement.ts +1 -1
  167. package/src/contacts/ContactTickets.ts +1 -1
  168. package/src/contacts/ContactUrn.ts +1 -1
  169. package/src/contactsearch/ContactSearch.ts +1 -1
  170. package/src/date/TembaDate.ts +1 -1
  171. package/src/datepicker/DatePicker.ts +1 -1
  172. package/src/dialog/Dialog.ts +2 -2
  173. package/src/dialog/Modax.ts +17 -24
  174. package/src/dropdown/Dropdown.ts +20 -14
  175. package/src/fields/FieldManager.ts +1 -1
  176. package/src/flow/FlowStoreElement.ts +1 -1
  177. package/src/formfield/FormField.ts +1 -1
  178. package/src/label/Label.ts +2 -2
  179. package/src/leafletmap/LeafletMap.ts +1 -1
  180. package/src/list/ContentMenu.ts +177 -0
  181. package/src/list/RunList.ts +4 -3
  182. package/src/list/SortableList.ts +1 -1
  183. package/src/list/TembaList.ts +2 -4
  184. package/src/list/TembaMenu.ts +1 -1
  185. package/src/list/TicketList.ts +1 -1
  186. package/src/loading/Loading.ts +2 -2
  187. package/src/omnibox/Omnibox.ts +2 -2
  188. package/src/options/Options.ts +2 -2
  189. package/src/remote/Remote.ts +1 -1
  190. package/src/select/Select.ts +2 -2
  191. package/src/shadowless/Shadowless.ts +1 -1
  192. package/src/slider/TembaSlider.ts +2 -2
  193. package/src/store/Store.ts +11 -7
  194. package/src/store/StoreElement.ts +1 -1
  195. package/src/tabpane/Tab.ts +1 -1
  196. package/src/tabpane/TabPane.ts +1 -1
  197. package/src/textinput/TextInput.ts +3 -3
  198. package/src/tip/Tip.ts +6 -6
  199. package/src/untyped.d.ts +0 -2
  200. package/src/utils/index.ts +1 -5
  201. package/src/vectoricon/VectorIcon.ts +1 -1
  202. package/temba-modules.ts +3 -0
  203. package/test/MouseHelper.ts +1 -1
  204. package/test/temba-contact-chat.test.ts +148 -62
  205. package/test/temba-contact-history.test.ts +1 -1
  206. package/test/temba-content-menu.test.ts +84 -0
  207. package/test/temba-modax.test.ts +25 -21
  208. package/test/temba-select.test.ts +2 -0
  209. package/test/temba-tip.test.ts +10 -5
  210. package/test/utils.test.ts +6 -19
  211. package/test-assets/contacts/{contact-barak-archived → contact-barack-archived} +1 -1
  212. package/test-assets/contacts/contact-carter-active +52 -0
  213. package/test-assets/contacts/contact-michelle-blocked +1 -1
  214. package/test-assets/contacts/contact-tim-stopped +1 -1
  215. package/test-assets/list/content-menu-archived-contacts.json +12 -0
  216. package/test-assets/list/content-menu-contact-read.json +49 -0
  217. package/test-assets/list/content-menu-new-campaign.json +15 -0
  218. package/test-assets/tickets/empty.json +6 -0
  219. package/test-assets/tickets/ticket-barack-closed.json +22 -0
  220. package/test-assets/tickets/ticket-carter-closed.json +22 -0
  221. package/test-assets/tickets/ticket-carter-open.json +22 -0
  222. package/web-test-runner.config.mjs +21 -18
  223. package/dist/41042aab.js +0 -5738
  224. package/dist/templates/components-body.html +0 -1
  225. package/dist/templates/components-head.html +0 -1
  226. package/dist/workbox-80efdfd1.js +0 -2
  227. package/dist/workbox-80efdfd1.js.map +0 -1
  228. package/screenshots/truth/contacts/contact-active-show-chat-msg.png +0 -0
  229. package/screenshots/truth/contacts/contact-blocked-show-chat-history.png +0 -0
  230. package/screenshots/truth/contacts/contact-stopped-hide-chat-msg.png +0 -0
  231. package/screenshots/truth/contacts/contact-stopped-show-chat-history.png +0 -0
@@ -9,12 +9,18 @@ const getContactChat = async (attrs = {}) => {
9
9
  await delay(100);
10
10
  return chat;
11
11
  };
12
- describe('temba-contact-chat', () => {
13
- // map requests for contact history and ticket api to our static files
14
- // we'll just us the same history and ticket list for everybody for now
12
+ const list_TAG = 'temba-list';
13
+ const getTicketList = async (attrs = {}) => {
14
+ const list = (await getComponent(list_TAG, attrs));
15
+ // wait for the fetch
16
+ await list.httpComplete;
17
+ return list;
18
+ };
19
+ describe('temba-contact-chat - contact tests', () => {
20
+ // map requests for contact history to our static files
21
+ // we'll just us the same historylist for everybody for now
15
22
  beforeEach(() => {
16
23
  mockGET(/\/contact\/history\/contact-.*/, '/test-assets/contacts/history.json');
17
- mockGET(/\/api\/v2\/tickets\.json\?contact=contact-.*/, '/test-assets/api/tickets.json');
18
24
  });
19
25
  it('can be created', async () => {
20
26
  // we are a StoreElement, so load a store first
@@ -24,93 +30,130 @@ describe('temba-contact-chat', () => {
24
30
  });
25
31
  await assertScreenshot('contacts/contact-active-default', getClip(chat));
26
32
  });
27
- it('can send chat msg if contact is active', async () => {
33
+ it('show history and show chatbox if contact is active', async () => {
28
34
  // we are a StoreElement, so load a store first
29
35
  await loadStore();
30
36
  const chat = await getContactChat({
31
37
  contact: 'contact-dave-active',
32
38
  });
39
+ const chatHistoryEl = chat.shadowRoot.querySelector('temba-contact-history');
40
+ expect(chatHistoryEl).to.not.equal(null);
33
41
  const chatboxDivEl = chat.shadowRoot.querySelector('.chatbox');
34
- const displayVal = chatboxDivEl.style.display;
35
- expect(displayVal).to.equal('');
36
- await assertScreenshot('contacts/contact-active-show-chat-msg', getClip(chat));
42
+ expect(chatboxDivEl).to.not.equal(null);
43
+ const reopenButton = chat.shadowRoot.querySelector('temba-button#reopen-button');
44
+ expect(reopenButton).to.equal(null);
45
+ await assertScreenshot('contacts/contact-active-show-chatbox', getClip(chat));
37
46
  });
38
- it('can see chat history if contact is active', async () => {
47
+ it('show history and hide chatbox if contact is archived', async () => {
39
48
  // we are a StoreElement, so load a store first
40
49
  await loadStore();
41
50
  const chat = await getContactChat({
42
- contact: 'contact-dave-active',
51
+ contact: 'contact-barack-archived',
43
52
  });
44
53
  const chatHistoryEl = chat.shadowRoot.querySelector('temba-contact-history');
45
- const displayVal = chatHistoryEl.style.display;
46
- expect(displayVal).to.equal('');
47
- await assertScreenshot('contacts/contact-active-show-chat-history', getClip(chat));
54
+ expect(chatHistoryEl).to.not.equal(null);
55
+ const chatboxDiv = chat.shadowRoot.querySelector('.chatbox');
56
+ expect(chatboxDiv).to.equal(null);
57
+ const reopenButton = chat.shadowRoot.querySelector('temba-button#reopen-button');
58
+ expect(reopenButton).to.equal(null);
59
+ await assertScreenshot('contacts/contact-archived-hide-chatbox', getClip(chat));
48
60
  });
49
- it('cannot send chat msg if contact is archived', async () => {
61
+ it('show history and hide chatbox if contact is blocked', async () => {
50
62
  // we are a StoreElement, so load a store first
51
63
  await loadStore();
52
64
  const chat = await getContactChat({
53
- contact: 'contact-barak-archived',
65
+ contact: 'contact-michelle-blocked',
54
66
  });
55
- const chatboxDivEl = chat.shadowRoot.querySelector('.chatbox');
56
- const displayVal = chatboxDivEl.style.display;
57
- expect(displayVal).to.equal('none');
58
- await assertScreenshot('contacts/contact-archived-hide-chat-msg', getClip(chat));
67
+ const chatHistoryEl = chat.shadowRoot.querySelector('temba-contact-history');
68
+ expect(chatHistoryEl).to.not.equal(null);
69
+ const chatboxDiv = chat.shadowRoot.querySelector('.chatbox');
70
+ expect(chatboxDiv).to.equal(null);
71
+ const reopenButton = chat.shadowRoot.querySelector('temba-button#reopen-button');
72
+ expect(reopenButton).to.equal(null);
73
+ await assertScreenshot('contacts/contact-blocked-hide-chatbox', getClip(chat));
59
74
  });
60
- it('can see chat history if contact is archived', async () => {
75
+ it('show history and hide chatbox if contact is stopped', async () => {
61
76
  // we are a StoreElement, so load a store first
62
77
  await loadStore();
63
78
  const chat = await getContactChat({
64
- contact: 'contact-barak-archived',
79
+ contact: 'contact-tim-stopped',
65
80
  });
66
81
  const chatHistoryEl = chat.shadowRoot.querySelector('temba-contact-history');
67
- const displayVal = chatHistoryEl.style.display;
68
- expect(displayVal).to.equal('');
69
- await assertScreenshot('contacts/contact-archived-show-chat-history', getClip(chat));
82
+ expect(chatHistoryEl).to.not.equal(null);
83
+ const chatboxDiv = chat.shadowRoot.querySelector('.chatbox');
84
+ expect(chatboxDiv).to.equal(null);
85
+ const reopenButton = chat.shadowRoot.querySelector('temba-button#reopen-button');
86
+ expect(reopenButton).to.equal(null);
87
+ await assertScreenshot('contacts/contact-stopped-hide-chatbox', getClip(chat));
70
88
  });
71
- it('cannot send chat msg if contact is blocked', async () => {
72
- // we are a StoreElement, so load a store first
73
- await loadStore();
74
- const chat = await getContactChat({
75
- contact: 'contact-michelle-blocked',
76
- });
77
- const chatboxDivEl = chat.shadowRoot.querySelector('.chatbox');
78
- const displayVal = chatboxDivEl.style.display;
79
- expect(displayVal).to.equal('none');
80
- await assertScreenshot('contacts/contact-blocked-hide-chat-msg', getClip(chat));
89
+ });
90
+ describe('temba-contact-chat - ticket tests', () => {
91
+ // map requests for contact history to our static files
92
+ // we'll just us the same history for everybody for now
93
+ beforeEach(() => {
94
+ mockGET(/\/contact\/history\/contact-.*/, '/test-assets/contacts/history.json');
95
+ mockGET(/\/api\/v2\/tickets\.json.*/, '/test-assets/tickets/empty.json');
81
96
  });
82
- it('can see chat history if contact is blocked', async () => {
97
+ it('show history and show chatbox if contact is active and ticket is open', async () => {
83
98
  // we are a StoreElement, so load a store first
84
99
  await loadStore();
85
100
  const chat = await getContactChat({
86
- contact: 'contact-michelle-blocked',
101
+ contact: 'contact-carter-active',
102
+ });
103
+ const tickets = await getTicketList({
104
+ endpoint: '/test-assets/tickets/ticket-carter-open.json',
87
105
  });
106
+ chat.currentTicket = tickets.items[0];
107
+ chat.refresh();
88
108
  const chatHistoryEl = chat.shadowRoot.querySelector('temba-contact-history');
89
- const displayVal = chatHistoryEl.style.display;
90
- expect(displayVal).to.equal('');
91
- await assertScreenshot('contacts/contact-blocked-show-chat-history', getClip(chat));
109
+ expect(chatHistoryEl).to.not.equal(null);
110
+ const chatboxDiv = chat.shadowRoot.querySelector('.chatbox');
111
+ expect(chatboxDiv).to.not.equal(null);
112
+ const reopenButton = chat.shadowRoot.querySelector('temba-button#reopen-button');
113
+ expect(reopenButton).to.equal(null);
114
+ await assertScreenshot('contacts/contact-active-ticket-open-show-chatbox', getClip(chat));
92
115
  });
93
- it('cannot send chat msg if contact is stopped', async () => {
116
+ it('show history and show reopen button if contact is active and ticket is closed', async () => {
94
117
  // we are a StoreElement, so load a store first
95
118
  await loadStore();
96
119
  const chat = await getContactChat({
97
- contact: 'contact-tim-stopped',
120
+ contact: 'contact-carter-active',
98
121
  });
99
- const chatboxDivEl = chat.shadowRoot.querySelector('.chatbox');
100
- const displayVal = chatboxDivEl.style.display;
101
- expect(displayVal).to.equal('none');
102
- await assertScreenshot('contacts/contact-stopped-hide-chat-msg', getClip(chat));
122
+ const tickets = await getTicketList({
123
+ endpoint: '/test-assets/tickets/ticket-carter-closed.json',
124
+ });
125
+ chat.currentTicket = tickets.items[0];
126
+ chat.refresh();
127
+ await waitFor(0);
128
+ await chat.httpComplete;
129
+ const chatHistoryEl = chat.shadowRoot.querySelector('temba-contact-history');
130
+ expect(chatHistoryEl).to.not.equal(null);
131
+ const chatboxDiv = chat.shadowRoot.querySelector('.chatbox');
132
+ expect(chatboxDiv).to.equal(null);
133
+ const reopenButton = chat.shadowRoot.querySelector('temba-button#reopen-button');
134
+ expect(reopenButton).to.not.equal(null);
135
+ await assertScreenshot('contacts/contact-active-ticket-closed-show-reopen-button', getClip(chat));
103
136
  });
104
- it('can see chat history if contact is stopped', async () => {
137
+ it('show history and hide chatbox if contact is archived and ticket is closed', async () => {
105
138
  // we are a StoreElement, so load a store first
106
139
  await loadStore();
107
140
  const chat = await getContactChat({
108
- contact: 'contact-tim-stopped',
141
+ contact: 'contact-barack-archived',
142
+ });
143
+ const tickets = await getTicketList({
144
+ endpoint: '/test-assets/tickets/ticket-barack-closed.json',
109
145
  });
146
+ chat.currentTicket = tickets.items[0];
147
+ chat.refresh();
148
+ await waitFor(0);
149
+ await chat.httpComplete;
110
150
  const chatHistoryEl = chat.shadowRoot.querySelector('temba-contact-history');
111
- const displayVal = chatHistoryEl.style.display;
112
- expect(displayVal).to.equal('');
113
- await assertScreenshot('contacts/contact-stopped-show-chat-history', getClip(chat));
151
+ expect(chatHistoryEl).to.not.equal(null);
152
+ const chatboxDiv = chat.shadowRoot.querySelector('.chatbox');
153
+ expect(chatboxDiv).to.equal(null);
154
+ const reopenButton = chat.shadowRoot.querySelector('temba-button#reopen-button');
155
+ expect(reopenButton).to.equal(null);
156
+ await assertScreenshot('contacts/contact-archived-ticket-closed-hide-chatbox', getClip(chat));
114
157
  });
115
158
  });
116
159
  //# sourceMappingURL=temba-contact-chat.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"temba-contact-chat.test.js","sourceRoot":"","sources":["../../test/temba-contact-chat.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect } from '@open-wc/testing';\nimport { ContactChat } from '../src/contacts/ContactChat';\nimport {\n assertScreenshot,\n delay,\n getClip,\n getComponent,\n loadStore,\n mockGET,\n} from '../test/utils.test';\n\nconst TAG = 'temba-contact-chat';\n\nconst getContactChat = async (attrs: any = {}) => {\n attrs['endpoint'] = '/test-assets/contacts/';\n\n // add some sizes and styles to force our chat history to scroll\n const chat = (await getComponent(\n TAG,\n attrs,\n '',\n 500,\n 500,\n 'display:flex;flex-direction:column;flex-grow:1;min-height:0;'\n )) as ContactChat;\n\n // wait for our contact to load\n await delay(100);\n\n return chat;\n};\n\ndescribe('temba-contact-chat', () => {\n // map requests for contact history and ticket api to our static files\n // we'll just us the same history and ticket list for everybody for now\n beforeEach(() => {\n mockGET(\n /\\/contact\\/history\\/contact-.*/,\n '/test-assets/contacts/history.json'\n );\n\n mockGET(\n /\\/api\\/v2\\/tickets\\.json\\?contact=contact-.*/,\n '/test-assets/api/tickets.json'\n );\n });\n\n it('can be created', async () => {\n // we are a StoreElement, so load a store first\n await loadStore();\n const chat: ContactChat = await getContactChat({\n contact: 'contact-dave-active',\n });\n\n await assertScreenshot('contacts/contact-active-default', getClip(chat));\n });\n\n it('can send chat msg if contact is active', async () => {\n // we are a StoreElement, so load a store first\n await loadStore();\n const chat: ContactChat = await getContactChat({\n contact: 'contact-dave-active',\n });\n\n const chatboxDivEl = chat.shadowRoot.querySelector(\n '.chatbox'\n ) as HTMLDivElement;\n const displayVal = chatboxDivEl.style.display;\n expect(displayVal).to.equal('');\n\n await assertScreenshot(\n 'contacts/contact-active-show-chat-msg',\n getClip(chat)\n );\n });\n\n it('can see chat history if contact is active', async () => {\n // we are a StoreElement, so load a store first\n await loadStore();\n const chat: ContactChat = await getContactChat({\n contact: 'contact-dave-active',\n });\n\n const chatHistoryEl = chat.shadowRoot.querySelector(\n 'temba-contact-history'\n ) as HTMLDivElement;\n const displayVal = chatHistoryEl.style.display;\n expect(displayVal).to.equal('');\n\n await assertScreenshot(\n 'contacts/contact-active-show-chat-history',\n getClip(chat)\n );\n });\n\n it('cannot send chat msg if contact is archived', async () => {\n // we are a StoreElement, so load a store first\n await loadStore();\n const chat: ContactChat = await getContactChat({\n contact: 'contact-barak-archived',\n });\n\n const chatboxDivEl = chat.shadowRoot.querySelector(\n '.chatbox'\n ) as HTMLDivElement;\n const displayVal = chatboxDivEl.style.display;\n expect(displayVal).to.equal('none');\n\n await assertScreenshot(\n 'contacts/contact-archived-hide-chat-msg',\n getClip(chat)\n );\n });\n\n it('can see chat history if contact is archived', async () => {\n // we are a StoreElement, so load a store first\n await loadStore();\n const chat: ContactChat = await getContactChat({\n contact: 'contact-barak-archived',\n });\n\n const chatHistoryEl = chat.shadowRoot.querySelector(\n 'temba-contact-history'\n ) as HTMLDivElement;\n const displayVal = chatHistoryEl.style.display;\n expect(displayVal).to.equal('');\n\n await assertScreenshot(\n 'contacts/contact-archived-show-chat-history',\n getClip(chat)\n );\n });\n\n it('cannot send chat msg if contact is blocked', async () => {\n // we are a StoreElement, so load a store first\n await loadStore();\n const chat: ContactChat = await getContactChat({\n contact: 'contact-michelle-blocked',\n });\n\n const chatboxDivEl = chat.shadowRoot.querySelector(\n '.chatbox'\n ) as HTMLDivElement;\n const displayVal = chatboxDivEl.style.display;\n expect(displayVal).to.equal('none');\n\n await assertScreenshot(\n 'contacts/contact-blocked-hide-chat-msg',\n getClip(chat)\n );\n });\n\n it('can see chat history if contact is blocked', async () => {\n // we are a StoreElement, so load a store first\n await loadStore();\n const chat: ContactChat = await getContactChat({\n contact: 'contact-michelle-blocked',\n });\n\n const chatHistoryEl = chat.shadowRoot.querySelector(\n 'temba-contact-history'\n ) as HTMLDivElement;\n const displayVal = chatHistoryEl.style.display;\n expect(displayVal).to.equal('');\n\n await assertScreenshot(\n 'contacts/contact-blocked-show-chat-history',\n getClip(chat)\n );\n });\n\n it('cannot send chat msg if contact is stopped', async () => {\n // we are a StoreElement, so load a store first\n await loadStore();\n const chat: ContactChat = await getContactChat({\n contact: 'contact-tim-stopped',\n });\n\n const chatboxDivEl = chat.shadowRoot.querySelector(\n '.chatbox'\n ) as HTMLDivElement;\n const displayVal = chatboxDivEl.style.display;\n expect(displayVal).to.equal('none');\n\n await assertScreenshot(\n 'contacts/contact-stopped-hide-chat-msg',\n getClip(chat)\n );\n });\n\n it('can see chat history if contact is stopped', async () => {\n // we are a StoreElement, so load a store first\n await loadStore();\n const chat: ContactChat = await getContactChat({\n contact: 'contact-tim-stopped',\n });\n\n const chatHistoryEl = chat.shadowRoot.querySelector(\n 'temba-contact-history'\n ) as HTMLDivElement;\n const displayVal = chatHistoryEl.style.display;\n expect(displayVal).to.equal('');\n\n await assertScreenshot(\n 'contacts/contact-stopped-show-chat-history',\n getClip(chat)\n );\n });\n});\n"]}
1
+ {"version":3,"file":"temba-contact-chat.test.js","sourceRoot":"","sources":["../../test/temba-contact-chat.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect } from '@open-wc/testing';\nimport { ContactChat } from '../src/contacts/ContactChat';\nimport { ContactHistory } from '../src/contacts/ContactHistory';\nimport { TicketList } from '../src/list/TicketList';\nimport {\n assertScreenshot,\n delay,\n getClip,\n getComponent,\n loadStore,\n mockGET,\n} from '../test/utils.test';\n\nconst TAG = 'temba-contact-chat';\nconst getContactChat = async (attrs: any = {}) => {\n attrs['endpoint'] = '/test-assets/contacts/';\n // add some sizes and styles to force our chat history to scroll\n const chat = (await getComponent(\n TAG,\n attrs,\n '',\n 500,\n 500,\n 'display:flex;flex-direction:column;flex-grow:1;min-height:0;'\n )) as ContactChat;\n\n // wait for our contact to load\n await delay(100);\n\n return chat;\n};\n\nconst list_TAG = 'temba-list';\nconst getTicketList = async (attrs: any = {}) => {\n const list = (await getComponent(list_TAG, attrs)) as TicketList;\n // wait for the fetch\n await list.httpComplete;\n return list;\n};\n\ndescribe('temba-contact-chat - contact tests', () => {\n // map requests for contact history to our static files\n // we'll just us the same historylist for everybody for now\n beforeEach(() => {\n mockGET(\n /\\/contact\\/history\\/contact-.*/,\n '/test-assets/contacts/history.json'\n );\n });\n\n it('can be created', async () => {\n // we are a StoreElement, so load a store first\n await loadStore();\n const chat: ContactChat = await getContactChat({\n contact: 'contact-dave-active',\n });\n\n await assertScreenshot('contacts/contact-active-default', getClip(chat));\n });\n\n it('show history and show chatbox if contact is active', async () => {\n // we are a StoreElement, so load a store first\n await loadStore();\n const chat: ContactChat = await getContactChat({\n contact: 'contact-dave-active',\n });\n\n const chatHistoryEl = chat.shadowRoot.querySelector(\n 'temba-contact-history'\n ) as ContactHistory;\n expect(chatHistoryEl).to.not.equal(null);\n\n const chatboxDivEl = chat.shadowRoot.querySelector(\n '.chatbox'\n ) as HTMLDivElement;\n expect(chatboxDivEl).to.not.equal(null);\n\n const reopenButton = chat.shadowRoot.querySelector(\n 'temba-button#reopen-button'\n ) as HTMLDivElement;\n expect(reopenButton).to.equal(null);\n\n await assertScreenshot(\n 'contacts/contact-active-show-chatbox',\n getClip(chat)\n );\n });\n\n it('show history and hide chatbox if contact is archived', async () => {\n // we are a StoreElement, so load a store first\n await loadStore();\n const chat: ContactChat = await getContactChat({\n contact: 'contact-barack-archived',\n });\n\n const chatHistoryEl = chat.shadowRoot.querySelector(\n 'temba-contact-history'\n ) as ContactHistory;\n expect(chatHistoryEl).to.not.equal(null);\n\n const chatboxDiv = chat.shadowRoot.querySelector(\n '.chatbox'\n ) as HTMLDivElement;\n expect(chatboxDiv).to.equal(null);\n\n const reopenButton = chat.shadowRoot.querySelector(\n 'temba-button#reopen-button'\n ) as HTMLDivElement;\n expect(reopenButton).to.equal(null);\n\n await assertScreenshot(\n 'contacts/contact-archived-hide-chatbox',\n getClip(chat)\n );\n });\n\n it('show history and hide chatbox if contact is blocked', async () => {\n // we are a StoreElement, so load a store first\n await loadStore();\n const chat: ContactChat = await getContactChat({\n contact: 'contact-michelle-blocked',\n });\n\n const chatHistoryEl = chat.shadowRoot.querySelector(\n 'temba-contact-history'\n ) as ContactHistory;\n expect(chatHistoryEl).to.not.equal(null);\n\n const chatboxDiv = chat.shadowRoot.querySelector(\n '.chatbox'\n ) as HTMLDivElement;\n expect(chatboxDiv).to.equal(null);\n\n const reopenButton = chat.shadowRoot.querySelector(\n 'temba-button#reopen-button'\n ) as HTMLDivElement;\n expect(reopenButton).to.equal(null);\n\n await assertScreenshot(\n 'contacts/contact-blocked-hide-chatbox',\n getClip(chat)\n );\n });\n\n it('show history and hide chatbox if contact is stopped', async () => {\n // we are a StoreElement, so load a store first\n await loadStore();\n const chat: ContactChat = await getContactChat({\n contact: 'contact-tim-stopped',\n });\n\n const chatHistoryEl = chat.shadowRoot.querySelector(\n 'temba-contact-history'\n ) as ContactHistory;\n expect(chatHistoryEl).to.not.equal(null);\n\n const chatboxDiv = chat.shadowRoot.querySelector(\n '.chatbox'\n ) as HTMLDivElement;\n expect(chatboxDiv).to.equal(null);\n\n const reopenButton = chat.shadowRoot.querySelector(\n 'temba-button#reopen-button'\n ) as HTMLDivElement;\n expect(reopenButton).to.equal(null);\n\n await assertScreenshot(\n 'contacts/contact-stopped-hide-chatbox',\n getClip(chat)\n );\n });\n});\n\ndescribe('temba-contact-chat - ticket tests', () => {\n // map requests for contact history to our static files\n // we'll just us the same history for everybody for now\n beforeEach(() => {\n mockGET(\n /\\/contact\\/history\\/contact-.*/,\n '/test-assets/contacts/history.json'\n );\n\n mockGET(/\\/api\\/v2\\/tickets\\.json.*/, '/test-assets/tickets/empty.json');\n });\n\n it('show history and show chatbox if contact is active and ticket is open', async () => {\n // we are a StoreElement, so load a store first\n await loadStore();\n const chat: ContactChat = await getContactChat({\n contact: 'contact-carter-active',\n });\n\n const tickets: TicketList = await getTicketList({\n endpoint: '/test-assets/tickets/ticket-carter-open.json',\n });\n\n chat.currentTicket = tickets.items[0];\n chat.refresh();\n\n const chatHistoryEl = chat.shadowRoot.querySelector(\n 'temba-contact-history'\n ) as ContactHistory;\n expect(chatHistoryEl).to.not.equal(null);\n\n const chatboxDiv = chat.shadowRoot.querySelector(\n '.chatbox'\n ) as HTMLDivElement;\n expect(chatboxDiv).to.not.equal(null);\n\n const reopenButton = chat.shadowRoot.querySelector(\n 'temba-button#reopen-button'\n ) as HTMLDivElement;\n expect(reopenButton).to.equal(null);\n\n await assertScreenshot(\n 'contacts/contact-active-ticket-open-show-chatbox',\n getClip(chat)\n );\n });\n\n it('show history and show reopen button if contact is active and ticket is closed', async () => {\n // we are a StoreElement, so load a store first\n await loadStore();\n const chat: ContactChat = await getContactChat({\n contact: 'contact-carter-active',\n });\n\n const tickets: TicketList = await getTicketList({\n endpoint: '/test-assets/tickets/ticket-carter-closed.json',\n });\n chat.currentTicket = tickets.items[0];\n chat.refresh();\n\n await waitFor(0);\n await chat.httpComplete;\n\n const chatHistoryEl = chat.shadowRoot.querySelector(\n 'temba-contact-history'\n ) as ContactHistory;\n expect(chatHistoryEl).to.not.equal(null);\n\n const chatboxDiv = chat.shadowRoot.querySelector(\n '.chatbox'\n ) as HTMLDivElement;\n expect(chatboxDiv).to.equal(null);\n\n const reopenButton = chat.shadowRoot.querySelector(\n 'temba-button#reopen-button'\n ) as HTMLDivElement;\n expect(reopenButton).to.not.equal(null);\n\n await assertScreenshot(\n 'contacts/contact-active-ticket-closed-show-reopen-button',\n getClip(chat)\n );\n });\n\n it('show history and hide chatbox if contact is archived and ticket is closed', async () => {\n // we are a StoreElement, so load a store first\n await loadStore();\n\n const chat: ContactChat = await getContactChat({\n contact: 'contact-barack-archived',\n });\n\n const tickets: TicketList = await getTicketList({\n endpoint: '/test-assets/tickets/ticket-barack-closed.json',\n });\n chat.currentTicket = tickets.items[0];\n chat.refresh();\n\n await waitFor(0);\n await chat.httpComplete;\n\n const chatHistoryEl = chat.shadowRoot.querySelector(\n 'temba-contact-history'\n ) as ContactHistory;\n expect(chatHistoryEl).to.not.equal(null);\n\n const chatboxDiv = chat.shadowRoot.querySelector(\n '.chatbox'\n ) as HTMLDivElement;\n expect(chatboxDiv).to.equal(null);\n\n const reopenButton = chat.shadowRoot.querySelector(\n 'temba-button#reopen-button'\n ) as HTMLDivElement;\n expect(reopenButton).to.equal(null);\n\n await assertScreenshot(\n 'contacts/contact-archived-ticket-closed-hide-chatbox',\n getClip(chat)\n );\n });\n});\n"]}
@@ -58,7 +58,7 @@ describe('temba-contact-history', () => {
58
58
  const group = history.shadowRoot.querySelector(`.event-count[data-group-index='${idx}']`);
59
59
  group.click();
60
60
  }
61
- await waitFor(800);
61
+ await waitFor(500);
62
62
  await assertScreenshot('contacts/history-expanded', getHistoryClip(history));
63
63
  });
64
64
  });
@@ -1 +1 @@
1
- {"version":3,"file":"temba-contact-history.test.js","sourceRoot":"","sources":["../../test/temba-contact-history.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { fixture, assert, expect } from '@open-wc/testing';\nimport { ContactHistory } from '../src/contacts/ContactHistory';\nimport {\n assertScreenshot,\n getClip,\n getHTML,\n loadStore,\n mockGET,\n mockNow,\n} from '../test/utils.test';\nimport './utils.test';\n\nexport const createHistory = async (def: string) => {\n const parentNode = document.createElement('div');\n parentNode.setAttribute(\n 'style',\n 'width: 500px;height:750px;display:flex;flex-direction:column;flex-grow:1;min-height:0;'\n );\n const history = (await fixture(def, { parentNode })) as ContactHistory;\n\n // let history fetch start and wait for it\n await waitFor(0);\n await history.httpComplete;\n\n // wait for scroll update\n await waitFor(0);\n await history.httpComplete;\n\n return history;\n};\n\nconst getHistoryHTML = (attrs: any = {} as any) =>\n // attrs = \"min-height:0;display:flex;flex-grow:1;flex-direction:column\";\n getHTML('temba-contact-history', attrs);\n\nconst getHistoryClip = (ele: ContactHistory) => {\n const clip = getClip(ele);\n clip.height = Math.min(clip.height, 750);\n clip.bottom = clip.top + clip.height;\n return clip;\n};\n\n// stub our current date for consistent screenshots\nmockNow('2021-03-31T00:31:00.000-00:00');\n\ndescribe('temba-contact-history', () => {\n beforeEach(async () => {\n mockGET(\n /\\/contact\\/history\\/contact-dave-active\\/.*/,\n '/test-assets/contacts/history.json'\n );\n\n mockGET(\n /\\/api\\/v2\\/tickets\\.json\\?contact=contact-dave-active/,\n '/test-assets/api/tickets.json'\n );\n\n await loadStore();\n });\n\n it('can be created', async () => {\n const history = await createHistory(getHistoryHTML());\n assert.instanceOf(history, ContactHistory);\n });\n\n it('renders history', async () => {\n const history = await createHistory(\n getHistoryHTML({\n uuid: 'contact-dave-active',\n })\n );\n\n await waitFor(500);\n\n // we should have scrolled to the bottom\n const events = history.shadowRoot.querySelector('.events');\n const top = events.scrollHeight - events.getBoundingClientRect().height;\n\n expect(top).to.equal(549);\n\n // make sure we actually scrolled to there\n expect(events.scrollTop).to.equal(top);\n\n await assertScreenshot('contacts/history', getHistoryClip(history));\n });\n\n it('expands event groups', async () => {\n const history = await createHistory(\n getHistoryHTML({\n uuid: 'contact-dave-active',\n })\n );\n\n // our groups with collapsed events\n const groups = [3, 5, 7];\n for (const idx of groups) {\n const group = history.shadowRoot.querySelector(\n `.event-count[data-group-index='${idx}']`\n ) as HTMLDivElement;\n group.click();\n }\n\n await waitFor(800);\n\n await assertScreenshot(\n 'contacts/history-expanded',\n getHistoryClip(history)\n );\n });\n});\n"]}
1
+ {"version":3,"file":"temba-contact-history.test.js","sourceRoot":"","sources":["../../test/temba-contact-history.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { fixture, assert, expect } from '@open-wc/testing';\nimport { ContactHistory } from '../src/contacts/ContactHistory';\nimport {\n assertScreenshot,\n getClip,\n getHTML,\n loadStore,\n mockGET,\n mockNow,\n} from '../test/utils.test';\nimport './utils.test';\n\nexport const createHistory = async (def: string) => {\n const parentNode = document.createElement('div');\n parentNode.setAttribute(\n 'style',\n 'width: 500px;height:750px;display:flex;flex-direction:column;flex-grow:1;min-height:0;'\n );\n const history = (await fixture(def, { parentNode })) as ContactHistory;\n\n // let history fetch start and wait for it\n await waitFor(0);\n await history.httpComplete;\n\n // wait for scroll update\n await waitFor(0);\n await history.httpComplete;\n\n return history;\n};\n\nconst getHistoryHTML = (attrs: any = {} as any) =>\n // attrs = \"min-height:0;display:flex;flex-grow:1;flex-direction:column\";\n getHTML('temba-contact-history', attrs);\n\nconst getHistoryClip = (ele: ContactHistory) => {\n const clip = getClip(ele);\n clip.height = Math.min(clip.height, 750);\n clip.bottom = clip.top + clip.height;\n return clip;\n};\n\n// stub our current date for consistent screenshots\nmockNow('2021-03-31T00:31:00.000-00:00');\n\ndescribe('temba-contact-history', () => {\n beforeEach(async () => {\n mockGET(\n /\\/contact\\/history\\/contact-dave-active\\/.*/,\n '/test-assets/contacts/history.json'\n );\n\n mockGET(\n /\\/api\\/v2\\/tickets\\.json\\?contact=contact-dave-active/,\n '/test-assets/api/tickets.json'\n );\n\n await loadStore();\n });\n\n it('can be created', async () => {\n const history = await createHistory(getHistoryHTML());\n assert.instanceOf(history, ContactHistory);\n });\n\n it('renders history', async () => {\n const history = await createHistory(\n getHistoryHTML({\n uuid: 'contact-dave-active',\n })\n );\n\n await waitFor(500);\n\n // we should have scrolled to the bottom\n const events = history.shadowRoot.querySelector('.events');\n const top = events.scrollHeight - events.getBoundingClientRect().height;\n\n expect(top).to.equal(549);\n\n // make sure we actually scrolled to there\n expect(events.scrollTop).to.equal(top);\n\n await assertScreenshot('contacts/history', getHistoryClip(history));\n });\n\n it('expands event groups', async () => {\n const history = await createHistory(\n getHistoryHTML({\n uuid: 'contact-dave-active',\n })\n );\n\n // our groups with collapsed events\n const groups = [3, 5, 7];\n for (const idx of groups) {\n const group = history.shadowRoot.querySelector(\n `.event-count[data-group-index='${idx}']`\n ) as HTMLDivElement;\n group.click();\n }\n\n await waitFor(500);\n\n await assertScreenshot(\n 'contacts/history-expanded',\n getHistoryClip(history)\n );\n });\n});\n"]}
@@ -0,0 +1,57 @@
1
+ import { assert, expect } from '@open-wc/testing';
2
+ import { CustomEventType } from '../src/interfaces';
3
+ import { ContentMenu } from '../src/list/ContentMenu';
4
+ import { assertScreenshot, getClip, getComponent } from './utils.test';
5
+ const TAG = 'temba-content-menu';
6
+ const getContentMenu = async (attrs = {}, width = 0) => {
7
+ const contentMenu = (await getComponent(TAG, attrs, '', width, 0, 'display:inline-block'));
8
+ // return right away if we don't have an endpoint
9
+ if (!contentMenu.endpoint) {
10
+ return contentMenu;
11
+ }
12
+ // if we have an endpoint, wait for a loaded event before returning
13
+ return new Promise(resolve => {
14
+ contentMenu.addEventListener(CustomEventType.Loaded, async () => {
15
+ resolve(contentMenu);
16
+ });
17
+ });
18
+ };
19
+ describe('temba-content-menu', () => {
20
+ it('can initially be created without endpoint', async () => {
21
+ const contentMenu = await getContentMenu();
22
+ assert.instanceOf(contentMenu, ContentMenu);
23
+ expect(contentMenu.endpoint).is.undefined;
24
+ });
25
+ it('with 1+ items and 1+ buttons', async () => {
26
+ const contentMenu = await getContentMenu({
27
+ endpoint: '/test-assets/list/content-menu-contact-read.json',
28
+ });
29
+ expect(contentMenu.items.length).equals(5);
30
+ expect(contentMenu.buttons.length).equals(1);
31
+ await assertScreenshot('content-menu/items-and-buttons', getClip(contentMenu));
32
+ });
33
+ it('with 1+ items and 0 buttons', async () => {
34
+ const contentMenu = await getContentMenu({
35
+ endpoint: '/test-assets/list/content-menu-archived-contacts.json',
36
+ });
37
+ expect(contentMenu.items.length).equals(1);
38
+ expect(contentMenu.buttons.length).equals(0);
39
+ await assertScreenshot('content-menu/item-no-buttons', getClip(contentMenu));
40
+ });
41
+ it('with 0 items and 1+ buttons', async () => {
42
+ const contentMenu = await getContentMenu({
43
+ endpoint: '/test-assets/list/content-menu-new-campaign.json',
44
+ });
45
+ expect(contentMenu.items.length).equals(0);
46
+ expect(contentMenu.buttons.length).equals(1);
47
+ await assertScreenshot('content-menu/button-no-items', getClip(contentMenu));
48
+ });
49
+ it('bad endpoint', async () => {
50
+ const contentMenu = await getContentMenu({
51
+ endpoint: '/test-assets/list/content-menu-bad-endpoint.json',
52
+ });
53
+ expect(contentMenu.items.length).equals(0);
54
+ expect(contentMenu.buttons.length).equals(0);
55
+ });
56
+ });
57
+ //# sourceMappingURL=temba-content-menu.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"temba-content-menu.test.js","sourceRoot":"","sources":["../../test/temba-content-menu.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAuB,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEvE,MAAM,GAAG,GAAG,oBAAoB,CAAC;AACjC,MAAM,cAAc,GAAG,KAAK,EAAE,QAAa,EAAE,EAAE,KAAK,GAAG,CAAC,EAAE,EAAE;IAC1D,MAAM,WAAW,GAAG,CAAC,MAAM,YAAY,CACrC,GAAG,EACH,KAAK,EACL,EAAE,EACF,KAAK,EACL,CAAC,EACD,sBAAsB,CACvB,CAAgB,CAAC;IAElB,iDAAiD;IACjD,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE;QACzB,OAAO,WAAW,CAAC;KACpB;IAED,mEAAmE;IACnE,OAAO,IAAI,OAAO,CAAc,OAAO,CAAC,EAAE;QACxC,WAAW,CAAC,gBAAgB,CAAC,eAAe,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;YAC9D,OAAO,CAAC,WAAW,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,WAAW,GAAgB,MAAM,cAAc,EAAE,CAAC;QACxD,MAAM,CAAC,UAAU,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAC5C,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC5C,MAAM,WAAW,GAAgB,MAAM,cAAc,CAAC;YACpD,QAAQ,EAAE,kDAAkD;SAC7D,CAAC,CAAC;QAEH,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,gBAAgB,CACpB,gCAAgC,EAChC,OAAO,CAAC,WAAW,CAAC,CACrB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAC3C,MAAM,WAAW,GAAgB,MAAM,cAAc,CAAC;YACpD,QAAQ,EAAE,uDAAuD;SAClE,CAAC,CAAC;QAEH,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,gBAAgB,CACpB,8BAA8B,EAC9B,OAAO,CAAC,WAAW,CAAC,CACrB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAC3C,MAAM,WAAW,GAAgB,MAAM,cAAc,CAAC;YACpD,QAAQ,EAAE,kDAAkD;SAC7D,CAAC,CAAC;QAEH,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,gBAAgB,CACpB,8BAA8B,EAC9B,OAAO,CAAC,WAAW,CAAC,CACrB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,cAAc,EAAE,KAAK,IAAI,EAAE;QAC5B,MAAM,WAAW,GAAgB,MAAM,cAAc,CAAC;YACpD,QAAQ,EAAE,kDAAkD;SAC7D,CAAC,CAAC;QAEH,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { assert, expect } from '@open-wc/testing';\nimport { CustomEventType } from '../src/interfaces';\nimport { ContentMenu, ContentMenuItemType } from '../src/list/ContentMenu';\nimport { assertScreenshot, getClip, getComponent } from './utils.test';\n\nconst TAG = 'temba-content-menu';\nconst getContentMenu = async (attrs: any = {}, width = 0) => {\n const contentMenu = (await getComponent(\n TAG,\n attrs,\n '',\n width,\n 0,\n 'display:inline-block'\n )) as ContentMenu;\n\n // return right away if we don't have an endpoint\n if (!contentMenu.endpoint) {\n return contentMenu;\n }\n\n // if we have an endpoint, wait for a loaded event before returning\n return new Promise<ContentMenu>(resolve => {\n contentMenu.addEventListener(CustomEventType.Loaded, async () => {\n resolve(contentMenu);\n });\n });\n};\n\ndescribe('temba-content-menu', () => {\n it('can initially be created without endpoint', async () => {\n const contentMenu: ContentMenu = await getContentMenu();\n assert.instanceOf(contentMenu, ContentMenu);\n expect(contentMenu.endpoint).is.undefined;\n });\n\n it('with 1+ items and 1+ buttons', async () => {\n const contentMenu: ContentMenu = await getContentMenu({\n endpoint: '/test-assets/list/content-menu-contact-read.json',\n });\n\n expect(contentMenu.items.length).equals(5);\n expect(contentMenu.buttons.length).equals(1);\n await assertScreenshot(\n 'content-menu/items-and-buttons',\n getClip(contentMenu)\n );\n });\n\n it('with 1+ items and 0 buttons', async () => {\n const contentMenu: ContentMenu = await getContentMenu({\n endpoint: '/test-assets/list/content-menu-archived-contacts.json',\n });\n\n expect(contentMenu.items.length).equals(1);\n expect(contentMenu.buttons.length).equals(0);\n await assertScreenshot(\n 'content-menu/item-no-buttons',\n getClip(contentMenu)\n );\n });\n\n it('with 0 items and 1+ buttons', async () => {\n const contentMenu: ContentMenu = await getContentMenu({\n endpoint: '/test-assets/list/content-menu-new-campaign.json',\n });\n\n expect(contentMenu.items.length).equals(0);\n expect(contentMenu.buttons.length).equals(1);\n await assertScreenshot(\n 'content-menu/button-no-items',\n getClip(contentMenu)\n );\n });\n\n it('bad endpoint', async () => {\n const contentMenu: ContentMenu = await getContentMenu({\n endpoint: '/test-assets/list/content-menu-bad-endpoint.json',\n });\n\n expect(contentMenu.items.length).equals(0);\n expect(contentMenu.buttons.length).equals(0);\n });\n});\n"]}
@@ -1,7 +1,8 @@
1
1
  import { fixture, expect, assert } from '@open-wc/testing';
2
- import { Modax } from '../src/dialog/Modax';
3
2
  import { useFakeTimers } from 'sinon';
4
- import { assertScreenshot, checkTimers, getClip, mockPOST } from './utils.test';
3
+ import { Modax } from '../src/dialog/Modax';
4
+ import { CustomEventType } from '../src/interfaces';
5
+ import { assertScreenshot, getClip, mockPOST } from './utils.test';
5
6
  let clock;
6
7
  const getModaxHTML = (endpoint) => {
7
8
  return `
@@ -16,10 +17,17 @@ const getButtons = (modax, type = null) => {
16
17
  .shadowRoot.querySelectorAll(type ? `temba-button[${type}='']` : 'temba-button');
17
18
  };
18
19
  const open = async (modax) => {
19
- modax.open = true;
20
- await modax.updateComplete;
21
- await modax.httpComplete;
22
- await clock.tick(400);
20
+ return new Promise((resolve, reject) => {
21
+ modax.addEventListener(CustomEventType.Loaded, async (event) => {
22
+ await clock.runAll();
23
+ resolve(event.detail);
24
+ });
25
+ modax.addEventListener(CustomEventType.Redirected, async (event) => {
26
+ await clock.runAll();
27
+ resolve(event.detail);
28
+ });
29
+ modax.open = true;
30
+ });
23
31
  };
24
32
  const clickPrimary = async (modax) => {
25
33
  const buttons = getButtons(modax);
@@ -35,10 +43,8 @@ const clickPrimary = async (modax) => {
35
43
  }
36
44
  expect(primary).not.equals(undefined, 'Missing primary button');
37
45
  primary.click();
38
- await clock.tick(500);
39
- await clock.tick(100);
40
46
  await waitFor(0);
41
- await clock.tick(1000);
47
+ await clock.runAll();
42
48
  }
43
49
  };
44
50
  const getDialogClip = (modax) => {
@@ -58,11 +64,8 @@ describe('temba-modax', () => {
58
64
  });
59
65
  it('opens', async () => {
60
66
  const modax = await fixture(getModaxHTML('/test-assets/modax/hello.html'));
61
- await click('temba-modax');
67
+ await open(modax);
62
68
  expect(modax.open).equals(true);
63
- await modax.httpComplete;
64
- await clock.tick(400);
65
- checkTimers(clock);
66
69
  // Now our body should have our endpoint text
67
70
  expect(modax.getBody().innerHTML).to.contain('Hello World');
68
71
  await assertScreenshot('modax/simple', getDialogClip(modax));
@@ -72,6 +75,8 @@ describe('temba-modax', () => {
72
75
  expect(modax.open).to.equal(false);
73
76
  await open(modax);
74
77
  expect(modax.open).to.equal(true);
78
+ expect(modax.primaryName).to.equal("Save Everything");
79
+ expect(modax.cancelName).to.equal("Cancel");
75
80
  await assertScreenshot('modax/form', getDialogClip(modax));
76
81
  });
77
82
  it('reverts primary name on reuse', async () => {
@@ -87,14 +92,8 @@ describe('temba-modax', () => {
87
92
  expect(modax.open).equals(false);
88
93
  // now fetch form from the same modax
89
94
  modax.endpoint = '/test-assets/modax/form.html';
90
- await modax.updateComplete;
91
- await modax.httpComplete;
92
- await clock.tick(400);
93
95
  await open(modax);
94
96
  expect(modax.open).equals(true);
95
- await modax.httpComplete;
96
- await clock.tick(400);
97
- await waitFor(100);
98
97
  // now we should have two buttons, 'Save Everything' and 'Cancel'
99
98
  buttons = getButtons(modax);
100
99
  expect(buttons.length).equals(2);
@@ -1 +1 @@
1
- {"version":3,"file":"temba-modax.test.js","sourceRoot":"","sources":["../../test/temba-modax.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { fixture, expect, assert } from '@open-wc/testing';\nimport { Button } from '../src/button/Button';\nimport { Modax } from '../src/dialog/Modax';\nimport { useFakeTimers } from 'sinon';\nimport { assertScreenshot, checkTimers, getClip, mockPOST } from './utils.test';\n\nlet clock: any;\n\nconst getModaxHTML = (endpoint: string): string => {\n return `\n <temba-modax header=\"Hello Modax\" endpoint=\"${endpoint}\">\n <div>Open Me</div>\n </temba-modax>\n `;\n};\n\nconst getButtons = (modax: Modax, type: string = null) => {\n return modax.shadowRoot\n .querySelector('temba-dialog')\n .shadowRoot.querySelectorAll(\n type ? `temba-button[${type}='']` : 'temba-button'\n );\n};\n\nconst open = async (modax: Modax) => {\n modax.open = true;\n await modax.updateComplete;\n await modax.httpComplete;\n await clock.tick(400);\n};\n\nconst clickPrimary = async (modax: Modax) => {\n const buttons = getButtons(modax);\n\n if (buttons.length > 0) {\n let primary = buttons[0] as Button;\n\n if (buttons.length > 1) {\n // look for our primary flag\n buttons.forEach((button: Button) => {\n if (button.primary) {\n primary = button;\n }\n });\n }\n\n expect(primary).not.equals(undefined, 'Missing primary button');\n primary.click();\n await clock.tick(500);\n await clock.tick(100);\n await waitFor(0);\n await clock.tick(1000);\n }\n};\n\nconst getDialogClip = (modax: Modax) => {\n const dialog = modax.shadowRoot.querySelector('temba-dialog');\n\n return getClip(\n dialog.shadowRoot.querySelector('.dialog-container') as HTMLElement\n );\n};\n\ndescribe('temba-modax', () => {\n beforeEach(function () {\n clock = useFakeTimers();\n });\n\n afterEach(function () {\n clock.restore();\n });\n\n it('can be created', async () => {\n const modax: Modax = await fixture(\n getModaxHTML('/test-assets/modax/hello.html')\n );\n assert.instanceOf(modax, Modax);\n });\n\n it('opens', async () => {\n const modax: Modax = await fixture(\n getModaxHTML('/test-assets/modax/hello.html')\n );\n\n await click('temba-modax');\n expect(modax.open).equals(true);\n await modax.httpComplete;\n await clock.tick(400);\n checkTimers(clock);\n\n // Now our body should have our endpoint text\n expect(modax.getBody().innerHTML).to.contain('Hello World');\n await assertScreenshot('modax/simple', getDialogClip(modax));\n });\n\n it('fetches forms', async () => {\n const modax: Modax = await fixture(\n getModaxHTML('/test-assets/modax/form.html')\n );\n expect(modax.open).to.equal(false);\n await open(modax);\n\n expect(modax.open).to.equal(true);\n await assertScreenshot('modax/form', getDialogClip(modax));\n });\n\n it('reverts primary name on reuse', async () => {\n const modax: Modax = await fixture(\n getModaxHTML('/test-assets/modax/hello.html')\n );\n\n // await click('temba-modax');\n await open(modax);\n expect(modax.open).equals(true);\n\n // should only have one button, okay\n let buttons = getButtons(modax);\n expect(buttons.length).equals(1);\n\n // close our dialog\n await clickPrimary(modax);\n expect(modax.open).equals(false);\n\n // now fetch form from the same modax\n modax.endpoint = '/test-assets/modax/form.html';\n await modax.updateComplete;\n await modax.httpComplete;\n await clock.tick(400);\n\n await open(modax);\n expect(modax.open).equals(true);\n await modax.httpComplete;\n await clock.tick(400);\n await waitFor(100);\n\n // now we should have two buttons, 'Save Everything' and 'Cancel'\n buttons = getButtons(modax);\n expect(buttons.length).equals(2);\n\n // secondary should be Cancel, not Ok\n const secondary = getButtons(modax, 'secondary')[0] as Button;\n expect(secondary.name).equals('Cancel');\n });\n\n it('closes after redirect', async () => {\n const modax: Modax = await fixture(\n getModaxHTML('/test-assets/modax/form.html')\n );\n\n await open(modax);\n const primary = getButtons(modax, 'primary')[0] as Button;\n expect(primary.name).equals('Save Everything');\n\n // click the submit button\n mockPOST(/\\/test-assets\\/modax\\/form\\.html/, '', {\n 'Temba-Success': '/newpage',\n });\n await clickPrimary(modax);\n\n // our modal should go away as we redirect\n expect(modax.open).equals(false, 'Modal still visible');\n });\n});\n"]}
1
+ {"version":3,"file":"temba-modax.test.js","sourceRoot":"","sources":["../../test/temba-modax.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { fixture, expect, assert } from '@open-wc/testing';\nimport { useFakeTimers } from 'sinon';\nimport { Button } from '../src/button/Button';\nimport { Modax } from '../src/dialog/Modax';\nimport { CustomEventType } from '../src/interfaces';\nimport { assertScreenshot, checkTimers, getClip, mockPOST } from './utils.test';\n\nlet clock: any;\n\nconst getModaxHTML = (endpoint: string): string => {\n return `\n <temba-modax header=\"Hello Modax\" endpoint=\"${endpoint}\">\n <div>Open Me</div>\n </temba-modax>\n `;\n};\n\nconst getButtons = (modax: Modax, type: string = null) => {\n return modax.shadowRoot\n .querySelector('temba-dialog')\n .shadowRoot.querySelectorAll(\n type ? `temba-button[${type}='']` : 'temba-button'\n );\n};\n\nconst open = async (modax: Modax) => { \n return new Promise((resolve: any, reject: any)=>{\n modax.addEventListener(CustomEventType.Loaded, async (event: CustomEvent)=>{\n await clock.runAll();\n resolve(event.detail);\n });\n\n modax.addEventListener(CustomEventType.Redirected, async (event: CustomEvent)=>{\n await clock.runAll();\n resolve(event.detail);\n });\n\n modax.open = true;\n\n\n });\n};\n\nconst clickPrimary = async (modax: Modax) => {\n const buttons = getButtons(modax);\n\n if (buttons.length > 0) {\n let primary = buttons[0] as Button;\n\n if (buttons.length > 1) {\n // look for our primary flag\n buttons.forEach((button: Button) => {\n if (button.primary) {\n primary = button;\n }\n });\n }\n\n expect(primary).not.equals(undefined, 'Missing primary button');\n primary.click();\n await waitFor(0);\n await clock.runAll();\n }\n};\n\nconst getDialogClip = (modax: Modax) => {\n const dialog = modax.shadowRoot.querySelector('temba-dialog');\n return getClip(\n dialog.shadowRoot.querySelector('.dialog-container') as HTMLElement\n );\n};\n\ndescribe('temba-modax', () => {\n beforeEach(function () {\n clock = useFakeTimers();\n });\n\n afterEach(function () {\n clock.restore();\n });\n\n it('can be created', async () => {\n const modax: Modax = await fixture(\n getModaxHTML('/test-assets/modax/hello.html')\n );\n assert.instanceOf(modax, Modax);\n });\n\n it('opens', async () => {\n const modax: Modax = await fixture(\n getModaxHTML('/test-assets/modax/hello.html')\n );\n\n await open(modax);\n expect(modax.open).equals(true);\n\n // Now our body should have our endpoint text\n expect(modax.getBody().innerHTML).to.contain('Hello World');\n\n await assertScreenshot('modax/simple', getDialogClip(modax));\n });\n\n it('fetches forms', async () => {\n const modax: Modax = await fixture(\n getModaxHTML('/test-assets/modax/form.html')\n );\n expect(modax.open).to.equal(false);\n await open(modax);\n\n expect(modax.open).to.equal(true);\n\n expect(modax.primaryName).to.equal(\"Save Everything\");\n expect(modax.cancelName).to.equal(\"Cancel\");\n\n await assertScreenshot('modax/form', getDialogClip(modax));\n });\n\n it('reverts primary name on reuse', async () => {\n const modax: Modax = await fixture(\n getModaxHTML('/test-assets/modax/hello.html')\n );\n\n // await click('temba-modax');\n await open(modax);\n expect(modax.open).equals(true);\n\n // should only have one button, okay\n let buttons = getButtons(modax);\n expect(buttons.length).equals(1);\n\n // close our dialog\n await clickPrimary(modax);\n expect(modax.open).equals(false);\n\n // now fetch form from the same modax\n modax.endpoint = '/test-assets/modax/form.html';\n await open(modax);\n expect(modax.open).equals(true);\n\n // now we should have two buttons, 'Save Everything' and 'Cancel'\n buttons = getButtons(modax);\n expect(buttons.length).equals(2);\n\n // secondary should be Cancel, not Ok\n const secondary = getButtons(modax, 'secondary')[0] as Button;\n expect(secondary.name).equals('Cancel');\n });\n\n it('closes after redirect', async () => {\n const modax: Modax = await fixture(\n getModaxHTML('/test-assets/modax/form.html')\n );\n\n await open(modax);\n const primary = getButtons(modax, 'primary')[0] as Button;\n expect(primary.name).equals('Save Everything');\n\n // click the submit button\n mockPOST(/\\/test-assets\\/modax\\/form\\.html/, '', {\n 'Temba-Success': '/newpage',\n });\n await clickPrimary(modax);\n\n // our modal should go away as we redirect\n expect(modax.open).equals(false, 'Modal still visible');\n });\n});\n"]}
@@ -94,6 +94,7 @@ const getClipWithOptions = (select) => {
94
94
  describe('temba-select', () => {
95
95
  beforeEach(function () {
96
96
  clock = useFakeTimers();
97
+ clock.tick(400);
97
98
  setViewport({ width: 500, height: 1000, deviceScaleFactor: 2 });
98
99
  });
99
100
  afterEach(function () {