@salesforcedevs/sfdocs-e2e 1.0.7-liquid-alpha.2 → 1.0.8-alpha
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/common-wdio.conf.js +2 -2
- package/package.json +1 -1
- package/portal-wdio.conf.js +0 -1
- package/src/content-repo/specs/homepage.test.ts +1 -1
- package/src/shared/pageobjects/api-redoc-reference.page.ts +0 -5
- package/src/shared/pageobjects/reference.page.ts +0 -9
- package/src/shared/specs/guides.test.ts +1 -1
- package/src/shared/specs/liquid.test.ts +68 -75
- package/src/shared/specs/redoc-reference.test.ts +0 -143
- package/src/shared/specs/video.test.ts +1 -4
- package/static-dsc-portal-wdio.conf.js +0 -1
- package/static-portal-wdio.conf.js +0 -2
- package/wdio.conf.js +0 -1
- package/src/shared/specs/contentActionToolbar.test.ts +0 -59
- package/src/shared/specs/liquid-advanced.test.ts +0 -71
package/common-wdio.conf.js
CHANGED
package/package.json
CHANGED
package/portal-wdio.conf.js
CHANGED
|
@@ -13,7 +13,7 @@ describe('Homepage', () => {
|
|
|
13
13
|
it('should show the expected number of projects', async () => {
|
|
14
14
|
const projectCards = await HomePage.projectCards;
|
|
15
15
|
|
|
16
|
-
expect(projectCards.length).toEqual(
|
|
16
|
+
expect(projectCards.length).toEqual(20);
|
|
17
17
|
});
|
|
18
18
|
|
|
19
19
|
// it('is accessible', () => {
|
|
@@ -35,11 +35,6 @@ class ApiRedocReferencePage extends Page {
|
|
|
35
35
|
const lnbItems = await scrollbarContainer.$$('ul[role="menu"] > li');
|
|
36
36
|
return lnbItems[index];
|
|
37
37
|
}
|
|
38
|
-
|
|
39
|
-
async getProjectHeader(): Promise<WebdriverIO.Element> {
|
|
40
|
-
const sidebar = await this.getSidebar();
|
|
41
|
-
return sidebar.$('div.redoc-project-header');
|
|
42
|
-
}
|
|
43
38
|
}
|
|
44
39
|
|
|
45
40
|
export default ApiRedocReferencePage;
|
|
@@ -38,13 +38,4 @@ export class ReferencePage extends Page {
|
|
|
38
38
|
async getSidebarContent(): Promise<WebdriverIO.Element> {
|
|
39
39
|
return $('>>>div .sidebar-item-selected');
|
|
40
40
|
}
|
|
41
|
-
|
|
42
|
-
async getSidebar(): Promise<WebdriverIO.Element> {
|
|
43
|
-
return (await $('>>>doc-content-layout')).shadow$('div > dx-sidebar-old');
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
async getSidebarItems(): Promise<WebdriverIO.ElementArray> {
|
|
47
|
-
const sidebar = await this.getSidebar();
|
|
48
|
-
return sidebar.shadow$$('div.container div.sidebar-content dx-tree');
|
|
49
|
-
}
|
|
50
41
|
}
|
|
@@ -64,7 +64,7 @@ describe('Test Guides page components functionality> ', () => {
|
|
|
64
64
|
const sidebar = await (await $('doc-content-layout')).shadow$('div > dx-sidebar-old');
|
|
65
65
|
const sideBarContent = await sidebar.shadow$$('div.container div.sidebar-content dx-tree');
|
|
66
66
|
|
|
67
|
-
expect(sideBarContent.length).toEqual(
|
|
67
|
+
expect(sideBarContent.length).toEqual(4);
|
|
68
68
|
|
|
69
69
|
const nextStepOption = await (
|
|
70
70
|
await sideBarContent[3].shadow$('dx-tree-item')
|
|
@@ -6,14 +6,56 @@ let liquidEnabled = false;
|
|
|
6
6
|
describe('Liquid Template Rendering', () => {
|
|
7
7
|
before(async () => {
|
|
8
8
|
try {
|
|
9
|
+
// Check frontmatter to determine if Liquid is enabled
|
|
10
|
+
let frontmatterCheckSucceeded = false;
|
|
11
|
+
|
|
12
|
+
try {
|
|
13
|
+
const fs = require('fs');
|
|
14
|
+
const path = require('path');
|
|
15
|
+
const matter = require('gray-matter');
|
|
16
|
+
|
|
17
|
+
const contentPath = path.resolve(
|
|
18
|
+
__dirname,
|
|
19
|
+
'../../../../example-repository/content/en-us/liquid-project/guides/liquid-quickstart.md',
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
if (fs.existsSync(contentPath)) {
|
|
23
|
+
const fileContent = fs.readFileSync(contentPath, 'utf-8');
|
|
24
|
+
const { data: frontmatter } = matter(fileContent);
|
|
25
|
+
liquidEnabled = frontmatter?.liquid?.enabled === true;
|
|
26
|
+
frontmatterCheckSucceeded = true;
|
|
27
|
+
}
|
|
28
|
+
} catch (frontmatterError) {
|
|
29
|
+
// Frontmatter check failed (file not found or gray-matter not available)
|
|
30
|
+
// Fall back to checking rendered output
|
|
31
|
+
frontmatterCheckSucceeded = false;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Initialize page for tests
|
|
9
35
|
page = new GuidePage('/docs/liquid-project/guide/liquid-quickstart.html');
|
|
10
|
-
|
|
36
|
+
page.open();
|
|
11
37
|
await page.waitPageLoad();
|
|
12
38
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
39
|
+
// Fallback: If frontmatter check didn't succeed, check rendered output
|
|
40
|
+
if (!frontmatterCheckSucceeded) {
|
|
41
|
+
const content = await $('>>>doc-content-layout');
|
|
42
|
+
const text = await content.getText();
|
|
43
|
+
const html = await content.getHTML();
|
|
44
|
+
|
|
45
|
+
const hasLiquidOutput = text.includes('Hello from data.yaml');
|
|
46
|
+
const hasRawSyntax =
|
|
47
|
+
html.includes('{{ data.greeting }}') ||
|
|
48
|
+
html.includes('{{ topic }}') ||
|
|
49
|
+
(html.includes('{{') && html.includes('{%'));
|
|
50
|
+
|
|
51
|
+
if (hasRawSyntax) {
|
|
52
|
+
liquidEnabled = false;
|
|
53
|
+
} else if (hasLiquidOutput) {
|
|
54
|
+
liquidEnabled = true;
|
|
55
|
+
} else {
|
|
56
|
+
liquidEnabled = false;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
17
59
|
} catch (e) {
|
|
18
60
|
liquidEnabled = false;
|
|
19
61
|
}
|
|
@@ -22,7 +64,7 @@ describe('Liquid Template Rendering', () => {
|
|
|
22
64
|
beforeEach(async () => {
|
|
23
65
|
if (liquidEnabled) {
|
|
24
66
|
page = new GuidePage('/docs/liquid-project/guide/liquid-quickstart.html');
|
|
25
|
-
|
|
67
|
+
page.open();
|
|
26
68
|
await page.waitPageLoad();
|
|
27
69
|
}
|
|
28
70
|
});
|
|
@@ -37,6 +79,10 @@ describe('Liquid Template Rendering', () => {
|
|
|
37
79
|
|
|
38
80
|
expect(text.includes('GitHub for writers')).toBeTruthy();
|
|
39
81
|
expect(text.includes('Hello from data.yaml')).toBeTruthy();
|
|
82
|
+
|
|
83
|
+
const html = await content.getHTML();
|
|
84
|
+
expect(html.includes('{{ topic }}')).toBeFalsy();
|
|
85
|
+
expect(html.includes('{{ data.greeting }}')).toBeFalsy();
|
|
40
86
|
});
|
|
41
87
|
|
|
42
88
|
it('Should render included templates from shared directory', async function () {
|
|
@@ -59,14 +105,19 @@ describe('Liquid Template Rendering', () => {
|
|
|
59
105
|
}
|
|
60
106
|
|
|
61
107
|
const content = await $('>>>doc-content-layout');
|
|
108
|
+
const html = await content.getHTML();
|
|
62
109
|
const text = await content.getText();
|
|
63
110
|
|
|
64
|
-
expect(text.includes('
|
|
65
|
-
expect(text.includes('
|
|
66
|
-
expect(text.includes('
|
|
111
|
+
expect(text.includes('create()')).toBeTruthy();
|
|
112
|
+
expect(text.includes('query()')).toBeTruthy();
|
|
113
|
+
expect(text.includes('update()')).toBeTruthy();
|
|
67
114
|
|
|
68
115
|
const listItems = await content.$$('li');
|
|
69
116
|
expect(listItems.length).toBeGreaterThan(5);
|
|
117
|
+
|
|
118
|
+
expect(html.includes('{% for')).toBeFalsy();
|
|
119
|
+
expect(html.includes('{%- for')).toBeFalsy();
|
|
120
|
+
expect(html.includes('{% endfor')).toBeFalsy();
|
|
70
121
|
});
|
|
71
122
|
|
|
72
123
|
it('Should not process Liquid syntax inside code blocks', async function () {
|
|
@@ -75,14 +126,15 @@ describe('Liquid Template Rendering', () => {
|
|
|
75
126
|
}
|
|
76
127
|
|
|
77
128
|
const content = await $('>>>doc-content-layout');
|
|
78
|
-
const
|
|
129
|
+
const html = await content.getHTML();
|
|
130
|
+
const codeBlock = await content.$('code');
|
|
79
131
|
|
|
80
132
|
expect(await codeBlock.isExisting()).toBeTruthy();
|
|
81
133
|
|
|
82
|
-
const
|
|
83
|
-
expect(
|
|
84
|
-
expect(
|
|
85
|
-
expect(
|
|
134
|
+
const codeHtml = await codeBlock.getHTML();
|
|
135
|
+
expect(codeHtml.includes('{{ data.greeting }}')).toBeTruthy();
|
|
136
|
+
expect(codeHtml.includes('{{ topic }}')).toBeTruthy();
|
|
137
|
+
expect(codeHtml.includes('{% for item in items %}')).toBeTruthy();
|
|
86
138
|
|
|
87
139
|
const text = await content.getText();
|
|
88
140
|
expect(text.includes('Visit')).toBeTruthy();
|
|
@@ -108,66 +160,7 @@ describe('Liquid Template Rendering', () => {
|
|
|
108
160
|
expect(html.includes('{{ id2 }}')).toBeFalsy();
|
|
109
161
|
});
|
|
110
162
|
|
|
111
|
-
it('Should
|
|
112
|
-
if (!liquidEnabled) {
|
|
113
|
-
this.skip();
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
const content = await $('>>>doc-content-layout');
|
|
117
|
-
const text = await content.getText();
|
|
118
|
-
const html = await content.getHTML();
|
|
119
|
-
|
|
120
|
-
expect(text.includes('This feature is currently only available in English')).toBeTruthy();
|
|
121
|
-
expect(html.includes('{% englishonly')).toBeFalsy();
|
|
122
|
-
expect(html.includes('{% endenglishonly')).toBeFalsy();
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
it('Should render liquid.data string format — single YAML file on root context', async function () {
|
|
126
|
-
if (!liquidEnabled) {
|
|
127
|
-
this.skip();
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
const content = await $('>>>doc-content-layout');
|
|
131
|
-
const text = await content.getText();
|
|
132
|
-
|
|
133
|
-
expect(text.includes('Hello from data.yaml')).toBeTruthy();
|
|
134
|
-
});
|
|
135
|
-
|
|
136
|
-
it('Should render liquid.data object format — multiple YAML files each under a named key', async function () {
|
|
137
|
-
if (!liquidEnabled) {
|
|
138
|
-
this.skip();
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
const multiDataPage = new GuidePage('/docs/liquid-project/guide/multi-data.html');
|
|
142
|
-
await browser.url(multiDataPage.path);
|
|
143
|
-
await multiDataPage.waitPageLoad();
|
|
144
|
-
|
|
145
|
-
const content = await $('>>>doc-content-layout');
|
|
146
|
-
const text = await content.getText();
|
|
147
|
-
const html = await content.getHTML();
|
|
148
|
-
|
|
149
|
-
expect(text.includes('Sample data file to check the multi-include')).toBeTruthy();
|
|
150
|
-
expect(html.includes('{{ two.summary }}')).toBeFalsy();
|
|
151
|
-
expect(html.includes('{{ data.one.summary }}')).toBeFalsy();
|
|
152
|
-
});
|
|
153
|
-
|
|
154
|
-
it('Should render the englishonly topic page', async function () {
|
|
155
|
-
if (!liquidEnabled) {
|
|
156
|
-
this.skip();
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
const englishOnlyPage = new GuidePage('/docs/liquid-project/guide/english-only-topic.html');
|
|
160
|
-
await browser.url(englishOnlyPage.path);
|
|
161
|
-
await englishOnlyPage.waitPageLoad();
|
|
162
|
-
|
|
163
|
-
const content = await $('>>>doc-content-layout');
|
|
164
|
-
const text = await content.getText();
|
|
165
|
-
|
|
166
|
-
expect(text.includes('English-Only Topic')).toBeTruthy();
|
|
167
|
-
expect(text.includes('filters: [englishonly]')).toBeTruthy();
|
|
168
|
-
});
|
|
169
|
-
|
|
170
|
-
it('Should not render raw Liquid syntax when Liquid processing is disabled', async function () {
|
|
163
|
+
it('Should not process Liquid when frontmatter has liquid.enabled as false', async function () {
|
|
171
164
|
if (!liquidEnabled) {
|
|
172
165
|
this.skip();
|
|
173
166
|
}
|
|
@@ -175,7 +168,7 @@ describe('Liquid Template Rendering', () => {
|
|
|
175
168
|
const disabledPage = new GuidePage(
|
|
176
169
|
'/docs/liquid-project/guide/liquid-learning-resources.html',
|
|
177
170
|
);
|
|
178
|
-
|
|
171
|
+
disabledPage.open();
|
|
179
172
|
await disabledPage.waitPageLoad();
|
|
180
173
|
|
|
181
174
|
const content = await $('>>>doc-content-layout');
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { it } from 'mocha';
|
|
2
2
|
import RedocApisPage from '../pageobjects/api-redoc-reference.page';
|
|
3
3
|
import OverviewPage from '../pageobjects/overview.page';
|
|
4
|
-
import { ReferencePage } from '../pageobjects/reference.page';
|
|
5
4
|
import {
|
|
6
5
|
waitAndGetDocPhaseParentInRedocReferencesPage,
|
|
7
6
|
assertDocPhaseUnavailability,
|
|
@@ -10,7 +9,6 @@ import {
|
|
|
10
9
|
} from '../pageobjects/doc-phase-config';
|
|
11
10
|
|
|
12
11
|
let page: RedocApisPage;
|
|
13
|
-
let refPage: ReferencePage;
|
|
14
12
|
describe('Redoc API Reference page', () => {
|
|
15
13
|
describe('check layouts', () => {
|
|
16
14
|
before(async () => {
|
|
@@ -169,145 +167,4 @@ describe('Redoc API Reference page', () => {
|
|
|
169
167
|
expect(await heading.isDisplayedInViewport()).toBe(true);
|
|
170
168
|
});
|
|
171
169
|
});
|
|
172
|
-
|
|
173
|
-
describe('Flexible References with Redoc Rendering', () => {
|
|
174
|
-
describe('All references view', () => {
|
|
175
|
-
before(async () => {
|
|
176
|
-
refPage = new ReferencePage('docs/service/multi-oas-redoc/references');
|
|
177
|
-
refPage.open();
|
|
178
|
-
|
|
179
|
-
await refPage.waitForMarkdownBasedReferencePageLoad();
|
|
180
|
-
});
|
|
181
|
-
|
|
182
|
-
it('should display all reference titles in LNB', async () => {
|
|
183
|
-
const treeItems = await refPage.getSidebarItems();
|
|
184
|
-
|
|
185
|
-
expect(treeItems.length).toEqual(3);
|
|
186
|
-
});
|
|
187
|
-
|
|
188
|
-
it('should show arrow button after OAS reference titles', async () => {
|
|
189
|
-
const sideBarContent = await refPage.getSidebarItems();
|
|
190
|
-
|
|
191
|
-
const secondItem = sideBarContent[1];
|
|
192
|
-
const treeItem = await secondItem.shadow$('dx-tree-item');
|
|
193
|
-
const treeTile = await treeItem.shadow$('a > dx-tree-tile');
|
|
194
|
-
const arrowIcon = await treeTile.shadow$(
|
|
195
|
-
'a > div[role="heading"] > div.tile-forward-arrow',
|
|
196
|
-
);
|
|
197
|
-
|
|
198
|
-
expect(await arrowIcon.isExisting()).toBeTruthy();
|
|
199
|
-
});
|
|
200
|
-
});
|
|
201
|
-
|
|
202
|
-
describe('Navigation and content verification', () => {
|
|
203
|
-
it('should display markdown content when first reference is clicked', async () => {
|
|
204
|
-
const sideBarContent = await refPage.getSidebarItems();
|
|
205
|
-
const firstItem = sideBarContent[0];
|
|
206
|
-
const treeItem = await firstItem.shadow$('dx-tree-item');
|
|
207
|
-
await treeItem.click();
|
|
208
|
-
|
|
209
|
-
const contentLayout = await $('>>>doc-content-layout');
|
|
210
|
-
await contentLayout.waitForDisplayed();
|
|
211
|
-
|
|
212
|
-
expect(await contentLayout.isDisplayed()).toBeTruthy();
|
|
213
|
-
|
|
214
|
-
const heading = await $('>>>h1');
|
|
215
|
-
const headingText = await heading.getText();
|
|
216
|
-
|
|
217
|
-
expect(headingText).toEqual('Metamind API references');
|
|
218
|
-
});
|
|
219
|
-
|
|
220
|
-
it('should display Redoc UI when OAS reference is clicked', async () => {
|
|
221
|
-
await browser.url('/docs/service/multi-oas-redoc/references');
|
|
222
|
-
await refPage.waitForMarkdownBasedReferencePageLoad();
|
|
223
|
-
|
|
224
|
-
const sideBarContent = await refPage.getSidebarItems();
|
|
225
|
-
const secondItem = sideBarContent[1];
|
|
226
|
-
const treeItem = await secondItem.shadow$('dx-tree-item');
|
|
227
|
-
await treeItem.click();
|
|
228
|
-
|
|
229
|
-
const redocContainer = await $('doc-redoc-reference > .redoc-container');
|
|
230
|
-
await redocContainer.waitForDisplayed({ timeout: 30000 });
|
|
231
|
-
|
|
232
|
-
expect(await redocContainer.isDisplayed()).toBeTruthy();
|
|
233
|
-
|
|
234
|
-
page = new RedocApisPage(
|
|
235
|
-
'docs/service/multi-oas-redoc/references/redoc-orders-multiple',
|
|
236
|
-
);
|
|
237
|
-
});
|
|
238
|
-
|
|
239
|
-
it('should have the correct api info title', async () => {
|
|
240
|
-
const apiTitle = await page.getApiTitle();
|
|
241
|
-
const titleText = await apiTitle.getText();
|
|
242
|
-
|
|
243
|
-
expect(titleText).toMatch('Einstein Vision and Einstein Language');
|
|
244
|
-
});
|
|
245
|
-
|
|
246
|
-
it('should display current reference title and "All References" with back arrow in LNB', async () => {
|
|
247
|
-
const projectHeaderContainer = await page.getProjectHeader();
|
|
248
|
-
|
|
249
|
-
const backButton = await projectHeaderContainer.$('a.redoc-project-back');
|
|
250
|
-
const allReference = await backButton.$('span.redoc-project-title');
|
|
251
|
-
const specTitle = await projectHeaderContainer.$('h2.redoc-spec-title');
|
|
252
|
-
|
|
253
|
-
expect(await allReference.getText()).toEqual('All Reference');
|
|
254
|
-
expect(await backButton.isExisting()).toBeTruthy();
|
|
255
|
-
expect(await specTitle.getText()).toEqual('Orders API');
|
|
256
|
-
});
|
|
257
|
-
});
|
|
258
|
-
|
|
259
|
-
describe('Navigation back to all references', () => {
|
|
260
|
-
before(async () => {
|
|
261
|
-
page = new RedocApisPage(
|
|
262
|
-
'docs/service/multi-oas-redoc/references/redoc-orders-multiple',
|
|
263
|
-
);
|
|
264
|
-
page.open();
|
|
265
|
-
await page.waitPageLoad();
|
|
266
|
-
});
|
|
267
|
-
|
|
268
|
-
it('should navigate back to main URL when back arrow is clicked', async () => {
|
|
269
|
-
const projectHeaderContainer = await page.getProjectHeader();
|
|
270
|
-
const backButton = await projectHeaderContainer.$('a.redoc-project-back');
|
|
271
|
-
|
|
272
|
-
await backButton.click();
|
|
273
|
-
|
|
274
|
-
const contentLayout = await $('>>>doc-content-layout');
|
|
275
|
-
await contentLayout.waitForDisplayed();
|
|
276
|
-
|
|
277
|
-
const currentUrl = await browser.getUrl();
|
|
278
|
-
|
|
279
|
-
expect(currentUrl).toContain('/docs/service/multi-oas-redoc/references');
|
|
280
|
-
expect(currentUrl).not.toContain('redoc-orders-multiple');
|
|
281
|
-
});
|
|
282
|
-
|
|
283
|
-
it('should display all references in LNB after navigating back', async () => {
|
|
284
|
-
refPage = new ReferencePage('/docs/service/multi-oas-redoc/references');
|
|
285
|
-
const treeItems = await refPage.getSidebarItems();
|
|
286
|
-
|
|
287
|
-
expect(treeItems.length).toEqual(3);
|
|
288
|
-
});
|
|
289
|
-
|
|
290
|
-
it('should navigate to third reference when clicked', async () => {
|
|
291
|
-
const sideBarContent = await refPage.getSidebarItems();
|
|
292
|
-
const thirdItem = sideBarContent[2];
|
|
293
|
-
const treeItem = await thirdItem.shadow$('dx-tree-item');
|
|
294
|
-
await treeItem.click();
|
|
295
|
-
|
|
296
|
-
const redocContainer = await $('doc-redoc-reference > .redoc-container');
|
|
297
|
-
await redocContainer.waitForDisplayed({ timeout: 30000 });
|
|
298
|
-
|
|
299
|
-
expect(await redocContainer.isDisplayed()).toBeTruthy();
|
|
300
|
-
expect(await browser.getUrl()).toContain('redoc-quip-admin-api');
|
|
301
|
-
|
|
302
|
-
page = new RedocApisPage(
|
|
303
|
-
'docs/service/multi-oas-redoc/references/redoc-quip-admin-api',
|
|
304
|
-
);
|
|
305
|
-
|
|
306
|
-
const apiTitle = await page.getApiTitle();
|
|
307
|
-
const titleText = await apiTitle.getText();
|
|
308
|
-
|
|
309
|
-
expect(titleText).toMatch('Quip Admin API');
|
|
310
|
-
});
|
|
311
|
-
});
|
|
312
|
-
});
|
|
313
170
|
});
|
|
@@ -24,11 +24,8 @@ describe('Video Plugin Scenarios ', () => {
|
|
|
24
24
|
expect(await videoTitle?.getText()).toBe('Video from YouTube');
|
|
25
25
|
const videoContainer = await videoRootElement?.$('.video-plugin-container');
|
|
26
26
|
const iframeElement = await videoContainer?.$('iframe');
|
|
27
|
-
// The video plugin normalizes the YouTube host to www.youtube.com to
|
|
28
|
-
// avoid a cross-origin redirect that would drop the iframe's fullscreen
|
|
29
|
-
// grant (W-23222416). The authored src is `https://youtube.com/...`.
|
|
30
27
|
expect(await iframeElement?.getAttribute('src')).toBe(
|
|
31
|
-
'https://
|
|
28
|
+
'https://youtube.com/embed/di6iwHhrH6s',
|
|
32
29
|
);
|
|
33
30
|
});
|
|
34
31
|
});
|
|
@@ -18,7 +18,6 @@ exports.config = {
|
|
|
18
18
|
|
|
19
19
|
// Exclude tests that require dynamic server features or pages not in static build
|
|
20
20
|
exclude: [
|
|
21
|
-
// './src/shared/specs/liquid.test.ts',
|
|
22
21
|
'./src/portal/specs/docs.api.test.ts',
|
|
23
22
|
'./src/portal/specs/docs.test.ts',
|
|
24
23
|
'./src/shared/specs/banner.test.ts',
|
|
@@ -18,8 +18,6 @@ exports.config = {
|
|
|
18
18
|
|
|
19
19
|
// Exclude tests that require dynamic server features or pages not in static build
|
|
20
20
|
exclude: [
|
|
21
|
-
// Advanced liquid tests require previewFuture, variables — not in static build
|
|
22
|
-
'./src/shared/specs/liquid-advanced.test.ts',
|
|
23
21
|
// /docs/apis landing page doesn't exist in static builds
|
|
24
22
|
'./src/portal/specs/docs.api.test.ts',
|
|
25
23
|
// /docs landing page doesn't exist in static builds
|
package/wdio.conf.js
CHANGED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import GuidePage from '../pageobjects/guide.page';
|
|
2
|
-
import { ReferencePage } from '../pageobjects/reference.page';
|
|
3
|
-
|
|
4
|
-
const EN_US_GUIDE_PATH = '/docs/service/vscode-maintainer/guide/vscode-overview.html';
|
|
5
|
-
const EN_US_MARKDOWN_REFERENCE_PATH =
|
|
6
|
-
'/docs/commerce/flexible-references/references/shopper-manual-ref/quick-start.html';
|
|
7
|
-
const NON_MARKDOWN_REFERENCE_PATH = '/docs/test-metamind-oas-api/references/1mkfx9?meta=Summary';
|
|
8
|
-
const NON_EN_US_MARKDOWN_REFERENCE_PATH =
|
|
9
|
-
'/docs/commerce/ja-jp/flex-references-loc/references/manual-ref/commerce-cloud-api-overview.html';
|
|
10
|
-
|
|
11
|
-
async function expectToolbarButtons(toolbar: WebdriverIO.Element): Promise<void> {
|
|
12
|
-
const toolbarButtons = await toolbar.shadow$$('dx-button.toolbar-button');
|
|
13
|
-
expect(toolbarButtons.length).toBe(3);
|
|
14
|
-
|
|
15
|
-
const labels = await Promise.all(
|
|
16
|
-
toolbarButtons.map(async (button) => (await button.getText()).trim()),
|
|
17
|
-
);
|
|
18
|
-
expect(labels).toEqual(
|
|
19
|
-
expect.arrayContaining(['Copy as Markdown', 'View as Markdown', 'Copy URL to Markdown']),
|
|
20
|
-
);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
describe('Content action toolbar scenarios', () => {
|
|
24
|
-
it('Markdown guide should have the toolbar', async () => {
|
|
25
|
-
const page = new GuidePage(EN_US_GUIDE_PATH);
|
|
26
|
-
page.open();
|
|
27
|
-
await page.waitPageLoad();
|
|
28
|
-
|
|
29
|
-
const toolbar = await $('>>>doc-content-action-toolbar');
|
|
30
|
-
await toolbar.waitForDisplayed();
|
|
31
|
-
await expectToolbarButtons(toolbar);
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
it('Markdown reference should have the toolbar', async () => {
|
|
35
|
-
const referencePage = new ReferencePage(EN_US_MARKDOWN_REFERENCE_PATH);
|
|
36
|
-
referencePage.open();
|
|
37
|
-
await referencePage.waitForMarkdownBasedReferencePageLoad();
|
|
38
|
-
|
|
39
|
-
const toolbar = await $('>>>doc-content-action-toolbar');
|
|
40
|
-
await toolbar.waitForDisplayed();
|
|
41
|
-
await expectToolbarButtons(toolbar);
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
it("Non-markdown reference shouldn't have toolbar", async () => {
|
|
45
|
-
const referencePage = new ReferencePage(NON_MARKDOWN_REFERENCE_PATH);
|
|
46
|
-
referencePage.open();
|
|
47
|
-
await referencePage.waitForSpecBasedReferencePageLoad();
|
|
48
|
-
|
|
49
|
-
const toolbar = await $('>>>doc-content-action-toolbar');
|
|
50
|
-
expect(await toolbar.isExisting()).toBeFalsy();
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
it("Non en-us locale page shouldn't have toolbar", async () => {
|
|
54
|
-
const nonEnUsReferencePage = new ReferencePage(NON_EN_US_MARKDOWN_REFERENCE_PATH);
|
|
55
|
-
nonEnUsReferencePage.open();
|
|
56
|
-
await nonEnUsReferencePage.waitForMarkdownBasedReferencePageLoad();
|
|
57
|
-
expect(await (await $('>>>doc-content-action-toolbar')).isExisting()).toBeFalsy();
|
|
58
|
-
});
|
|
59
|
-
});
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import GuidePage from '../pageobjects/guide.page';
|
|
2
|
-
|
|
3
|
-
let page: GuidePage;
|
|
4
|
-
let liquidEnabled = false;
|
|
5
|
-
|
|
6
|
-
describe('Liquid Template Rendering — Advanced', () => {
|
|
7
|
-
before(async () => {
|
|
8
|
-
try {
|
|
9
|
-
page = new GuidePage('/docs/liquid-project/guide/liquid-quickstart.html');
|
|
10
|
-
await browser.url(page.path);
|
|
11
|
-
await page.waitPageLoad();
|
|
12
|
-
|
|
13
|
-
const content = await $('>>>doc-content-layout');
|
|
14
|
-
const text = await content.getText();
|
|
15
|
-
|
|
16
|
-
liquidEnabled = text.includes('Hello from data.yaml');
|
|
17
|
-
} catch (e) {
|
|
18
|
-
liquidEnabled = false;
|
|
19
|
-
}
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
beforeEach(async () => {
|
|
23
|
-
if (liquidEnabled) {
|
|
24
|
-
page = new GuidePage('/docs/liquid-project/guide/liquid-quickstart.html');
|
|
25
|
-
await browser.url(page.path);
|
|
26
|
-
await page.waitPageLoad();
|
|
27
|
-
}
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
it('Should render repository-level variables from content-config.yml', async function () {
|
|
31
|
-
if (!liquidEnabled) {
|
|
32
|
-
this.skip();
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
const content = await $('>>>doc-content-layout');
|
|
36
|
-
const text = await content.getText();
|
|
37
|
-
const html = await content.getHTML();
|
|
38
|
-
|
|
39
|
-
expect(text.includes('Salesforce Platform')).toBeTruthy();
|
|
40
|
-
expect(text.includes('62.0')).toBeTruthy();
|
|
41
|
-
expect(text.includes('sf')).toBeTruthy();
|
|
42
|
-
expect(html.includes('{{ variables.platform')).toBeFalsy();
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
it('Should render future block content when previewFuture is enabled', async function () {
|
|
46
|
-
if (!liquidEnabled) {
|
|
47
|
-
this.skip();
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
const content = await $('>>>doc-content-layout');
|
|
51
|
-
const text = await content.getText();
|
|
52
|
-
|
|
53
|
-
expect(text.includes('Coming Soon')).toBeTruthy();
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
it('Should render the future topic page when previewFuture is enabled', async function () {
|
|
57
|
-
if (!liquidEnabled) {
|
|
58
|
-
this.skip();
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
const futurePage = new GuidePage('/docs/liquid-project/guide/future-topic.html');
|
|
62
|
-
await browser.url(futurePage.path);
|
|
63
|
-
await futurePage.waitPageLoad();
|
|
64
|
-
|
|
65
|
-
const content = await $('>>>doc-content-layout');
|
|
66
|
-
const text = await content.getText();
|
|
67
|
-
|
|
68
|
-
expect(text.includes('Future Feature')).toBeTruthy();
|
|
69
|
-
expect(text.includes('previewFuture')).toBeTruthy();
|
|
70
|
-
});
|
|
71
|
-
});
|