Skip to content

Commit f935551

Browse files
committed
test: replace cucumber with playwright for internalLink.feature
Signed-off-by: Ashim Shrestha <[email protected]>
1 parent b8e01de commit f935551

File tree

13 files changed

+582
-2
lines changed

13 files changed

+582
-2
lines changed

.drone.star

Lines changed: 74 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,9 +223,10 @@ def stagePipelines(ctx):
223223
if (determineReleasePackage(ctx) != None):
224224
return unit_test_pipelines
225225

226+
e2e_playwright_pipeline = e2eTestsOnPlaywright(ctx)
226227
e2e_pipelines = e2eTests(ctx)
227228
keycloak_pipelines = e2eTestsOnKeycloak(ctx)
228-
return unit_test_pipelines + pipelinesDependsOn(e2e_pipelines + keycloak_pipelines, unit_test_pipelines)
229+
return unit_test_pipelines + pipelinesDependsOn(e2e_playwright_pipeline + e2e_pipelines + keycloak_pipelines, unit_test_pipelines)
229230

230231
def afterPipelines(ctx):
231232
return build(ctx) + pipelinesDependsOn(notify(ctx), build(ctx))
@@ -535,6 +536,64 @@ def unitTests(ctx):
535536
},
536537
}]
537538

539+
def e2eTestsOnPlaywright(ctx):
540+
e2e_workspace = {
541+
"base": dir["base"],
542+
"path": config["app"],
543+
}
544+
545+
e2e_trigger = {
546+
"ref": [
547+
"refs/heads/master",
548+
"refs/heads/stable-*",
549+
"refs/tags/**",
550+
"refs/pull/**",
551+
],
552+
}
553+
554+
pipelines = []
555+
556+
# pipeline steps
557+
steps = skipIfUnchanged(ctx, "e2e-tests-playwright")
558+
559+
environment = {
560+
"BASE_URL_OCIS": "ocis:9200",
561+
"PLAYWRIGHT_BROWSERS_PATH": ".playwright",
562+
}
563+
564+
steps += restoreBuildArtifactCache(ctx, "pnpm", ".pnpm-store") + \
565+
installPnpm() + \
566+
restoreBrowsersCache() + \
567+
restoreBuildArtifactCache(ctx, "web-dist", "dist")
568+
569+
if ctx.build.event == "cron":
570+
steps += restoreBuildArtifactCache(ctx, "ocis", "ocis")
571+
else:
572+
steps += restoreOcisCache()
573+
574+
steps += ocisService()
575+
576+
steps += [{
577+
"name": "e2e-tests-playwright",
578+
"image": OC_CI_NODEJS_IMAGE,
579+
"environment": environment,
580+
"commands": [
581+
"pnpm test:e2e:playwright --project=chromium",
582+
],
583+
}]
584+
585+
pipelines.append({
586+
"kind": "pipeline",
587+
"type": "docker",
588+
"name": "e2e-tests-playwright",
589+
"workspace": e2e_workspace,
590+
"steps": steps,
591+
"depends_on": ["cache-ocis"],
592+
"trigger": e2e_trigger,
593+
})
594+
595+
return pipelines
596+
538597
def e2eTests(ctx):
539598
e2e_workspace = {
540599
"base": dir["base"],
@@ -1365,12 +1424,26 @@ def skipIfUnchanged(ctx, type):
13651424
}
13661425
return [skip_step]
13671426

