@skyux/data-grid 14.19.0 → 15.0.0-alpha.10

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.
@@ -1,10 +1,13 @@
1
- import { SkyAgGridWrapperHarness } from '@skyux/ag-grid/testing';
1
+ import { SkyAgGridWrapperHarness, provideSkyAgGridTesting } from '@skyux/ag-grid/testing';
2
2
  import { SkyQueryableComponentHarness } from '@skyux/core/testing';
3
3
  import { SkyWaitHarness } from '@skyux/indicators/testing';
4
4
  import { SkyPagingHarness } from '@skyux/lists/testing';
5
5
 
6
6
  /**
7
7
  * Harness for interacting with SKY UX data grid components in tests.
8
+ * Add `provideSkyDataGridTesting()` to the spec's providers so the harness
9
+ * can wait for the grid to finish rendering; without it, render-readiness
10
+ * waits are skipped.
8
11
  * @preview
9
12
  */
10
13
  class SkyDataGridHarness extends SkyQueryableComponentHarness {
@@ -59,11 +62,42 @@ class SkyDataGridHarness extends SkyQueryableComponentHarness {
59
62
  .catch(() => Promise.reject(new Error('Unable to retrieve total number of displayed rows.')));
60
63
  }
61
64
  /**
62
- * Clicks the column header sort button.
65
+ * Clicks the column header sort button and waits for the grid to re-render
66
+ * the sorted rows, and for a consumer's own `[(sort)]` binding to reflect
67
+ * the change, before resolving.
63
68
  */
64
69
  async clickColumnSortButton(column) {
70
+ const grid = await this.#getGridWrapper();
71
+ const api = await grid.getGridApi();
72
+ const renderCountBeforeClick = await grid.getRenderCount();
65
73
  const btn = await this.locatorFor(`.ag-header-cell.ag-header-cell-sortable[col-id="${column}"] button.ag-header-cell-label-sortable`)();
66
- await btn.click();
74
+ // AG Grid's `sortChanged` event (which `SkyDataGrid`'s own `[(sort)]`
75
+ // binding listens for) is dispatched independently of the `modelUpdated`
76
+ // render event `waitUntilRendered()` waits for below, so wait for it
77
+ // explicitly instead of guessing how many stabilize passes are enough
78
+ // for it to have already fired. Registered only after `btn` resolves, so
79
+ // a failed locator lookup can't leave this listener attached.
80
+ let handler;
81
+ const sortChanged = new Promise((resolve) => {
82
+ handler = () => resolve();
83
+ api.addEventListener('sortChanged', handler);
84
+ });
85
+ let timeoutId;
86
+ try {
87
+ await btn.click();
88
+ await grid.waitUntilRendered(renderCountBeforeClick);
89
+ await Promise.race([
90
+ sortChanged,
91
+ new Promise((resolve) => {
92
+ timeoutId = setTimeout(resolve, 2000);
93
+ }),
94
+ ]);
95
+ }
96
+ finally {
97
+ clearTimeout(timeoutId);
98
+ api.removeEventListener('sortChanged', handler);
99
+ }
100
+ await this.forceStabilize();
67
101
  }
68
102
  /**
69
103
  * Gets the paging harness for the data grid. Throws if the grid is not paged.
@@ -87,14 +121,82 @@ class SkyDataGridHarness extends SkyQueryableComponentHarness {
87
121
  async getWait() {
88
122
  return await this.queryHarness(SkyWaitHarness);
89
123
  }
124
+ /**
125
+ * Returns a child harness after the grid has finished rendering, or throws
126
+ * an error if the harness is not found.
127
+ */
128
+ async queryHarness(query) {
129
+ await this.#waitForGridWrapperRendered();
130
+ return await super.queryHarness(query);
131
+ }
132
+ /**
133
+ * Returns a child harness after the grid has finished rendering, or `null`
134
+ * if not found.
135
+ */
136
+ async queryHarnessOrNull(query) {
137
+ await this.#waitForGridWrapperRendered();
138
+ return await super.queryHarnessOrNull(query);
139
+ }
140
+ /**
141
+ * Returns all child harnesses that match after the grid has finished
142
+ * rendering.
143
+ */
144
+ async queryHarnesses(query) {
145
+ await this.#waitForGridWrapperRendered();
146
+ return await super.queryHarnesses(query);
147
+ }
148
+ /**
149
+ * Returns a child test element after the grid has finished rendering, or
150
+ * throws an error if not found.
151
+ */
152
+ async querySelector(selector) {
153
+ await this.#waitForGridWrapperRendered();
154
+ return await super.querySelector(selector);
155
+ }
156
+ /**
157
+ * Returns a child test element after the grid has finished rendering, or
158
+ * `null` if not found.
159
+ */
160
+ async querySelectorOrNull(selector) {
161
+ await this.#waitForGridWrapperRendered();
162
+ return await super.querySelectorOrNull(selector);
163
+ }
164
+ /**
165
+ * Returns all child test elements that match after the grid has finished
166
+ * rendering.
167
+ */
168
+ async querySelectorAll(selector) {
169
+ await this.#waitForGridWrapperRendered();
170
+ return await super.querySelectorAll(selector);
171
+ }
172
+ /**
173
+ * Bypasses the render-readiness wait to avoid recursing through it while
174
+ * checking readiness itself.
175
+ */
90
176
  async #getGridWrapper() {
91
- return await this.queryHarness(SkyAgGridWrapperHarness);
177
+ return await super.queryHarness(SkyAgGridWrapperHarness);
178
+ }
179
+ async #waitForGridWrapperRendered() {
180
+ await this.#getGridWrapper()
181
+ .then(async (grid) => await grid.waitUntilRendered())
182
+ .catch(() => undefined);
92
183
  }
