@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,16 +1,21 @@
|
|
|
1
|
-
import { expect } from '@open-wc/testing';
|
|
1
|
+
import { expect, waitUntil } from '@open-wc/testing';
|
|
2
|
+
import { useFakeTimers } from 'sinon';
|
|
2
3
|
import { ContactChat } from '../src/contacts/ContactChat';
|
|
3
4
|
import { ContactHistory } from '../src/contacts/ContactHistory';
|
|
5
|
+
import { CustomEventType } from '../src/interfaces';
|
|
4
6
|
import { TicketList } from '../src/list/TicketList';
|
|
5
7
|
import {
|
|
6
8
|
assertScreenshot,
|
|
7
|
-
delay,
|
|
8
9
|
getClip,
|
|
9
10
|
getComponent,
|
|
10
11
|
loadStore,
|
|
11
12
|
mockGET,
|
|
13
|
+
mockNow,
|
|
12
14
|
} from '../test/utils.test';
|
|
13
15
|
|
|
16
|
+
let clock: any;
|
|
17
|
+
mockNow('2021-03-31T00:31:00.000-00:00');
|
|
18
|
+
|
|
14
19
|
const TAG = 'temba-contact-chat';
|
|
15
20
|
const getContactChat = async (attrs: any = {}) => {
|
|
16
21
|
attrs['endpoint'] = '/test-assets/contacts/';
|
|
@@ -24,18 +29,28 @@ const getContactChat = async (attrs: any = {}) => {
|
|
|
24
29
|
'display:flex;flex-direction:column;flex-grow:1;min-height:0;'
|
|
25
30
|
)) as ContactChat;
|
|
26
31
|
|
|
27
|
-
//
|
|
28
|
-
await
|
|
29
|
-
|
|
32
|
+
// TODO: this should be waiting for an event instead
|
|
33
|
+
await waitFor(100);
|
|
30
34
|
return chat;
|
|
31
35
|
};
|
|
32
36
|
|
|
33
37
|
const list_TAG = 'temba-list';
|
|
34
38
|
const getTicketList = async (attrs: any = {}) => {
|
|
35
39
|
const list = (await getComponent(list_TAG, attrs)) as TicketList;
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
40
|
+
|
|
41
|
+
if (!list.endpoint) {
|
|
42
|
+
return list;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return new Promise<TicketList>(resolve => {
|
|
46
|
+
list.addEventListener(
|
|
47
|
+
CustomEventType.FetchComplete,
|
|
48
|
+
async () => {
|
|
49
|
+
resolve(list);
|
|
50
|
+
},
|
|
51
|
+
{ once: true }
|
|
52
|
+
);
|
|
53
|
+
});
|
|
39
54
|
};
|
|
40
55
|
|
|
41
56
|
describe('temba-contact-chat - contact tests', () => {
|
|
@@ -46,6 +61,11 @@ describe('temba-contact-chat - contact tests', () => {
|
|
|
46
61
|
/\/contact\/history\/contact-.*/,
|
|
47
62
|
'/test-assets/contacts/history.json'
|
|
48
63
|
);
|
|
64
|
+
clock = useFakeTimers();
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
afterEach(function () {
|
|
68
|
+
clock.restore();
|
|
49
69
|
});
|
|
50
70
|
|
|
51
71
|
it('can be created', async () => {
|
|
@@ -152,7 +172,7 @@ describe('temba-contact-chat - contact tests', () => {
|
|
|
152
172
|
const chatHistoryEl = chat.shadowRoot.querySelector(
|
|
153
173
|
'temba-contact-history'
|
|
154
174
|
) as ContactHistory;
|
|
155
|
-
expect(chatHistoryEl).to.not.equal(null);
|
|
175
|
+
expect(chatHistoryEl).to.not.equal(null, 'Chat history missing');
|
|
156
176
|
|
|
157
177
|
const chatboxDiv = chat.shadowRoot.querySelector(
|
|
158
178
|
'.chatbox'
|
|
@@ -181,6 +201,11 @@ describe('temba-contact-chat - ticket tests', () => {
|
|
|
181
201
|
);
|
|
182
202
|
|
|
183
203
|
mockGET(/\/api\/v2\/tickets\.json.*/, '/test-assets/tickets/empty.json');
|
|
204
|
+
clock = useFakeTimers();
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
afterEach(function () {
|
|
208
|
+
clock.restore();
|
|
184
209
|
});
|
|
185
210
|
|
|
186
211
|
it('show history and show chatbox if contact is active and ticket is open', async () => {
|
|
@@ -214,7 +239,12 @@ describe('temba-contact-chat - ticket tests', () => {
|
|
|
214
239
|
|
|
215
240
|
await assertScreenshot(
|
|
216
241
|
'contacts/contact-active-ticket-open-show-chatbox',
|
|
217
|
-
getClip(chat)
|
|
242
|
+
getClip(chat),
|
|
243
|
+
{
|
|
244
|
+
clock: clock,
|
|
245
|
+
predicate: () =>
|
|
246
|
+
chat.getContactHistory().getEventsPane().scrollTop === 982,
|
|
247
|
+
}
|
|
218
248
|
);
|
|
219
249
|
});
|
|
220
250
|
|
|
@@ -231,7 +261,6 @@ describe('temba-contact-chat - ticket tests', () => {
|
|
|
231
261
|
chat.currentTicket = tickets.items[0];
|
|
232
262
|
chat.refresh();
|
|
233
263
|
|
|
234
|
-
await waitFor(0);
|
|
235
264
|
await chat.httpComplete;
|
|
236
265
|
|
|
237
266
|
const chatHistoryEl = chat.shadowRoot.querySelector(
|
|
@@ -251,7 +280,13 @@ describe('temba-contact-chat - ticket tests', () => {
|
|
|
251
280
|
|
|
252
281
|
await assertScreenshot(
|
|
253
282
|
'contacts/contact-active-ticket-closed-show-reopen-button',
|
|
254
|
-
getClip(chat)
|
|
283
|
+
getClip(chat),
|
|
284
|
+
{
|
|
285
|
+
clock: clock,
|
|
286
|
+
predicate: () => {
|
|
287
|
+
return chat.getContactHistory().getEventsPane().scrollTop === 918;
|
|
288
|
+
},
|
|
289
|
+
}
|
|
255
290
|
);
|
|
256
291
|
});
|
|
257
292
|
|
|
@@ -269,9 +304,6 @@ describe('temba-contact-chat - ticket tests', () => {
|
|
|
269
304
|
chat.currentTicket = tickets.items[0];
|
|
270
305
|
chat.refresh();
|
|
271
306
|
|
|
272
|
-
await waitFor(0);
|
|
273
|
-
await chat.httpComplete;
|
|
274
|
-
|
|
275
307
|
const chatHistoryEl = chat.shadowRoot.querySelector(
|
|
276
308
|
'temba-contact-history'
|
|
277
309
|
) as ContactHistory;
|
|
@@ -289,7 +321,13 @@ describe('temba-contact-chat - ticket tests', () => {
|
|
|
289
321
|
|
|
290
322
|
await assertScreenshot(
|
|
291
323
|
'contacts/contact-archived-ticket-closed-hide-chatbox',
|
|
292
|
-
getClip(chat)
|
|
324
|
+
getClip(chat),
|
|
325
|
+
{
|
|
326
|
+
clock: clock,
|
|
327
|
+
predicate: () => {
|
|
328
|
+
return chat.getContactHistory().getEventsPane().scrollTop === 867;
|
|
329
|
+
},
|
|
330
|
+
}
|
|
293
331
|
);
|
|
294
332
|
});
|
|
295
333
|
});
|
|
@@ -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 {
|
|
4
5
|
assertScreenshot,
|
|
@@ -17,15 +18,6 @@ export const createHistory = async (def: string) => {
|
|
|
17
18
|
'width: 500px;height:750px;display:flex;flex-direction:column;flex-grow:1;min-height:0;'
|
|
18
19
|
);
|
|
19
20
|
const history = (await fixture(def, { parentNode })) as ContactHistory;
|
|
20
|
-
|
|
21
|
-
// let history fetch start and wait for it
|
|
22
|
-
await waitFor(0);
|
|
23
|
-
await history.httpComplete;
|
|
24
|
-
|
|
25
|
-
// wait for scroll update
|
|
26
|
-
await waitFor(0);
|
|
27
|
-
await history.httpComplete;
|
|
28
|
-
|
|
29
21
|
return history;
|
|
30
22
|
};
|
|
31
23
|
|
|
@@ -42,9 +34,12 @@ const getHistoryClip = (ele: ContactHistory) => {
|
|
|
42
34
|
|
|
43
35
|
// stub our current date for consistent screenshots
|
|
44
36
|
mockNow('2021-03-31T00:31:00.000-00:00');
|
|
37
|
+
let clock: any;
|
|
45
38
|
|
|
46
39
|
describe('temba-contact-history', () => {
|
|
47
40
|
beforeEach(async () => {
|
|
41
|
+
clock = useFakeTimers();
|
|
42
|
+
|
|
48
43
|
mockGET(
|
|
49
44
|
/\/contact\/history\/contact-dave-active\/.*/,
|
|
50
45
|
'/test-assets/contacts/history.json'
|
|
@@ -58,7 +53,11 @@ describe('temba-contact-history', () => {
|
|
|
58
53
|
await loadStore();
|
|
59
54
|
});
|
|
60
55
|
|
|
61
|
-
|
|
56
|
+
afterEach(function () {
|
|
57
|
+
clock.restore();
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
it.only('can be created', async () => {
|
|
62
61
|
const history = await createHistory(getHistoryHTML());
|
|
63
62
|
assert.instanceOf(history, ContactHistory);
|
|
64
63
|
});
|
|
@@ -70,17 +69,15 @@ describe('temba-contact-history', () => {
|
|
|
70
69
|
})
|
|
71
70
|
);
|
|
72
71
|
|
|
73
|
-
await waitFor(500);
|
|
74
|
-
|
|
75
72
|
// we should have scrolled to the bottom
|
|
76
73
|
const events = history.shadowRoot.querySelector('.events');
|
|
77
74
|
const top = events.scrollHeight - events.getBoundingClientRect().height;
|
|
78
75
|
|
|
79
76
|
expect(top).to.equal(549);
|
|
77
|
+
await clock.runAllAsync();
|
|
80
78
|
|
|
81
79
|
// make sure we actually scrolled to there
|
|
82
80
|
expect(events.scrollTop).to.equal(top);
|
|
83
|
-
|
|
84
81
|
await assertScreenshot('contacts/history', getHistoryClip(history));
|
|
85
82
|
});
|
|
86
83
|
|
|
@@ -98,13 +95,8 @@ describe('temba-contact-history', () => {
|
|
|
98
95
|
`.event-count[data-group-index='${idx}']`
|
|
99
96
|
) as HTMLDivElement;
|
|
100
97
|
group.click();
|
|
98
|
+
await clock.runAllAsync();
|
|
99
|
+
expect(group.parentElement.classList.contains('expanded')).equal(true);
|
|
101
100
|
}
|
|
102
|
-
|
|
103
|
-
await waitFor(500);
|
|
104
|
-
|
|
105
|
-
await assertScreenshot(
|
|
106
|
-
'contacts/history-expanded',
|
|
107
|
-
getHistoryClip(history)
|
|
108
|
-
);
|
|
109
101
|
});
|
|
110
102
|
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { assert, expect } from '@open-wc/testing';
|
|
2
2
|
import { CustomEventType } from '../src/interfaces';
|
|
3
|
-
import { ContentMenu
|
|
3
|
+
import { ContentMenu } from '../src/list/ContentMenu';
|
|
4
4
|
import { assertScreenshot, getClip, getComponent } from './utils.test';
|
|
5
5
|
|
|
6
6
|
const TAG = 'temba-content-menu';
|
|
@@ -21,9 +21,13 @@ const getContentMenu = async (attrs: any = {}, width = 0) => {
|
|
|
21
21
|
|
|
22
22
|
// if we have an endpoint, wait for a loaded event before returning
|
|
23
23
|
return new Promise<ContentMenu>(resolve => {
|
|
24
|
-
contentMenu.addEventListener(
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
contentMenu.addEventListener(
|
|
25
|
+
CustomEventType.Loaded,
|
|
26
|
+
async () => {
|
|
27
|
+
resolve(contentMenu);
|
|
28
|
+
},
|
|
29
|
+
{ once: true }
|
|
30
|
+
);
|
|
27
31
|
});
|
|
28
32
|
};
|
|
29
33
|
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
const BORING_LIST = html`<temba-field-manager />`;
|
|
12
12
|
|
|
13
13
|
export const getEle = async (attrs: any = {}) => {
|
|
14
|
-
const fm =
|
|
14
|
+
const fm = `<temba-field-manager
|
|
15
15
|
${getAttributes(attrs)}
|
|
16
16
|
></temba-field-manager>`;
|
|
17
17
|
const parentNode = document.createElement('div');
|
package/test/temba-list.test.ts
CHANGED
|
@@ -1,19 +1,40 @@
|
|
|
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';
|
|
5
7
|
|
|
8
|
+
let clock: any;
|
|
9
|
+
|
|
6
10
|
const TAG = 'temba-list';
|
|
7
11
|
const getList = async (attrs: any = {}) => {
|
|
8
12
|
const list = (await getComponent(TAG, attrs)) as TembaList;
|
|
9
13
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
+
if (!list.endpoint) {
|
|
15
|
+
return list;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
return new Promise<TembaList>(resolve => {
|
|
19
|
+
list.addEventListener(
|
|
20
|
+
CustomEventType.FetchComplete,
|
|
21
|
+
async () => {
|
|
22
|
+
resolve(list);
|
|
23
|
+
},
|
|
24
|
+
{ once: true }
|
|
25
|
+
);
|
|
26
|
+
});
|
|
14
27
|
};
|
|
15
28
|
|
|
16
29
|
describe('temba-list', () => {
|
|
30
|
+
beforeEach(function () {
|
|
31
|
+
clock = useFakeTimers();
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
afterEach(function () {
|
|
35
|
+
clock.restore();
|
|
36
|
+
});
|
|
37
|
+
|
|
17
38
|
it('can be created', async () => {
|
|
18
39
|
const list: TembaList = await getList();
|
|
19
40
|
assert.instanceOf(list, TembaList);
|
|
@@ -38,15 +59,15 @@ describe('temba-list', () => {
|
|
|
38
59
|
endpoint: '/test-assets/list/temba-list.json',
|
|
39
60
|
});
|
|
40
61
|
|
|
41
|
-
const
|
|
62
|
+
const changeTest = new Promise<void>(resolve => {
|
|
63
|
+
list.addEventListener('change', () => {
|
|
64
|
+
resolve();
|
|
65
|
+
});
|
|
66
|
+
});
|
|
42
67
|
|
|
43
|
-
list.addEventListener('change', changeEvent);
|
|
44
68
|
list.cursorIndex = 1;
|
|
45
69
|
|
|
46
|
-
|
|
47
|
-
await waitFor(0);
|
|
48
|
-
|
|
49
|
-
assert(changeEvent.called, 'change event not fired');
|
|
70
|
+
await changeTest;
|
|
50
71
|
await assertScreenshot('list/items-selected', getClip(list));
|
|
51
72
|
});
|
|
52
73
|
|
|
@@ -59,13 +80,14 @@ describe('temba-list', () => {
|
|
|
59
80
|
const changeEvent = sinon.spy();
|
|
60
81
|
list.addEventListener('change', changeEvent);
|
|
61
82
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
83
|
+
const refreshTest = new Promise<void>(resolve => {
|
|
84
|
+
list.addEventListener(CustomEventType.FetchComplete, () => {
|
|
85
|
+
resolve();
|
|
86
|
+
});
|
|
87
|
+
});
|
|
65
88
|
|
|
66
|
-
|
|
67
|
-
await
|
|
68
|
-
await list.httpComplete;
|
|
89
|
+
list.endpoint = '/test-assets/list/temba-list-shorter.json';
|
|
90
|
+
await refreshTest;
|
|
69
91
|
|
|
70
92
|
assert(changeEvent.called, 'change event not fired');
|
|
71
93
|
await assertScreenshot('list/items-updated', getClip(list));
|
package/test/temba-modax.test.ts
CHANGED
|
@@ -23,21 +23,25 @@ const getButtons = (modax: Modax, type: string = null) => {
|
|
|
23
23
|
);
|
|
24
24
|
};
|
|
25
25
|
|
|
26
|
-
const open = async (modax: Modax) => {
|
|
27
|
-
return new Promise((resolve: any, reject: any)=>{
|
|
28
|
-
modax.addEventListener(
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
26
|
+
const open = async (modax: Modax) => {
|
|
27
|
+
return new Promise((resolve: any, reject: any) => {
|
|
28
|
+
modax.addEventListener(
|
|
29
|
+
CustomEventType.Loaded,
|
|
30
|
+
async (event: CustomEvent) => {
|
|
31
|
+
await clock.runAll();
|
|
32
|
+
resolve(event.detail);
|
|
33
|
+
}
|
|
34
|
+
);
|
|
32
35
|
|
|
33
|
-
modax.addEventListener(
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
36
|
+
modax.addEventListener(
|
|
37
|
+
CustomEventType.Redirected,
|
|
38
|
+
async (event: CustomEvent) => {
|
|
39
|
+
await clock.runAll();
|
|
40
|
+
resolve(event.detail);
|
|
41
|
+
}
|
|
42
|
+
);
|
|
37
43
|
|
|
38
44
|
modax.open = true;
|
|
39
|
-
|
|
40
|
-
|
|
41
45
|
});
|
|
42
46
|
};
|
|
43
47
|
|
|
@@ -58,8 +62,6 @@ const clickPrimary = async (modax: Modax) => {
|
|
|
58
62
|
|
|
59
63
|
expect(primary).not.equals(undefined, 'Missing primary button');
|
|
60
64
|
primary.click();
|
|
61
|
-
await waitFor(0);
|
|
62
|
-
await clock.runAll();
|
|
63
65
|
}
|
|
64
66
|
};
|
|
65
67
|
|
|
@@ -109,8 +111,8 @@ describe('temba-modax', () => {
|
|
|
109
111
|
|
|
110
112
|
expect(modax.open).to.equal(true);
|
|
111
113
|
|
|
112
|
-
expect(modax.primaryName).to.equal(
|
|
113
|
-
expect(modax.cancelName).to.equal(
|
|
114
|
+
expect(modax.primaryName).to.equal('Save Everything');
|
|
115
|
+
expect(modax.cancelName).to.equal('Cancel');
|
|
114
116
|
|
|
115
117
|
await assertScreenshot('modax/form', getDialogClip(modax));
|
|
116
118
|
});
|
|
@@ -156,12 +158,19 @@ describe('temba-modax', () => {
|
|
|
156
158
|
expect(primary.name).equals('Save Everything');
|
|
157
159
|
|
|
158
160
|
// click the submit button
|
|
159
|
-
mockPOST(/\/test-assets\/modax\/form\.html/, '', {
|
|
160
|
-
'Temba-Success': '
|
|
161
|
+
mockPOST(/\/test-assets\/modax\/form\.html/, 'arst', {
|
|
162
|
+
'Temba-Success': 'hide',
|
|
161
163
|
});
|
|
162
|
-
await clickPrimary(modax);
|
|
163
164
|
|
|
164
|
-
|
|
165
|
-
|
|
165
|
+
const hideTest = new Promise<void>(resolve => {
|
|
166
|
+
modax.addEventListener(CustomEventType.Submitted, () => {
|
|
167
|
+
expect(modax.open).equals(false, 'Modal still visible');
|
|
168
|
+
resolve();
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
await clickPrimary(modax);
|
|
173
|
+
await clock.runAllAsync();
|
|
174
|
+
await hideTest;
|
|
166
175
|
});
|
|
167
176
|
});
|
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
loadStore,
|
|
10
10
|
} from './utils.test';
|
|
11
11
|
import { range } from '../src/utils';
|
|
12
|
+
import { CustomEventType } from '../src/interfaces';
|
|
12
13
|
|
|
13
14
|
let clock: any;
|
|
14
15
|
|
|
@@ -18,38 +19,39 @@ const colors = [
|
|
|
18
19
|
{ name: 'Blue', value: '2' },
|
|
19
20
|
];
|
|
20
21
|
|
|
21
|
-
export const createSelect = async (def: string
|
|
22
|
+
export const createSelect = async (def: string) => {
|
|
22
23
|
const parentNode = document.createElement('div');
|
|
23
24
|
parentNode.setAttribute('style', 'width: 250px;');
|
|
24
25
|
|
|
25
26
|
const select: Select = await fixture(def, { parentNode });
|
|
26
|
-
clock.
|
|
27
|
+
clock.runAll();
|
|
27
28
|
await select.updateComplete;
|
|
28
|
-
await waitFor(delay);
|
|
29
29
|
return select;
|
|
30
30
|
};
|
|
31
31
|
|
|
32
32
|
export const open = async (select: Select) => {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
// * throttle for scroll event if needed
|
|
40
|
-
// As such, we aggressively wait for http activity
|
|
41
|
-
// and advance possible ticks before and after to
|
|
42
|
-
// reliably wait until the select is truly open
|
|
33
|
+
if (!select.endpoint) {
|
|
34
|
+
await click('temba-select');
|
|
35
|
+
await clock.runAll();
|
|
36
|
+
await clock.runAll();
|
|
37
|
+
return select;
|
|
38
|
+
}
|
|
43
39
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
40
|
+
const promise = new Promise<Select>(resolve => {
|
|
41
|
+
select.addEventListener(
|
|
42
|
+
CustomEventType.FetchComplete,
|
|
43
|
+
async () => {
|
|
44
|
+
await clock.runAll();
|
|
45
|
+
resolve(select);
|
|
46
|
+
},
|
|
47
|
+
{ once: true }
|
|
48
|
+
);
|
|
49
|
+
});
|
|
47
50
|
|
|
48
|
-
await
|
|
49
|
-
await clock.
|
|
51
|
+
await click('temba-select');
|
|
52
|
+
await clock.runAll();
|
|
50
53
|
|
|
51
|
-
|
|
52
|
-
return select;
|
|
54
|
+
return promise;
|
|
53
55
|
};
|
|
54
56
|
|
|
55
57
|
export const clear = (select: Select) => {
|
|
@@ -95,14 +97,6 @@ export const getSelectHTML = (
|
|
|
95
97
|
return selectHTML;
|
|
96
98
|
};
|
|
97
99
|
|
|
98
|
-
export const forPages = async (select: Select, pages = 1) => {
|
|
99
|
-
for (const _ in range(0, pages * 3 + 1)) {
|
|
100
|
-
await select.httpComplete;
|
|
101
|
-
await select.updateComplete;
|
|
102
|
-
await waitFor(0);
|
|
103
|
-
}
|
|
104
|
-
};
|
|
105
|
-
|
|
106
100
|
const getClipWithOptions = (select: Select) => {
|
|
107
101
|
const selectClip = getClip(select);
|
|
108
102
|
const options = select.shadowRoot.querySelector(
|
|
@@ -313,7 +307,6 @@ describe('temba-select', () => {
|
|
|
313
307
|
|
|
314
308
|
await typeInto('temba-select', 're', false);
|
|
315
309
|
await open(select);
|
|
316
|
-
await forPages(select, 2);
|
|
317
310
|
assert.equal(select.visibleOptions.length, 2);
|
|
318
311
|
|
|
319
312
|
await assertScreenshot('select/searching', getClipWithOptions(select));
|
|
@@ -329,7 +322,6 @@ describe('temba-select', () => {
|
|
|
329
322
|
);
|
|
330
323
|
|
|
331
324
|
await open(select);
|
|
332
|
-
await forPages(select, 3);
|
|
333
325
|
|
|
334
326
|
// should have all three pages visible right away
|
|
335
327
|
assert.equal(select.visibleOptions.length, 15);
|
|
@@ -347,11 +339,6 @@ describe('temba-select', () => {
|
|
|
347
339
|
|
|
348
340
|
// wait for updates from fetching three pages
|
|
349
341
|
await open(select);
|
|
350
|
-
await forPages(select, 4);
|
|
351
|
-
|
|
352
|
-
// quiet for searchable
|
|
353
|
-
await waitFor(200);
|
|
354
|
-
|
|
355
342
|
assert.equal(select.visibleOptions.length, 15);
|
|
356
343
|
|
|
357
344
|
// close and reopen
|
|
@@ -362,9 +349,9 @@ describe('temba-select', () => {
|
|
|
362
349
|
assert.equal(select.visibleOptions.length, 15);
|
|
363
350
|
|
|
364
351
|
// close and reopen once more (previous bug failed on third opening)
|
|
365
|
-
select.blur();
|
|
366
|
-
await open(select);
|
|
367
|
-
assert.equal(select.visibleOptions.length, 15);
|
|
352
|
+
// select.blur();
|
|
353
|
+
// await open(select);
|
|
354
|
+
// assert.equal(select.visibleOptions.length, 15);
|
|
368
355
|
});
|
|
369
356
|
|
|
370
357
|
it('can enter expressions', async () => {
|
|
@@ -380,10 +367,6 @@ describe('temba-select', () => {
|
|
|
380
367
|
await typeInto('temba-select', 'Hi there @contact', false);
|
|
381
368
|
await open(select);
|
|
382
369
|
|
|
383
|
-
await forPages(select, 1);
|
|
384
|
-
await clock.tick(400);
|
|
385
|
-
await select.httpComplete;
|
|
386
|
-
|
|
387
370
|
assert.equal(select.completionOptions.length, 14);
|
|
388
371
|
await assertScreenshot('select/expressions', getClipWithOptions(select));
|
|
389
372
|
});
|
|
@@ -403,8 +386,6 @@ describe('temba-select', () => {
|
|
|
403
386
|
expect(select.values.length).to.equal(0);
|
|
404
387
|
});
|
|
405
388
|
|
|
406
|
-
/** */
|
|
407
|
-
|
|
408
389
|
it('should look the same with search enabled', async () => {
|
|
409
390
|
const select = await createSelect(
|
|
410
391
|
getSelectHTML(colors, {
|
package/test/utils.test.ts
CHANGED
|
@@ -7,11 +7,10 @@ interface Clip {
|
|
|
7
7
|
height: number;
|
|
8
8
|
}
|
|
9
9
|
|
|
10
|
-
import { expect, fixture, html, assert } from '@open-wc/testing';
|
|
10
|
+
import { expect, fixture, html, assert, waitUntil } from '@open-wc/testing';
|
|
11
11
|
import MouseHelper from './MouseHelper';
|
|
12
12
|
import { Store } from '../src/store/Store';
|
|
13
13
|
import { replace, stub } from 'sinon';
|
|
14
|
-
import { fail } from 'assert';
|
|
15
14
|
|
|
16
15
|
export interface CodeMock {
|
|
17
16
|
endpoint: RegExp;
|
|
@@ -140,10 +139,17 @@ export const delay = (millis: number) => {
|
|
|
140
139
|
export const assertScreenshot = async (
|
|
141
140
|
filename: string,
|
|
142
141
|
clip: Clip,
|
|
143
|
-
|
|
144
|
-
exclude: Clip[] = []
|
|
142
|
+
waitFor?: { clock?: any; predicate?: () => boolean }
|
|
145
143
|
) => {
|
|
146
|
-
|
|
144
|
+
if (waitFor) {
|
|
145
|
+
if (waitFor.clock) {
|
|
146
|
+
waitFor.clock.restore();
|
|
147
|
+
}
|
|
148
|
+
await waitUntil(waitFor.predicate);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
const threshold = 0.1;
|
|
152
|
+
const exclude: Clip[] = [];
|
|
147
153
|
|
|
148
154
|
try {
|
|
149
155
|
await (window as any).matchPageSnapshot(
|