1427+
if type == "e2e-tests-playwright":
1428+
e2e_playwright_skip_steps = [
1429+
"^__fixtures__/.*",
1430+
"^__mocks__/.*",
1431+
"^packages/.*/tests/.*",
1432+
"^tests/unit/.*",
1433+
"^tests/e2e/cucumber/.*",
1434+
]
1435+
skip_step["settings"] = {
1436+
"ALLOW_SKIP_CHANGED": base_skip_steps + e2e_playwright_skip_steps,
1437+
}
1438+
return [skip_step]
1439+
13681440
if type == "e2e-tests":
13691441
e2e_skip_steps = [
13701442
"^__fixtures__/.*",
13711443
"^__mocks__/.*",
13721444
"^packages/.*/tests/.*",
13731445
"^tests/unit/.*",
1446+
"^tests/e2e-playwright/.*",
13741447
]
13751448
skip_step["settings"] = {
13761449
"ALLOW_SKIP_CHANGED": base_skip_steps + e2e_skip_steps,

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
"lint": "eslint vite.config.ts '{packages,tests}/**/*.{js,ts,vue}' --color",
1313
"serve": "SERVER=true pnpm build:w",
1414
"test:e2e:cucumber": "NODE_TLS_REJECT_UNAUTHORIZED=0 TS_NODE_PROJECT=./tests/e2e/cucumber/tsconfig.json cucumber-js --profile=e2e -f json:tests/e2e/cucumber/report/cucumber_report.json",
15+
"test:e2e:playwright": "NODE_TLS_REJECT_UNAUTHORIZED=0 npx playwright test --config=tests/e2e-playwright/",
1516
"test:unit": "NODE_OPTIONS=--unhandled-rejections=throw vitest",
1617
"licenses:check": "license-checker-rseidelsohn --summary --relativeLicensePath --onlyAllow 'Python-2.0;Apache*;Apache License, Version 2.0;Apache-2.0;Apache 2.0;Artistic-2.0;BSD;BSD-3-Clause;CC-BY-3.0;CC-BY-4.0;CC0-1.0;ISC;MIT;MPL-2.0;Public Domain;Unicode-TOU;Unlicense;WTFPL;BlueOak-1.0.0' --excludePackages '@ownclouders/babel-preset;@ownclouders/eslint-config;@ownclouders/prettier-config;@ownclouders/tsconfig;@ownclouders/web-client;@ownclouders/web-pkg;external;web-app-files;text-editor;preview;web-app-ocm;@ownclouders/design-system;pdf-viewer;web-app-search;admin-settings;webfinger;web-runtime;@ownclouders/web-test-helpers'",
1718
"licenses:csv": "license-checker-rseidelsohn --relativeLicensePath --csv --out ./third-party-licenses/third-party-licenses.csv",

test-results/.last-run.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"status": "passed",
3+
"failedTests": []
4+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { config } from '../../e2e/config.js'
2+
import { api } from '../../e2e/support'
3+
import { UsersEnvironment } from '../../e2e/support/environment'
4+
5+
export async function setAccessAndRefreshToken(usersEnvironment: UsersEnvironment) {
6+
if (!config.basicAuth && !config.predefinedUsers) {
7+
let user = usersEnvironment.getUser({ key: config.adminUsername })
8+
await api.token.setAccessAndRefreshToken(user)
9+
}
10+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import { defineConfig, devices } from '@playwright/test'
2+
3+
/**
4+
* See https://playwright.dev/docs/test-configuration.
5+
*/
6+
export default defineConfig({
7+
// Look for test files in the following directory, relative to this configuration file.
8+
testDir: 'specs',
9+
10+
// Run all tests in parallel.
11+
fullyParallel: false,
12+
13+
// Fail the build on CI if you accidentally left test.only in the source code.
14+
forbidOnly: !!process.env.CI,
15+
16+
// Retry on CI only.
17+
retries: process.env.CI ? 1 : 0,
18+
19+
// Opt out of parallel tests on CI.
20+
workers: process.env.CI ? 1 : undefined,
21+
22+
// Reporter to use
23+
reporter: 'html',
24+
25+
use: {
26+
ignoreHTTPSErrors: true,
27+
28+
// Collect trace when retrying the failed test.
29+
trace: 'on-first-retry'
30+
},
31+
// Configure projects for major browsers.
32+
projects: [
33+
{
34+
name: 'chromium',
35+
use: { ...devices['Desktop Chrome'] }
36+
},
37+
{
38+
name: 'firefox',
39+
use: { ...devices['Desktop Firefox'] }
40+
},
41+
{
42+
name: 'webkit',
43+
use: { ...devices['Desktop Safari'] }
44+
}
45+
]
46+
})
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
import { expect, test } from '@playwright/test'
2+
import { config } from '../../e2e/config.js'
3+
import {
4+
ActorsEnvironment,
5+
UsersEnvironment,
6+
LinksEnvironment,
7+
FilesEnvironment
8+
} from '../../e2e/support/environment'
9+
import { setAccessAndRefreshToken } from '../helpers/setAccessAndRefreshToken'
10+
import * as api from '../steps/api/api'
11+
import * as ui from '../steps/ui/index'
12+
13+
test.describe('internal link share', () => {
14+
let actorsEnvironment
15+
const usersEnvironment = new UsersEnvironment()
16+
const linksEnvironment = new LinksEnvironment()
17+
const filesEnvironment = new FilesEnvironment()
18+
19+
test.beforeEach(async ({ browser }) => {
20+
actorsEnvironment = new ActorsEnvironment({
21+
context: {
22+
acceptDownloads: config.acceptDownloads,
23+
reportDir: config.reportDir,
24+
tracingReportDir: config.tracingReportDir,
25+
reportHar: config.reportHar,
26+
reportTracing: config.reportTracing,
27+
reportVideo: config.reportVideo,
28+
failOnUncaughtConsoleError: config.failOnUncaughtConsoleError
29+
},
30+
browser: browser
31+
})
32+
33+
await setAccessAndRefreshToken(usersEnvironment)
34+
35+
await api.userHasBeenCreated({ usersEnvironment, stepUser: 'Admin', userToBeCreated: 'Alice' })
36+
await api.userHasBeenCreated({ usersEnvironment, stepUser: 'Admin', userToBeCreated: 'Brian' })
37+
38+
await ui.logInUser({ usersEnvironment, actorsEnvironment, stepUser: 'Alice' })
39+
await ui.logInUser({ usersEnvironment, actorsEnvironment, stepUser: 'Brian' })
40+
41+
await api.userHasCreatedFolder({ usersEnvironment, stepUser: 'Alice', folderName: 'myfolder' })
42+
43+
await api.userHasSharedResource({
44+
usersEnvironment,
45+
stepUser: 'Alice',
46+
resource: 'myfolder',
47+
recipient: 'Brian',
48+
type: 'user',
49+
role: 'Can edit',
50+
resourceType: 'folder'
51+
})
52+
53+
await api.userHasCreatedPublicLinkOfResource({
54+
usersEnvironment,
55+
stepUser: 'Alice',
56+
resource: 'myfolder',
57+
role: 'Invited people'
58+
})
59+
})
60+
61+
test('opening a link with internal role', async () => {
62+
await ui.openPublicLink({
63+
actorsEnvironment,
64+
linksEnvironment,
65+
stepUser: 'Brian',
66+
name: 'Unnamed link'
67+
})
68+
await ui.navigateToSharedWithMePage({ actorsEnvironment, stepUser: 'Brian' })
69+
await ui.uploadResource({
70+
actorsEnvironment,
71+
filesEnvironment,
72+
stepUser: 'Brian',
73+
resource: 'simple.pdf',
74+
to: 'myfolder'
75+
})
76+
await ui.updateShareeRole({
77+
usersEnvironment,
78+
actorsEnvironment,
79+
stepUser: 'Alice',
80+
resource: 'myfolder',
81+
recipient: 'Brian',
82+
type: 'user',
83+
role: 'Can view',
84+
resourceType: 'folder'
85+
})
86+
await ui.logOutUser({ actorsEnvironment, stepUser: 'Alice' })
87+
88+
expect(
89+
await ui.isAbleToEditFileOrFolder({
90+
actorsEnvironment,
91+
stepUser: 'Brian',
92+
resource: 'myfolder'
93+
})
94+
).toBeFalsy()
95+
await ui.logOutUser({ actorsEnvironment, stepUser: 'Brian' })
96+
})
97+
})
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
import { config } from '../../../e2e/config.js'
2+
import { UsersEnvironment } from '../../../e2e/support/environment'
3+
import { api } from '../../../e2e/support'
4+
import { ResourceType } from '../../../e2e/support/api/share/share'
5+
6+
export async function userHasBeenCreated({
7+
usersEnvironment,
8+
stepUser,
9+
userToBeCreated
10+
}: {
11+
usersEnvironment: UsersEnvironment
12+
stepUser: string
13+
userToBeCreated: string
14+
}): Promise<void> {
15+
const admin = usersEnvironment.getUser({ key: stepUser })
16+
const user = usersEnvironment.getUser({ key: userToBeCreated })
17+
// do not try to create users when using predefined users
18+
if (!config.predefinedUsers) {
19+
await api.provision.createUser({ user, admin })
20+
}
21+
}
22+
23+
export async function userHasCreatedFolder({
24+
usersEnvironment,
25+
stepUser,
26+
folderName
27+
}: {
28+
usersEnvironment: UsersEnvironment
29+
stepUser: string
30+
folderName: string
31+
}): Promise<void> {
32+
const user = usersEnvironment.getUser({ key: stepUser })
33+
await api.dav.createFolderInsidePersonalSpace({ user, folder: folderName })
34+
}
35+
36+
export async function userHasSharedResource({
37+
usersEnvironment,
38+
stepUser,
39+
resource,
40+
recipient,
41+
type,
42+
role,
43+
resourceType
44+
}: {
45+
usersEnvironment: UsersEnvironment
46+
stepUser: string
47+
resource: string
48+
recipient: string
49+
type: string
50+
role: string
51+
resourceType: ResourceType
52+
}): Promise<void> {
53+
const user = usersEnvironment.getUser({ key: stepUser })
54+
await api.share.createShare({
55+
user,
56+
path: resource,
57+
shareType: type,
58+
shareWith: recipient,
59+
role: role,
60+
resourceType: resourceType as ResourceType
61+
})
62+
}
63+
64+
export async function userHasCreatedPublicLinkOfResource({
65+
usersEnvironment,
66+
stepUser,
67+
resource,
68+
role,
69+
name,
70+
password,
71+
space
72+
}: {
73+
usersEnvironment: UsersEnvironment
74+
stepUser: string
75+
resource: string
76+
role: string
77+
name?: string
78+
password?: undefined
79+
space?: 'Personal'
80+
}) {
81+
const user = usersEnvironment.getUser({ key: stepUser })
82+
83+
await api.share.createLinkShare({
84+
user,
85+
path: resource,
86+
password: password,
87+
name: name ? name : 'Unnamed link',
88+
role: role,
89+
spaceName: space
90+
})
91+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export * from './public'
2+
export * from './shares'
3+
export * from './resources'
4+
export * from './session'
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { objects } from '../../../e2e/support'
2+
import { ActorsEnvironment, LinksEnvironment } from '../../../e2e/support/environment'
3+
4+
export async function openPublicLink({
5+
actorsEnvironment,
6+
linksEnvironment,
7+
stepUser,
8+
name
9+
}: {
10+
actorsEnvironment: ActorsEnvironment
11+
linksEnvironment: LinksEnvironment
12+
stepUser: string
13+
name: string
14+
}): Promise<void> {
15+
const { page } = await actorsEnvironment.createActor({
16+
key: stepUser,
17+
namespace: actorsEnvironment.generateNamespace(stepUser, stepUser)
18+
})
19+
20+
const { url } = linksEnvironment.getLink({ name })
21+
const pageObject = new objects.applicationFiles.page.Public({ page })
22+
await pageObject.open({ url })
23+
}

0 commit comments

Comments
 (0)