@skyux/avatar 11.15.1 → 11.16.0
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/documentation.json +911 -47
- package/esm2022/testing/avatar/avatar-harness-filters.mjs +2 -0
- package/esm2022/testing/avatar/avatar-harness.mjs +118 -0
- package/esm2022/testing/public-api.mjs +2 -1
- package/fesm2022/skyux-avatar-testing.mjs +119 -1
- package/fesm2022/skyux-avatar-testing.mjs.map +1 -1
- package/package.json +8 -7
- package/testing/avatar/avatar-harness-filters.d.ts +6 -0
- package/testing/avatar/avatar-harness.d.ts +46 -0
- package/testing/public-api.d.ts +1 -0
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXZhdGFyLWhhcm5lc3MtZmlsdGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9hdmF0YXIvdGVzdGluZy9zcmMvYXZhdGFyL2F2YXRhci1oYXJuZXNzLWZpbHRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNreUhhcm5lc3NGaWx0ZXJzIH0gZnJvbSAnQHNreXV4L2NvcmUvdGVzdGluZyc7XG5cbi8qKlxuICogQSBzZXQgb2YgY3JpdGVyaWEgdGhhdCBjYW4gYmUgdXNlZCB0byBmaWx0ZXIgYSBsaXN0IG9mIFNreUF2YXRhckhhcm5lc3MgaW5zdGFuY2VzLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWludGVyZmFjZVxuZXhwb3J0IGludGVyZmFjZSBTa3lBdmF0YXJIYXJuZXNzRmlsdGVycyBleHRlbmRzIFNreUhhcm5lc3NGaWx0ZXJzIHt9XG4iXX0=
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { SkyComponentHarness, SkyHarnessUtility } from '@skyux/core/testing';
|
|
2
|
+
import { SkyErrorModalHarness } from '@skyux/errors/testing';
|
|
3
|
+
import { SkyFileDropHarness } from '@skyux/forms/testing';
|
|
4
|
+
const WAIT_INTERVAL = 10;
|
|
5
|
+
const WAIT_TIMEOUT = 3000;
|
|
6
|
+
async function isHidden(el) {
|
|
7
|
+
return (await el.getCssValue('display')) === 'none';
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Harness for interacting with an avatar component in tests.
|
|
11
|
+
*/
|
|
12
|
+
export class SkyAvatarHarness extends SkyComponentHarness {
|
|
13
|
+
/**
|
|
14
|
+
* @internal
|
|
15
|
+
*/
|
|
16
|
+
static { this.hostSelector = 'sky-avatar'; }
|
|
17
|
+
#documentRootLocator = this.documentRootLocatorFactory();
|
|
18
|
+
#getFileDrop = this.locatorForOptional(SkyFileDropHarness);
|
|
19
|
+
#errorModal = this.#documentRootLocator.locatorForOptional(SkyErrorModalHarness);
|
|
20
|
+
/**
|
|
21
|
+
* Gets a `HarnessPredicate` that can be used to search for a
|
|
22
|
+
* `SkyAvatarHarness` that meets certain criteria.
|
|
23
|
+
*/
|
|
24
|
+
static with(filters) {
|
|
25
|
+
return SkyAvatarHarness.getDataSkyIdPredicate(filters);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Gets the initials displayed when no image URL is specified.
|
|
29
|
+
*/
|
|
30
|
+
async getInitials() {
|
|
31
|
+
const initialsEl = await this.locatorFor('.sky-avatar-initials')();
|
|
32
|
+
if (await isHidden(initialsEl)) {
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
return initialsEl.text();
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Gets the avatar's current image URL or Blob.
|
|
39
|
+
*/
|
|
40
|
+
async getSrc() {
|
|
41
|
+
const url = await this.#getImageUrl();
|
|
42
|
+
if (url?.startsWith('blob:')) {
|
|
43
|
+
return await (await fetch(url)).blob();
|
|
44
|
+
}
|
|
45
|
+
return url;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Gets whether users can change the image.
|
|
49
|
+
*/
|
|
50
|
+
async getCanChange() {
|
|
51
|
+
return !!(await this.#getFileDrop());
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Simulates the user selecting or dropping an image onto the component.
|
|
55
|
+
*/
|
|
56
|
+
async dropAvatarFile(file, waitForChange) {
|
|
57
|
+
const fileDrop = await this.#getFileDrop();
|
|
58
|
+
if (!fileDrop) {
|
|
59
|
+
throw new Error('A new avatar cannot be selected because the canChange input is not set to true.');
|
|
60
|
+
}
|
|
61
|
+
if (waitForChange) {
|
|
62
|
+
await this.#dropAndWait(fileDrop, file);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
await fileDrop.dropFile(file);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Gets whether an error indicating an invalid file type is displayed.
|
|
70
|
+
*/
|
|
71
|
+
async hasFileTypeError() {
|
|
72
|
+
const errorModal = await this.#errorModal();
|
|
73
|
+
return !!(await errorModal?.getTitle())?.includes('File is not an image.');
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Gets whether an error indicating an invalid file size is displayed.
|
|
77
|
+
*/
|
|
78
|
+
async hasMaxSizeError() {
|
|
79
|
+
const errorModal = await this.#errorModal();
|
|
80
|
+
return !!(await errorModal?.getTitle())?.includes('File is too large.');
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Closes the currently displayed error.
|
|
84
|
+
*/
|
|
85
|
+
async closeError() {
|
|
86
|
+
const errorModal = await this.#errorModal();
|
|
87
|
+
if (!errorModal) {
|
|
88
|
+
throw new Error('No error is currently displayed.');
|
|
89
|
+
}
|
|
90
|
+
await errorModal.clickCloseButton();
|
|
91
|
+
}
|
|
92
|
+
async #getImageUrl() {
|
|
93
|
+
const imageEl = await this.locatorFor('.sky-avatar-image')();
|
|
94
|
+
if (await isHidden(imageEl)) {
|
|
95
|
+
return undefined;
|
|
96
|
+
}
|
|
97
|
+
return SkyHarnessUtility.getBackgroundImageUrl(imageEl);
|
|
98
|
+
}
|
|
99
|
+
async #dropAndWait(fileDrop, file) {
|
|
100
|
+
const currentUrl = await this.#getImageUrl();
|
|
101
|
+
await fileDrop.dropFile(file);
|
|
102
|
+
return new Promise((resolve, reject) => {
|
|
103
|
+
const checkForFileChange = async (attempts) => {
|
|
104
|
+
if ((await this.#getImageUrl()) !== currentUrl) {
|
|
105
|
+
resolve();
|
|
106
|
+
}
|
|
107
|
+
else if (attempts * WAIT_INTERVAL < WAIT_TIMEOUT) {
|
|
108
|
+
setTimeout(() => void checkForFileChange(attempts + 1), WAIT_INTERVAL);
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
reject(new Error('The avatar src did not change within the expected time span'));
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
void checkForFileChange(0);
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXZhdGFyLWhhcm5lc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvYXZhdGFyL3Rlc3Rpbmcvc3JjL2F2YXRhci9hdmF0YXItaGFybmVzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM3RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUkxRCxNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUM7QUFDekIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDO0FBRTFCLEtBQUssVUFBVSxRQUFRLENBQUMsRUFBZTtJQUNyQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUFDO0FBQ3RELENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sT0FBTyxnQkFBaUIsU0FBUSxtQkFBbUI7SUFDdkQ7O09BRUc7YUFDVyxpQkFBWSxHQUFHLFlBQVksQ0FBQztJQUUxQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztJQUV6RCxZQUFZLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDM0QsV0FBVyxHQUNULElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxrQkFBa0IsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBRXJFOzs7T0FHRztJQUNJLE1BQU0sQ0FBQyxJQUFJLENBQ2hCLE9BQWdDO1FBRWhDLE9BQU8sZ0JBQWdCLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLFdBQVc7UUFDdEIsTUFBTSxVQUFVLEdB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LENBQUMsSUFBSSxDQUFDLENBQUM7UUFFOUIsT0FBTyxJQUFJLE9BQU8sQ0FBTyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUMzQyxNQUFNLGtCQUFrQixHQUFHLEtBQUssRUFBRSxRQUFnQixFQUFpQixFQUFFO2dCQUNuRSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsS0FBSyxVQUFVLEVBQUUsQ0FBQztvQkFDL0MsT0FBTyxFQUFFLENBQUM7Z0JBQ1osQ0FBQztxQkFBTSxJQUFJLFFBQVEsR0FBRyxhQUFhLEdBQUcsWUFBWSxFQUFFLENBQUM7b0JBQ25ELFVBQVUsQ0FDUixHQUFHLEVBQUUsQ0FBQyxLQUFLLGtCQUFrQixDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsRUFDM0MsYUFBYSxDQUNkLENBQUM7Z0JBQ0osQ0FBQztxQkFBTSxDQUFDO29CQUNOLE1BQU0sQ0FDSixJQUFJLEtBQUssQ0FDUCw2REFBNkQsQ0FDOUQsQ0FDRixDQUFDO2dCQUNKLENBQUM7WUFDSCxDQUFDLENBQUM7WUFFRixLQUFLLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEhhcm5lc3NQcmVkaWNhdGUsIFRlc3RFbGVtZW50IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3Rlc3RpbmcnO1xuaW1wb3J0IHsgU2t5Q29tcG9uZW50SGFybmVzcywgU2t5SGFybmVzc1V0aWxpdHkgfSBmcm9tICdAc2t5dXgvY29yZS90ZXN0aW5nJztcbmltcG9ydCB7IFNreUVycm9yTW9kYWxIYXJuZXNzIH0gZnJvbSAnQHNreXV4L2Vycm9ycy90ZXN0aW5nJztcbmltcG9ydCB7IFNreUZpbGVEcm9wSGFybmVzcyB9IGZyb20gJ0Bza3l1eC9mb3Jtcy90ZXN0aW5nJztcblxuaW1wb3J0IHsgU2t5QXZhdGFySGFybmVzc0ZpbHRlcnMgfSBmcm9tICcuL2F2YXRhci1oYXJuZXNzLWZpbHRlcnMnO1xuXG5jb25zdCBXQUlUX0lOVEVSVkFMID0gMTA7XG5jb25zdCBXQUlUX1RJTUVPVVQgPSAzMDAwO1xuXG5hc3luYyBmdW5jdGlvbiBpc0hpZGRlbihlbDogVGVzdEVsZW1lbnQpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgcmV0dXJuIChhd2FpdCBlbC5nZXRDc3NWYWx1ZSgnZGlzcGxheScpKSA9PT0gJ25vbmUnO1xufVxuXG4vKipcbiAqIEhhcm5lc3MgZm9yIGludGVyYWN0aW5nIHdpdGggYW4gYXZhdGFyIGNvbXBvbmVudCBpbiB0ZXN0cy5cbiAqL1xuZXhwb3J0IGNsYXNzIFNreUF2YXRhckhhcm5lc3MgZXh0ZW5kcyBTa3lDb21wb25lbnRIYXJuZXNzIHtcbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBob3N0U2VsZWN0b3IgPSAnc2t5LWF2YXRhcic7XG5cbiAgI2RvY3VtZW50Um9vdExvY2F0b3IgPSB0aGlzLmRvY3VtZW50Um9vdExvY2F0b3JGYWN0b3J5KCk7XG5cbiAgI2dldEZpbGVEcm9wID0gdGhpcy5sb2NhdG9yRm9yT3B0aW9uYWwoU2t5RmlsZURyb3BIYXJuZXNzKTtcbiAgI2Vycm9yTW9kYWwgPVxuICAgIHRoaXMuI2RvY3VtZW50Um9vdExvY2F0b3IubG9jYXRvckZvck9wdGlvbmFsKFNreUVycm9yTW9kYWxIYXJuZXNzKTtcblxuICAvKipcbiAgICogR2V0cyBhIGBIYXJuZXNzUHJlZGljYXRlYCB0aGF0IGNhbiBiZSB1c2VkIHRvIHNlYXJjaCBmb3IgYVxuICAgKiBgU2t5QXZhdGFySGFybmVzc2AgdGhhdCBtZWV0cyBjZXJ0YWluIGNyaXRlcmlhLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB3aXRoKFxuICAgIGZpbHRlcnM6IFNreUF2YXRhckhhcm5lc3NGaWx0ZXJzLFxuICApOiBIYXJuZXNzUHJlZGljYXRlPFNreUF2YXRhckhhcm5lc3M+IHtcbiAgICByZXR1cm4gU2t5QXZhdGFySGFybmVzcy5nZXREYXRhU2t5SWRQcmVkaWNhdGUoZmlsdGVycyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgaW5pdGlhbHMgZGlzcGxheWVkIHdoZW4gbm8gaW1hZ2UgVVJMIGlzIHNwZWNpZmllZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRJbml0aWFscygpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IGluaXRpYWxzRWwgPSBhd2FpdCB0aGlzLmxvY2F0b3JGb3IoJy5za3ktYXZhdGFyLWluaXRpYWxzJykoKTtcblxuICAgIGlmIChhd2FpdCBpc0hpZGRlbihpbml0aWFsc0VsKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5pdGlhbHNFbC50ZXh0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgYXZhdGFyJ3MgY3VycmVudCBpbWFnZSBVUkwgb3IgQmxvYi5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRTcmMoKTogUHJvbWlzZTxzdHJpbmcgfCBCbG9iIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgdXJsID0gYXdhaXQgdGhpcy4jZ2V0SW1hZ2VVcmwoKTtcblxuICAgIGlmICh1cmw/LnN0YXJ0c1dpdGgoJ2Jsb2I6JykpIHtcbiAgICAgIHJldHVybiBhd2FpdCAoYXdhaXQgZmV0Y2godXJsKSkuYmxvYigpO1xuICAgIH1cblxuICAgIHJldHVybiB1cmw7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB3aGV0aGVyIHVzZXJzIGNhbiBjaGFuZ2UgdGhlIGltYWdlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENhbkNoYW5nZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gISEoYXdhaXQgdGhpcy4jZ2V0RmlsZURyb3AoKSk7XG4gIH1cblxuICAvKipcbiAgICogU2ltdWxhdGVzIHRoZSB1c2VyIHNlbGVjdGluZyBvciBkcm9wcGluZyBhbiBpbWFnZSBvbnRvIHRoZSBjb21wb25lbnQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZHJvcEF2YXRhckZpbGUoXG4gICAgZmlsZTogRmlsZSxcbiAgICB3YWl0Rm9yQ2hhbmdlPzogYm9vbGVhbixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZmlsZURyb3AgPSBhd2FpdCB0aGlzLiNnZXRGaWxlRHJvcCgpO1xuXG4gICAgaWYgKCFmaWxlRHJvcCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnQSBuZXcgYXZhdGFyIGNhbm5vdCBiZSBzZWxlY3RlZCBiZWNhdXNlIHRoZSBjYW5DaGFuZ2UgaW5wdXQgaXMgbm90IHNldCB0byB0cnVlLicsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh3YWl0Rm9yQ2hhbmdlKSB7XG4gICAgICBhd2FpdCB0aGlzLiNkcm9wQW5kV2FpdChmaWxlRHJvcCwgZmlsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IGZpbGVEcm9wLmRyb3BGaWxlKGZpbGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHdoZXRoZXIgYW4gZXJyb3IgaW5kaWNhdGluZyBhbiBpbnZhbGlkIGZpbGUgdHlwZSBpcyBkaXNwbGF5ZWQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaGFzRmlsZVR5cGVFcnJvcigpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBlcnJvck1vZGFsID0gYXdhaXQgdGhpcy4jZXJyb3JNb2RhbCgpO1xuXG4gICAgcmV0dXJuICEhKGF3YWl0IGVycm9yTW9kYWw/LmdldFRpdGxlKCkpPy5pbmNsdWRlcygnRmlsZSBpcyBub3QgYW4gaW1hZ2UuJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB3aGV0aGVyIGFuIGVycm9yIGluZGljYXRpbmcgYW4gaW52YWxpZCBmaWxlIHNpemUgaXMgZGlzcGxheWVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGhhc01heFNpemVFcnJvcigpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBlcnJvck1vZGFsID0gYXdhaXQgdGhpcy4jZXJyb3JNb2RhbCgpO1xuXG4gICAgcmV0dXJuICEhKGF3YWl0IGVycm9yTW9kYWw/LmdldFRpdGxlKCkpPy5pbmNsdWRlcygnRmlsZSBpcyB0b28gbGFyZ2UuJyk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoZSBjdXJyZW50bHkgZGlzcGxheWVkIGVycm9yLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNsb3NlRXJyb3IoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZXJyb3JNb2RhbCA9IGF3YWl0IHRoaXMuI2Vycm9yTW9kYWwoKTtcblxuICAgIGlmICghZXJyb3JNb2RhbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBlcnJvciBpcyBjdXJyZW50bHkgZGlzcGxheWVkLicpO1xuICAgIH1cblxuICAgIGF3YWl0IGVycm9yTW9kYWwuY2xpY2tDbG9zZUJ1dHRvbigpO1xuICB9XG5cbiAgYXN5bmMgI2dldEltYWdlVXJsKCk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgaW1hZ2VFbCA9IGF3YWl0IHRoaXMubG9jYXRvckZvcignLnNreS1hdmF0YXItaW1hZ2UnKSgpO1xuXG4gICAgaWYgKGF3YWl0IGlzSGlkZGVuKGltYWdlRWwpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiBTa3lIYXJuZXNzVXRpbGl0eS5nZXRCYWNrZ3JvdW5kSW1hZ2VVcmwoaW1hZ2VFbCk7XG4gIH1cblxuICBhc3luYyAjZHJvcEFuZFdhaXQoZmlsZURyb3A6IFNreUZpbGVEcm9wSGFybmVzcywgZmlsZTogRmlsZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGN1cnJlbnRVcmwgPSBhd2FpdCB0aGlzLiNnZXRJbWFnZVVybCgpO1xuXG4gICAgYXdhaXQgZmlsZURyb3AuZHJvcEZpbGUoZmlsZSk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgY2hlY2tGb3JGaWxlQ2hhbmdlID0gYXN5bmMgKGF0dGVtcHRzOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgaWYgKChhd2FpdCB0aGlzLiNnZXRJbWFnZVVybCgpKSAhPT0gY3VycmVudFVybCkge1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSBlbHNlIGlmIChhdHRlbXB0cyAqIFdBSVRfSU5URVJWQUwgPCBXQUlUX1RJTUVPVVQpIHtcbiAgICAgICAgICBzZXRUaW1lb3V0KFxuICAgICAgICAgICAgKCkgPT4gdm9pZCBjaGVja0ZvckZpbGVDaGFuZ2UoYXR0ZW1wdHMgKyAxKSxcbiAgICAgICAgICAgIFdBSVRfSU5URVJWQUwsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QoXG4gICAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICdUaGUgYXZhdGFyIHNyYyBkaWQgbm90IGNoYW5nZSB3aXRoaW4gdGhlIGV4cGVjdGVkIHRpbWUgc3BhbicsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHZvaWQgY2hlY2tGb3JGaWxlQ2hhbmdlKDApO1xuICAgIH0pO1xuICB9XG59XG4iXX0=
|
|
@@ -1,2 +1,3 @@
|
|
|
1
1
|
export { SkyAvatarFixture } from './avatar-fixture';
|
|
2
|
-
|
|
2
|
+
export { SkyAvatarHarness } from './avatar/avatar-harness';
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9hdmF0YXIvdGVzdGluZy9zcmMvcHVibGljLWFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVwRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IFNreUF2YXRhckZpeHR1cmUgfSBmcm9tICcuL2F2YXRhci1maXh0dXJlJztcblxuZXhwb3J0IHsgU2t5QXZhdGFySGFybmVzcyB9IGZyb20gJy4vYXZhdGFyL2F2YXRhci1oYXJuZXNzJztcbiJdfQ==
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { By } from '@angular/platform-browser';
|
|
2
2
|
import { SkyAppTestUtility } from '@skyux-sdk/testing';
|
|
3
|
+
import { SkyComponentHarness, SkyHarnessUtility } from '@skyux/core/testing';
|
|
4
|
+
import { SkyErrorModalHarness } from '@skyux/errors/testing';
|
|
5
|
+
import { SkyFileDropHarness } from '@skyux/forms/testing';
|
|
3
6
|
|
|
4
7
|
/**
|
|
5
8
|
* Allows interaction with a SKY UX avatar component.
|
|
@@ -32,9 +35,124 @@ class SkyAvatarFixture {
|
|
|
32
35
|
}
|
|
33
36
|
}
|
|
34
37
|
|
|
38
|
+
const WAIT_INTERVAL = 10;
|
|
39
|
+
const WAIT_TIMEOUT = 3000;
|
|
40
|
+
async function isHidden(el) {
|
|
41
|
+
return (await el.getCssValue('display')) === 'none';
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Harness for interacting with an avatar component in tests.
|
|
45
|
+
*/
|
|
46
|
+
class SkyAvatarHarness extends SkyComponentHarness {
|
|
47
|
+
/**
|
|
48
|
+
* @internal
|
|
49
|
+
*/
|
|
50
|
+
static { this.hostSelector = 'sky-avatar'; }
|
|
51
|
+
#documentRootLocator = this.documentRootLocatorFactory();
|
|
52
|
+
#getFileDrop = this.locatorForOptional(SkyFileDropHarness);
|
|
53
|
+
#errorModal = this.#documentRootLocator.locatorForOptional(SkyErrorModalHarness);
|
|
54
|
+
/**
|
|
55
|
+
* Gets a `HarnessPredicate` that can be used to search for a
|
|
56
|
+
* `SkyAvatarHarness` that meets certain criteria.
|
|
57
|
+
*/
|
|
58
|
+
static with(filters) {
|
|
59
|
+
return SkyAvatarHarness.getDataSkyIdPredicate(filters);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Gets the initials displayed when no image URL is specified.
|
|
63
|
+
*/
|
|
64
|
+
async getInitials() {
|
|
65
|
+
const initialsEl = await this.locatorFor('.sky-avatar-initials')();
|
|
66
|
+
if (await isHidden(initialsEl)) {
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
return initialsEl.text();
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Gets the avatar's current image URL or Blob.
|
|
73
|
+
*/
|
|
74
|
+
async getSrc() {
|
|
75
|
+
const url = await this.#getImageUrl();
|
|
76
|
+
if (url?.startsWith('blob:')) {
|
|
77
|
+
return await (await fetch(url)).blob();
|
|
78
|
+
}
|
|
79
|
+
return url;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Gets whether users can change the image.
|
|
83
|
+
*/
|
|
84
|
+
async getCanChange() {
|
|
85
|
+
return !!(await this.#getFileDrop());
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Simulates the user selecting or dropping an image onto the component.
|
|
89
|
+
*/
|
|
90
|
+
async dropAvatarFile(file, waitForChange) {
|
|
91
|
+
const fileDrop = await this.#getFileDrop();
|
|
92
|
+
if (!fileDrop) {
|
|
93
|
+
throw new Error('A new avatar cannot be selected because the canChange input is not set to true.');
|
|
94
|
+
}
|
|
95
|
+
if (waitForChange) {
|
|
96
|
+
await this.#dropAndWait(fileDrop, file);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
await fileDrop.dropFile(file);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Gets whether an error indicating an invalid file type is displayed.
|
|
104
|
+
*/
|
|
105
|
+
async hasFileTypeError() {
|
|
106
|
+
const errorModal = await this.#errorModal();
|
|
107
|
+
return !!(await errorModal?.getTitle())?.includes('File is not an image.');
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Gets whether an error indicating an invalid file size is displayed.
|
|
111
|
+
*/
|
|
112
|
+
async hasMaxSizeError() {
|
|
113
|
+
const errorModal = await this.#errorModal();
|
|
114
|
+
return !!(await errorModal?.getTitle())?.includes('File is too large.');
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Closes the currently displayed error.
|
|
118
|
+
*/
|
|
119
|
+
async closeError() {
|
|
120
|
+
const errorModal = await this.#errorModal();
|
|
121
|
+
if (!errorModal) {
|
|
122
|
+
throw new Error('No error is currently displayed.');
|
|
123
|
+
}
|
|
124
|
+
await errorModal.clickCloseButton();
|
|
125
|
+
}
|
|
126
|
+
async #getImageUrl() {
|
|
127
|
+
const imageEl = await this.locatorFor('.sky-avatar-image')();
|
|
128
|
+
if (await isHidden(imageEl)) {
|
|
129
|
+
return undefined;
|
|
130
|
+
}
|
|
131
|
+
return SkyHarnessUtility.getBackgroundImageUrl(imageEl);
|
|
132
|
+
}
|
|
133
|
+
async #dropAndWait(fileDrop, file) {
|
|
134
|
+
const currentUrl = await this.#getImageUrl();
|
|
135
|
+
await fileDrop.dropFile(file);
|
|
136
|
+
return new Promise((resolve, reject) => {
|
|
137
|
+
const checkForFileChange = async (attempts) => {
|
|
138
|
+
if ((await this.#getImageUrl()) !== currentUrl) {
|
|
139
|
+
resolve();
|
|
140
|
+
}
|
|
141
|
+
else if (attempts * WAIT_INTERVAL < WAIT_TIMEOUT) {
|
|
142
|
+
setTimeout(() => void checkForFileChange(attempts + 1), WAIT_INTERVAL);
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
reject(new Error('The avatar src did not change within the expected time span'));
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
void checkForFileChange(0);
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
35
153
|
/**
|
|
36
154
|
* Generated bundle index. Do not edit.
|
|
37
155
|
*/
|
|
38
156
|
|
|
39
|
-
export { SkyAvatarFixture };
|
|
157
|
+
export { SkyAvatarFixture, SkyAvatarHarness };
|
|
40
158
|
//# sourceMappingURL=skyux-avatar-testing.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skyux-avatar-testing.mjs","sources":["../../../../../libs/components/avatar/testing/src/avatar-fixture.ts","../../../../../libs/components/avatar/testing/src/skyux-avatar-testing.ts"],"sourcesContent":["import { DebugElement } from '@angular/core';\nimport { ComponentFixture } from '@angular/core/testing';\nimport { By } from '@angular/platform-browser';\nimport { SkyAppTestUtility } from '@skyux-sdk/testing';\n\n/**\n * Allows interaction with a SKY UX avatar component.\n * @internal\n */\nexport class SkyAvatarFixture {\n /**\n * The initials displayed when no image URL is specified.\n */\n public get initials(): string | undefined {\n const initialsEl = this.#debugEl.query(By.css('.sky-avatar-initials'));\n\n if (SkyAppTestUtility.isVisible(initialsEl)) {\n return SkyAppTestUtility.getText(\n initialsEl.query(By.css('.sky-avatar-initials-inner')),\n );\n }\n\n return undefined;\n }\n\n /**\n * The avatar's current image URL.\n */\n public get imageUrl(): string | undefined {\n const imageEl = this.#debugEl.query(By.css('.sky-avatar-image'));\n\n if (SkyAppTestUtility.isVisible(imageEl)) {\n return SkyAppTestUtility.getBackgroundImageUrl(imageEl);\n }\n\n return undefined;\n }\n\n #debugEl: DebugElement;\n\n constructor(fixture: ComponentFixture<any>, skyTestId: string) {\n this.#debugEl = SkyAppTestUtility.getDebugElementByTestId(\n fixture,\n skyTestId,\n 'sky-avatar',\n );\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"skyux-avatar-testing.mjs","sources":["../../../../../libs/components/avatar/testing/src/avatar-fixture.ts","../../../../../libs/components/avatar/testing/src/avatar/avatar-harness.ts","../../../../../libs/components/avatar/testing/src/skyux-avatar-testing.ts"],"sourcesContent":["import { DebugElement } from '@angular/core';\nimport { ComponentFixture } from '@angular/core/testing';\nimport { By } from '@angular/platform-browser';\nimport { SkyAppTestUtility } from '@skyux-sdk/testing';\n\n/**\n * Allows interaction with a SKY UX avatar component.\n * @internal\n */\nexport class SkyAvatarFixture {\n /**\n * The initials displayed when no image URL is specified.\n */\n public get initials(): string | undefined {\n const initialsEl = this.#debugEl.query(By.css('.sky-avatar-initials'));\n\n if (SkyAppTestUtility.isVisible(initialsEl)) {\n return SkyAppTestUtility.getText(\n initialsEl.query(By.css('.sky-avatar-initials-inner')),\n );\n }\n\n return undefined;\n }\n\n /**\n * The avatar's current image URL.\n */\n public get imageUrl(): string | undefined {\n const imageEl = this.#debugEl.query(By.css('.sky-avatar-image'));\n\n if (SkyAppTestUtility.isVisible(imageEl)) {\n return SkyAppTestUtility.getBackgroundImageUrl(imageEl);\n }\n\n return undefined;\n }\n\n #debugEl: DebugElement;\n\n constructor(fixture: ComponentFixture<any>, skyTestId: string) {\n this.#debugEl = SkyAppTestUtility.getDebugElementByTestId(\n fixture,\n skyTestId,\n 'sky-avatar',\n );\n }\n}\n","import { HarnessPredicate, TestElement } from '@angular/cdk/testing';\nimport { SkyComponentHarness, SkyHarnessUtility } from '@skyux/core/testing';\nimport { SkyErrorModalHarness } from '@skyux/errors/testing';\nimport { SkyFileDropHarness } from '@skyux/forms/testing';\n\nimport { SkyAvatarHarnessFilters } from './avatar-harness-filters';\n\nconst WAIT_INTERVAL = 10;\nconst WAIT_TIMEOUT = 3000;\n\nasync function isHidden(el: TestElement): Promise<boolean> {\n return (await el.getCssValue('display')) === 'none';\n}\n\n/**\n * Harness for interacting with an avatar component in tests.\n */\nexport class SkyAvatarHarness extends SkyComponentHarness {\n /**\n * @internal\n */\n public static hostSelector = 'sky-avatar';\n\n #documentRootLocator = this.documentRootLocatorFactory();\n\n #getFileDrop = this.locatorForOptional(SkyFileDropHarness);\n #errorModal =\n this.#documentRootLocator.locatorForOptional(SkyErrorModalHarness);\n\n /**\n * Gets a `HarnessPredicate` that can be used to search for a\n * `SkyAvatarHarness` that meets certain criteria.\n */\n public static with(\n filters: SkyAvatarHarnessFilters,\n ): HarnessPredicate<SkyAvatarHarness> {\n return SkyAvatarHarness.getDataSkyIdPredicate(filters);\n }\n\n /**\n * Gets the initials displayed when no image URL is specified.\n */\n public async getInitials(): Promise<string | undefined> {\n const initialsEl = await this.locatorFor('.sky-avatar-initials')();\n\n if (await isHidden(initialsEl)) {\n return undefined;\n }\n\n return initialsEl.text();\n }\n\n /**\n * Gets the avatar's current image URL or Blob.\n */\n public async getSrc(): Promise<string | Blob | undefined> {\n const url = await this.#getImageUrl();\n\n if (url?.startsWith('blob:')) {\n return await (await fetch(url)).blob();\n }\n\n return url;\n }\n\n /**\n * Gets whether users can change the image.\n */\n public async getCanChange(): Promise<boolean> {\n return !!(await this.#getFileDrop());\n }\n\n /**\n * Simulates the user selecting or dropping an image onto the component.\n */\n public async dropAvatarFile(\n file: File,\n waitForChange?: boolean,\n ): Promise<void> {\n const fileDrop = await this.#getFileDrop();\n\n if (!fileDrop) {\n throw new Error(\n 'A new avatar cannot be selected because the canChange input is not set to true.',\n );\n }\n\n if (waitForChange) {\n await this.#dropAndWait(fileDrop, file);\n } else {\n await fileDrop.dropFile(file);\n }\n }\n\n /**\n * Gets whether an error indicating an invalid file type is displayed.\n */\n public async hasFileTypeError(): Promise<boolean> {\n const errorModal = await this.#errorModal();\n\n return !!(await errorModal?.getTitle())?.includes('File is not an image.');\n }\n\n /**\n * Gets whether an error indicating an invalid file size is displayed.\n */\n public async hasMaxSizeError(): Promise<boolean> {\n const errorModal = await this.#errorModal();\n\n return !!(await errorModal?.getTitle())?.includes('File is too large.');\n }\n\n /**\n * Closes the currently displayed error.\n */\n public async closeError(): Promise<void> {\n const errorModal = await this.#errorModal();\n\n if (!errorModal) {\n throw new Error('No error is currently displayed.');\n }\n\n await errorModal.clickCloseButton();\n }\n\n async #getImageUrl(): Promise<string | undefined> {\n const imageEl = await this.locatorFor('.sky-avatar-image')();\n\n if (await isHidden(imageEl)) {\n return undefined;\n }\n\n return SkyHarnessUtility.getBackgroundImageUrl(imageEl);\n }\n\n async #dropAndWait(fileDrop: SkyFileDropHarness, file: File): Promise<void> {\n const currentUrl = await this.#getImageUrl();\n\n await fileDrop.dropFile(file);\n\n return new Promise<void>((resolve, reject) => {\n const checkForFileChange = async (attempts: number): Promise<void> => {\n if ((await this.#getImageUrl()) !== currentUrl) {\n resolve();\n } else if (attempts * WAIT_INTERVAL < WAIT_TIMEOUT) {\n setTimeout(\n () => void checkForFileChange(attempts + 1),\n WAIT_INTERVAL,\n );\n } else {\n reject(\n new Error(\n 'The avatar src did not change within the expected time span',\n ),\n );\n }\n };\n\n void checkForFileChange(0);\n });\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@skyux/avatar",
|
|
3
|
-
"version": "11.
|
|
3
|
+
"version": "11.16.0",
|
|
4
4
|
"author": "Blackbaud, Inc.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"blackbaud",
|
|
@@ -36,15 +36,16 @@
|
|
|
36
36
|
}
|
|
37
37
|
},
|
|
38
38
|
"peerDependencies": {
|
|
39
|
+
"@angular/cdk": "^18.2.8",
|
|
39
40
|
"@angular/common": "^18.2.8",
|
|
40
41
|
"@angular/core": "^18.2.8",
|
|
41
42
|
"@angular/platform-browser": "^18.2.8",
|
|
42
|
-
"@skyux-sdk/testing": "11.
|
|
43
|
-
"@skyux/core": "11.
|
|
44
|
-
"@skyux/errors": "11.
|
|
45
|
-
"@skyux/forms": "11.
|
|
46
|
-
"@skyux/i18n": "11.
|
|
47
|
-
"@skyux/theme": "11.
|
|
43
|
+
"@skyux-sdk/testing": "11.16.0",
|
|
44
|
+
"@skyux/core": "11.16.0",
|
|
45
|
+
"@skyux/errors": "11.16.0",
|
|
46
|
+
"@skyux/forms": "11.16.0",
|
|
47
|
+
"@skyux/i18n": "11.16.0",
|
|
48
|
+
"@skyux/theme": "11.16.0"
|
|
48
49
|
},
|
|
49
50
|
"dependencies": {
|
|
50
51
|
"tslib": "^2.6.3"
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { HarnessPredicate } from '@angular/cdk/testing';
|
|
2
|
+
import { SkyComponentHarness } from '@skyux/core/testing';
|
|
3
|
+
import { SkyAvatarHarnessFilters } from './avatar-harness-filters';
|
|
4
|
+
/**
|
|
5
|
+
* Harness for interacting with an avatar component in tests.
|
|
6
|
+
*/
|
|
7
|
+
export declare class SkyAvatarHarness extends SkyComponentHarness {
|
|
8
|
+
#private;
|
|
9
|
+
/**
|
|
10
|
+
* @internal
|
|
11
|
+
*/
|
|
12
|
+
static hostSelector: string;
|
|
13
|
+
/**
|
|
14
|
+
* Gets a `HarnessPredicate` that can be used to search for a
|
|
15
|
+
* `SkyAvatarHarness` that meets certain criteria.
|
|
16
|
+
*/
|
|
17
|
+
static with(filters: SkyAvatarHarnessFilters): HarnessPredicate<SkyAvatarHarness>;
|
|
18
|
+
/**
|
|
19
|
+
* Gets the initials displayed when no image URL is specified.
|
|
20
|
+
*/
|
|
21
|
+
getInitials(): Promise<string | undefined>;
|
|
22
|
+
/**
|
|
23
|
+
* Gets the avatar's current image URL or Blob.
|
|
24
|
+
*/
|
|
25
|
+
getSrc(): Promise<string | Blob | undefined>;
|
|
26
|
+
/**
|
|
27
|
+
* Gets whether users can change the image.
|
|
28
|
+
*/
|
|
29
|
+
getCanChange(): Promise<boolean>;
|
|
30
|
+
/**
|
|
31
|
+
* Simulates the user selecting or dropping an image onto the component.
|
|
32
|
+
*/
|
|
33
|
+
dropAvatarFile(file: File, waitForChange?: boolean): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Gets whether an error indicating an invalid file type is displayed.
|
|
36
|
+
*/
|
|
37
|
+
hasFileTypeError(): Promise<boolean>;
|
|
38
|
+
/**
|
|
39
|
+
* Gets whether an error indicating an invalid file size is displayed.
|
|
40
|
+
*/
|
|
41
|
+
hasMaxSizeError(): Promise<boolean>;
|
|
42
|
+
/**
|
|
43
|
+
* Closes the currently displayed error.
|
|
44
|
+
*/
|
|
45
|
+
closeError(): Promise<void>;
|
|
46
|
+
}
|
package/testing/public-api.d.ts
CHANGED