93
184
  }
94
185
 
186
+ /**
187
+ * Configures every data grid in the test to disable AG Grid's row/column
188
+ * virtualization and to opt out of AG Grid's Angular test-zone detection so
189
+ * `SkyDataGridHarness` can reliably wait for the grid to finish rendering.
190
+ * Add to the spec's `TestBed.configureTestingModule` providers.
191
+ * @preview
192
+ */
193
+ function provideSkyDataGridTesting() {
194
+ return [provideSkyAgGridTesting()];
195
+ }
196
+
95
197
  /**
96
198
  * Generated bundle index. Do not edit.
97
199
  */
98
200
 
99
- export { SkyDataGridHarness };
201
+ export { SkyDataGridHarness, provideSkyDataGridTesting };
100
202
  //# sourceMappingURL=skyux-data-grid-testing.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"skyux-data-grid-testing.mjs","sources":["../../../../../libs/components/data-grid/testing/src/modules/data-grid/data-grid-harness.ts","../../../../../libs/components/data-grid/testing/src/skyux-data-grid-testing.ts"],"sourcesContent":["import { HarnessPredicate } from '@angular/cdk/testing';\nimport { SkyAgGridWrapperHarness } from '@skyux/ag-grid/testing';\nimport { SkyQueryableComponentHarness } from '@skyux/core/testing';\nimport { SkyWaitHarness } from '@skyux/indicators/testing';\nimport { SkyPagingHarness } from '@skyux/lists/testing';\n\nimport { SkyDataGridHarnessFilters } from './data-grid-harness.filters';\n\n/**\n * Harness for interacting with SKY UX data grid components in tests.\n * @preview\n */\nexport class SkyDataGridHarness extends SkyQueryableComponentHarness {\n /**\n * @internal\n */\n public static hostSelector = 'sky-data-grid';\n\n /**\n * Gets a `HarnessPredicate` that can be used to search for a\n * `SkyDataGridHarness` that meets certain criteria\n */\n public static with(\n filters: SkyDataGridHarnessFilters,\n ): HarnessPredicate<SkyDataGridHarness> {\n return SkyDataGridHarness.getDataSkyIdPredicate(filters);\n }\n\n /**\n * Checks whether the grid is ready.\n */\n public async isGridReady(): Promise<boolean> {\n return await this.#getGridWrapper()\n .then(async (grid) => await grid.isGridReady())\n .catch(() => false);\n }\n\n /**\n * Checks whether the grid is loading.\n */\n public async isLoading(): Promise<boolean> {\n const waits = await this.queryHarnesses(SkyWaitHarness);\n return await Promise.all(\n waits.map(async (wait): Promise<boolean> => await wait.isWaiting()),\n ).then((loadingStates) => loadingStates.some((isLoading) => isLoading));\n }\n\n /**\n * Retrieves the IDs of the currently displayed columns.\n */\n public async getDisplayedColumnIds(): Promise<string[]> {\n return await this.#getGridWrapper()\n .then(async (grid) => await grid.getDisplayedColumnIds())\n .catch(() =>\n Promise.reject(new Error('Unable to retrieve displayed column IDs.')),\n );\n }\n\n /**\n * Retrieves the header names of the currently displayed columns.\n */\n public async getDisplayedColumnHeaderNames(): Promise<string[]> {\n return await this.#getGridWrapper()\n .then(async (grid) => await grid.getDisplayedColumnHeaderNames())\n .catch(() =>\n Promise.reject(\n new Error('Unable to retrieve displayed column header names.'),\n ),\n );\n }\n\n /**\n * Retrieves the total number of displayed rows.\n */\n public async getDisplayedRowCount(): Promise<number> {\n return await this.#getGridWrapper()\n .then(async (grid) => (await grid.getGridApi()).getDisplayedRowCount())\n .catch(() =>\n Promise.reject(\n new Error('Unable to retrieve total number of displayed rows.'),\n ),\n );\n }\n\n /**\n * Clicks the column header sort button.\n */\n public async clickColumnSortButton(column: string): Promise<void> {\n const btn = await this.locatorFor(\n `.ag-header-cell.ag-header-cell-sortable[col-id=\"${column}\"] button.ag-header-cell-label-sortable`,\n )();\n await btn.click();\n }\n\n /**\n * Gets the paging harness for the data grid. Throws if the grid is not paged.\n */\n public async getPaging(): Promise<SkyPagingHarness> {\n const paging = await this.getPagingOrNull();\n\n if (paging === null) {\n throw new Error('Unable to retrieve paging. The data grid is not paged.');\n }\n\n return paging;\n }\n\n /**\n * Gets the paging harness for the data grid, or `null` if the grid is not paged.\n */\n public async getPagingOrNull(): Promise<SkyPagingHarness | null> {\n return await this.queryHarnessOrNull(SkyPagingHarness);\n }\n\n /**\n * Gets the wait harness for the data grid.\n */\n public async getWait(): Promise<SkyWaitHarness> {\n return await this.queryHarness(SkyWaitHarness);\n }\n\n async #getGridWrapper(): Promise<SkyAgGridWrapperHarness> {\n return await this.queryHarness(SkyAgGridWrapperHarness);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"skyux-data-grid-testing.mjs","sources":["../../../../../libs/components/data-grid/testing/src/modules/data-grid/data-grid-harness.ts","../../../../../libs/components/data-grid/testing/src/modules/data-grid/provide-data-grid-testing.ts","../../../../../libs/components/data-grid/testing/src/skyux-data-grid-testing.ts"],"sourcesContent":["import {\n ComponentHarness,\n HarnessPredicate,\n HarnessQuery,\n TestElement,\n} from '@angular/cdk/testing';\nimport { SkyAgGridWrapperHarness } from '@skyux/ag-grid/testing';\nimport { SkyQueryableComponentHarness } from '@skyux/core/testing';\nimport { SkyWaitHarness } from '@skyux/indicators/testing';\nimport { SkyPagingHarness } from '@skyux/lists/testing';\n\nimport { SkyDataGridHarnessFilters } from './data-grid-harness.filters';\n\n/**\n * Harness for interacting with SKY UX data grid components in tests.\n * Add `provideSkyDataGridTesting()` to the spec's providers so the harness\n * can wait for the grid to finish rendering; without it, render-readiness\n * waits are skipped.\n * @preview\n */\nexport class SkyDataGridHarness extends SkyQueryableComponentHarness {\n /**\n * @internal\n */\n public static hostSelector = 'sky-data-grid';\n\n /**\n * Gets a `HarnessPredicate` that can be used to search for a\n * `SkyDataGridHarness` that meets certain criteria\n */\n public static with(\n filters: SkyDataGridHarnessFilters,\n ): HarnessPredicate<SkyDataGridHarness> {\n return SkyDataGridHarness.getDataSkyIdPredicate(filters);\n }\n\n /**\n * Checks whether the grid is ready.\n */\n public async isGridReady(): Promise<boolean> {\n return await this.#getGridWrapper()\n .then(async (grid) => await grid.isGridReady())\n .catch(() => false);\n }\n\n /**\n * Checks whether the grid is loading.\n */\n public async isLoading(): Promise<boolean> {\n const waits = await this.queryHarnesses(SkyWaitHarness);\n return await Promise.all(\n waits.map(async (wait): Promise<boolean> => await wait.isWaiting()),\n ).then((loadingStates) => loadingStates.some((isLoading) => isLoading));\n }\n\n /**\n * Retrieves the IDs of the currently displayed columns.\n */\n public async getDisplayedColumnIds(): Promise<string[]> {\n return await this.#getGridWrapper()\n .then(async (grid) => await grid.getDisplayedColumnIds())\n .catch(() =>\n Promise.reject(new Error('Unable to retrieve displayed column IDs.')),\n );\n }\n\n /**\n * Retrieves the header names of the currently displayed columns.\n */\n public async getDisplayedColumnHeaderNames(): Promise<string[]> {\n return await this.#getGridWrapper()\n .then(async (grid) => await grid.getDisplayedColumnHeaderNames())\n .catch(() =>\n Promise.reject(\n new Error('Unable to retrieve displayed column header names.'),\n ),\n );\n }\n\n /**\n * Retrieves the total number of displayed rows.\n */\n public async getDisplayedRowCount(): Promise<number> {\n return await this.#getGridWrapper()\n .then(async (grid) => (await grid.getGridApi()).getDisplayedRowCount())\n .catch(() =>\n Promise.reject(\n new Error('Unable to retrieve total number of displayed rows.'),\n ),\n );\n }\n\n /**\n * Clicks the column header sort button and waits for the grid to re-render\n * the sorted rows, and for a consumer's own `[(sort)]` binding to reflect\n * the change, before resolving.\n */\n public async clickColumnSortButton(column: string): Promise<void> {\n const grid = await this.#getGridWrapper();\n const api = await grid.getGridApi();\n const renderCountBeforeClick = await grid.getRenderCount();\n const btn = await this.locatorFor(\n `.ag-header-cell.ag-header-cell-sortable[col-id=\"${column}\"] button.ag-header-cell-label-sortable`,\n )();\n // AG Grid's `sortChanged` event (which `SkyDataGrid`'s own `[(sort)]`\n // binding listens for) is dispatched independently of the `modelUpdated`\n // render event `waitUntilRendered()` waits for below, so wait for it\n // explicitly instead of guessing how many stabilize passes are enough\n // for it to have already fired. Registered only after `btn` resolves, so\n // a failed locator lookup can't leave this listener attached.\n let handler!: () => void;\n const sortChanged = new Promise<void>((resolve) => {\n handler = (): void => resolve();\n api.addEventListener('sortChanged', handler);\n });\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n try {\n await btn.click();\n await grid.waitUntilRendered(renderCountBeforeClick);\n await Promise.race([\n sortChanged,\n new Promise((resolve) => {\n timeoutId = setTimeout(resolve, 2000);\n }),\n ]);\n } finally {\n clearTimeout(timeoutId);\n api.removeEventListener('sortChanged', handler);\n }\n await this.forceStabilize();\n }\n\n /**\n * Gets the paging harness for the data grid. Throws if the grid is not paged.\n */\n public async getPaging(): Promise<SkyPagingHarness> {\n const paging = await this.getPagingOrNull();\n\n if (paging === null) {\n throw new Error('Unable to retrieve paging. The data grid is not paged.');\n }\n\n return paging;\n }\n\n /**\n * Gets the paging harness for the data grid, or `null` if the grid is not paged.\n */\n public async getPagingOrNull(): Promise<SkyPagingHarness | null> {\n return await this.queryHarnessOrNull(SkyPagingHarness);\n }\n\n /**\n * Gets the wait harness for the data grid.\n */\n public async getWait(): Promise<SkyWaitHarness> {\n return await this.queryHarness(SkyWaitHarness);\n }\n\n /**\n * Returns a child harness after the grid has finished rendering, or throws\n * an error if the harness is not found.\n */\n public override async queryHarness<T extends ComponentHarness>(\n query: HarnessQuery<T>,\n ): Promise<T> {\n await this.#waitForGridWrapperRendered();\n return await super.queryHarness(query);\n }\n\n /**\n * Returns a child harness after the grid has finished rendering, or `null`\n * if not found.\n */\n public override async queryHarnessOrNull<T extends ComponentHarness>(\n query: HarnessQuery<T>,\n ): Promise<T | null> {\n await this.#waitForGridWrapperRendered();\n return await super.queryHarnessOrNull(query);\n }\n\n /**\n * Returns all child harnesses that match after the grid has finished\n * rendering.\n */\n public override async queryHarnesses<T extends ComponentHarness>(\n query: HarnessQuery<T>,\n ): Promise<T[]> {\n await this.#waitForGridWrapperRendered();\n return await super.queryHarnesses(query);\n }\n\n /**\n * Returns a child test element after the grid has finished rendering, or\n * throws an error if not found.\n */\n public override async querySelector(selector: string): Promise<TestElement> {\n await this.#waitForGridWrapperRendered();\n return await super.querySelector(selector);\n }\n\n /**\n * Returns a child test element after the grid has finished rendering, or\n * `null` if not found.\n */\n public override async querySelectorOrNull(\n selector: string,\n ): Promise<TestElement | null> {\n await this.#waitForGridWrapperRendered();\n return await super.querySelectorOrNull(selector);\n }\n\n /**\n * Returns all child test elements that match after the grid has finished\n * rendering.\n */\n public override async querySelectorAll(\n selector: string,\n ): Promise<TestElement[]> {\n await this.#waitForGridWrapperRendered();\n return await super.querySelectorAll(selector);\n }\n\n /**\n * Bypasses the render-readiness wait to avoid recursing through it while\n * checking readiness itself.\n */\n async #getGridWrapper(): Promise<SkyAgGridWrapperHarness> {\n return await super.queryHarness(SkyAgGridWrapperHarness);\n }\n\n async #waitForGridWrapperRendered(): Promise<void> {\n await this.#getGridWrapper()\n .then(async (grid) => await grid.waitUntilRendered())\n .catch(() => undefined);\n }\n}\n","import { Provider } from '@angular/core';\nimport { provideSkyAgGridTesting } from '@skyux/ag-grid/testing';\n\n/**\n * Configures every data grid in the test to disable AG Grid's row/column\n * virtualization and to opt out of AG Grid's Angular test-zone detection so\n * `SkyDataGridHarness` can reliably wait for the grid to finish rendering.\n * Add to the spec's `TestBed.configureTestingModule` providers.\n * @preview\n */\nexport function provideSkyDataGridTesting(): Provider[] {\n return [provideSkyAgGridTesting()];\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}