2
3
'use strict';
4
5
+const {runOnlyForReactRange} = require('./utils');
6
const listAppUtils = require('./list-app-utils');
7
const devToolsUtils = require('./devtools-utils');
8
const {test, expect} = require('@playwright/test');
9
const config = require('../../playwright.config');
10
+const semver = require('semver');
11
test.use(config);
12
test.describe('Components', () => {
13
let page;
15
test.beforeEach(async ({browser}) => {
16
page = await browser.newPage();
17
16
- await page.goto('http://localhost:8080/e2e.html', {
18
+ await page.goto(config.use.url, {
19
waitUntil: 'domcontentloaded',
20
});
21
53
// Select the first list item in DevTools.
54
await devToolsUtils.selectElement(page, 'ListItem', 'List\nApp');
55
56
+ // Prop names/values may not be editable based on the React version.
57
+ // If they're not editable, make sure they degrade gracefully
58
+ const isEditableName = semver.gte(config.use.react_version, '17.0.0');
59
+ const isEditableValue = semver.gte(config.use.react_version, '16.8.0');
60
+
61
// Then read the inspected values.
55
- const [propName, propValue, sourceText] = await page.evaluate(() => {
56
- const {createTestNameSelector, findAllNodes} = window.REACT_DOM_DEVTOOLS;
57
- const container = document.getElementById('devtools');
62
+ const [propName, propValue, sourceText] = await page.evaluate(
63
+ isEditable => {
64
+ const {
65
+ createTestNameSelector,
66
+ findAllNodes,
67
+ } = window.REACT_DOM_DEVTOOLS;
68
+ const container = document.getElementById('devtools');
69
59
- const editableName = findAllNodes(container, [
60
- createTestNameSelector('InspectedElementPropsTree'),
61
- createTestNameSelector('EditableName'),
62
- ])[0];
63
- const editableValue = findAllNodes(container, [
64
- createTestNameSelector('InspectedElementPropsTree'),
65
- createTestNameSelector('EditableValue'),
66
- ])[0];
67
- const source = findAllNodes(container, [
68
- createTestNameSelector('InspectedElementView-Source'),
69
- ])[0];
70
+ // Get name of first prop
71
+ const selectorName = isEditable.name
72
+ ? 'EditableName'
73
+ : 'NonEditableName';
74
+ const nameElement = findAllNodes(container, [
75
+ createTestNameSelector('InspectedElementPropsTree'),
76
+ createTestNameSelector(selectorName),
77
+ ])[0];
78
+ const name = isEditable.name
79
+ ? nameElement.value
80
+ : nameElement.innerText;
81
+
82
+ // Get value of first prop
83
+ const selectorValue = isEditable.value
84
+ ? 'EditableValue'
85
+ : 'NonEditableValue';
86
+ const valueElement = findAllNodes(container, [
87
+ createTestNameSelector('InspectedElementPropsTree'),
88
+ createTestNameSelector(selectorValue),
89
+ ])[0];
90
+ const source = findAllNodes(container, [
91
+ createTestNameSelector('InspectedElementView-Source'),
92
+ ])[0];
93
+ const value = isEditable.value
94
+ ? valueElement.value
95
+ : valueElement.innerText;
96
71
- return [editableName.value, editableValue.value, source.innerText];
72
- });
97
+ return [name, value, source.innerText];
98
+ },
99
+ {name: isEditableName, value: isEditableValue}
100
+ );
101
102
expect(propName).toBe('label');
103
expect(propValue).toBe('"one"');
76
- expect(sourceText).toContain('ListApp.js');
104
+ expect(sourceText).toMatch(/ListApp[a-zA-Z]*\.js/);
105
});
106
107
test('should allow props to be edited', async () => {
108
+ runOnlyForReactRange('>=16.8');
109
+
110
// Select the first list item in DevTools.
111
await devToolsUtils.selectElement(page, 'ListItem', 'List\nApp');
112
139
});
140
141
test('should load and parse hook names for the inspected element', async () => {
142
+ runOnlyForReactRange('>=16.8');
143
+
144
// Select the List component DevTools.
145
await devToolsUtils.selectElement(page, 'List', 'App');
146
194
});
195
}
196
165
- await page.evaluate(() => {
166
- const {createTestNameSelector, focusWithin} = window.REACT_DOM_DEVTOOLS;
167
- const container = document.getElementById('devtools');
197
+ async function focusComponentSearch() {
198
+ await page.evaluate(() => {
199
+ const {createTestNameSelector, focusWithin} = window.REACT_DOM_DEVTOOLS;
200
+ const container = document.getElementById('devtools');
201
169
- focusWithin(container, [
170
- createTestNameSelector('ComponentSearchInput-Input'),
171
- ]);
172
- });
202
+ focusWithin(container, [
203
+ createTestNameSelector('ComponentSearchInput-Input'),
204
+ ]);
205
+ });
206
+ }
207
208
+ await focusComponentSearch();
209
page.keyboard.insertText('List');
210
let count = await getComponentSearchResultsCount();
211
expect(count).toBe('1 | 4');
212
213
+ await focusComponentSearch();
214
page.keyboard.insertText('Item');
215
count = await getComponentSearchResultsCount();
216
expect(count).toBe('1 | 3');