@nyaruka/temba-components 0.37.0 → 0.37.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 (57) hide show
  1. package/.github/workflows/stale.yml +1 -0
  2. package/CHANGELOG.md +12 -0
  3. package/dist/{46adbabc.js → 135b99dc.js} +8 -4
  4. package/dist/index.js +8 -4
  5. package/dist/sw.js +1 -1
  6. package/dist/sw.js.map +1 -1
  7. package/dist/templates/components-body.html +1 -1
  8. package/dist/templates/components-head.html +1 -1
  9. package/out-tsc/src/contacts/ContactFieldEditor.js +1 -1
  10. package/out-tsc/src/contacts/ContactFieldEditor.js.map +1 -1
  11. package/out-tsc/src/list/ContentMenu.js +4 -0
  12. package/out-tsc/src/list/ContentMenu.js.map +1 -1
  13. package/out-tsc/src/list/TembaList.js +8 -5
  14. package/out-tsc/src/list/TembaList.js.map +1 -1
  15. package/out-tsc/src/select/Select.js +18 -4
  16. package/out-tsc/src/select/Select.js.map +1 -1
  17. package/out-tsc/test/temba-contact-chat.test.js +40 -13
  18. package/out-tsc/test/temba-contact-chat.test.js.map +1 -1
  19. package/out-tsc/test/temba-contact-history.test.js +10 -10
  20. package/out-tsc/test/temba-contact-history.test.js.map +1 -1
  21. package/out-tsc/test/temba-content-menu.test.js +1 -1
  22. package/out-tsc/test/temba-content-menu.test.js.map +1 -1
  23. package/out-tsc/test/temba-field-manager.test.js +1 -1
  24. package/out-tsc/test/temba-field-manager.test.js.map +1 -1
  25. package/out-tsc/test/temba-list.test.js +29 -13
  26. package/out-tsc/test/temba-list.test.js.map +1 -1
  27. package/out-tsc/test/temba-modax.test.js +12 -8
  28. package/out-tsc/test/temba-modax.test.js.map +1 -1
  29. package/out-tsc/test/temba-select.test.js +21 -39
  30. package/out-tsc/test/temba-select.test.js.map +1 -1
  31. package/out-tsc/test/utils.test.js +10 -3
  32. package/out-tsc/test/utils.test.js.map +1 -1
  33. package/package.json +1 -1
  34. package/screenshots/truth/contacts/contact-active-default.png +0 -0
  35. package/screenshots/truth/contacts/contact-active-show-chatbox.png +0 -0
  36. package/screenshots/truth/contacts/contact-active-ticket-closed-show-reopen-button.png +0 -0
  37. package/screenshots/truth/contacts/contact-active-ticket-open-show-chatbox.png +0 -0
  38. package/screenshots/truth/contacts/contact-archived-hide-chatbox.png +0 -0
  39. package/screenshots/truth/contacts/contact-archived-ticket-closed-hide-chatbox.png +0 -0
  40. package/screenshots/truth/contacts/contact-blocked-hide-chatbox.png +0 -0
  41. package/screenshots/truth/contacts/contact-stopped-hide-chatbox.png +0 -0
  42. package/screenshots/truth/dialog/focused.png +0 -0
  43. package/screenshots/truth/modax/form.png +0 -0
  44. package/src/contacts/ContactFieldEditor.ts +1 -1
  45. package/src/list/ContentMenu.ts +4 -0
  46. package/src/list/TembaList.ts +9 -9
  47. package/src/select/Select.ts +23 -9
  48. package/test/temba-contact-chat.test.ts +54 -16
  49. package/test/temba-contact-history.test.ts +12 -20
  50. package/test/temba-content-menu.test.ts +8 -4
  51. package/test/temba-field-manager.test.ts +1 -1
  52. package/test/temba-list.test.ts +38 -16
  53. package/test/temba-modax.test.ts +30 -21
  54. package/test/temba-select.test.ts +25 -44
  55. package/test/utils.test.ts +11 -5
  56. package/test-assets/style.css +5 -0
  57. package/web-test-runner.config.mjs +18 -14
@@ -1,26 +1,39 @@
1
1
  import { expect } from '@open-wc/testing';
2
- import { assertScreenshot, delay, getClip, getComponent, loadStore, mockGET, } from '../test/utils.test';
2
+ import { useFakeTimers } from 'sinon';
3
+ import { CustomEventType } from '../src/interfaces';
4
+ import { assertScreenshot, getClip, getComponent, loadStore, mockGET, mockNow, } from '../test/utils.test';
5
+ let clock;
6
+ mockNow('2021-03-31T00:31:00.000-00:00');
3
7
  const TAG = 'temba-contact-chat';
