@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.
- package/.github/workflows/stale.yml +1 -0
- package/CHANGELOG.md +12 -0
- package/dist/{46adbabc.js → 135b99dc.js} +8 -4
- package/dist/index.js +8 -4
- package/dist/sw.js +1 -1
- package/dist/sw.js.map +1 -1
- package/dist/templates/components-body.html +1 -1
- package/dist/templates/components-head.html +1 -1
- package/out-tsc/src/contacts/ContactFieldEditor.js +1 -1
- package/out-tsc/src/contacts/ContactFieldEditor.js.map +1 -1
- package/out-tsc/src/list/ContentMenu.js +4 -0
- package/out-tsc/src/list/ContentMenu.js.map +1 -1
- package/out-tsc/src/list/TembaList.js +8 -5
- package/out-tsc/src/list/TembaList.js.map +1 -1
- package/out-tsc/src/select/Select.js +18 -4
- package/out-tsc/src/select/Select.js.map +1 -1
- package/out-tsc/test/temba-contact-chat.test.js +40 -13
- package/out-tsc/test/temba-contact-chat.test.js.map +1 -1
- package/out-tsc/test/temba-contact-history.test.js +10 -10
- package/out-tsc/test/temba-contact-history.test.js.map +1 -1
- package/out-tsc/test/temba-content-menu.test.js +1 -1
- package/out-tsc/test/temba-content-menu.test.js.map +1 -1
- package/out-tsc/test/temba-field-manager.test.js +1 -1
- package/out-tsc/test/temba-field-manager.test.js.map +1 -1
- package/out-tsc/test/temba-list.test.js +29 -13
- package/out-tsc/test/temba-list.test.js.map +1 -1
- package/out-tsc/test/temba-modax.test.js +12 -8
- package/out-tsc/test/temba-modax.test.js.map +1 -1
- package/out-tsc/test/temba-select.test.js +21 -39
- package/out-tsc/test/temba-select.test.js.map +1 -1
- package/out-tsc/test/utils.test.js +10 -3
- package/out-tsc/test/utils.test.js.map +1 -1
- package/package.json +1 -1
- package/screenshots/truth/contacts/contact-active-default.png +0 -0
- package/screenshots/truth/contacts/contact-active-show-chatbox.png +0 -0
- package/screenshots/truth/contacts/contact-active-ticket-closed-show-reopen-button.png +0 -0
- package/screenshots/truth/contacts/contact-active-ticket-open-show-chatbox.png +0 -0
- package/screenshots/truth/contacts/contact-archived-hide-chatbox.png +0 -0
- package/screenshots/truth/contacts/contact-archived-ticket-closed-hide-chatbox.png +0 -0
- package/screenshots/truth/contacts/contact-blocked-hide-chatbox.png +0 -0
- package/screenshots/truth/contacts/contact-stopped-hide-chatbox.png +0 -0
- package/screenshots/truth/dialog/focused.png +0 -0
- package/screenshots/truth/modax/form.png +0 -0
- package/src/contacts/ContactFieldEditor.ts +1 -1
- package/src/list/ContentMenu.ts +4 -0
- package/src/list/TembaList.ts +9 -9
- package/src/select/Select.ts +23 -9
- package/test/temba-contact-chat.test.ts +54 -16
- package/test/temba-contact-history.test.ts +12 -20
- package/test/temba-content-menu.test.ts +8 -4
- package/test/temba-field-manager.test.ts +1 -1
- package/test/temba-list.test.ts +38 -16
- package/test/temba-modax.test.ts +30 -21
- package/test/temba-select.test.ts +25 -44
- package/test/utils.test.ts +11 -5
- package/test-assets/style.css +5 -0
- package/web-test-runner.config.mjs +18 -14
|
@@ -1,26 +1,39 @@
|
|
|
1
1
|
import { expect } from '@open-wc/testing';
|
|
2
|
-
import {
|
|
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
|
-
//
|
|
9
|
-
await
|
|
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
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
-
|
|
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":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EACL,gBAAgB,EAChB,OAAO,EACP,OAAO,EACP,SAAS,EACT,OAAO,EACP,OAAO,GACR,MAAM,oBAAoB,CAAC;AAC5B,OAAO,cAAc,CAAC;AAEtB,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,GAAW,EAAE,EAAE;IACjD,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACjD,UAAU,CAAC,YAAY,CACrB,OAAO,EACP,wFAAwF,CACzF,CAAC;IACF,MAAM,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,CAAC,CAAmB,CAAC;
|
|
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":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,WAAW,
|
|
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 =
|
|
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":"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
|
|
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
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
|
34
|
-
|
|
47
|
+
const changeTest = new Promise(resolve => {
|
|
48
|
+
list.addEventListener('change', () => {
|
|
49
|
+
resolve();
|
|
50
|
+
});
|
|
51
|
+
});
|
|
35
52
|
list.cursorIndex = 1;
|
|
36
|
-
|
|
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
|
-
|
|
49
|
-
|
|
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
|
-
|
|
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":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEvE,MAAM,GAAG,GAAG,YAAY,CAAC;AACzB,MAAM,OAAO,GAAG,KAAK,EAAE,QAAa,EAAE,EAAE,EAAE;IACxC,MAAM,IAAI,GAAG,CAAC,MAAM,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAc,CAAC;IAE3D,
|
|
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(
|
|
79
|
-
expect(modax.cancelName).to.equal(
|
|
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': '
|
|
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
|
-
|
|
115
|
-
|
|
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":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAEtC,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAe,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAEhF,IAAI,KAAU,CAAC;AAEf,MAAM,YAAY,GAAG,CAAC,QAAgB,EAAU,EAAE;IAChD,OAAO;oDAC2C,QAAQ;;;KAGvD,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,KAAY,EAAE,OAAe,IAAI,EAAE,EAAE;IACvD,OAAO,KAAK,CAAC,UAAU;SACpB,aAAa,CAAC,cAAc,CAAC;SAC7B,UAAU,CAAC,gBAAgB,CAC1B,IAAI,CAAC,CAAC,CAAC,gBAAgB,IAAI,MAAM,CAAC,CAAC,CAAC,cAAc,CACnD,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,IAAI,GAAG,KAAK,EAAE,KAAY,EAAE,EAAE;IAClC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAY,EAAE,MAAW,
|
|
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"]}
|