@salesforcedevs/sfdocs-e2e 0.6.139-node22-3 → 1.0.0-alpha.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/README.md +6 -22
- package/bin/run-e2e.js +0 -1
- package/common-wdio.conf.js +9 -20
- package/package.json +3 -6
- package/src/content-repo/specs/homepage.test.ts +1 -1
- package/src/shared/pageobjects/page.ts +3 -3
- package/src/shared/specs/layout-tests.ts +3 -5
- package/src/shared/specs/reference.test.ts +1 -6
- package/bin/publish.sh +0 -31
- package/src/shared/specs/internalLinks.test.ts +0 -70
- package/static-dsc-portal-wdio.conf.js +0 -49
package/README.md
CHANGED
|
@@ -43,11 +43,6 @@ Tests are organised into three suites, each targeting a different surface:
|
|
|
43
43
|
- Google Chrome installed (ChromeDriver version is auto-detected from your local Chrome installation)
|
|
44
44
|
- A running SFDocs portal at the target base URL
|
|
45
45
|
|
|
46
|
-
The `static-portal` suite excludes the following tests that are not applicable to static builds:
|
|
47
|
-
|
|
48
|
-
- `docs.api.test.ts` and `docs.test.ts` — landing pages that don't exist in static builds
|
|
49
|
-
- Footer tests (`should display footer`) — footer component is not available in static builds
|
|
50
|
-
|
|
51
46
|
### Run against the static portal (default)
|
|
52
47
|
|
|
53
48
|
```bash
|
|
@@ -106,7 +101,6 @@ npx sfdocs-e2e --baseUrl http://localhost:8080
|
|
|
106
101
|
# Choose a config suite
|
|
107
102
|
npx sfdocs-e2e --config portal
|
|
108
103
|
npx sfdocs-e2e --config static-portal
|
|
109
|
-
npx sfdocs-e2e --config static-dsc-portal
|
|
110
104
|
npx sfdocs-e2e --config search
|
|
111
105
|
|
|
112
106
|
# Help
|
|
@@ -160,21 +154,14 @@ Publish a new version when:
|
|
|
160
154
|
|
|
161
155
|
Always validate with an alpha release first, then promote to stable.
|
|
162
156
|
|
|
163
|
-
The e2e package is marked `"private": true` so it is automatically skipped during the monorepo's standard `yarn release` workflow. Two convenience scripts handle temporarily removing the private flag, publishing, and restoring it:
|
|
164
|
-
|
|
165
|
-
| Script | Command | Description |
|
|
166
|
-
| ------------------- | ---------------------------------- | ---------------------------------- |
|
|
167
|
-
| `release:alpha:e2e` | `yarn release:alpha:e2e <version>` | Publish with the `alpha` dist-tag |
|
|
168
|
-
| `release:e2e` | `yarn release:e2e <version>` | Publish with the `latest` dist-tag |
|
|
169
|
-
|
|
170
157
|
**1. Publish an alpha (for testing)**
|
|
171
158
|
|
|
172
159
|
```bash
|
|
173
160
|
cd packages/e2e
|
|
174
|
-
yarn
|
|
161
|
+
yarn publish --tag alpha --new-version 1.0.0-alpha.0
|
|
175
162
|
```
|
|
176
163
|
|
|
177
|
-
The `alpha` dist-tag means `
|
|
164
|
+
The `alpha` dist-tag means `npm install @salesforcedevs/sfdocs-e2e` will **not** resolve this version by default — consumers must opt in explicitly:
|
|
178
165
|
|
|
179
166
|
```bash
|
|
180
167
|
# Install latest alpha
|
|
@@ -189,21 +176,18 @@ Iterate on alphas as needed (`1.0.0-alpha.1`, `1.0.0-alpha.2`, ...) until the re
|
|
|
189
176
|
**2. Promote to stable**
|
|
190
177
|
|
|
191
178
|
```bash
|
|
192
|
-
|
|
193
|
-
yarn release:e2e 1.0.0
|
|
179
|
+
yarn publish --tag latest --new-version 1.0.0
|
|
194
180
|
```
|
|
195
181
|
|
|
196
182
|
**3. Future releases — bump and publish**
|
|
197
183
|
|
|
198
184
|
```bash
|
|
199
|
-
cd packages/e2e
|
|
200
|
-
|
|
201
185
|
# Bug fix
|
|
202
|
-
yarn
|
|
186
|
+
yarn publish --tag latest --new-version 1.0.1
|
|
203
187
|
|
|
204
188
|
# New feature
|
|
205
|
-
yarn
|
|
189
|
+
yarn publish --tag latest --new-version 1.1.0
|
|
206
190
|
|
|
207
191
|
# Breaking change
|
|
208
|
-
yarn
|
|
192
|
+
yarn publish --tag latest --new-version 2.0.0
|
|
209
193
|
```
|
package/bin/run-e2e.js
CHANGED
|
@@ -56,7 +56,6 @@ Environment Variables:
|
|
|
56
56
|
const configName = parsedArgs.config || 'static-portal';
|
|
57
57
|
const configMap = {
|
|
58
58
|
'static-portal': 'static-portal-wdio.conf.js',
|
|
59
|
-
'static-dsc-portal': 'static-dsc-portal-wdio.conf.js',
|
|
60
59
|
portal: 'portal-wdio.conf.js',
|
|
61
60
|
search: 'search-wdio.conf.js',
|
|
62
61
|
};
|
package/common-wdio.conf.js
CHANGED
|
@@ -80,7 +80,6 @@ const defaultCapabilities = [
|
|
|
80
80
|
},
|
|
81
81
|
];
|
|
82
82
|
const defaultMochaTimeoutInterval = 200000; //increased timeout because its taking more time to load for references file
|
|
83
|
-
const isGithubActions = Boolean(process.env.GITHUB_ACTIONS);
|
|
84
83
|
|
|
85
84
|
// Resolve ChromeDriver version: env var → Chrome for Testing API lookup → latest
|
|
86
85
|
const resolvedChromeDriverVersion = resolveChromedriverVersion();
|
|
@@ -182,25 +181,15 @@ exports.config = {
|
|
|
182
181
|
// Services take over a specific job you don't want to take care of. They enhance
|
|
183
182
|
// your test setup with almost no effort. Unlike plugins, they don't add new
|
|
184
183
|
// commands. Instead, they hook themselves up into the test process.
|
|
185
|
-
services:
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
],
|
|
195
|
-
],
|
|
196
|
-
...(isGithubActions
|
|
197
|
-
? {
|
|
198
|
-
protocol: 'http',
|
|
199
|
-
hostname: '127.0.0.1',
|
|
200
|
-
port: 4444,
|
|
201
|
-
path: '/wd/hub',
|
|
202
|
-
}
|
|
203
|
-
: {}),
|
|
184
|
+
services: [
|
|
185
|
+
[
|
|
186
|
+
'selenium-standalone',
|
|
187
|
+
{
|
|
188
|
+
installArgs: { drivers }, // drivers to install
|
|
189
|
+
args: { drivers }, // drivers to use
|
|
190
|
+
},
|
|
191
|
+
],
|
|
192
|
+
],
|
|
204
193
|
|
|
205
194
|
// Framework you want to run your specs with.
|
|
206
195
|
// The following are supported: Mocha, Jasmine, and Cucumber
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@salesforcedevs/sfdocs-e2e",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.0-alpha.0",
|
|
4
4
|
"description": "E2E test suite for SFDocs static portal pages (SSG)",
|
|
5
5
|
"license": "ISC",
|
|
6
6
|
"bin": {
|
|
@@ -16,13 +16,10 @@
|
|
|
16
16
|
"test:e2e": "TS_NODE_TRANSPILE_ONLY=true TS_NODE_PROJECT=./tsconfig.json wdio wdio.conf.js",
|
|
17
17
|
"test:e2e:portal": "TS_NODE_TRANSPILE_ONLY=true TS_NODE_PROJECT=./tsconfig.json wdio portal-wdio.conf.js",
|
|
18
18
|
"test:e2e:static:portal": "TS_NODE_TRANSPILE_ONLY=true TS_NODE_PROJECT=./tsconfig.json wdio static-portal-wdio.conf.js",
|
|
19
|
-
"test:
|
|
20
|
-
"test:scope-search": "TS_NODE_TRANSPILE_ONLY=true TS_NODE_PROJECT=./tsconfig.json wdio search-wdio.conf.js",
|
|
21
|
-
"release:alpha:e2e": "f() { bash bin/publish.sh $1 --tag alpha; }; f",
|
|
22
|
-
"release:e2e": "f() { bash bin/publish.sh $1; }; f"
|
|
19
|
+
"test:scope-search": "TS_NODE_TRANSPILE_ONLY=true TS_NODE_PROJECT=./tsconfig.json wdio search-wdio.conf.js"
|
|
23
20
|
},
|
|
24
21
|
"dependencies": {
|
|
25
|
-
"@sa11y/wdio": "^
|
|
22
|
+
"@sa11y/wdio": "^7.0.0",
|
|
26
23
|
"@wdio/allure-reporter": "^7.19.0",
|
|
27
24
|
"@wdio/cli": "^7.19.0",
|
|
28
25
|
"@wdio/local-runner": "^7.19.0",
|
|
@@ -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(17);
|
|
17
17
|
});
|
|
18
18
|
|
|
19
19
|
// it('is accessible', () => {
|
|
@@ -44,15 +44,15 @@ export default class Page {
|
|
|
44
44
|
);
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
-
async getHeader(
|
|
48
|
-
return await $(
|
|
47
|
+
async getHeader(): Promise<WebdriverIO.Element> {
|
|
48
|
+
return await $('hgf-c360contextnav');
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
async getHeaderTitle(): Promise<WebdriverIO.Element> {
|
|
52
52
|
return (await $('>>>header')).$('h4');
|
|
53
53
|
}
|
|
54
54
|
|
|
55
|
-
async getGlobalSearchBox(headerTag = 'dx-
|
|
55
|
+
async getGlobalSearchBox(headerTag = 'dx-header'): Promise<WebdriverIO.Element> {
|
|
56
56
|
return (await $(headerTag)).shadow$('dx-header-search');
|
|
57
57
|
}
|
|
58
58
|
|
|
@@ -7,7 +7,7 @@ import Page from '../pageobjects/page';
|
|
|
7
7
|
* @param givenPage : This is the current page for which we need to test chrome.
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
export default function layoutTest(givenPage: Page, headerTag = 'dx-
|
|
10
|
+
export default function layoutTest(givenPage: Page, headerTag = 'dx-header') {
|
|
11
11
|
let page: Page;
|
|
12
12
|
describe('Basic layout testing > ', () => {
|
|
13
13
|
beforeEach(async () => {
|
|
@@ -15,12 +15,10 @@ export default function layoutTest(givenPage: Page, headerTag = 'dx-global-heade
|
|
|
15
15
|
});
|
|
16
16
|
|
|
17
17
|
it('should display header', async () => {
|
|
18
|
-
const header = await $(
|
|
18
|
+
const header = await $('hgf-c360contextnav');
|
|
19
19
|
await header.waitForDisplayed();
|
|
20
20
|
expect(await header.isDisplayed()).toBeTruthy();
|
|
21
|
-
|
|
22
|
-
expect(await header.getText()).toContain('Developers');
|
|
23
|
-
}
|
|
21
|
+
expect(await header.getText()).toContain('Developers');
|
|
24
22
|
});
|
|
25
23
|
|
|
26
24
|
it.skip('should display global search box', async () => {
|
|
@@ -9,7 +9,6 @@ describe('API Pages', () => {
|
|
|
9
9
|
beforeEach(async () => {
|
|
10
10
|
referencePage = new ReferencePage('/docs/commerce/test-cc-orders-api/references');
|
|
11
11
|
referencePage.open();
|
|
12
|
-
await referencePage.waitForSpecBasedReferencePageLoad();
|
|
13
12
|
});
|
|
14
13
|
|
|
15
14
|
layoutTest(referencePage, 'doc-header');
|
|
@@ -86,7 +85,6 @@ describe('Reference Versioning', () => {
|
|
|
86
85
|
beforeEach(async () => {
|
|
87
86
|
referencePage = new ReferencePage('/docs/c-cart-apis/references/ref1?meta=Summary');
|
|
88
87
|
referencePage.open();
|
|
89
|
-
await referencePage.waitForSpecBasedReferencePageLoad();
|
|
90
88
|
});
|
|
91
89
|
|
|
92
90
|
it('should check for the presence of version picker dropdown', async () => {
|
|
@@ -135,7 +133,7 @@ describe('Reference Versioning', () => {
|
|
|
135
133
|
|
|
136
134
|
await versionOptions[1].waitForClickable();
|
|
137
135
|
await versionOptions[1].click();
|
|
138
|
-
await
|
|
136
|
+
await browser.pause(1000);
|
|
139
137
|
|
|
140
138
|
const apiTitle = await (await $('>>>div.api-title span')).getText();
|
|
141
139
|
const apiVersion = await (await $('>>>p.version span')).getText();
|
|
@@ -181,10 +179,8 @@ describe('Reference Versioning', () => {
|
|
|
181
179
|
|
|
182
180
|
await referencePage.waitForSpecBasedReferencePageLoad();
|
|
183
181
|
await referencePage.selectVersion();
|
|
184
|
-
await referencePage.waitForSpecBasedReferencePageLoad();
|
|
185
182
|
|
|
186
183
|
const container = await $('>>>div.title-area div');
|
|
187
|
-
await container.waitForDisplayed();
|
|
188
184
|
const apiTitle = await container.getText();
|
|
189
185
|
|
|
190
186
|
expect(apiTitle).toEqual('createBasket');
|
|
@@ -278,7 +274,6 @@ describe('Spec-Based Flexible References', () => {
|
|
|
278
274
|
await referencePage.waitForSpecBasedReferencePageLoad();
|
|
279
275
|
|
|
280
276
|
const container = await $('>>>div.title-area div');
|
|
281
|
-
await container.waitForDisplayed();
|
|
282
277
|
const apiTitle = await container.getText();
|
|
283
278
|
|
|
284
279
|
expect(apiTitle).toEqual('getBasket');
|
package/bin/publish.sh
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
set -euo pipefail
|
|
3
|
-
|
|
4
|
-
VERSION="${1:?Usage: publish.sh <version> [--tag <tag>]}"
|
|
5
|
-
shift
|
|
6
|
-
|
|
7
|
-
cp package.json .package.json.bak
|
|
8
|
-
|
|
9
|
-
cleanup() {
|
|
10
|
-
mv .package.json.bak package.json
|
|
11
|
-
node -e "
|
|
12
|
-
var p = require('./package.json');
|
|
13
|
-
p.version = '$VERSION';
|
|
14
|
-
require('fs').writeFileSync('package.json', JSON.stringify(p, null, 2) + '\n');
|
|
15
|
-
"
|
|
16
|
-
git add package.json
|
|
17
|
-
git commit --amend --no-edit
|
|
18
|
-
}
|
|
19
|
-
trap cleanup EXIT
|
|
20
|
-
|
|
21
|
-
node -e "
|
|
22
|
-
var p = require('./package.json');
|
|
23
|
-
delete p.private;
|
|
24
|
-
require('fs').writeFileSync('package.json', JSON.stringify(p, null, 2) + '\n');
|
|
25
|
-
"
|
|
26
|
-
|
|
27
|
-
if [ "$#" -gt 0 ]; then
|
|
28
|
-
yarn publish --new-version "$VERSION" "$@"
|
|
29
|
-
else
|
|
30
|
-
yarn publish --new-version "$VERSION"
|
|
31
|
-
fi
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import GuidePage from '../pageobjects/guide.page';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* E2E tests for internal link resolution (internalReferencePlugin + referenceLinkTransformerPlugin).
|
|
5
|
-
* Covered: relative .md → .html resolution, guide-to-guide links, reference-to-guide links,
|
|
6
|
-
* external links.
|
|
7
|
-
**/
|
|
8
|
-
describe('Internal link resolution', () => {
|
|
9
|
-
const UPDATE_ORDER_STATES_PAGE =
|
|
10
|
-
'/docs/commerce/test-cc-orders-api/guide/update-order-states.html';
|
|
11
|
-
const QUICK_START_PAGE = '/docs/commerce/test-cc-orders-api/guide/quick-start.html';
|
|
12
|
-
const REFERENCE_PAGE =
|
|
13
|
-
'/docs/success/sfdocs/references/markdown-cheatsheet/markdown-cheatsheet.html#how-to-link-between-overviews-guides-and-references';
|
|
14
|
-
|
|
15
|
-
let page: GuidePage;
|
|
16
|
-
|
|
17
|
-
it('should resolve relative guide link correctly', async () => {
|
|
18
|
-
page = new GuidePage(UPDATE_ORDER_STATES_PAGE);
|
|
19
|
-
page.open();
|
|
20
|
-
await page.waitPageLoad();
|
|
21
|
-
|
|
22
|
-
const ordersApiLink = await $('a.internal-link-guide[href*="orders-api-overview"]');
|
|
23
|
-
await ordersApiLink.waitForDisplayed();
|
|
24
|
-
const href = await ordersApiLink.getAttribute('href');
|
|
25
|
-
expect(href).not.toMatch(/\.md(?:\?|#|$)/);
|
|
26
|
-
expect(href).toContain('orders-api-overview.html');
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
it('should resolve guide linking in same folder correctly', async () => {
|
|
30
|
-
page = new GuidePage(QUICK_START_PAGE);
|
|
31
|
-
page.open();
|
|
32
|
-
await page.waitPageLoad();
|
|
33
|
-
|
|
34
|
-
await (await $('>>> doc-heading[hash="see-also"]')).waitForDisplayed();
|
|
35
|
-
|
|
36
|
-
const understandTheBasicsLink = await $('=Understand the Basics');
|
|
37
|
-
await understandTheBasicsLink.waitForDisplayed();
|
|
38
|
-
const href = await understandTheBasicsLink.getAttribute('href');
|
|
39
|
-
expect(href).not.toMatch(/\.md(?:\?|#|$)/);
|
|
40
|
-
expect(href).toContain('understand-the-basics.html');
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
it('should have html link for reference to guide linking', async () => {
|
|
44
|
-
page = new GuidePage(REFERENCE_PAGE);
|
|
45
|
-
page.open();
|
|
46
|
-
await page.waitPageLoad();
|
|
47
|
-
|
|
48
|
-
await (
|
|
49
|
-
await $('>>> doc-heading[hash="how-to-link-between-overviews-guides-and-references"]')
|
|
50
|
-
).waitForDisplayed();
|
|
51
|
-
|
|
52
|
-
const threeContentTypesLink = await $('=three content types');
|
|
53
|
-
await threeContentTypesLink.waitForDisplayed();
|
|
54
|
-
const href = await threeContentTypesLink.getAttribute('href');
|
|
55
|
-
expect(href).toContain('guide');
|
|
56
|
-
expect(href).toMatch(/\.html(?:#|$|\?)/);
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
it('should treat external links as external', async () => {
|
|
60
|
-
page = new GuidePage(REFERENCE_PAGE);
|
|
61
|
-
page.open();
|
|
62
|
-
await page.waitPageLoad();
|
|
63
|
-
|
|
64
|
-
const externalLinks = await $$('a.external-link-guide');
|
|
65
|
-
expect(externalLinks.length).toBeGreaterThan(0);
|
|
66
|
-
for (const link of externalLinks) {
|
|
67
|
-
expect(await link.getAttribute('target')).toBe('_blank');
|
|
68
|
-
}
|
|
69
|
-
});
|
|
70
|
-
});
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* WebdriverIO configuration for E2E tests on Static Portal Pages (SSG) on DSC
|
|
3
|
-
*
|
|
4
|
-
* Prerequisites:
|
|
5
|
-
* 1. Build static pages: yarn build:static:portal
|
|
6
|
-
* 2. Start static server: yarn start:static:portal (runs on port 3000)
|
|
7
|
-
* 3. Run tests: yarn test:e2e:static:portal
|
|
8
|
-
*/
|
|
9
|
-
const BASE_CONFIG = require('./common-wdio.conf');
|
|
10
|
-
|
|
11
|
-
exports.config = {
|
|
12
|
-
...BASE_CONFIG.config,
|
|
13
|
-
// Static pages are served on port 3000 by default; override via E2E_BASE_URL env var
|
|
14
|
-
baseUrl: process.env.E2E_BASE_URL || 'http://localhost:3000',
|
|
15
|
-
|
|
16
|
-
// Reuse the same portal specs - static pages have the same URL structure
|
|
17
|
-
specs: ['./src/portal/specs/**/*.test.ts', './src/shared/specs/*.test.ts'],
|
|
18
|
-
|
|
19
|
-
// Exclude tests that require dynamic server features or pages not in static build
|
|
20
|
-
exclude: [
|
|
21
|
-
'./src/portal/specs/docs.api.test.ts',
|
|
22
|
-
'./src/portal/specs/docs.test.ts',
|
|
23
|
-
'./src/shared/specs/banner.test.ts',
|
|
24
|
-
],
|
|
25
|
-
|
|
26
|
-
// Output directory for static test results
|
|
27
|
-
outputDir: './_results_/static-portal',
|
|
28
|
-
|
|
29
|
-
// Override reporters to use separate output directories
|
|
30
|
-
reporters: [
|
|
31
|
-
'spec',
|
|
32
|
-
[
|
|
33
|
-
require('wdio-video-reporter'),
|
|
34
|
-
{
|
|
35
|
-
saveAllVideos: false,
|
|
36
|
-
videoSlowdownMultiplier: 3,
|
|
37
|
-
outputDir: './_results_/static-portal/videos',
|
|
38
|
-
},
|
|
39
|
-
],
|
|
40
|
-
[
|
|
41
|
-
'allure',
|
|
42
|
-
{
|
|
43
|
-
outputDir: './_results_/static-portal/allure-raw',
|
|
44
|
-
disableWebdriverStepsReporting: true,
|
|
45
|
-
disableWebdriverScreenshotsReporting: false,
|
|
46
|
-
},
|
|
47
|
-
],
|
|
48
|
-
],
|
|
49
|
-
};
|