4
8
  const getContactChat = async (attrs = {}) => {
5
9
  attrs['endpoint'] = '/test-assets/contacts/';
6
10
  // add some sizes and styles to force our chat history to scroll
7
11
  const chat = (await getComponent(TAG, attrs, '', 500, 500, 'display:flex;flex-direction:column;flex-grow:1;min-height:0;'));
8
- // wait for our contact to load
9
- await delay(100);
12
+ // TODO: this should be waiting for an event instead
13
+ await waitFor(100);
10
14
  return chat;
11
15
  };
12
16
  const list_TAG = 'temba-list';
13
17
  const getTicketList = async (attrs = {}) => {
14
18
  const list = (await getComponent(list_TAG, attrs));
15
- // wait for the fetch
16
- await list.httpComplete;
17
- return list;
19
+ if (!list.endpoint) {
20
+ return list;
21
+ }
22
+ return new Promise(resolve => {
23
+ list.addEventListener(CustomEventType.FetchComplete, async () => {
24
+ resolve(list);
25
+ }, { once: true });
26
+ });
18
27
  };
19
28
  describe('temba-contact-chat - contact tests', () => {
20
29
  // map requests for contact history to our static files
21
30
  // we'll just us the same historylist for everybody for now
22
31
  beforeEach(() => {
23
32
  mockGET(/\/contact\/history\/contact-.*/, '/test-assets/contacts/history.json');
33
+ clock = useFakeTimers();
34
+ });
35
+ afterEach(function () {
36
+ clock.restore();
24
37
  });
25
38
  it('can be created', async () => {
26
39
  // we are a StoreElement, so load a store first
@@ -79,7 +92,7 @@ describe('temba-contact-chat - contact tests', () => {
79
92
  contact: 'contact-tim-stopped',
80
93
  });
81
94
  const chatHistoryEl = chat.shadowRoot.querySelector('temba-contact-history');
82
- expect(chatHistoryEl).to.not.equal(null);
95
+ expect(chatHistoryEl).to.not.equal(null, 'Chat history missing');
83
96
  const chatboxDiv = chat.shadowRoot.querySelector('.chatbox');
84
97
  expect(chatboxDiv).to.equal(null);
85
98
  const reopenButton = chat.shadowRoot.querySelector('temba-button#reopen-button');
@@ -93,6 +106,10 @@ describe('temba-contact-chat - ticket tests', () => {
93
106
  beforeEach(() => {
94
107
  mockGET(/\/contact\/history\/contact-.*/, '/test-assets/contacts/history.json');
95
108
  mockGET(/\/api\/v2\/tickets\.json.*/, '/test-assets/tickets/empty.json');
109
+ clock = useFakeTimers();
110
+ });
111
+ afterEach(function () {
112
+ clock.restore();
96
113
  });
97
114
  it('show history and show chatbox if contact is active and ticket is open', async () => {
98
115
  // we are a StoreElement, so load a store first
@@ -111,7 +128,10 @@ describe('temba-contact-chat - ticket tests', () => {
111
128
  expect(chatboxDiv).to.not.equal(null);
112
129
  const reopenButton = chat.shadowRoot.querySelector('temba-button#reopen-button');
113
130
  expect(reopenButton).to.equal(null);
114
- await assertScreenshot('contacts/contact-active-ticket-open-show-chatbox', getClip(chat));
131
+ await assertScreenshot('contacts/contact-active-ticket-open-show-chatbox', getClip(chat), {
132
+ clock: clock,
133
+ predicate: () => chat.getContactHistory().getEventsPane().scrollTop === 982,
134
+ });
115
135
  });
116
136
  it('show history and show reopen button if contact is active and ticket is closed', async () => {
117
137
  // we are a StoreElement, so load a store first
@@ -124,7 +144,6 @@ describe('temba-contact-chat - ticket tests', () => {
124
144
  });
125
145
  chat.currentTicket = tickets.items[0];
126
146
  chat.refresh();
127
- await waitFor(0);
128
147
  await chat.httpComplete;
129
148
  const chatHistoryEl = chat.shadowRoot.querySelector('temba-contact-history');
130
149
  expect(chatHistoryEl).to.not.equal(null);
@@ -132,7 +151,12 @@ describe('temba-contact-chat - ticket tests', () => {
132
151
  expect(chatboxDiv).to.equal(null);
133
152
  const reopenButton = chat.shadowRoot.querySelector('temba-button#reopen-button');
134
153
  expect(reopenButton).to.not.equal(null);
135
- await assertScreenshot('contacts/contact-active-ticket-closed-show-reopen-button', getClip(chat));
154
+ await assertScreenshot('contacts/contact-active-ticket-closed-show-reopen-button', getClip(chat), {
155
+ clock: clock,
156
+ predicate: () => {
157
+ return chat.getContactHistory().getEventsPane().scrollTop === 918;
158
+ },
159
+ });
136
160
  });
137
161
  it('show history and hide chatbox if contact is archived and ticket is closed', async () => {
138
162
  // we are a StoreElement, so load a store first
@@ -145,15 +169,18 @@ describe('temba-contact-chat - ticket tests', () => {
145
169
  });
146
170
  chat.currentTicket = tickets.items[0];
147
171
  chat.refresh();
148
- await waitFor(0);
149
- await chat.httpComplete;
150
172
  const chatHistoryEl = chat.shadowRoot.querySelector('temba-contact-history');
151
173
  expect(chatHistoryEl).to.not.equal(null);
152
174
  const chatboxDiv = chat.shadowRoot.querySelector('.chatbox');
153
175
  expect(chatboxDiv).to.equal(null);
154
176
  const reopenButton = chat.shadowRoot.querySelector('temba-button#reopen-button');
155
177
  expect(reopenButton).to.equal(null);
156
- await assertScreenshot('contacts/contact-archived-ticket-closed-hide-chatbox', getClip(chat));
178
+ await assertScreenshot('contacts/contact-archived-ticket-closed-hide-chatbox', getClip(chat), {
179
+ clock: clock,
180
+ predicate: () => {
181
+ return chat.getContactHistory().getEventsPane().scrollTop === 867;
182
+ },
183
+ });
157
184
  });
158
185
  });
159
186
  //# 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 { 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"]}
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, waitUntil } from '@open-wc/testing';\nimport { useFakeTimers } from 'sinon';\nimport { ContactChat } from '../src/contacts/ContactChat';\nimport { ContactHistory } from '../src/contacts/ContactHistory';\nimport { CustomEventType } from '../src/interfaces';\nimport { TicketList } from '../src/list/TicketList';\nimport {\n assertScreenshot,\n getClip,\n getComponent,\n loadStore,\n mockGET,\n mockNow,\n} from '../test/utils.test';\n\nlet clock: any;\nmockNow('2021-03-31T00:31:00.000-00:00');\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 // TODO: this should be waiting for an event instead\n await waitFor(100);\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\n if (!list.endpoint) {\n return list;\n }\n\n return new Promise<TicketList>(resolve => {\n list.addEventListener(\n CustomEventType.FetchComplete,\n async () => {\n resolve(list);\n },\n { once: true }\n );\n });\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 clock = useFakeTimers();\n });\n\n afterEach(function () {\n clock.restore();\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, 'Chat history missing');\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 clock = useFakeTimers();\n });\n\n afterEach(function () {\n clock.restore();\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 clock: clock,\n predicate: () =>\n chat.getContactHistory().getEventsPane().scrollTop === 982,\n }\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 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 clock: clock,\n predicate: () => {\n return chat.getContactHistory().getEventsPane().scrollTop === 918;\n },\n }\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 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 clock: clock,\n predicate: () => {\n return chat.getContactHistory().getEventsPane().scrollTop === 867;\n },\n }\n );\n });\n});\n"]}
@@ -1,4 +1,5 @@
1
1
  import { fixture, assert, expect } from '@open-wc/testing';
2
+ import { useFakeTimers } from 'sinon';
2
3
  import { ContactHistory } from '../src/contacts/ContactHistory';
3
4
  import { assertScreenshot, getClip, getHTML, loadStore, mockGET, mockNow, } from '../test/utils.test';
4
5
  import './utils.test';
@@ -6,12 +7,6 @@ export const createHistory = async (def) => {
6
7
  const parentNode = document.createElement('div');
7
8
  parentNode.setAttribute('style', 'width: 500px;height:750px;display:flex;flex-direction:column;flex-grow:1;min-height:0;');
8
9
  const history = (await fixture(def, { parentNode }));
9
- // let history fetch start and wait for it
10
- await waitFor(0);
11
- await history.httpComplete;
12
- // wait for scroll update
13
- await waitFor(0);
14
- await history.httpComplete;
15
10
  return history;
16
11
  };
17
12
  const getHistoryHTML = (attrs = {}) =>
@@ -25,13 +20,18 @@ const getHistoryClip = (ele) => {
25
20
  };
26
21
  // stub our current date for consistent screenshots
27
22
  mockNow('2021-03-31T00:31:00.000-00:00');
23
+ let clock;
28
24
  describe('temba-contact-history', () => {
29
25
  beforeEach(async () => {
26
+ clock = useFakeTimers();
30
27
  mockGET(/\/contact\/history\/contact-dave-active\/.*/, '/test-assets/contacts/history.json');
31
28
  mockGET(/\/api\/v2\/tickets\.json\?contact=contact-dave-active/, '/test-assets/api/tickets.json');
32
29
  await loadStore();
33
30
  });
34
- it('can be created', async () => {
31
+ afterEach(function () {
32
+ clock.restore();
33
+ });
34
+ it.only('can be created', async () => {
35
35
  const history = await createHistory(getHistoryHTML());
36
36
  assert.instanceOf(history, ContactHistory);
37
37
  });
@@ -39,11 +39,11 @@ describe('temba-contact-history', () => {
39
39
  const history = await createHistory(getHistoryHTML({
40
40
  uuid: 'contact-dave-active',
41
41
  }));
42
- await waitFor(500);
43
42
  // we should have scrolled to the bottom
44
43
  const events = history.shadowRoot.querySelector('.events');
45
44
  const top = events.scrollHeight - events.getBoundingClientRect().height;
46
45
  expect(top).to.equal(549);
46
+ await clock.runAllAsync();
47
47
  // make sure we actually scrolled to there
48
48
  expect(events.scrollTop).to.equal(top);
49
49
  await assertScreenshot('contacts/history', getHistoryClip(history));
@@ -57,9 +57,9 @@ describe('temba-contact-history', () => {
57
57
  for (const idx of groups) {
58
58
  const group = history.shadowRoot.querySelector(`.event-count[data-group-index='${idx}']`);
59
59
  group.click();
60
+ await clock.runAllAsync();
61
+ expect(group.parentElement.classList.contains('expanded')).equal(true);
60
62
  }
61
- await waitFor(500);
62
- await assertScreenshot('contacts/history-expanded', getHistoryClip(history));
63
63
  });
64
64
  });
65
65
  //# sourceMappingURL=temba-contact-history.test.js.map
@@ -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(500);\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 { useFakeTimers } from 'sinon';\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 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');\nlet clock: any;\n\ndescribe('temba-contact-history', () => {\n beforeEach(async () => {\n clock = useFakeTimers();\n\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 afterEach(function () {\n clock.restore();\n });\n\n it.only('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 // 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 await clock.runAllAsync();\n\n // make sure we actually scrolled to there\n expect(events.scrollTop).to.equal(top);\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 await clock.runAllAsync();\n expect(group.parentElement.classList.contains('expanded')).equal(true);\n }\n });\n});\n"]}
@@ -13,7 +13,7 @@ const getContentMenu = async (attrs = {}, width = 0) => {
13
13
  return new Promise(resolve => {
14
14
  contentMenu.addEventListener(CustomEventType.Loaded, async () => {
15
15
  resolve(contentMenu);
16
- });
16
+ }, { once: true });
17
17
  });
18
18
  };
19
19
  describe('temba-content-menu', () => {
@@ -1 +1 @@
1
- {"version":3,"file":"temba-content-menu.test.js","sourceRoot":"","sources":["../../test/temba-content-menu.test.ts"],"names":[],"mappings":"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","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 it('is spa page', async () => {\n const contentMenu: ContentMenu = await getContentMenu({\n endpoint: '/test-assets/list/content-menu-contact-read.json',\n legacy: 0,\n });\n expect(contentMenu.legacy).equals(0);\n });\n\n it('is legacy page', async () => {\n const contentMenu: ContentMenu = await getContentMenu({\n endpoint: '/test-assets/list/content-menu-contact-read.json',\n legacy: 1,\n });\n expect(contentMenu.legacy).equals(1);\n });\n});\n"]}
1
+ {"version":3,"file":"temba-content-menu.test.js","sourceRoot":"","sources":["../../test/temba-content-menu.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { assert, expect } from '@open-wc/testing';\nimport { CustomEventType } from '../src/interfaces';\nimport { ContentMenu } 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(\n CustomEventType.Loaded,\n async () => {\n resolve(contentMenu);\n },\n { once: true }\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 it('is spa page', async () => {\n const contentMenu: ContentMenu = await getContentMenu({\n endpoint: '/test-assets/list/content-menu-contact-read.json',\n legacy: 0,\n });\n expect(contentMenu.legacy).equals(0);\n });\n\n it('is legacy page', async () => {\n const contentMenu: ContentMenu = await getContentMenu({\n endpoint: '/test-assets/list/content-menu-contact-read.json',\n legacy: 1,\n });\n expect(contentMenu.legacy).equals(1);\n });\n});\n"]}
@@ -3,7 +3,7 @@ import { html } from 'lit';
3
3
  import { assertScreenshot, getAttributes, getClip, loadStore, } from './utils.test';
4
4
  const BORING_LIST = html `<temba-field-manager />`;
5
5
  export const getEle = async (attrs = {}) => {
6
- const fm = html `<temba-field-manager
6
+ const fm = `<temba-field-manager
7
7
  ${getAttributes(attrs)}
8
8
  ></temba-field-manager>`;
9
9
  const parentNode = document.createElement('div');
@@ -1 +1 @@
1
- {"version":3,"file":"temba-field-manager.test.js","sourceRoot":"","sources":["../../test/temba-field-manager.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { fixture } from '@open-wc/testing';\nimport { html } from 'lit';\nimport { FieldManager } from '../src/fields/FieldManager';\nimport {\n assertScreenshot,\n getAttributes,\n getClip,\n loadStore,\n} from './utils.test';\n\nconst BORING_LIST = html`<temba-field-manager />`;\n\nexport const getEle = async (attrs: any = {}) => {\n const fm = html`<temba-field-manager\n ${getAttributes(attrs)}\n ></temba-field-manager>`;\n const parentNode = document.createElement('div');\n parentNode.setAttribute('style', 'width: 600px;');\n return (await fixture(fm, { parentNode })) as FieldManager;\n};\n\ndescribe('temba-field-manager', () => {\n it('renders default', async () => {\n await loadStore();\n const fm: FieldManager = await getEle();\n await assertScreenshot('list/fields', getClip(fm));\n });\n\n it('filters', async () => {\n await loadStore();\n const fm: FieldManager = await getEle();\n (fm.shadowRoot.querySelector('#search') as HTMLDivElement).click();\n await type('at');\n await assertScreenshot('list/fields-filtered', getClip(fm));\n });\n\n it('hovers', async () => {\n await loadStore();\n const fm: FieldManager = await getEle();\n\n // hover over the first item\n const first = fm.shadowRoot.querySelector('.sortable') as HTMLDivElement;\n const bounds = first.getBoundingClientRect();\n await moveMouse(bounds.left + 20, bounds.top + 10);\n await assertScreenshot('list/fields-hovered', getClip(fm));\n });\n\n it('drags featured down', async () => {\n await loadStore();\n const fm: FieldManager = await getEle();\n const first = fm.shadowRoot.querySelector('.sortable') as HTMLDivElement;\n const bounds = first.getBoundingClientRect();\n\n // drag our item\n await moveMouse(bounds.left + 20, bounds.top + 10);\n await mouseDown();\n await moveMouse(bounds.left + 30, bounds.bottom + 20);\n await assertScreenshot('list/fields-dragging', getClip(fm));\n });\n});\n"]}
1
+ {"version":3,"file":"temba-field-manager.test.js","sourceRoot":"","sources":["../../test/temba-field-manager.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAE3B,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,OAAO,EACP,SAAS,GACV,MAAM,cAAc,CAAC;AAEtB,MAAM,WAAW,GAAG,IAAI,CAAA,yBAAyB,CAAC;AAElD,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,EAAE,QAAa,EAAE,EAAE,EAAE;IAC9C,MAAM,EAAE,GAAG;MACP,aAAa,CAAC,KAAK,CAAC;0BACA,CAAC;IACzB,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACjD,UAAU,CAAC,YAAY,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IAClD,OAAO,CAAC,MAAM,OAAO,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,CAAiB,CAAC;AAC7D,CAAC,CAAC;AAEF,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,iBAAiB,EAAE,KAAK,IAAI,EAAE;QAC/B,MAAM,SAAS,EAAE,CAAC;QAClB,MAAM,EAAE,GAAiB,MAAM,MAAM,EAAE,CAAC;QACxC,MAAM,gBAAgB,CAAC,aAAa,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;QACvB,MAAM,SAAS,EAAE,CAAC;QAClB,MAAM,EAAE,GAAiB,MAAM,MAAM,EAAE,CAAC;QACvC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,CAAoB,CAAC,KAAK,EAAE,CAAC;QACnE,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,MAAM,gBAAgB,CAAC,sBAAsB,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QACtB,MAAM,SAAS,EAAE,CAAC;QAClB,MAAM,EAAE,GAAiB,MAAM,MAAM,EAAE,CAAC;QAExC,4BAA4B;QAC5B,MAAM,KAAK,GAAG,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,WAAW,CAAmB,CAAC;QACzE,MAAM,MAAM,GAAG,KAAK,CAAC,qBAAqB,EAAE,CAAC;QAC7C,MAAM,SAAS,CAAC,MAAM,CAAC,IAAI,GAAG,EAAE,EAAE,MAAM,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;QACnD,MAAM,gBAAgB,CAAC,qBAAqB,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;QACnC,MAAM,SAAS,EAAE,CAAC;QAClB,MAAM,EAAE,GAAiB,MAAM,MAAM,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,WAAW,CAAmB,CAAC;QACzE,MAAM,MAAM,GAAG,KAAK,CAAC,qBAAqB,EAAE,CAAC;QAE7C,gBAAgB;QAChB,MAAM,SAAS,CAAC,MAAM,CAAC,IAAI,GAAG,EAAE,EAAE,MAAM,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;QACnD,MAAM,SAAS,EAAE,CAAC;QAClB,MAAM,SAAS,CAAC,MAAM,CAAC,IAAI,GAAG,EAAE,EAAE,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;QACtD,MAAM,gBAAgB,CAAC,sBAAsB,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { fixture } from '@open-wc/testing';\nimport { html } from 'lit';\nimport { FieldManager } from '../src/fields/FieldManager';\nimport {\n assertScreenshot,\n getAttributes,\n getClip,\n loadStore,\n} from './utils.test';\n\nconst BORING_LIST = html`<temba-field-manager />`;\n\nexport const getEle = async (attrs: any = {}) => {\n const fm = `<temba-field-manager\n ${getAttributes(attrs)}\n ></temba-field-manager>`;\n const parentNode = document.createElement('div');\n parentNode.setAttribute('style', 'width: 600px;');\n return (await fixture(fm, { parentNode })) as FieldManager;\n};\n\ndescribe('temba-field-manager', () => {\n it('renders default', async () => {\n await loadStore();\n const fm: FieldManager = await getEle();\n await assertScreenshot('list/fields', getClip(fm));\n });\n\n it('filters', async () => {\n await loadStore();\n const fm: FieldManager = await getEle();\n (fm.shadowRoot.querySelector('#search') as HTMLDivElement).click();\n await type('at');\n await assertScreenshot('list/fields-filtered', getClip(fm));\n });\n\n it('hovers', async () => {\n await loadStore();\n const fm: FieldManager = await getEle();\n\n // hover over the first item\n const first = fm.shadowRoot.querySelector('.sortable') as HTMLDivElement;\n const bounds = first.getBoundingClientRect();\n await moveMouse(bounds.left + 20, bounds.top + 10);\n await assertScreenshot('list/fields-hovered', getClip(fm));\n });\n\n it('drags featured down', async () => {\n await loadStore();\n const fm: FieldManager = await getEle();\n const first = fm.shadowRoot.querySelector('.sortable') as HTMLDivElement;\n const bounds = first.getBoundingClientRect();\n\n // drag our item\n await moveMouse(bounds.left + 20, bounds.top + 10);\n await mouseDown();\n await moveMouse(bounds.left + 30, bounds.bottom + 20);\n await assertScreenshot('list/fields-dragging', getClip(fm));\n });\n});\n"]}
@@ -1,15 +1,29 @@
1
1
  import { assert, expect } from '@open-wc/testing';
2
2
  import * as sinon from 'sinon';
3
+ import { useFakeTimers } from 'sinon';
4
+ import { CustomEventType } from '../src/interfaces';
3
5
  import { TembaList } from '../src/list/TembaList';
4
6
  import { assertScreenshot, getClip, getComponent } from './utils.test';
7
+ let clock;
5
8
  const TAG = 'temba-list';
6
9
  const getList = async (attrs = {}) => {
7
10
  const list = (await getComponent(TAG, attrs));
8
- // wait for the fetch
9
- await list.httpComplete;
10
- return list;
11
+ if (!list.endpoint) {
12
+ return list;
13
+ }
14
+ return new Promise(resolve => {
15
+ list.addEventListener(CustomEventType.FetchComplete, async () => {
16
+ resolve(list);
17
+ }, { once: true });
18
+ });
11
19
  };
12
20
  describe('temba-list', () => {
21
+ beforeEach(function () {
22
+ clock = useFakeTimers();
23
+ });
24
+ afterEach(function () {
25
+ clock.restore();
26
+ });
13
27
  it('can be created', async () => {
14
28
  const list = await getList();
15
29
  assert.instanceOf(list, TembaList);
@@ -30,12 +44,13 @@ describe('temba-list', () => {
30
44
  const list = await getList({
31
45
  endpoint: '/test-assets/list/temba-list.json',
32
46
  });
33
- const changeEvent = sinon.spy();
34
- list.addEventListener('change', changeEvent);
47
+ const changeTest = new Promise(resolve => {
48
+ list.addEventListener('change', () => {
49
+ resolve();
50
+ });
51
+ });
35
52
  list.cursorIndex = 1;
36
- // let our event fire
37
- await waitFor(0);
38
- assert(changeEvent.called, 'change event not fired');
53
+ await changeTest;
39
54
  await assertScreenshot('list/items-selected', getClip(list));
40
55
  });
41
56
  it('fires change when first element changes after fetch', async () => {
@@ -45,12 +60,13 @@ describe('temba-list', () => {
45
60
  // spy on change event
46
61
  const changeEvent = sinon.spy();
47
62
  list.addEventListener('change', changeEvent);
48
- // don't let our list reset on endpoint change
49
- list.preserve = true;
63
+ const refreshTest = new Promise(resolve => {
64
+ list.addEventListener(CustomEventType.FetchComplete, () => {
65
+ resolve();
66
+ });
67
+ });
50
68
  list.endpoint = '/test-assets/list/temba-list-shorter.json';
51
- // refresh our endpoint and wait for event to fire
52
- await waitFor(0);
53
- await list.httpComplete;
69
+ await refreshTest;
54
70
  assert(changeEvent.called, 'change event not fired');
55
71
  await assertScreenshot('list/items-updated', getClip(list));
56
72
  });
@@ -1 +1 @@
1
- {"version":3,"file":"temba-list.test.js","sourceRoot":"","sources":["../../test/temba-list.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { assert, expect } from '@open-wc/testing';\nimport * as sinon from 'sinon';\nimport { TembaList } from '../src/list/TembaList';\nimport { assertScreenshot, getClip, getComponent } from './utils.test';\n\nconst TAG = 'temba-list';\nconst getList = async (attrs: any = {}) => {\n const list = (await getComponent(TAG, attrs)) as TembaList;\n\n // wait for the fetch\n await list.httpComplete;\n\n return list;\n};\n\ndescribe('temba-list', () => {\n it('can be created', async () => {\n const list: TembaList = await getList();\n assert.instanceOf(list, TembaList);\n expect(list.items.length).to.equal(0);\n });\n\n it('shows empty list with bad endpoint', async () => {\n const list: TembaList = await getList({ endpoint: 'expected-404.json' });\n expect(list.items.length).to.equal(0);\n });\n\n it('renders with endpoint', async () => {\n const list: TembaList = await getList({\n endpoint: '/test-assets/list/temba-list.json',\n });\n expect(list.items.length).to.equal(4);\n await assertScreenshot('list/items', getClip(list));\n });\n\n it('fires change event on cursor change', async () => {\n const list: TembaList = await getList({\n endpoint: '/test-assets/list/temba-list.json',\n });\n\n const changeEvent = sinon.spy();\n\n list.addEventListener('change', changeEvent);\n list.cursorIndex = 1;\n\n // let our event fire\n await waitFor(0);\n\n assert(changeEvent.called, 'change event not fired');\n await assertScreenshot('list/items-selected', getClip(list));\n });\n\n it('fires change when first element changes after fetch', async () => {\n const list: TembaList = await getList({\n endpoint: '/test-assets/list/temba-list.json',\n });\n\n // spy on change event\n const changeEvent = sinon.spy();\n list.addEventListener('change', changeEvent);\n\n // don't let our list reset on endpoint change\n list.preserve = true;\n list.endpoint = '/test-assets/list/temba-list-shorter.json';\n\n // refresh our endpoint and wait for event to fire\n await waitFor(0);\n await list.httpComplete;\n\n assert(changeEvent.called, 'change event not fired');\n await assertScreenshot('list/items-updated', getClip(list));\n });\n});\n"]}
1
+ {"version":3,"file":"temba-list.test.js","sourceRoot":"","sources":["../../test/temba-list.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { assert, expect } from '@open-wc/testing';\nimport * as sinon from 'sinon';\nimport { useFakeTimers } from 'sinon';\nimport { CustomEventType } from '../src/interfaces';\nimport { TembaList } from '../src/list/TembaList';\nimport { assertScreenshot, getClip, getComponent } from './utils.test';\n\nlet clock: any;\n\nconst TAG = 'temba-list';\nconst getList = async (attrs: any = {}) => {\n const list = (await getComponent(TAG, attrs)) as TembaList;\n\n if (!list.endpoint) {\n return list;\n }\n\n return new Promise<TembaList>(resolve => {\n list.addEventListener(\n CustomEventType.FetchComplete,\n async () => {\n resolve(list);\n },\n { once: true }\n );\n });\n};\n\ndescribe('temba-list', () => {\n beforeEach(function () {\n clock = useFakeTimers();\n });\n\n afterEach(function () {\n clock.restore();\n });\n\n it('can be created', async () => {\n const list: TembaList = await getList();\n assert.instanceOf(list, TembaList);\n expect(list.items.length).to.equal(0);\n });\n\n it('shows empty list with bad endpoint', async () => {\n const list: TembaList = await getList({ endpoint: 'expected-404.json' });\n expect(list.items.length).to.equal(0);\n });\n\n it('renders with endpoint', async () => {\n const list: TembaList = await getList({\n endpoint: '/test-assets/list/temba-list.json',\n });\n expect(list.items.length).to.equal(4);\n await assertScreenshot('list/items', getClip(list));\n });\n\n it('fires change event on cursor change', async () => {\n const list: TembaList = await getList({\n endpoint: '/test-assets/list/temba-list.json',\n });\n\n const changeTest = new Promise<void>(resolve => {\n list.addEventListener('change', () => {\n resolve();\n });\n });\n\n list.cursorIndex = 1;\n\n await changeTest;\n await assertScreenshot('list/items-selected', getClip(list));\n });\n\n it('fires change when first element changes after fetch', async () => {\n const list: TembaList = await getList({\n endpoint: '/test-assets/list/temba-list.json',\n });\n\n // spy on change event\n const changeEvent = sinon.spy();\n list.addEventListener('change', changeEvent);\n\n const refreshTest = new Promise<void>(resolve => {\n list.addEventListener(CustomEventType.FetchComplete, () => {\n resolve();\n });\n });\n\n list.endpoint = '/test-assets/list/temba-list-shorter.json';\n await refreshTest;\n\n assert(changeEvent.called, 'change event not fired');\n await assertScreenshot('list/items-updated', getClip(list));\n });\n});\n"]}
@@ -43,8 +43,6 @@ const clickPrimary = async (modax) => {
43
43
  }
44
44
  expect(primary).not.equals(undefined, 'Missing primary button');
45
45
  primary.click();
46
- await waitFor(0);
47
- await clock.runAll();
48
46
  }
49
47
  };
50
48
  const getDialogClip = (modax) => {
@@ -75,8 +73,8 @@ describe('temba-modax', () => {
75
73
  expect(modax.open).to.equal(false);
76
74
  await open(modax);
77
75
  expect(modax.open).to.equal(true);
78
- expect(modax.primaryName).to.equal("Save Everything");
79
- expect(modax.cancelName).to.equal("Cancel");
76
+ expect(modax.primaryName).to.equal('Save Everything');
77
+ expect(modax.cancelName).to.equal('Cancel');
80
78
  await assertScreenshot('modax/form', getDialogClip(modax));
81
79
  });
82
80
  it('reverts primary name on reuse', async () => {
@@ -107,12 +105,18 @@ describe('temba-modax', () => {
107
105
  const primary = getButtons(modax, 'primary')[0];
108
106
  expect(primary.name).equals('Save Everything');
109
107
  // click the submit button
110
- mockPOST(/\/test-assets\/modax\/form\.html/, '', {
111
- 'Temba-Success': '/newpage',
108
+ mockPOST(/\/test-assets\/modax\/form\.html/, 'arst', {
109
+ 'Temba-Success': 'hide',
110
+ });
111
+ const hideTest = new Promise(resolve => {
112
+ modax.addEventListener(CustomEventType.Submitted, () => {
113
+ expect(modax.open).equals(false, 'Modal still visible');
114
+ resolve();
115
+ });
112
116
  });
113
117
  await clickPrimary(modax);
114
- // our modal should go away as we redirect
115
- expect(modax.open).equals(false, 'Modal still visible');
118
+ await clock.runAllAsync();
119
+ await hideTest;
116
120
  });
117
121
  });
118
122
  //# sourceMappingURL=temba-modax.test.js.map
@@ -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 { 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"]}
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(\n CustomEventType.Loaded,\n async (event: CustomEvent) => {\n await clock.runAll();\n resolve(event.detail);\n }\n );\n\n modax.addEventListener(\n CustomEventType.Redirected,\n async (event: CustomEvent) => {\n await clock.runAll();\n resolve(event.detail);\n }\n );\n\n modax.open = true;\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 }\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/, 'arst', {\n 'Temba-Success': 'hide',\n });\n\n const hideTest = new Promise<void>(resolve => {\n modax.addEventListener(CustomEventType.Submitted, () => {\n expect(modax.open).equals(false, 'Modal still visible');\n resolve();\n });\n });\n\n await clickPrimary(modax);\n await clock.runAllAsync();\n await hideTest;\n });\n});\n"]}