@digital-ai/devops-page-object-release 0.0.4 → 0.0.6

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/dist/module.js CHANGED
@@ -111,6 +111,29 @@ class $aaf14e80ae835616$export$b66cc3708c7bd4a4 extends (0, $1b3e547d6616178c$ex
111
111
 
112
112
 
113
113
 
114
+ async function $251ce8153733e46f$export$a0f926f04148e5d2(locators) {
115
+ const res = await Promise.all([
116
+ ...locators.map(async (locator, index)=>{
117
+ let timedOut = false;
118
+ await locator.waitFor({
119
+ state: "visible",
120
+ timeout: 2000
121
+ }).catch(()=>timedOut = true);
122
+ return [
123
+ timedOut ? -1 : index,
124
+ locator
125
+ ];
126
+ })
127
+ ]);
128
+ const resolvedLocator = res.find((r)=>r[0] !== -1);
129
+ if (!resolvedLocator) {
130
+ console.warn("waitForOneOf", res);
131
+ throw new Error("no locator visible before timeout");
132
+ }
133
+ return resolvedLocator;
134
+ }
135
+
136
+
114
137
  class $2d8ab26bb7c4ceb5$export$a87f0ae8695e74be extends (0, $9626bc9256ce31f7$export$2b65d1d97338f32b) {
115
138
  async openVariable(variableKey) {
116
139
  await this.page.locator(`.variables-list .variable`).getByText(variableKey).click();
@@ -118,8 +141,31 @@ class $2d8ab26bb7c4ceb5$export$a87f0ae8695e74be extends (0, $9626bc9256ce31f7$ex
118
141
  }
119
142
  }
120
143
  class $2d8ab26bb7c4ceb5$var$ReleaseVariableModal extends (0, $9626bc9256ce31f7$export$2b65d1d97338f32b) {
144
+ async expectValue(locators, expectFn) {
145
+ const [index, locator] = await (0, $251ce8153733e46f$export$a0f926f04148e5d2)(locators);
146
+ await expectFn[index](locator);
147
+ }
121
148
  async expectValueToBe(value) {
122
- await (0, $hOLA6$expect)(this.page.locator("#modal .variable-value input")).toHaveValue(value);
149
+ await this.expectValue([
150
+ this.page.locator("#modal .variable-value input"),
151
+ this.page.locator("#modal .variable-value .field-readonly"),
152
+ this.page.locator("#modal .variable-value .xl-map-string-string")
153
+ ], [
154
+ (l)=>(0, $hOLA6$expect)(l).toHaveValue(value),
155
+ (l)=>(0, $hOLA6$expect)(l).toHaveText(value),
156
+ (l)=>(0, $hOLA6$expect)(l).toHaveText(value)
157
+ ]);
158
+ }
159
+ async expectValueToContain(value) {
160
+ await this.expectValue([
161
+ this.page.locator("#modal .variable-value input"),
162
+ this.page.locator("#modal .variable-value .field-readonly"),
163
+ this.page.locator("#modal .variable-value .xl-map-string-string")
164
+ ], [
165
+ (l)=>(0, $hOLA6$expect)(l.inputValue()).toContain(value),
166
+ (l)=>(0, $hOLA6$expect)(l).toContainText(value),
167
+ (l)=>(0, $hOLA6$expect)(l).toContainText(value)
168
+ ]);
123
169
  }
124
170
  async close() {
125
171
  await this.page.locator("#modal .modal-header button.close").click();
@@ -193,6 +239,9 @@ class $e50eb8e8657a3113$var$ConfigRail extends $e50eb8e8657a3113$export$e946776e
193
239
  hasText: variableName
194
240
  }).click();
195
241
  }
242
+ async setVariable(propertyName, variableName) {
243
+ return this.setValueFromCi(propertyName, variableName);
244
+ }
196
245
  async expectValueFromString(propertyName, propertyValue) {
197
246
  return await (0, $hOLA6$expect)(this.railLocator.locator(`.input-scalar-fake-input[id="${propertyName}"]`)).toHaveText(propertyValue);
198
247
  }
@@ -439,7 +488,6 @@ const $f86fbaaa8b4e8c61$export$45f0aca2596a2bb3 = function() {
439
488
  const getVariableEntity = (value, key, containerId, index, password)=>{
440
489
  const keyNoSyntax = key.replace("${", "").replace("}", "");
441
490
  return {
442
- title: "",
443
491
  id: `${containerId}/Variable${index}`,
444
492
  key: keyNoSyntax,
445
493
  requiresValue: true,
@@ -634,7 +682,7 @@ class $80c3ae34677b4324$var$Fixtures {
634
682
  return $hOLA6$env[name];
635
683
  }
636
684
  async setFeatures(features) {
637
- return this.doPut("/settings/features", features);
685
+ return this.doPut("settings/features", features);
638
686
  }
639
687
  async enableTaskDrawer(enabled) {
640
688
  return this.setFeatures([
@@ -1 +1 @@
1
- {"mappings":"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","sources":["apps/release/index.ts","apps/release/fixtures/index.ts","apps/release/pages/index.ts","apps/release/pages/ReleasePage.ts","apps/release/pages/TriggersPage.ts","apps/release/pages/ReleasesListPage.ts","apps/release/pages/WithPage.ts","apps/release/pages/task-modal/CustomScriptTaskModal.ts","apps/release/pages/task-modal/TaskModal.ts","apps/release/pages/ReleaseVariablesPage.ts","apps/release/pages/task-drawer/TaskDrawer.ts","apps/release/pages/LoginPage.ts","apps/release/pages/ApplicationsPage.ts","apps/release/pages/PersonalAccessTokenPage.ts","apps/release/fixtures/helper.ts"],"sourcesContent":["export { test } from './fixtures';\n","import { test as base, expect, Page, APIResponse } from '@playwright/test';\nimport { execFile } from 'child_process';\nimport { APIRequestContext } from 'playwright-core';\nimport isNil from 'lodash/isNil';\nimport { Navigation } from '../pages';\nimport { LoginPage } from '../pages/LoginPage';\nimport { ApplicationsPage } from '../pages/ApplicationsPage';\nimport { PersonalAccessTokenPage } from '../pages/PersonalAccessTokenPage';\nimport { initReleaseDefaults } from './helper';\nimport * as process from 'process';\nimport { FixtureConfiguration, FixtureFeature, FixtureRelease, FixtureTrigger, Release } from '../types';\n\nconst adminHeaders = {\n Authorization: 'Basic YWRtaW46YWRtaW4=',\n Cookie: 'XSRF-TOKEN=1;',\n 'X-XSRF-TOKEN': '1',\n};\n\ntype ReleaseFixtures = {\n applicationPage: ApplicationsPage;\n fixtures: Fixtures;\n loginPage: LoginPage;\n navigation: Navigation;\n personalAccessTokenPage: PersonalAccessTokenPage;\n};\n\nexport const test = base.extend<ReleaseFixtures>({\n fixtures: async ({ request, page }, use) => {\n const fixtures = new Fixtures(request, page);\n await use(fixtures);\n return fixtures;\n },\n loginPage: async ({ page }, use) => {\n const loginPage = new LoginPage(page);\n await use(loginPage);\n return loginPage;\n },\n applicationPage: async ({ page }, use) => {\n const applicationPage = new ApplicationsPage(page);\n await use(applicationPage);\n return applicationPage;\n },\n personalAccessTokenPage: async ({ page }, use) => {\n const personalAccessTokenPage = new PersonalAccessTokenPage(page);\n await use(personalAccessTokenPage);\n return personalAccessTokenPage;\n },\n navigation: async ({ page }, use) => {\n const navigationPage = new Navigation(page);\n await use(navigationPage);\n return navigationPage;\n },\n});\n\nclass Fixtures {\n private readonly request: APIRequestContext;\n private readonly page: Page;\n\n private releaseIds: Array<string> = [];\n private triggerIds: Array<string> = [];\n private configurationIds: Array<string> = [];\n\n constructor(request: APIRequestContext, page: Page) {\n this.request = request;\n this.page = page;\n }\n\n release(release: FixtureRelease): Promise<APIResponse> {\n this.initDefaults(release);\n this.releaseIds.push(release.id);\n return this.deleteRelease(release.id)\n .then(() => this.deleteArchivedRelease(release.id))\n .then(() => this.doPost('fixtures/release', release));\n }\n\n configuration(ci: FixtureConfiguration): Promise<APIResponse> {\n this.configurationIds.push(ci.id);\n return this.doPost('fixtures/shared', [ci]);\n }\n\n trigger(trigger: FixtureTrigger): Promise<APIResponse> {\n this.triggerIds.push(trigger.id);\n return this.doPost('fixtures/trigger', trigger);\n }\n\n deleteArchivedRelease(id: string): Promise<APIResponse> {\n const releaseId = id.includes('Applications/') ? id : `Applications/${id}`;\n return this.doDelete('fixtures/cis', [\n {\n id: releaseId,\n type: 'xlrelease.Release',\n },\n ]);\n }\n\n deleteRelease(id: string): Promise<APIResponse> {\n const releaseId = id.includes('Applications/') ? id : `Applications/${id}`;\n return this.doDelete(`fixtures/${releaseId}`);\n }\n\n deleteTrigger(id: string): Promise<APIResponse> {\n return this.doDelete(`fixtures/trigger/${id}`);\n }\n\n deleteConfiguration(id: string): Promise<APIResponse> {\n return this.doDelete(`fixtures/shared`, [id]);\n }\n\n cleanAll(): Promise<Awaited<APIResponse>[]> {\n const promises = [];\n for (const releaseId of this.releaseIds.reverse()) {\n promises.push(this.deleteRelease(releaseId));\n }\n for (const triggerId of this.triggerIds) {\n promises.push(this.deleteTrigger(triggerId));\n }\n for (const confId of this.configurationIds) {\n promises.push(this.deleteConfiguration(confId));\n }\n this.releaseIds = [];\n this.triggerIds = [];\n this.configurationIds = [];\n return Promise.all(promises);\n }\n\n async waitForReleaseStarted(releaseTitle: string): Promise<void> {\n await expect(async () => {\n const resp = await this.doPost('releases/search', {\n inProgress: true,\n paused: true,\n failing: true,\n failed: true,\n title: releaseTitle,\n });\n const page = await resp.json();\n await expect(page.cis.length).toBeGreaterThan(0);\n }).toPass();\n }\n\n async waitForFirstPoll(triggerId: string): Promise<void> {\n await expect(async () => {\n const resp = await this.doGet(`api/v1/triggers/${triggerId}`);\n const trigger = await resp.json();\n await expect(isNil(trigger.triggerState)).toBe(false);\n }).toPass();\n }\n\n exec(path: string): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n execFile(path, (error) => {\n if (error === null) {\n return resolve();\n } else {\n return reject();\n }\n });\n });\n }\n\n getFakeApiUrl(): string {\n return this.getEnvVariable('ENV_FAKE_API') || 'http://localhost:5517';\n }\n\n getEnvVariable(name: string): string | undefined {\n return process.env[name];\n }\n\n async setFeatures(features: Array<FixtureFeature>): Promise<APIResponse> {\n return this.doPut('/settings/features', features);\n }\n\n async enableTaskDrawer(enabled: boolean): Promise<APIResponse> {\n return this.setFeatures([{ id: 'Configuration/features/xlrelease.TaskDrawer', type: 'xlrelease.TaskDrawer', category: 'Stable', enabled: enabled }]);\n }\n\n private doPost(url: string, body: unknown): Promise<APIResponse> {\n return this.request.post(url, { data: body, headers: adminHeaders });\n }\n\n private doPut(url: string, body: unknown): Promise<APIResponse> {\n return this.request.put(url, { data: body, headers: adminHeaders });\n }\n\n private doGet(url: string): Promise<APIResponse> {\n return this.request.get(url, { headers: adminHeaders });\n }\n\n private doDelete(url: string, body?: unknown): Promise<APIResponse> {\n return this.request.delete(url, { data: body, headers: adminHeaders });\n }\n\n private initDefaults(ci: FixtureRelease): void {\n initReleaseDefaults(ci as Release);\n }\n}\n","import { Page } from '@playwright/test';\nimport { ReleasePage } from './ReleasePage';\n\nexport class Navigation {\n private readonly page: Page;\n\n constructor(page: Page) {\n this.page = page;\n }\n\n async openTemplate(id: string): Promise<ReleasePage> {\n return this.openReleaseOrTemplate(id, false);\n }\n\n async openRelease(id: string): Promise<ReleasePage> {\n return this.openReleaseOrTemplate(id, true);\n }\n\n private async openReleaseOrTemplate(id: string, release: boolean): Promise<ReleasePage> {\n const url = release ? 'releases' : 'templates';\n await this.page.goto(`./#/${url}/${id}`);\n await this.page.waitForSelector('#release');\n return new ReleasePage(this.page);\n }\n}\n","import { Page, Locator, expect } from '@playwright/test';\nimport { TriggersPage } from './TriggersPage';\nimport { WithPage } from './WithPage';\nimport { CustomScriptTaskModal } from './task-modal/CustomScriptTaskModal';\nimport { ReleaseVariablesPage } from './ReleaseVariablesPage';\nimport { TaskDrawer } from \"./task-drawer/TaskDrawer\";\n\nexport class ReleasePage extends WithPage {\n async openTriggers(): Promise<TriggersPage> {\n await this.openSubPage('Triggers');\n return new TriggersPage(this.page);\n }\n\n async abort(comment = 'Abort for testing'): Promise<void> {\n await this.page.locator('action-toolbar button', { hasText: 'Abort' }).click();\n await this.page.locator('.modal textarea').fill(comment);\n await this.page.locator('.modal .continue').click();\n }\n\n getPhase(phaseName: string): Phase {\n return new Phase(this.page, phaseName);\n }\n\n async start(): Promise<void> {\n await this.page.locator('action-toolbar button', { hasText: 'Start' }).click();\n await this.page.locator('.modal button.primary').click();\n }\n\n async waitForTaskCompleted(taskTitle: string): Promise<void> {\n await expect(this.page.locator('.task.completed').getByText(taskTitle, { exact: true })).toBeVisible();\n }\n async waitForTaskFailed(taskTitle: string): Promise<void> {\n await expect(this.page.locator('.task.failed').getByText(taskTitle, { exact: true })).toBeVisible();\n }\n async waitForStatusLine(statusLine: string): Promise<void> {\n await expect(this.page.locator('.task .status-line').getByText(statusLine, { exact: true })).toBeVisible();\n }\n\n /**\n * @deprecated Don't use this, use new TaskDrawer\n */\n async openCustomScriptTaskModal(taskName: string): Promise<CustomScriptTaskModal> {\n await this.page.locator('.task-header').getByText(taskName).click();\n return new CustomScriptTaskModal(this.page);\n }\n\n async openTaskDrawer(taskName: string): Promise<TaskDrawer> {\n await this.page.locator('.task-header').getByText(taskName).click();\n return new TaskDrawer(this.page);\n }\n\n async openVariables(): Promise<ReleaseVariablesPage> {\n await this.openReleaseMenu('Variables');\n return new ReleaseVariablesPage(this.page);\n }\n\n async openReleaseMenu(menuItem: string): Promise<void> {\n await this.page.locator(`navigation-sidebar ul li`).getByText(menuItem, { exact: true }).click();\n }\n\n private async openSubPage(subpage: string): Promise<void> {\n await this.page.locator('ul.side-nav li', { hasText: subpage }).click();\n }\n}\n\nclass Phase extends WithPage {\n private readonly phaseLocator: Locator;\n\n constructor(page: Page, phaseName: string) {\n super(page);\n this.phaseLocator = page.locator('.phase', { hasText: phaseName });\n }\n\n async addTask(taskName: string, taskGroup: string, taskType: string): Promise<void> {\n await this.phaseLocator.getByText('Add task').click();\n await this.phaseLocator.locator('.quick-title').fill(taskName);\n await this.phaseLocator.locator('.xlr-ctx-menu-toggle').click();\n await this.page.locator(`.xlr-ctx-menu-item`).getByTitle(taskGroup, { exact: true }).scrollIntoViewIfNeeded();\n await this.page.locator(`.xlr-ctx-menu-item`).getByTitle(taskGroup, { exact: true }).hover();\n await this.page.locator(`.xlr-ctx-menu.active`).getByTitle(taskType, { exact: true }).click();\n await this.phaseLocator.locator('.quick-controls-container a').getByText('Add', { exact: true }).click();\n }\n}\n","import { expect } from '@playwright/test';\nimport { ReleasesListPage } from './ReleasesListPage';\nimport { WithPage } from './WithPage';\n\nexport class TriggersPage extends WithPage {\n async openRelatedReleasesOf(title: string): Promise<ReleasesListPage> {\n await this.openContextMenu(title);\n await this.page.locator('.popover-content xlr-context-menu a', { hasText: 'View releases' }).click();\n return new ReleasesListPage(this.page);\n }\n\n private async openContextMenu(title: string): Promise<void> {\n await expect(async () => {\n await this.page.locator('.trigger-row-content', { hasText: title }).locator('.context-menu-button').click();\n await expect(this.page.locator('.popover-content')).toBeVisible();\n }).toPass();\n }\n}\n","import { expect } from '@playwright/test';\nimport { ReleasePage } from './ReleasePage';\nimport { WithPage } from './WithPage';\n\nexport class ReleasesListPage extends WithPage {\n async expectNumberOfReleases(releaseTitle: string, amount: number): Promise<void> {\n if (amount === 1) {\n await expect(this.page.locator('.release').getByText(releaseTitle)).toBeVisible();\n } else {\n await expect(this.page.locator('.release').getByText(releaseTitle).count()).toBe(amount);\n }\n }\n\n async openReleaseByName(releaseTitle: string): Promise<ReleasePage> {\n await this.page.locator('.release-line .row-wrapper .release-title-wrapper a', { hasText: releaseTitle }).click();\n return new ReleasePage(this.page);\n }\n}\n","import { Page } from '@playwright/test';\n\nexport class WithPage {\n protected readonly page: Page;\n\n constructor(page: Page) {\n this.page = page;\n }\n}\n","import { expect } from '@playwright/test';\nimport { TaskModal } from './TaskModal';\n\n/**\n * @deprecated Don't use this, use new TaskDrawer\n */\nexport class CustomScriptTaskModal extends TaskModal {\n async expectFieldNotEmpty(field: string): Promise<void> {\n await expect(this.taskModalLocator.locator(`#${field} .display`).textContent).toBeDefined();\n }\n\n async setSelectField(propertyName: string, value: string): Promise<void> {\n await this.focusOnField(propertyName);\n await this.taskModalLocator.locator(`select[name=\"${propertyName}\"]`).selectOption(value);\n }\n\n async setTextField(propertyName: string, value: string): Promise<void> {\n await this.focusOnField(propertyName);\n await this.taskModalLocator.locator(`input[name=\"${propertyName}\"]`).fill(value);\n }\n\n async setAutocompleteField(propertyName: string, value: string): Promise<void> {\n await this.focusOnAutocompleteField(propertyName);\n await this.taskModalLocator.locator(`#${propertyName} ul li`).getByText(value).click();\n }\n\n async expectOutputValueToBe(propertyName: string, value: string): Promise<void> {\n await expect(this.taskModalLocator.locator(`#${propertyName} .field-readonly span`)).toContainText(value);\n }\n\n // TODO move this to a new inline-editor\n private async focusOnField(propertyName: string): Promise<void> {\n await expect(async () => {\n await this.taskModalLocator.locator(`#${propertyName} .display`).click({ force: true });\n await expect(this.taskModalLocator.locator(`#${propertyName} label.edit`)).toBeVisible();\n }).toPass();\n }\n\n private async focusOnAutocompleteField(propertyName: string): Promise<void> {\n await expect(async () => {\n await this.taskModalLocator.locator(`#${propertyName} input`).click({ force: true });\n await expect(this.taskModalLocator.locator(`#${propertyName} ul`)).toBeVisible();\n }).toPass();\n }\n}\n","import { Page, Locator } from '@playwright/test';\n\nimport { WithPage } from '../WithPage';\n\n/**\n * @deprecated Don't use this, use new TaskDrawer\n */\nexport class TaskModal extends WithPage {\n protected readonly taskModalLocator: Locator;\n\n constructor(page: Page) {\n super(page);\n this.taskModalLocator = this.page.locator('.modal-content.task-details');\n }\n\n async close(): Promise<void> {\n await this.taskModalLocator.locator('.modal-header button.close').click();\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './WithPage';\n\nexport class ReleaseVariablesPage extends WithPage {\n async openVariable(variableKey: string): Promise<ReleaseVariableModal> {\n await this.page.locator(`.variables-list .variable`).getByText(variableKey).click();\n return new ReleaseVariableModal(this.page);\n }\n}\n\nclass ReleaseVariableModal extends WithPage {\n async expectValueToBe(value: string): Promise<void> {\n await expect(this.page.locator('#modal .variable-value input')).toHaveValue(value);\n }\n\n async close(): Promise<void> {\n await this.page.locator('#modal .modal-header button.close').click();\n }\n}\n","import { WithPage } from \"../WithPage\";\nimport { Locator, Page, expect } from \"@playwright/test\";\n\ntype Rail = 'Overview' | 'Activity' | 'Config' | 'Scheduling' | 'Conditions' | 'Attributes' | 'Attach'\n\nexport class TaskDrawer extends WithPage {\n\n protected readonly taskDrawerLocator: Locator;\n\n constructor(page: Page) {\n super(page);\n this.taskDrawerLocator = this.page.locator('task-drawer .dot-drawer');\n }\n\n async openConfigRail(): Promise<ConfigRail> {\n await this.openRail('Config')\n return new ConfigRail(this.page)\n }\n\n async openRail(rail: Rail): Promise<void> {\n await this.taskDrawerLocator.locator('.task-navigation-rail').getByText(rail).click();\n }\n\n async close(): Promise<void> {\n await this.taskDrawerLocator.locator('.task-drawer-header').getByTestId('close-btn').click();\n }\n\n}\n\nclass ConfigRail extends TaskDrawer {\n\n protected readonly railLocator: Locator;\n\n\n constructor(page: Page) {\n super(page);\n this.railLocator = this.taskDrawerLocator.locator('.task-config');\n }\n\n async openInputProperties(): Promise<void> {\n await this.railLocator.locator('.task-config-header').getByText('Input properties').click();\n }\n\n async openOutputProperties(): Promise<void> {\n await this.railLocator.locator('.task-config-header').getByText('Output properties').click();\n }\n\n async getValueFromCi(propertyName: string): Promise<string> {\n return this.railLocator.locator(`input[id=\"${propertyName}\"]`).inputValue()\n }\n\n async getAllOptionsFromCi(propertyName: string): Promise<string[]> {\n await this.railLocator.locator(`input[id=\"${propertyName}\"]`).click()\n return this.railLocator.locator(`.dot-popper ul li`).allInnerTexts();\n }\n\n async setValueFromCi(propertyName: string, value: string): Promise<void> {\n await this.railLocator.locator(`input[id=\"${propertyName}\"]`).clear()\n await this.railLocator.locator(`input[id=\"${propertyName}\"]`).click()\n await this.railLocator.locator(`.dot-popper ul li`, {hasText: value}).click()\n }\n\n async getValueFromString(propertyName: string): Promise<string | null> {\n await this.railLocator.locator(`.input-scalar-fake-input[id=\"${propertyName}\"]`).focus()\n return this.railLocator.locator(`input[id=\"${propertyName}\"]`).inputValue()\n }\n\n async setValueFromString(propertyName: string, value: string): Promise<void> {\n await this.railLocator.locator(`.input-scalar-fake-input[id=\"${propertyName}\"]`).focus()\n await this.railLocator.locator(`input[id=\"${propertyName}\"]`).fill(value)\n }\n\n async setValueFromLargeString(propertyName: string, value: string): Promise<void> {\n await this.railLocator.locator(`.input-scalar-fake-input[id=\"${propertyName}\"]`).focus()\n await this.railLocator.locator(`textarea[id=\"${propertyName}\"]`).fill(value)\n }\n\n async setValueFromPassword(propertyName: string, value: string): Promise<void> {\n await this.railLocator.locator(`input[id=\"${propertyName}\"]`).fill(value)\n }\n\n async setAndCreateVariable(propertyName: string, variableName: string): Promise<void> {\n await this.railLocator.locator(`input[id=\"${propertyName}\"]`).clear()\n await this.railLocator.locator(`input[id=\"${propertyName}\"]`).click()\n await this.railLocator.locator(`input[id=\"${propertyName}\"]`).fill(variableName)\n await this.railLocator.locator(`.dot-popper button`, {hasText: variableName}).click()\n }\n\n async expectValueFromString(propertyName: string, propertyValue: string): Promise<void> {\n return await expect(this.railLocator.locator(`.input-scalar-fake-input[id=\"${propertyName}\"]`)).toHaveText(propertyValue);\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './WithPage';\n\nexport class LoginPage extends WithPage {\n async login(userName: string, password: string): Promise<void> {\n await this.page.goto('./');\n await expect(this.page).toHaveTitle('Digital.ai Release');\n await this.page.locator('#inputLogin').fill(userName);\n await this.page.locator('#inputPassword').fill(password);\n await this.page.locator(\"button[type='submit']\").click();\n await expect(this.page.locator('#releases-content')).toBeVisible();\n }\n\n async logout(): Promise<void> {\n await this.page.locator('button.dot-avatar').click();\n await this.page.getByText('Log out').click();\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './WithPage';\n\nexport class ApplicationsPage extends WithPage {\n async goToApplicationsPage(): Promise<this> {\n await this.page.goto('./#/applications');\n await expect(this.page).toHaveTitle('Applications - Digital.ai Release');\n return this;\n }\n\n async addNewApplication(applicationName: string): Promise<this> {\n await this.page.locator(`//button[normalize-space()='New application']`).click();\n await this.page.locator(`input[placeholder='Add name...']`).type(applicationName);\n await this.page.locator(`//button[normalize-space()='Save']`).click();\n return this;\n }\n\n async verifyApplicationisCreated(applicationName: string): Promise<this> {\n await this.page.waitForSelector(`div[title='${applicationName}'] strong`);\n return this;\n }\n\n async createApplicationAndLinkEnvironment(environmentName: string, applicationName: string): Promise<this> {\n await this.page.locator(`//button[normalize-space()='New application']`).click();\n await this.page.locator(`input[placeholder='Add name...']`).type(applicationName);\n await this.page.locator(\"input[placeholder='Filter environment name...']\").type(environmentName);\n await this.page.locator(`div[title='${environmentName}']`).click();\n await this.page.locator(`//button[normalize-space()='Save']`).click();\n await this.page.locator('i.xl-icon.close-icon').click();\n return this;\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './WithPage';\n\nexport class PersonalAccessTokenPage extends WithPage {\n async openPersonalAccessTokenPage(): Promise<this> {\n // await this.page.locator(\"button.dot-avatar\").click()\n // await this.page.locator(\"//div[normalize-space()='Access tokens']\").click()\n await this.page.goto('./#/personal-access-token');\n await expect(this.page).toHaveTitle('Access tokens / Personal settings - Digital.ai Release');\n return this;\n }\n\n async addNewToken(tokenName: string): Promise<this> {\n //await expect(this.page).toHaveTitle('Access tokens / Personal settings - Digital.ai Release')\n\n await this.page.locator('#tokenText').fill(tokenName);\n await this.page.locator(\"button[type='submit']\").click();\n return this;\n }\n}\n","import isUndefined from 'lodash/isUndefined';\nimport each from 'lodash/each';\nimport forEach from 'lodash/forEach';\nimport defaults from 'lodash/defaults';\nimport toPairs from 'lodash/toPairs';\n\nimport { Container, Dashboard, Phase, Release, Task, Tile, Variable, VariableValueProvider } from '../types';\n\nexport const initReleaseDefaults = (function () {\n const RELEASE_TYPE = 'xlrelease.Release';\n const PHASE_TYPE = 'xlrelease.Phase';\n const TEAM_TYPE = 'xlrelease.Team';\n const TASK_TYPE = 'xlrelease.Task';\n const COMMENT_TYPE = 'xlrelease.Comment';\n const CONDITION_TYPE = 'xlrelease.GateCondition';\n const DEPENDENCY_TYPE = 'xlrelease.Dependency';\n const LINK_TYPE = 'xlrelease.Link';\n const ATTACHMENT_TYPE = 'xlrelease.Attachment';\n const DASHBOARD_TYPE = 'xlrelease.Dashboard';\n const _TRIGGER_TYPE = 'xlrelease.ReleaseTrigger';\n const JIRA_TYPE = 'jira.CreateIssue';\n const DEFAULT_TASK_OWNER = 'Itchy';\n\n const processTasks = (task: Task, container: Container, index: number): void => {\n if (isUndefined(task.type)) task.type = TASK_TYPE;\n task.id = task.id || `${container.id}/Task${index}`;\n if (isUndefined(task.owner) && task.type !== JIRA_TYPE) task.owner = DEFAULT_TASK_OWNER;\n if (task.owner === null) delete task.owner;\n\n each(task.conditions, function (condition, idx) {\n condition.type = CONDITION_TYPE;\n condition.id = `${task.id}/GateCondition${idx}`;\n });\n each(task.dependencies, function (dependency, idx) {\n dependency.type = DEPENDENCY_TYPE;\n dependency.id = `${task.id}/Dependency${idx}`;\n });\n each(task.links, function (link, idx) {\n link.type = LINK_TYPE;\n link.id = `${task.id}/Link${idx}`;\n });\n each(task.comments, function (comment, idx) {\n comment.type = COMMENT_TYPE;\n comment.id = `${task.id}/Comment${idx}`;\n });\n each(task.tasks, function (subTask, idx) {\n processTasks(subTask, task, idx);\n });\n each(task.templateVariables, function (variable, idx) {\n defaults(variable, getVariableEntity(variable.value, variable.key, task.id, idx));\n });\n each(task.attachments, function (attachment, idx) {\n attachment.type = ATTACHMENT_TYPE;\n attachment.id = `${task.id}/Attachment${idx}`;\n });\n if (task.pythonScript) {\n const pythonScript = task.pythonScript;\n pythonScript.id = `${task.id}/PythonScript`;\n pythonScript.customScriptTask = task.id;\n }\n };\n\n const processPhases = (phase: Phase, release: Release, index: number): void => {\n phase.type = PHASE_TYPE;\n phase.id = `${release.id}/Phase${index}`;\n\n forEach(phase.tasks, (task, idx): void => {\n processTasks(task, phase, idx);\n });\n };\n\n const getVariableEntity = (\n value: string,\n key: string,\n containerId: string,\n index: number,\n password?: boolean,\n // eslint-disable-next-line max-params\n ): Variable => {\n const keyNoSyntax = key.replace('${', '').replace('}', '');\n return {\n title: '',\n id: `${containerId}/Variable${index}`,\n key: keyNoSyntax,\n requiresValue: true,\n showOnReleaseStart: true,\n type: password ? 'xlrelease.PasswordStringVariable' : 'xlrelease.StringVariable',\n value: value,\n };\n };\n\n const getValueProviderConfigurationEntity = function (containerId: string): VariableValueProvider {\n return {\n id: `${containerId}/valueProvider`,\n variable: containerId,\n };\n };\n\n const getDashboardExtension = (dashboard: Dashboard, releaseId: string): Dashboard => {\n const dashboardExtension: Dashboard = {\n id: `${releaseId}/summary`,\n type: DASHBOARD_TYPE,\n tiles: [],\n };\n if (dashboard.tiles) {\n forEach(dashboard.tiles, function (tile, index) {\n dashboardExtension.tiles.push(getTileEntity(tile, `${releaseId}/summary`, index));\n });\n }\n return dashboardExtension;\n };\n\n function getTileEntity(tile: Tile, containerId: string, index: number): Tile {\n tile.id = tile.id || `${containerId}/Tile${index}`;\n return tile;\n }\n\n return function (release: Release) {\n release.type = RELEASE_TYPE;\n if (release.id.indexOf('Applications/') === -1) {\n release.id = `Applications/${release.id}`;\n }\n if (release.startDate) {\n release.queryableStartDate = release.startDate;\n } else if (release.scheduledStartDate) {\n release.queryableStartDate = release.scheduledStartDate;\n }\n if (release.endDate) {\n release.queryableEndDate = release.endDate;\n } else if (release.dueDate) {\n release.queryableEndDate = release.dueDate;\n }\n if (isUndefined(release.owner)) release.owner = 'Itchy'; // default release manager\n\n forEach(release.phases, function (phase, index) {\n processPhases(phase, release, index);\n });\n forEach(release.teams, function (team, index) {\n team.type = TEAM_TYPE;\n team.id = `${release.id}/Team${index}`;\n });\n forEach(release.attachments, function (attachment, index) {\n attachment.type = ATTACHMENT_TYPE;\n attachment.id = `${release.id}/Attachment${index}`;\n });\n forEach(release.variables, function (variable: Variable, index) {\n defaults(variable, getVariableEntity(variable.value, variable.key, release.id, index));\n if (variable.valueProvider) {\n defaults(variable.valueProvider, getValueProviderConfigurationEntity(variable.id));\n }\n });\n forEach(toPairs(release.variableValues), function (keyValue, index) {\n if (!release.variables) release.variables = [];\n release.variables.push(getVariableEntity(keyValue[1], keyValue[0], release.id, 1000 + index));\n release.variableValues = undefined;\n });\n forEach(toPairs(release.passwordVariableValues), function (keyValue, index) {\n if (!release.variables) release.variables = [];\n release.variables.push(getVariableEntity(keyValue[1], keyValue[0], release.id, 1500 + index, true));\n release.passwordVariableValues = undefined;\n });\n\n if (release.summary) {\n release.extensions = [getDashboardExtension(release.summary, release.id)];\n release.summary = undefined;\n }\n };\n})();\n"],"names":[],"version":3,"file":"module.js.map"}
1
+ {"mappings":"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","sources":["apps/release/index.ts","apps/release/fixtures/index.ts","apps/release/pages/index.ts","apps/release/pages/ReleasePage.ts","apps/release/pages/TriggersPage.ts","apps/release/pages/ReleasesListPage.ts","apps/release/pages/WithPage.ts","apps/release/pages/task-modal/CustomScriptTaskModal.ts","apps/release/pages/task-modal/TaskModal.ts","apps/release/pages/ReleaseVariablesPage.ts","apps/release/pages/helper/index.ts","apps/release/pages/task-drawer/TaskDrawer.ts","apps/release/pages/LoginPage.ts","apps/release/pages/ApplicationsPage.ts","apps/release/pages/PersonalAccessTokenPage.ts","apps/release/fixtures/helper.ts"],"sourcesContent":["export { test } from './fixtures';\n","import { test as base, expect, Page, APIResponse } from '@playwright/test';\nimport { execFile } from 'child_process';\nimport { APIRequestContext } from 'playwright-core';\nimport isNil from 'lodash/isNil';\nimport { Navigation } from '../pages';\nimport { LoginPage } from '../pages/LoginPage';\nimport { ApplicationsPage } from '../pages/ApplicationsPage';\nimport { PersonalAccessTokenPage } from '../pages/PersonalAccessTokenPage';\nimport { initReleaseDefaults } from './helper';\nimport * as process from 'process';\nimport { FixtureConfiguration, FixtureFeature, FixtureRelease, FixtureTrigger, Release } from '../types';\n\nconst adminHeaders = {\n Authorization: 'Basic YWRtaW46YWRtaW4=',\n Cookie: 'XSRF-TOKEN=1;',\n 'X-XSRF-TOKEN': '1',\n};\n\ntype ReleaseFixtures = {\n applicationPage: ApplicationsPage;\n fixtures: Fixtures;\n loginPage: LoginPage;\n navigation: Navigation;\n personalAccessTokenPage: PersonalAccessTokenPage;\n};\n\nexport const test = base.extend<ReleaseFixtures>({\n fixtures: async ({ request, page }, use) => {\n const fixtures = new Fixtures(request, page);\n await use(fixtures);\n return fixtures;\n },\n loginPage: async ({ page }, use) => {\n const loginPage = new LoginPage(page);\n await use(loginPage);\n return loginPage;\n },\n applicationPage: async ({ page }, use) => {\n const applicationPage = new ApplicationsPage(page);\n await use(applicationPage);\n return applicationPage;\n },\n personalAccessTokenPage: async ({ page }, use) => {\n const personalAccessTokenPage = new PersonalAccessTokenPage(page);\n await use(personalAccessTokenPage);\n return personalAccessTokenPage;\n },\n navigation: async ({ page }, use) => {\n const navigationPage = new Navigation(page);\n await use(navigationPage);\n return navigationPage;\n },\n});\n\nclass Fixtures {\n private readonly request: APIRequestContext;\n private readonly page: Page;\n\n private releaseIds: Array<string> = [];\n private triggerIds: Array<string> = [];\n private configurationIds: Array<string> = [];\n\n constructor(request: APIRequestContext, page: Page) {\n this.request = request;\n this.page = page;\n }\n\n release(release: FixtureRelease): Promise<APIResponse> {\n this.initDefaults(release);\n this.releaseIds.push(release.id);\n return this.deleteRelease(release.id)\n .then(() => this.deleteArchivedRelease(release.id))\n .then(() => this.doPost('fixtures/release', release));\n }\n\n configuration(ci: FixtureConfiguration): Promise<APIResponse> {\n this.configurationIds.push(ci.id);\n return this.doPost('fixtures/shared', [ci]);\n }\n\n trigger(trigger: FixtureTrigger): Promise<APIResponse> {\n this.triggerIds.push(trigger.id);\n return this.doPost('fixtures/trigger', trigger);\n }\n\n deleteArchivedRelease(id: string): Promise<APIResponse> {\n const releaseId = id.includes('Applications/') ? id : `Applications/${id}`;\n return this.doDelete('fixtures/cis', [\n {\n id: releaseId,\n type: 'xlrelease.Release',\n },\n ]);\n }\n\n deleteRelease(id: string): Promise<APIResponse> {\n const releaseId = id.includes('Applications/') ? id : `Applications/${id}`;\n return this.doDelete(`fixtures/${releaseId}`);\n }\n\n deleteTrigger(id: string): Promise<APIResponse> {\n return this.doDelete(`fixtures/trigger/${id}`);\n }\n\n deleteConfiguration(id: string): Promise<APIResponse> {\n return this.doDelete(`fixtures/shared`, [id]);\n }\n\n cleanAll(): Promise<Awaited<APIResponse>[]> {\n const promises = [];\n for (const releaseId of this.releaseIds.reverse()) {\n promises.push(this.deleteRelease(releaseId));\n }\n for (const triggerId of this.triggerIds) {\n promises.push(this.deleteTrigger(triggerId));\n }\n for (const confId of this.configurationIds) {\n promises.push(this.deleteConfiguration(confId));\n }\n this.releaseIds = [];\n this.triggerIds = [];\n this.configurationIds = [];\n return Promise.all(promises);\n }\n\n async waitForReleaseStarted(releaseTitle: string): Promise<void> {\n await expect(async () => {\n const resp = await this.doPost('releases/search', {\n inProgress: true,\n paused: true,\n failing: true,\n failed: true,\n title: releaseTitle,\n });\n const page = await resp.json();\n await expect(page.cis.length).toBeGreaterThan(0);\n }).toPass();\n }\n\n async waitForFirstPoll(triggerId: string): Promise<void> {\n await expect(async () => {\n const resp = await this.doGet(`api/v1/triggers/${triggerId}`);\n const trigger = await resp.json();\n await expect(isNil(trigger.triggerState)).toBe(false);\n }).toPass();\n }\n\n exec(path: string): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n execFile(path, (error) => {\n if (error === null) {\n return resolve();\n } else {\n return reject();\n }\n });\n });\n }\n\n getFakeApiUrl(): string {\n return this.getEnvVariable('ENV_FAKE_API') || 'http://localhost:5517';\n }\n\n getEnvVariable(name: string): string | undefined {\n return process.env[name];\n }\n\n async setFeatures(features: Array<FixtureFeature>): Promise<APIResponse> {\n return this.doPut('settings/features', features);\n }\n\n async enableTaskDrawer(enabled: boolean): Promise<APIResponse> {\n return this.setFeatures([{ id: 'Configuration/features/xlrelease.TaskDrawer', type: 'xlrelease.TaskDrawer', category: 'Stable', enabled: enabled }]);\n }\n\n private doPost(url: string, body: unknown): Promise<APIResponse> {\n return this.request.post(url, { data: body, headers: adminHeaders });\n }\n\n private doPut(url: string, body: unknown): Promise<APIResponse> {\n return this.request.put(url, { data: body, headers: adminHeaders });\n }\n\n private doGet(url: string): Promise<APIResponse> {\n return this.request.get(url, { headers: adminHeaders });\n }\n\n private doDelete(url: string, body?: unknown): Promise<APIResponse> {\n return this.request.delete(url, { data: body, headers: adminHeaders });\n }\n\n private initDefaults(ci: FixtureRelease): void {\n initReleaseDefaults(ci as Release);\n }\n}\n","import { Page } from '@playwright/test';\nimport { ReleasePage } from './ReleasePage';\n\nexport class Navigation {\n private readonly page: Page;\n\n constructor(page: Page) {\n this.page = page;\n }\n\n async openTemplate(id: string): Promise<ReleasePage> {\n return this.openReleaseOrTemplate(id, false);\n }\n\n async openRelease(id: string): Promise<ReleasePage> {\n return this.openReleaseOrTemplate(id, true);\n }\n\n private async openReleaseOrTemplate(id: string, release: boolean): Promise<ReleasePage> {\n const url = release ? 'releases' : 'templates';\n await this.page.goto(`./#/${url}/${id}`);\n await this.page.waitForSelector('#release');\n return new ReleasePage(this.page);\n }\n}\n","import { Page, Locator, expect } from '@playwright/test';\nimport { TriggersPage } from './TriggersPage';\nimport { WithPage } from './WithPage';\nimport { CustomScriptTaskModal } from './task-modal/CustomScriptTaskModal';\nimport { ReleaseVariablesPage } from './ReleaseVariablesPage';\nimport { TaskDrawer } from \"./task-drawer/TaskDrawer\";\n\nexport class ReleasePage extends WithPage {\n async openTriggers(): Promise<TriggersPage> {\n await this.openSubPage('Triggers');\n return new TriggersPage(this.page);\n }\n\n async abort(comment = 'Abort for testing'): Promise<void> {\n await this.page.locator('action-toolbar button', { hasText: 'Abort' }).click();\n await this.page.locator('.modal textarea').fill(comment);\n await this.page.locator('.modal .continue').click();\n }\n\n getPhase(phaseName: string): Phase {\n return new Phase(this.page, phaseName);\n }\n\n async start(): Promise<void> {\n await this.page.locator('action-toolbar button', { hasText: 'Start' }).click();\n await this.page.locator('.modal button.primary').click();\n }\n\n async waitForTaskCompleted(taskTitle: string): Promise<void> {\n await expect(this.page.locator('.task.completed').getByText(taskTitle, { exact: true })).toBeVisible();\n }\n async waitForTaskFailed(taskTitle: string): Promise<void> {\n await expect(this.page.locator('.task.failed').getByText(taskTitle, { exact: true })).toBeVisible();\n }\n async waitForStatusLine(statusLine: string): Promise<void> {\n await expect(this.page.locator('.task .status-line').getByText(statusLine, { exact: true })).toBeVisible();\n }\n\n /**\n * @deprecated Don't use this, use new TaskDrawer\n */\n async openCustomScriptTaskModal(taskName: string): Promise<CustomScriptTaskModal> {\n await this.page.locator('.task-header').getByText(taskName).click();\n return new CustomScriptTaskModal(this.page);\n }\n\n async openTaskDrawer(taskName: string): Promise<TaskDrawer> {\n await this.page.locator('.task-header').getByText(taskName).click();\n return new TaskDrawer(this.page);\n }\n\n async openVariables(): Promise<ReleaseVariablesPage> {\n await this.openReleaseMenu('Variables');\n return new ReleaseVariablesPage(this.page);\n }\n\n async openReleaseMenu(menuItem: string): Promise<void> {\n await this.page.locator(`navigation-sidebar ul li`).getByText(menuItem, { exact: true }).click();\n }\n\n private async openSubPage(subpage: string): Promise<void> {\n await this.page.locator('ul.side-nav li', { hasText: subpage }).click();\n }\n}\n\nclass Phase extends WithPage {\n private readonly phaseLocator: Locator;\n\n constructor(page: Page, phaseName: string) {\n super(page);\n this.phaseLocator = page.locator('.phase', { hasText: phaseName });\n }\n\n async addTask(taskName: string, taskGroup: string, taskType: string): Promise<void> {\n await this.phaseLocator.getByText('Add task').click();\n await this.phaseLocator.locator('.quick-title').fill(taskName);\n await this.phaseLocator.locator('.xlr-ctx-menu-toggle').click();\n await this.page.locator(`.xlr-ctx-menu-item`).getByTitle(taskGroup, { exact: true }).scrollIntoViewIfNeeded();\n await this.page.locator(`.xlr-ctx-menu-item`).getByTitle(taskGroup, { exact: true }).hover();\n await this.page.locator(`.xlr-ctx-menu.active`).getByTitle(taskType, { exact: true }).click();\n await this.phaseLocator.locator('.quick-controls-container a').getByText('Add', { exact: true }).click();\n }\n}\n","import { expect } from '@playwright/test';\nimport { ReleasesListPage } from './ReleasesListPage';\nimport { WithPage } from './WithPage';\n\nexport class TriggersPage extends WithPage {\n async openRelatedReleasesOf(title: string): Promise<ReleasesListPage> {\n await this.openContextMenu(title);\n await this.page.locator('.popover-content xlr-context-menu a', { hasText: 'View releases' }).click();\n return new ReleasesListPage(this.page);\n }\n\n private async openContextMenu(title: string): Promise<void> {\n await expect(async () => {\n await this.page.locator('.trigger-row-content', { hasText: title }).locator('.context-menu-button').click();\n await expect(this.page.locator('.popover-content')).toBeVisible();\n }).toPass();\n }\n}\n","import { expect } from '@playwright/test';\nimport { ReleasePage } from './ReleasePage';\nimport { WithPage } from './WithPage';\n\nexport class ReleasesListPage extends WithPage {\n async expectNumberOfReleases(releaseTitle: string, amount: number): Promise<void> {\n if (amount === 1) {\n await expect(this.page.locator('.release').getByText(releaseTitle)).toBeVisible();\n } else {\n await expect(this.page.locator('.release').getByText(releaseTitle).count()).toBe(amount);\n }\n }\n\n async openReleaseByName(releaseTitle: string): Promise<ReleasePage> {\n await this.page.locator('.release-line .row-wrapper .release-title-wrapper a', { hasText: releaseTitle }).click();\n return new ReleasePage(this.page);\n }\n}\n","import { Page } from '@playwright/test';\n\nexport class WithPage {\n protected readonly page: Page;\n\n constructor(page: Page) {\n this.page = page;\n }\n}\n","import { expect } from '@playwright/test';\nimport { TaskModal } from './TaskModal';\n\n/**\n * @deprecated Don't use this, use new TaskDrawer\n */\nexport class CustomScriptTaskModal extends TaskModal {\n async expectFieldNotEmpty(field: string): Promise<void> {\n await expect(this.taskModalLocator.locator(`#${field} .display`).textContent).toBeDefined();\n }\n\n async setSelectField(propertyName: string, value: string): Promise<void> {\n await this.focusOnField(propertyName);\n await this.taskModalLocator.locator(`select[name=\"${propertyName}\"]`).selectOption(value);\n }\n\n async setTextField(propertyName: string, value: string): Promise<void> {\n await this.focusOnField(propertyName);\n await this.taskModalLocator.locator(`input[name=\"${propertyName}\"]`).fill(value);\n }\n\n async setAutocompleteField(propertyName: string, value: string): Promise<void> {\n await this.focusOnAutocompleteField(propertyName);\n await this.taskModalLocator.locator(`#${propertyName} ul li`).getByText(value).click();\n }\n\n async expectOutputValueToBe(propertyName: string, value: string): Promise<void> {\n await expect(this.taskModalLocator.locator(`#${propertyName} .field-readonly span`)).toContainText(value);\n }\n\n // TODO move this to a new inline-editor\n private async focusOnField(propertyName: string): Promise<void> {\n await expect(async () => {\n await this.taskModalLocator.locator(`#${propertyName} .display`).click({ force: true });\n await expect(this.taskModalLocator.locator(`#${propertyName} label.edit`)).toBeVisible();\n }).toPass();\n }\n\n private async focusOnAutocompleteField(propertyName: string): Promise<void> {\n await expect(async () => {\n await this.taskModalLocator.locator(`#${propertyName} input`).click({ force: true });\n await expect(this.taskModalLocator.locator(`#${propertyName} ul`)).toBeVisible();\n }).toPass();\n }\n}\n","import { Page, Locator } from '@playwright/test';\n\nimport { WithPage } from '../WithPage';\n\n/**\n * @deprecated Don't use this, use new TaskDrawer\n */\nexport class TaskModal extends WithPage {\n protected readonly taskModalLocator: Locator;\n\n constructor(page: Page) {\n super(page);\n this.taskModalLocator = this.page.locator('.modal-content.task-details');\n }\n\n async close(): Promise<void> {\n await this.taskModalLocator.locator('.modal-header button.close').click();\n }\n}\n","import { expect, Locator } from '@playwright/test';\nimport { WithPage } from './WithPage';\nimport { waitForOneOf } from './helper';\n\ntype ExpectWithLocator = (l: Locator) => void;\n\nexport class ReleaseVariablesPage extends WithPage {\n async openVariable(variableKey: string): Promise<ReleaseVariableModal> {\n await this.page.locator(`.variables-list .variable`).getByText(variableKey).click();\n return new ReleaseVariableModal(this.page);\n }\n}\n\nclass ReleaseVariableModal extends WithPage {\n private async expectValue(locators: Locator[], expectFn: ExpectWithLocator[]): Promise<void> {\n const [index, locator] = await waitForOneOf(locators);\n await expectFn[index](locator);\n }\n\n async expectValueToBe(value: string): Promise<void> {\n await this.expectValue(\n [\n this.page.locator('#modal .variable-value input'),\n this.page.locator('#modal .variable-value .field-readonly'),\n this.page.locator('#modal .variable-value .xl-map-string-string'),\n ],\n [(l) => expect(l).toHaveValue(value), (l) => expect(l).toHaveText(value), (l) => expect(l).toHaveText(value)],\n );\n }\n\n async expectValueToContain(value: string): Promise<void> {\n await this.expectValue(\n [\n this.page.locator('#modal .variable-value input'),\n this.page.locator('#modal .variable-value .field-readonly'),\n this.page.locator('#modal .variable-value .xl-map-string-string'),\n ],\n [\n (l) => expect(l.inputValue()).toContain(value),\n (l) => expect(l).toContainText(value),\n (l) => expect(l).toContainText(value),\n ],\n );\n }\n\n async close(): Promise<void> {\n await this.page.locator('#modal .modal-header button.close').click();\n }\n}\n","import { Locator } from '@playwright/test';\n\ntype WaitForRes = [ locatorIndex: number, locator: Locator ];\nexport async function waitForOneOf(\n locators: Locator[],\n): Promise<WaitForRes> {\n const res = await Promise.all([\n ...locators.map(async (locator, index): Promise<WaitForRes> => {\n let timedOut = false;\n await locator.waitFor({ state: 'visible', timeout: 2000}).catch(() => timedOut = true);\n return [ timedOut ? -1 : index, locator ];\n }),\n ]);\n const resolvedLocator = res.find(r => r[0] !== -1);\n if (!resolvedLocator) {\n console.warn('waitForOneOf', res);\n throw new Error('no locator visible before timeout');\n }\n return resolvedLocator;\n}\n","import { WithPage } from \"../WithPage\";\nimport { Locator, Page, expect } from \"@playwright/test\";\n\ntype Rail = 'Overview' | 'Activity' | 'Config' | 'Scheduling' | 'Conditions' | 'Attributes' | 'Attach'\n\nexport class TaskDrawer extends WithPage {\n\n protected readonly taskDrawerLocator: Locator;\n\n constructor(page: Page) {\n super(page);\n this.taskDrawerLocator = this.page.locator('task-drawer .dot-drawer');\n }\n\n async openConfigRail(): Promise<ConfigRail> {\n await this.openRail('Config')\n return new ConfigRail(this.page)\n }\n\n async openRail(rail: Rail): Promise<void> {\n await this.taskDrawerLocator.locator('.task-navigation-rail').getByText(rail).click();\n }\n\n async close(): Promise<void> {\n await this.taskDrawerLocator.locator('.task-drawer-header').getByTestId('close-btn').click();\n }\n\n}\n\nclass ConfigRail extends TaskDrawer {\n\n protected readonly railLocator: Locator;\n\n\n constructor(page: Page) {\n super(page);\n this.railLocator = this.taskDrawerLocator.locator('.task-config');\n }\n\n async openInputProperties(): Promise<void> {\n await this.railLocator.locator('.task-config-header').getByText('Input properties').click();\n }\n\n async openOutputProperties(): Promise<void> {\n await this.railLocator.locator('.task-config-header').getByText('Output properties').click();\n }\n\n async getValueFromCi(propertyName: string): Promise<string> {\n return this.railLocator.locator(`input[id=\"${propertyName}\"]`).inputValue()\n }\n\n async getAllOptionsFromCi(propertyName: string): Promise<string[]> {\n await this.railLocator.locator(`input[id=\"${propertyName}\"]`).click()\n return this.railLocator.locator(`.dot-popper ul li`).allInnerTexts();\n }\n\n async setValueFromCi(propertyName: string, value: string): Promise<void> {\n await this.railLocator.locator(`input[id=\"${propertyName}\"]`).clear()\n await this.railLocator.locator(`input[id=\"${propertyName}\"]`).click()\n await this.railLocator.locator(`.dot-popper ul li`, {hasText: value}).click()\n }\n\n async getValueFromString(propertyName: string): Promise<string | null> {\n await this.railLocator.locator(`.input-scalar-fake-input[id=\"${propertyName}\"]`).focus()\n return this.railLocator.locator(`input[id=\"${propertyName}\"]`).inputValue()\n }\n\n async setValueFromString(propertyName: string, value: string): Promise<void> {\n await this.railLocator.locator(`.input-scalar-fake-input[id=\"${propertyName}\"]`).focus()\n await this.railLocator.locator(`input[id=\"${propertyName}\"]`).fill(value)\n }\n\n async setValueFromLargeString(propertyName: string, value: string): Promise<void> {\n await this.railLocator.locator(`.input-scalar-fake-input[id=\"${propertyName}\"]`).focus()\n await this.railLocator.locator(`textarea[id=\"${propertyName}\"]`).fill(value)\n }\n\n async setValueFromPassword(propertyName: string, value: string): Promise<void> {\n await this.railLocator.locator(`input[id=\"${propertyName}\"]`).fill(value)\n }\n\n async setAndCreateVariable(propertyName: string, variableName: string): Promise<void> {\n await this.railLocator.locator(`input[id=\"${propertyName}\"]`).clear()\n await this.railLocator.locator(`input[id=\"${propertyName}\"]`).click()\n await this.railLocator.locator(`input[id=\"${propertyName}\"]`).fill(variableName)\n await this.railLocator.locator(`.dot-popper button`, {hasText: variableName}).click()\n }\n\n async setVariable(propertyName: string, variableName: string): Promise<void> {\n return this.setValueFromCi(propertyName, variableName);\n }\n\n async expectValueFromString(propertyName: string, propertyValue: string): Promise<void> {\n return await expect(this.railLocator.locator(`.input-scalar-fake-input[id=\"${propertyName}\"]`)).toHaveText(propertyValue);\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './WithPage';\n\nexport class LoginPage extends WithPage {\n async login(userName: string, password: string): Promise<void> {\n await this.page.goto('./');\n await expect(this.page).toHaveTitle('Digital.ai Release');\n await this.page.locator('#inputLogin').fill(userName);\n await this.page.locator('#inputPassword').fill(password);\n await this.page.locator(\"button[type='submit']\").click();\n await expect(this.page.locator('#releases-content')).toBeVisible();\n }\n\n async logout(): Promise<void> {\n await this.page.locator('button.dot-avatar').click();\n await this.page.getByText('Log out').click();\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './WithPage';\n\nexport class ApplicationsPage extends WithPage {\n async goToApplicationsPage(): Promise<this> {\n await this.page.goto('./#/applications');\n await expect(this.page).toHaveTitle('Applications - Digital.ai Release');\n return this;\n }\n\n async addNewApplication(applicationName: string): Promise<this> {\n await this.page.locator(`//button[normalize-space()='New application']`).click();\n await this.page.locator(`input[placeholder='Add name...']`).type(applicationName);\n await this.page.locator(`//button[normalize-space()='Save']`).click();\n return this;\n }\n\n async verifyApplicationisCreated(applicationName: string): Promise<this> {\n await this.page.waitForSelector(`div[title='${applicationName}'] strong`);\n return this;\n }\n\n async createApplicationAndLinkEnvironment(environmentName: string, applicationName: string): Promise<this> {\n await this.page.locator(`//button[normalize-space()='New application']`).click();\n await this.page.locator(`input[placeholder='Add name...']`).type(applicationName);\n await this.page.locator(\"input[placeholder='Filter environment name...']\").type(environmentName);\n await this.page.locator(`div[title='${environmentName}']`).click();\n await this.page.locator(`//button[normalize-space()='Save']`).click();\n await this.page.locator('i.xl-icon.close-icon').click();\n return this;\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './WithPage';\n\nexport class PersonalAccessTokenPage extends WithPage {\n async openPersonalAccessTokenPage(): Promise<this> {\n // await this.page.locator(\"button.dot-avatar\").click()\n // await this.page.locator(\"//div[normalize-space()='Access tokens']\").click()\n await this.page.goto('./#/personal-access-token');\n await expect(this.page).toHaveTitle('Access tokens / Personal settings - Digital.ai Release');\n return this;\n }\n\n async addNewToken(tokenName: string): Promise<this> {\n //await expect(this.page).toHaveTitle('Access tokens / Personal settings - Digital.ai Release')\n\n await this.page.locator('#tokenText').fill(tokenName);\n await this.page.locator(\"button[type='submit']\").click();\n return this;\n }\n}\n","import isUndefined from 'lodash/isUndefined';\nimport each from 'lodash/each';\nimport forEach from 'lodash/forEach';\nimport defaults from 'lodash/defaults';\nimport toPairs from 'lodash/toPairs';\n\nimport { Container, Dashboard, Phase, Release, Task, Tile, Variable, VariableValueProvider } from '../types';\n\nexport const initReleaseDefaults = (function () {\n const RELEASE_TYPE = 'xlrelease.Release';\n const PHASE_TYPE = 'xlrelease.Phase';\n const TEAM_TYPE = 'xlrelease.Team';\n const TASK_TYPE = 'xlrelease.Task';\n const COMMENT_TYPE = 'xlrelease.Comment';\n const CONDITION_TYPE = 'xlrelease.GateCondition';\n const DEPENDENCY_TYPE = 'xlrelease.Dependency';\n const LINK_TYPE = 'xlrelease.Link';\n const ATTACHMENT_TYPE = 'xlrelease.Attachment';\n const DASHBOARD_TYPE = 'xlrelease.Dashboard';\n const _TRIGGER_TYPE = 'xlrelease.ReleaseTrigger';\n const JIRA_TYPE = 'jira.CreateIssue';\n const DEFAULT_TASK_OWNER = 'Itchy';\n\n const processTasks = (task: Task, container: Container, index: number): void => {\n if (isUndefined(task.type)) task.type = TASK_TYPE;\n task.id = task.id || `${container.id}/Task${index}`;\n if (isUndefined(task.owner) && task.type !== JIRA_TYPE) task.owner = DEFAULT_TASK_OWNER;\n if (task.owner === null) delete task.owner;\n\n each(task.conditions, function (condition, idx) {\n condition.type = CONDITION_TYPE;\n condition.id = `${task.id}/GateCondition${idx}`;\n });\n each(task.dependencies, function (dependency, idx) {\n dependency.type = DEPENDENCY_TYPE;\n dependency.id = `${task.id}/Dependency${idx}`;\n });\n each(task.links, function (link, idx) {\n link.type = LINK_TYPE;\n link.id = `${task.id}/Link${idx}`;\n });\n each(task.comments, function (comment, idx) {\n comment.type = COMMENT_TYPE;\n comment.id = `${task.id}/Comment${idx}`;\n });\n each(task.tasks, function (subTask, idx) {\n processTasks(subTask, task, idx);\n });\n each(task.templateVariables, function (variable, idx) {\n defaults(variable, getVariableEntity(variable.value, variable.key, task.id, idx));\n });\n each(task.attachments, function (attachment, idx) {\n attachment.type = ATTACHMENT_TYPE;\n attachment.id = `${task.id}/Attachment${idx}`;\n });\n if (task.pythonScript) {\n const pythonScript = task.pythonScript;\n pythonScript.id = `${task.id}/PythonScript`;\n pythonScript.customScriptTask = task.id;\n }\n };\n\n const processPhases = (phase: Phase, release: Release, index: number): void => {\n phase.type = PHASE_TYPE;\n phase.id = `${release.id}/Phase${index}`;\n\n forEach(phase.tasks, (task, idx): void => {\n processTasks(task, phase, idx);\n });\n };\n\n const getVariableEntity = (\n value: string,\n key: string,\n containerId: string,\n index: number,\n password?: boolean,\n // eslint-disable-next-line max-params\n ): Variable => {\n const keyNoSyntax = key.replace('${', '').replace('}', '');\n return {\n id: `${containerId}/Variable${index}`,\n key: keyNoSyntax,\n requiresValue: true,\n showOnReleaseStart: true,\n type: password ? 'xlrelease.PasswordStringVariable' : 'xlrelease.StringVariable',\n value: value,\n };\n };\n\n const getValueProviderConfigurationEntity = function (containerId: string): VariableValueProvider {\n return {\n id: `${containerId}/valueProvider`,\n variable: containerId,\n };\n };\n\n const getDashboardExtension = (dashboard: Dashboard, releaseId: string): Dashboard => {\n const dashboardExtension: Dashboard = {\n id: `${releaseId}/summary`,\n type: DASHBOARD_TYPE,\n tiles: [],\n };\n if (dashboard.tiles) {\n forEach(dashboard.tiles, function (tile, index) {\n dashboardExtension.tiles.push(getTileEntity(tile, `${releaseId}/summary`, index));\n });\n }\n return dashboardExtension;\n };\n\n function getTileEntity(tile: Tile, containerId: string, index: number): Tile {\n tile.id = tile.id || `${containerId}/Tile${index}`;\n return tile;\n }\n\n return function (release: Release) {\n release.type = RELEASE_TYPE;\n if (release.id.indexOf('Applications/') === -1) {\n release.id = `Applications/${release.id}`;\n }\n if (release.startDate) {\n release.queryableStartDate = release.startDate;\n } else if (release.scheduledStartDate) {\n release.queryableStartDate = release.scheduledStartDate;\n }\n if (release.endDate) {\n release.queryableEndDate = release.endDate;\n } else if (release.dueDate) {\n release.queryableEndDate = release.dueDate;\n }\n if (isUndefined(release.owner)) release.owner = 'Itchy'; // default release manager\n\n forEach(release.phases, function (phase, index) {\n processPhases(phase, release, index);\n });\n forEach(release.teams, function (team, index) {\n team.type = TEAM_TYPE;\n team.id = `${release.id}/Team${index}`;\n });\n forEach(release.attachments, function (attachment, index) {\n attachment.type = ATTACHMENT_TYPE;\n attachment.id = `${release.id}/Attachment${index}`;\n });\n forEach(release.variables, function (variable: Variable, index) {\n defaults(variable, getVariableEntity(variable.value, variable.key, release.id, index));\n if (variable.valueProvider) {\n defaults(variable.valueProvider, getValueProviderConfigurationEntity(variable.id));\n }\n });\n forEach(toPairs(release.variableValues), function (keyValue, index) {\n if (!release.variables) release.variables = [];\n release.variables.push(getVariableEntity(keyValue[1], keyValue[0], release.id, 1000 + index));\n release.variableValues = undefined;\n });\n forEach(toPairs(release.passwordVariableValues), function (keyValue, index) {\n if (!release.variables) release.variables = [];\n release.variables.push(getVariableEntity(keyValue[1], keyValue[0], release.id, 1500 + index, true));\n release.passwordVariableValues = undefined;\n });\n\n if (release.summary) {\n release.extensions = [getDashboardExtension(release.summary, release.id)];\n release.summary = undefined;\n }\n };\n})();\n"],"names":[],"version":3,"file":"module.js.map"}
package/dist/types.d.ts CHANGED
@@ -34,6 +34,7 @@ declare class ReleaseVariablesPage extends WithPage {
34
34
  }
35
35
  declare class ReleaseVariableModal extends WithPage {
36
36
  expectValueToBe(value: string): Promise<void>;
37
+ expectValueToContain(value: string): Promise<void>;
37
38
  close(): Promise<void>;
38
39
  }
39
40
  type Rail = 'Overview' | 'Activity' | 'Config' | 'Scheduling' | 'Conditions' | 'Attributes' | 'Attach';
@@ -57,6 +58,7 @@ declare class ConfigRail extends TaskDrawer {
57
58
  setValueFromLargeString(propertyName: string, value: string): Promise<void>;
58
59
  setValueFromPassword(propertyName: string, value: string): Promise<void>;
59
60
  setAndCreateVariable(propertyName: string, variableName: string): Promise<void>;
61
+ setVariable(propertyName: string, variableName: string): Promise<void>;
60
62
  expectValueFromString(propertyName: string, propertyValue: string): Promise<void>;
61
63
  }
62
64
  declare class ReleasePage extends WithPage {
@@ -130,7 +132,7 @@ interface Release extends PlanItem {
130
132
  interface VariableValues {
131
133
  [key: string]: any;
132
134
  }
133
- interface Variable extends PlanItem {
135
+ interface Variable extends BaseConfigurationItem {
134
136
  key: string;
135
137
  requiresValue: boolean;
136
138
  showOnReleaseStart: boolean;
@@ -189,6 +191,7 @@ type DeepPartial<T> = {
189
191
  };
190
192
  type FixtureRelease = DeepPartial<Release> & Pick<Release, 'id'>;
191
193
  interface FixtureConfiguration extends PlanItem {
194
+ apiToken?: string;
192
195
  password?: string;
193
196
  url: string;
194
197
  username?: string;
@@ -1 +1 @@
1
- {"mappings":"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","sources":["apps/release/pages/WithPage.ts","apps/release/pages/ReleasesListPage.ts","apps/release/pages/TriggersPage.ts","apps/release/pages/task-modal/TaskModal.ts","apps/release/pages/task-modal/CustomScriptTaskModal.ts","apps/release/pages/ReleaseVariablesPage.ts","apps/release/pages/task-drawer/TaskDrawer.ts","apps/release/pages/ReleasePage.ts","apps/release/pages/index.ts","apps/release/pages/LoginPage.ts","apps/release/pages/ApplicationsPage.ts","apps/release/pages/PersonalAccessTokenPage.ts","apps/release/types/index.ts","apps/release/fixtures/helper.ts","apps/release/fixtures/index.ts","apps/release/index.ts"],"sourcesContent":["import { Page } from '@playwright/test';\n\nexport class WithPage {\n protected readonly page: Page;\n\n constructor(page: Page) {\n this.page = page;\n }\n}\n","import { expect } from '@playwright/test';\nimport { ReleasePage } from './ReleasePage';\nimport { WithPage } from './WithPage';\n\nexport class ReleasesListPage extends WithPage {\n async expectNumberOfReleases(releaseTitle: string, amount: number): Promise<void> {\n if (amount === 1) {\n await expect(this.page.locator('.release').getByText(releaseTitle)).toBeVisible();\n } else {\n await expect(this.page.locator('.release').getByText(releaseTitle).count()).toBe(amount);\n }\n }\n\n async openReleaseByName(releaseTitle: string): Promise<ReleasePage> {\n await this.page.locator('.release-line .row-wrapper .release-title-wrapper a', { hasText: releaseTitle }).click();\n return new ReleasePage(this.page);\n }\n}\n","import { expect } from '@playwright/test';\nimport { ReleasesListPage } from './ReleasesListPage';\nimport { WithPage } from './WithPage';\n\nexport class TriggersPage extends WithPage {\n async openRelatedReleasesOf(title: string): Promise<ReleasesListPage> {\n await this.openContextMenu(title);\n await this.page.locator('.popover-content xlr-context-menu a', { hasText: 'View releases' }).click();\n return new ReleasesListPage(this.page);\n }\n\n private async openContextMenu(title: string): Promise<void> {\n await expect(async () => {\n await this.page.locator('.trigger-row-content', { hasText: title }).locator('.context-menu-button').click();\n await expect(this.page.locator('.popover-content')).toBeVisible();\n }).toPass();\n }\n}\n","import { Page, Locator } from '@playwright/test';\n\nimport { WithPage } from '../WithPage';\n\n/**\n * @deprecated Don't use this, use new TaskDrawer\n */\nexport class TaskModal extends WithPage {\n protected readonly taskModalLocator: Locator;\n\n constructor(page: Page) {\n super(page);\n this.taskModalLocator = this.page.locator('.modal-content.task-details');\n }\n\n async close(): Promise<void> {\n await this.taskModalLocator.locator('.modal-header button.close').click();\n }\n}\n","import { expect } from '@playwright/test';\nimport { TaskModal } from './TaskModal';\n\n/**\n * @deprecated Don't use this, use new TaskDrawer\n */\nexport class CustomScriptTaskModal extends TaskModal {\n async expectFieldNotEmpty(field: string): Promise<void> {\n await expect(this.taskModalLocator.locator(`#${field} .display`).textContent).toBeDefined();\n }\n\n async setSelectField(propertyName: string, value: string): Promise<void> {\n await this.focusOnField(propertyName);\n await this.taskModalLocator.locator(`select[name=\"${propertyName}\"]`).selectOption(value);\n }\n\n async setTextField(propertyName: string, value: string): Promise<void> {\n await this.focusOnField(propertyName);\n await this.taskModalLocator.locator(`input[name=\"${propertyName}\"]`).fill(value);\n }\n\n async setAutocompleteField(propertyName: string, value: string): Promise<void> {\n await this.focusOnAutocompleteField(propertyName);\n await this.taskModalLocator.locator(`#${propertyName} ul li`).getByText(value).click();\n }\n\n async expectOutputValueToBe(propertyName: string, value: string): Promise<void> {\n await expect(this.taskModalLocator.locator(`#${propertyName} .field-readonly span`)).toContainText(value);\n }\n\n // TODO move this to a new inline-editor\n private async focusOnField(propertyName: string): Promise<void> {\n await expect(async () => {\n await this.taskModalLocator.locator(`#${propertyName} .display`).click({ force: true });\n await expect(this.taskModalLocator.locator(`#${propertyName} label.edit`)).toBeVisible();\n }).toPass();\n }\n\n private async focusOnAutocompleteField(propertyName: string): Promise<void> {\n await expect(async () => {\n await this.taskModalLocator.locator(`#${propertyName} input`).click({ force: true });\n await expect(this.taskModalLocator.locator(`#${propertyName} ul`)).toBeVisible();\n }).toPass();\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './WithPage';\n\nexport class ReleaseVariablesPage extends WithPage {\n async openVariable(variableKey: string): Promise<ReleaseVariableModal> {\n await this.page.locator(`.variables-list .variable`).getByText(variableKey).click();\n return new ReleaseVariableModal(this.page);\n }\n}\n\nclass ReleaseVariableModal extends WithPage {\n async expectValueToBe(value: string): Promise<void> {\n await expect(this.page.locator('#modal .variable-value input')).toHaveValue(value);\n }\n\n async close(): Promise<void> {\n await this.page.locator('#modal .modal-header button.close').click();\n }\n}\n","import { WithPage } from \"../WithPage\";\nimport { Locator, Page, expect } from \"@playwright/test\";\n\ntype Rail = 'Overview' | 'Activity' | 'Config' | 'Scheduling' | 'Conditions' | 'Attributes' | 'Attach'\n\nexport class TaskDrawer extends WithPage {\n\n protected readonly taskDrawerLocator: Locator;\n\n constructor(page: Page) {\n super(page);\n this.taskDrawerLocator = this.page.locator('task-drawer .dot-drawer');\n }\n\n async openConfigRail(): Promise<ConfigRail> {\n await this.openRail('Config')\n return new ConfigRail(this.page)\n }\n\n async openRail(rail: Rail): Promise<void> {\n await this.taskDrawerLocator.locator('.task-navigation-rail').getByText(rail).click();\n }\n\n async close(): Promise<void> {\n await this.taskDrawerLocator.locator('.task-drawer-header').getByTestId('close-btn').click();\n }\n\n}\n\nclass ConfigRail extends TaskDrawer {\n\n protected readonly railLocator: Locator;\n\n\n constructor(page: Page) {\n super(page);\n this.railLocator = this.taskDrawerLocator.locator('.task-config');\n }\n\n async openInputProperties(): Promise<void> {\n await this.railLocator.locator('.task-config-header').getByText('Input properties').click();\n }\n\n async openOutputProperties(): Promise<void> {\n await this.railLocator.locator('.task-config-header').getByText('Output properties').click();\n }\n\n async getValueFromCi(propertyName: string): Promise<string> {\n return this.railLocator.locator(`input[id=\"${propertyName}\"]`).inputValue()\n }\n\n async getAllOptionsFromCi(propertyName: string): Promise<string[]> {\n await this.railLocator.locator(`input[id=\"${propertyName}\"]`).click()\n return this.railLocator.locator(`.dot-popper ul li`).allInnerTexts();\n }\n\n async setValueFromCi(propertyName: string, value: string): Promise<void> {\n await this.railLocator.locator(`input[id=\"${propertyName}\"]`).clear()\n await this.railLocator.locator(`input[id=\"${propertyName}\"]`).click()\n await this.railLocator.locator(`.dot-popper ul li`, {hasText: value}).click()\n }\n\n async getValueFromString(propertyName: string): Promise<string | null> {\n await this.railLocator.locator(`.input-scalar-fake-input[id=\"${propertyName}\"]`).focus()\n return this.railLocator.locator(`input[id=\"${propertyName}\"]`).inputValue()\n }\n\n async setValueFromString(propertyName: string, value: string): Promise<void> {\n await this.railLocator.locator(`.input-scalar-fake-input[id=\"${propertyName}\"]`).focus()\n await this.railLocator.locator(`input[id=\"${propertyName}\"]`).fill(value)\n }\n\n async setValueFromLargeString(propertyName: string, value: string): Promise<void> {\n await this.railLocator.locator(`.input-scalar-fake-input[id=\"${propertyName}\"]`).focus()\n await this.railLocator.locator(`textarea[id=\"${propertyName}\"]`).fill(value)\n }\n\n async setValueFromPassword(propertyName: string, value: string): Promise<void> {\n await this.railLocator.locator(`input[id=\"${propertyName}\"]`).fill(value)\n }\n\n async setAndCreateVariable(propertyName: string, variableName: string): Promise<void> {\n await this.railLocator.locator(`input[id=\"${propertyName}\"]`).clear()\n await this.railLocator.locator(`input[id=\"${propertyName}\"]`).click()\n await this.railLocator.locator(`input[id=\"${propertyName}\"]`).fill(variableName)\n await this.railLocator.locator(`.dot-popper button`, {hasText: variableName}).click()\n }\n\n async expectValueFromString(propertyName: string, propertyValue: string): Promise<void> {\n return await expect(this.railLocator.locator(`.input-scalar-fake-input[id=\"${propertyName}\"]`)).toHaveText(propertyValue);\n }\n}\n","import { Page, Locator, expect } from '@playwright/test';\nimport { TriggersPage } from './TriggersPage';\nimport { WithPage } from './WithPage';\nimport { CustomScriptTaskModal } from './task-modal/CustomScriptTaskModal';\nimport { ReleaseVariablesPage } from './ReleaseVariablesPage';\nimport { TaskDrawer } from \"./task-drawer/TaskDrawer\";\n\nexport class ReleasePage extends WithPage {\n async openTriggers(): Promise<TriggersPage> {\n await this.openSubPage('Triggers');\n return new TriggersPage(this.page);\n }\n\n async abort(comment = 'Abort for testing'): Promise<void> {\n await this.page.locator('action-toolbar button', { hasText: 'Abort' }).click();\n await this.page.locator('.modal textarea').fill(comment);\n await this.page.locator('.modal .continue').click();\n }\n\n getPhase(phaseName: string): Phase {\n return new Phase(this.page, phaseName);\n }\n\n async start(): Promise<void> {\n await this.page.locator('action-toolbar button', { hasText: 'Start' }).click();\n await this.page.locator('.modal button.primary').click();\n }\n\n async waitForTaskCompleted(taskTitle: string): Promise<void> {\n await expect(this.page.locator('.task.completed').getByText(taskTitle, { exact: true })).toBeVisible();\n }\n async waitForTaskFailed(taskTitle: string): Promise<void> {\n await expect(this.page.locator('.task.failed').getByText(taskTitle, { exact: true })).toBeVisible();\n }\n async waitForStatusLine(statusLine: string): Promise<void> {\n await expect(this.page.locator('.task .status-line').getByText(statusLine, { exact: true })).toBeVisible();\n }\n\n /**\n * @deprecated Don't use this, use new TaskDrawer\n */\n async openCustomScriptTaskModal(taskName: string): Promise<CustomScriptTaskModal> {\n await this.page.locator('.task-header').getByText(taskName).click();\n return new CustomScriptTaskModal(this.page);\n }\n\n async openTaskDrawer(taskName: string): Promise<TaskDrawer> {\n await this.page.locator('.task-header').getByText(taskName).click();\n return new TaskDrawer(this.page);\n }\n\n async openVariables(): Promise<ReleaseVariablesPage> {\n await this.openReleaseMenu('Variables');\n return new ReleaseVariablesPage(this.page);\n }\n\n async openReleaseMenu(menuItem: string): Promise<void> {\n await this.page.locator(`navigation-sidebar ul li`).getByText(menuItem, { exact: true }).click();\n }\n\n private async openSubPage(subpage: string): Promise<void> {\n await this.page.locator('ul.side-nav li', { hasText: subpage }).click();\n }\n}\n\nclass Phase extends WithPage {\n private readonly phaseLocator: Locator;\n\n constructor(page: Page, phaseName: string) {\n super(page);\n this.phaseLocator = page.locator('.phase', { hasText: phaseName });\n }\n\n async addTask(taskName: string, taskGroup: string, taskType: string): Promise<void> {\n await this.phaseLocator.getByText('Add task').click();\n await this.phaseLocator.locator('.quick-title').fill(taskName);\n await this.phaseLocator.locator('.xlr-ctx-menu-toggle').click();\n await this.page.locator(`.xlr-ctx-menu-item`).getByTitle(taskGroup, { exact: true }).scrollIntoViewIfNeeded();\n await this.page.locator(`.xlr-ctx-menu-item`).getByTitle(taskGroup, { exact: true }).hover();\n await this.page.locator(`.xlr-ctx-menu.active`).getByTitle(taskType, { exact: true }).click();\n await this.phaseLocator.locator('.quick-controls-container a').getByText('Add', { exact: true }).click();\n }\n}\n","import { Page } from '@playwright/test';\nimport { ReleasePage } from './ReleasePage';\n\nexport class Navigation {\n private readonly page: Page;\n\n constructor(page: Page) {\n this.page = page;\n }\n\n async openTemplate(id: string): Promise<ReleasePage> {\n return this.openReleaseOrTemplate(id, false);\n }\n\n async openRelease(id: string): Promise<ReleasePage> {\n return this.openReleaseOrTemplate(id, true);\n }\n\n private async openReleaseOrTemplate(id: string, release: boolean): Promise<ReleasePage> {\n const url = release ? 'releases' : 'templates';\n await this.page.goto(`./#/${url}/${id}`);\n await this.page.waitForSelector('#release');\n return new ReleasePage(this.page);\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './WithPage';\n\nexport class LoginPage extends WithPage {\n async login(userName: string, password: string): Promise<void> {\n await this.page.goto('./');\n await expect(this.page).toHaveTitle('Digital.ai Release');\n await this.page.locator('#inputLogin').fill(userName);\n await this.page.locator('#inputPassword').fill(password);\n await this.page.locator(\"button[type='submit']\").click();\n await expect(this.page.locator('#releases-content')).toBeVisible();\n }\n\n async logout(): Promise<void> {\n await this.page.locator('button.dot-avatar').click();\n await this.page.getByText('Log out').click();\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './WithPage';\n\nexport class ApplicationsPage extends WithPage {\n async goToApplicationsPage(): Promise<this> {\n await this.page.goto('./#/applications');\n await expect(this.page).toHaveTitle('Applications - Digital.ai Release');\n return this;\n }\n\n async addNewApplication(applicationName: string): Promise<this> {\n await this.page.locator(`//button[normalize-space()='New application']`).click();\n await this.page.locator(`input[placeholder='Add name...']`).type(applicationName);\n await this.page.locator(`//button[normalize-space()='Save']`).click();\n return this;\n }\n\n async verifyApplicationisCreated(applicationName: string): Promise<this> {\n await this.page.waitForSelector(`div[title='${applicationName}'] strong`);\n return this;\n }\n\n async createApplicationAndLinkEnvironment(environmentName: string, applicationName: string): Promise<this> {\n await this.page.locator(`//button[normalize-space()='New application']`).click();\n await this.page.locator(`input[placeholder='Add name...']`).type(applicationName);\n await this.page.locator(\"input[placeholder='Filter environment name...']\").type(environmentName);\n await this.page.locator(`div[title='${environmentName}']`).click();\n await this.page.locator(`//button[normalize-space()='Save']`).click();\n await this.page.locator('i.xl-icon.close-icon').click();\n return this;\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './WithPage';\n\nexport class PersonalAccessTokenPage extends WithPage {\n async openPersonalAccessTokenPage(): Promise<this> {\n // await this.page.locator(\"button.dot-avatar\").click()\n // await this.page.locator(\"//div[normalize-space()='Access tokens']\").click()\n await this.page.goto('./#/personal-access-token');\n await expect(this.page).toHaveTitle('Access tokens / Personal settings - Digital.ai Release');\n return this;\n }\n\n async addNewToken(tokenName: string): Promise<this> {\n //await expect(this.page).toHaveTitle('Access tokens / Personal settings - Digital.ai Release')\n\n await this.page.locator('#tokenText').fill(tokenName);\n await this.page.locator(\"button[type='submit']\").click();\n return this;\n }\n}\n","interface BaseConfigurationItem {\n id: string;\n type: string;\n}\n\ninterface PlanItem extends BaseConfigurationItem {\n title: string;\n}\n\nexport interface Release extends PlanItem {\n allowConcurrentReleasesFromTrigger: boolean;\n attachments: Array<Attachment>;\n description: string;\n dueDate?: Date;\n endDate?: Date;\n extensions: Array<ReleaseExtension>;\n owner?: string;\n passwordVariableValues?: VariableValues;\n phases: Array<Phase>;\n queryableEndDate?: Date;\n queryableStartDate?: Date;\n scheduledStartDate?: Date;\n scriptUserPassword?: string;\n scriptUsername?: string;\n startDate?: Date;\n status: ReleaseStatus;\n summary?: Dashboard;\n teams: Array<Team>;\n variableValues?: VariableValues;\n variables: Array<Variable>;\n}\n\ninterface VariableValues {\n [key: string]: any;\n}\n\nexport interface Variable extends PlanItem {\n key: string;\n requiresValue: boolean;\n showOnReleaseStart: boolean;\n value: any;\n valueProvider?: VariableValueProvider;\n}\n\nexport interface VariableValueProvider {\n id: string;\n variable: string;\n}\n\nexport interface Container extends PlanItem {\n tasks: Array<Task>;\n}\n\nexport interface Phase extends Container {\n status: PhaseStatus;\n}\n\nexport interface Task extends PlanItem {\n attachments: Array<Attachment>;\n comments: Array<Comment>;\n conditions: Array<Condition>;\n dependencies: Array<Dependency>;\n links: Array<Link>;\n owner?: string;\n pythonScript?: PythonScript;\n status: TaskStatus;\n tasks: Array<Task>;\n templateVariables: Array<Variable>;\n}\n\ntype Condition = PlanItem;\ntype Dependency = PlanItem;\ntype Link = PlanItem;\ntype Comment = PlanItem;\ntype Attachment = PlanItem;\n\nexport interface Dashboard extends ReleaseExtension {\n tiles: Array<Tile>;\n}\n\ntype ReleaseExtension = BaseConfigurationItem;\nexport type Tile = BaseConfigurationItem;\n\ninterface PythonScript extends BaseConfigurationItem {\n customScriptTask: string;\n}\n\ntype ReleaseStatus = 'TEMPLATE' | 'PLANNED' | 'IN_PROGRESS' | 'PAUSED' | 'FAILING' | 'FAILED' | 'COMPLETED' | 'ABORTED';\ntype PhaseStatus = 'PLANNED' | 'IN_PROGRESS' | 'COMPLETED' | 'FAILING' | 'FAILED' | 'SKIPPED' | 'ABORTED';\ntype TaskStatus =\n | 'IN_PROGRESS'\n | 'PLANNED'\n | 'SKIPPED_IN_ADVANCE'\n | 'COMPLETED_IN_ADVANCE'\n | 'COMPLETED'\n | 'SKIPPED'\n | 'ABORTED'\n | 'PENDING'\n | 'FACET_CHECK_IN_PROGRESS'\n | 'FAILED'\n | 'FAILING'\n | 'FAILURE_HANDLER_IN_PROGRESS'\n | 'ABORT_SCRIPT_IN_PROGRESS'\n | 'PRECONDITION_IN_PROGRESS'\n | 'QUEUED'\n | 'ABORT_SCRIPT_QUEUED'\n | 'WAITING_FOR_INPUT'\n | 'FAILURE_HANDLER_QUEUED';\n\ntype Team = BaseConfigurationItem;\n\ntype FeatureCategory = 'Stable' | 'Incubating';\ntype FeatureType = 'xlrelease.TaskDrawer'; // add more as needed\nexport interface FixtureFeature {\n category: FeatureCategory;\n enabled: boolean;\n id: string;\n type: FeatureType;\n}\n\ntype DeepPartial<T> = {\n [P in keyof T]?: DeepPartial<T[P]>;\n};\n\n// for fixtures we allow releases with everything optional expect the `id`\nexport type FixtureRelease = DeepPartial<Release> & Pick<Release, 'id'>;\n\nexport interface FixtureConfiguration extends PlanItem {\n password?: string;\n url: string;\n username?: string;\n}\n\nexport interface FixtureTrigger extends PlanItem {\n folderId?: string;\n gitRepository?: string;\n periodicity?: number | string;\n pollType?: string;\n releaseTitle: string;\n template: string;\n}\n","import isUndefined from 'lodash/isUndefined';\nimport each from 'lodash/each';\nimport forEach from 'lodash/forEach';\nimport defaults from 'lodash/defaults';\nimport toPairs from 'lodash/toPairs';\n\nimport { Container, Dashboard, Phase, Release, Task, Tile, Variable, VariableValueProvider } from '../types';\n\nexport const initReleaseDefaults = (function () {\n const RELEASE_TYPE = 'xlrelease.Release';\n const PHASE_TYPE = 'xlrelease.Phase';\n const TEAM_TYPE = 'xlrelease.Team';\n const TASK_TYPE = 'xlrelease.Task';\n const COMMENT_TYPE = 'xlrelease.Comment';\n const CONDITION_TYPE = 'xlrelease.GateCondition';\n const DEPENDENCY_TYPE = 'xlrelease.Dependency';\n const LINK_TYPE = 'xlrelease.Link';\n const ATTACHMENT_TYPE = 'xlrelease.Attachment';\n const DASHBOARD_TYPE = 'xlrelease.Dashboard';\n const _TRIGGER_TYPE = 'xlrelease.ReleaseTrigger';\n const JIRA_TYPE = 'jira.CreateIssue';\n const DEFAULT_TASK_OWNER = 'Itchy';\n\n const processTasks = (task: Task, container: Container, index: number): void => {\n if (isUndefined(task.type)) task.type = TASK_TYPE;\n task.id = task.id || `${container.id}/Task${index}`;\n if (isUndefined(task.owner) && task.type !== JIRA_TYPE) task.owner = DEFAULT_TASK_OWNER;\n if (task.owner === null) delete task.owner;\n\n each(task.conditions, function (condition, idx) {\n condition.type = CONDITION_TYPE;\n condition.id = `${task.id}/GateCondition${idx}`;\n });\n each(task.dependencies, function (dependency, idx) {\n dependency.type = DEPENDENCY_TYPE;\n dependency.id = `${task.id}/Dependency${idx}`;\n });\n each(task.links, function (link, idx) {\n link.type = LINK_TYPE;\n link.id = `${task.id}/Link${idx}`;\n });\n each(task.comments, function (comment, idx) {\n comment.type = COMMENT_TYPE;\n comment.id = `${task.id}/Comment${idx}`;\n });\n each(task.tasks, function (subTask, idx) {\n processTasks(subTask, task, idx);\n });\n each(task.templateVariables, function (variable, idx) {\n defaults(variable, getVariableEntity(variable.value, variable.key, task.id, idx));\n });\n each(task.attachments, function (attachment, idx) {\n attachment.type = ATTACHMENT_TYPE;\n attachment.id = `${task.id}/Attachment${idx}`;\n });\n if (task.pythonScript) {\n const pythonScript = task.pythonScript;\n pythonScript.id = `${task.id}/PythonScript`;\n pythonScript.customScriptTask = task.id;\n }\n };\n\n const processPhases = (phase: Phase, release: Release, index: number): void => {\n phase.type = PHASE_TYPE;\n phase.id = `${release.id}/Phase${index}`;\n\n forEach(phase.tasks, (task, idx): void => {\n processTasks(task, phase, idx);\n });\n };\n\n const getVariableEntity = (\n value: string,\n key: string,\n containerId: string,\n index: number,\n password?: boolean,\n // eslint-disable-next-line max-params\n ): Variable => {\n const keyNoSyntax = key.replace('${', '').replace('}', '');\n return {\n title: '',\n id: `${containerId}/Variable${index}`,\n key: keyNoSyntax,\n requiresValue: true,\n showOnReleaseStart: true,\n type: password ? 'xlrelease.PasswordStringVariable' : 'xlrelease.StringVariable',\n value: value,\n };\n };\n\n const getValueProviderConfigurationEntity = function (containerId: string): VariableValueProvider {\n return {\n id: `${containerId}/valueProvider`,\n variable: containerId,\n };\n };\n\n const getDashboardExtension = (dashboard: Dashboard, releaseId: string): Dashboard => {\n const dashboardExtension: Dashboard = {\n id: `${releaseId}/summary`,\n type: DASHBOARD_TYPE,\n tiles: [],\n };\n if (dashboard.tiles) {\n forEach(dashboard.tiles, function (tile, index) {\n dashboardExtension.tiles.push(getTileEntity(tile, `${releaseId}/summary`, index));\n });\n }\n return dashboardExtension;\n };\n\n function getTileEntity(tile: Tile, containerId: string, index: number): Tile {\n tile.id = tile.id || `${containerId}/Tile${index}`;\n return tile;\n }\n\n return function (release: Release) {\n release.type = RELEASE_TYPE;\n if (release.id.indexOf('Applications/') === -1) {\n release.id = `Applications/${release.id}`;\n }\n if (release.startDate) {\n release.queryableStartDate = release.startDate;\n } else if (release.scheduledStartDate) {\n release.queryableStartDate = release.scheduledStartDate;\n }\n if (release.endDate) {\n release.queryableEndDate = release.endDate;\n } else if (release.dueDate) {\n release.queryableEndDate = release.dueDate;\n }\n if (isUndefined(release.owner)) release.owner = 'Itchy'; // default release manager\n\n forEach(release.phases, function (phase, index) {\n processPhases(phase, release, index);\n });\n forEach(release.teams, function (team, index) {\n team.type = TEAM_TYPE;\n team.id = `${release.id}/Team${index}`;\n });\n forEach(release.attachments, function (attachment, index) {\n attachment.type = ATTACHMENT_TYPE;\n attachment.id = `${release.id}/Attachment${index}`;\n });\n forEach(release.variables, function (variable: Variable, index) {\n defaults(variable, getVariableEntity(variable.value, variable.key, release.id, index));\n if (variable.valueProvider) {\n defaults(variable.valueProvider, getValueProviderConfigurationEntity(variable.id));\n }\n });\n forEach(toPairs(release.variableValues), function (keyValue, index) {\n if (!release.variables) release.variables = [];\n release.variables.push(getVariableEntity(keyValue[1], keyValue[0], release.id, 1000 + index));\n release.variableValues = undefined;\n });\n forEach(toPairs(release.passwordVariableValues), function (keyValue, index) {\n if (!release.variables) release.variables = [];\n release.variables.push(getVariableEntity(keyValue[1], keyValue[0], release.id, 1500 + index, true));\n release.passwordVariableValues = undefined;\n });\n\n if (release.summary) {\n release.extensions = [getDashboardExtension(release.summary, release.id)];\n release.summary = undefined;\n }\n };\n})();\n","import { test as base, expect, Page, APIResponse } from '@playwright/test';\nimport { execFile } from 'child_process';\nimport { APIRequestContext } from 'playwright-core';\nimport isNil from 'lodash/isNil';\nimport { Navigation } from '../pages';\nimport { LoginPage } from '../pages/LoginPage';\nimport { ApplicationsPage } from '../pages/ApplicationsPage';\nimport { PersonalAccessTokenPage } from '../pages/PersonalAccessTokenPage';\nimport { initReleaseDefaults } from './helper';\nimport * as process from 'process';\nimport { FixtureConfiguration, FixtureFeature, FixtureRelease, FixtureTrigger, Release } from '../types';\n\nconst adminHeaders = {\n Authorization: 'Basic YWRtaW46YWRtaW4=',\n Cookie: 'XSRF-TOKEN=1;',\n 'X-XSRF-TOKEN': '1',\n};\n\ntype ReleaseFixtures = {\n applicationPage: ApplicationsPage;\n fixtures: Fixtures;\n loginPage: LoginPage;\n navigation: Navigation;\n personalAccessTokenPage: PersonalAccessTokenPage;\n};\n\nexport const test = base.extend<ReleaseFixtures>({\n fixtures: async ({ request, page }, use) => {\n const fixtures = new Fixtures(request, page);\n await use(fixtures);\n return fixtures;\n },\n loginPage: async ({ page }, use) => {\n const loginPage = new LoginPage(page);\n await use(loginPage);\n return loginPage;\n },\n applicationPage: async ({ page }, use) => {\n const applicationPage = new ApplicationsPage(page);\n await use(applicationPage);\n return applicationPage;\n },\n personalAccessTokenPage: async ({ page }, use) => {\n const personalAccessTokenPage = new PersonalAccessTokenPage(page);\n await use(personalAccessTokenPage);\n return personalAccessTokenPage;\n },\n navigation: async ({ page }, use) => {\n const navigationPage = new Navigation(page);\n await use(navigationPage);\n return navigationPage;\n },\n});\n\nclass Fixtures {\n private readonly request: APIRequestContext;\n private readonly page: Page;\n\n private releaseIds: Array<string> = [];\n private triggerIds: Array<string> = [];\n private configurationIds: Array<string> = [];\n\n constructor(request: APIRequestContext, page: Page) {\n this.request = request;\n this.page = page;\n }\n\n release(release: FixtureRelease): Promise<APIResponse> {\n this.initDefaults(release);\n this.releaseIds.push(release.id);\n return this.deleteRelease(release.id)\n .then(() => this.deleteArchivedRelease(release.id))\n .then(() => this.doPost('fixtures/release', release));\n }\n\n configuration(ci: FixtureConfiguration): Promise<APIResponse> {\n this.configurationIds.push(ci.id);\n return this.doPost('fixtures/shared', [ci]);\n }\n\n trigger(trigger: FixtureTrigger): Promise<APIResponse> {\n this.triggerIds.push(trigger.id);\n return this.doPost('fixtures/trigger', trigger);\n }\n\n deleteArchivedRelease(id: string): Promise<APIResponse> {\n const releaseId = id.includes('Applications/') ? id : `Applications/${id}`;\n return this.doDelete('fixtures/cis', [\n {\n id: releaseId,\n type: 'xlrelease.Release',\n },\n ]);\n }\n\n deleteRelease(id: string): Promise<APIResponse> {\n const releaseId = id.includes('Applications/') ? id : `Applications/${id}`;\n return this.doDelete(`fixtures/${releaseId}`);\n }\n\n deleteTrigger(id: string): Promise<APIResponse> {\n return this.doDelete(`fixtures/trigger/${id}`);\n }\n\n deleteConfiguration(id: string): Promise<APIResponse> {\n return this.doDelete(`fixtures/shared`, [id]);\n }\n\n cleanAll(): Promise<Awaited<APIResponse>[]> {\n const promises = [];\n for (const releaseId of this.releaseIds.reverse()) {\n promises.push(this.deleteRelease(releaseId));\n }\n for (const triggerId of this.triggerIds) {\n promises.push(this.deleteTrigger(triggerId));\n }\n for (const confId of this.configurationIds) {\n promises.push(this.deleteConfiguration(confId));\n }\n this.releaseIds = [];\n this.triggerIds = [];\n this.configurationIds = [];\n return Promise.all(promises);\n }\n\n async waitForReleaseStarted(releaseTitle: string): Promise<void> {\n await expect(async () => {\n const resp = await this.doPost('releases/search', {\n inProgress: true,\n paused: true,\n failing: true,\n failed: true,\n title: releaseTitle,\n });\n const page = await resp.json();\n await expect(page.cis.length).toBeGreaterThan(0);\n }).toPass();\n }\n\n async waitForFirstPoll(triggerId: string): Promise<void> {\n await expect(async () => {\n const resp = await this.doGet(`api/v1/triggers/${triggerId}`);\n const trigger = await resp.json();\n await expect(isNil(trigger.triggerState)).toBe(false);\n }).toPass();\n }\n\n exec(path: string): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n execFile(path, (error) => {\n if (error === null) {\n return resolve();\n } else {\n return reject();\n }\n });\n });\n }\n\n getFakeApiUrl(): string {\n return this.getEnvVariable('ENV_FAKE_API') || 'http://localhost:5517';\n }\n\n getEnvVariable(name: string): string | undefined {\n return process.env[name];\n }\n\n async setFeatures(features: Array<FixtureFeature>): Promise<APIResponse> {\n return this.doPut('/settings/features', features);\n }\n\n async enableTaskDrawer(enabled: boolean): Promise<APIResponse> {\n return this.setFeatures([{ id: 'Configuration/features/xlrelease.TaskDrawer', type: 'xlrelease.TaskDrawer', category: 'Stable', enabled: enabled }]);\n }\n\n private doPost(url: string, body: unknown): Promise<APIResponse> {\n return this.request.post(url, { data: body, headers: adminHeaders });\n }\n\n private doPut(url: string, body: unknown): Promise<APIResponse> {\n return this.request.put(url, { data: body, headers: adminHeaders });\n }\n\n private doGet(url: string): Promise<APIResponse> {\n return this.request.get(url, { headers: adminHeaders });\n }\n\n private doDelete(url: string, body?: unknown): Promise<APIResponse> {\n return this.request.delete(url, { data: body, headers: adminHeaders });\n }\n\n private initDefaults(ci: FixtureRelease): void {\n initReleaseDefaults(ci as Release);\n }\n}\n","export { test } from './fixtures';\n"],"names":[],"version":3,"file":"types.d.ts.map"}
1
+ {"mappings":";;AAEA;IACE,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;gBAElB,IAAI,EAAE,IAAI;CAGvB;ACJD,8BAA8B,SAAQ,QAAQ;IACtC,sBAAsB,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ3E,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;CAIpE;ACbD,0BAA0B,SAAQ,QAAQ;IAClC,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAYtE;ACbD;;GAEG;AACH,uBAAuB,SAAQ,QAAQ;IACrC,SAAS,CAAC,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;gBAEjC,IAAI,EAAE,IAAI;IAKhB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B;ACfD;;GAEG;AACH,mCAAmC,SAAQ,SAAS;IAC5C,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjD,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlE,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKhE,oBAAoB,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxE,qBAAqB,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAkBhF;AEtCD,kCAAkC,SAAQ,QAAQ;IAC1C,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;CAIvE;AAED,kCAA2B,SAAQ,QAAQ;IAMnC,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW7C,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAelD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B;AC7CD,YAAY,UAAU,GAAG,UAAU,GAAG,QAAQ,GAAG,YAAY,GAAG,YAAY,GAAG,YAAY,GAAG,QAAQ,CAAA;AAEtG,wBAAwB,SAAQ,QAAQ;IAEtC,SAAS,CAAC,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;gBAElC,IAAI,EAAE,IAAI;IAKhB,cAAc,IAAI,OAAO,CAAC,UAAU,CAAC;IAKrC,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAInC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAI7B;AAED,wBAAiB,SAAQ,UAAU;IAEjC,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;gBAG5B,IAAI,EAAE,IAAI;IAKhB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIpC,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrC,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIrD,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAK5D,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMlE,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAKhE,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKtE,uBAAuB,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK3E,oBAAoB,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxE,oBAAoB,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO/E,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAItE,qBAAqB,CAAC,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGxF;ACxFD,yBAAyB,SAAQ,QAAQ;IACjC,YAAY,IAAI,OAAO,CAAC,YAAY,CAAC;IAKrC,KAAK,CAAC,OAAO,SAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAMzD,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK;IAI5B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAGtD,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAGnD,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1D;;OAEG;IACG,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAK3E,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAKrD,aAAa,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAK9C,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAOvD;AAED,mBAAY,SAAQ,QAAQ;gBAGd,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM;IAKnC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CASpF;AC/ED;gBAGc,IAAI,EAAE,IAAI;IAIhB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAI9C,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;CAUpD;ACrBD,uBAAuB,SAAQ,QAAQ;IAC/B,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASxD,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;CAI9B;ACdD,8BAA8B,SAAQ,QAAQ;IACtC,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IAMrC,iBAAiB,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOzD,0BAA0B,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlE,mCAAmC,CAAC,eAAe,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAS3G;AC5BD,qCAAqC,SAAQ,QAAQ;IAC7C,2BAA2B,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ5C,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAOpD;ACnBD;IACE,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,kBAAmB,SAAQ,qBAAqB;IAC9C,KAAK,EAAE,MAAM,CAAC;CACf;AAED,iBAAyB,SAAQ,QAAQ;IACvC,kCAAkC,EAAE,OAAO,CAAC;IAC5C,WAAW,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,UAAU,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sBAAsB,CAAC,EAAE,cAAc,CAAC;IACxC,MAAM,EAAE,KAAK,CAAC,OAAK,CAAC,CAAC;IACrB,gBAAgB,CAAC,EAAE,IAAI,CAAC;IACxB,kBAAkB,CAAC,EAAE,IAAI,CAAC;IAC1B,kBAAkB,CAAC,EAAE,IAAI,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,MAAM,EAAE,aAAa,CAAC;IACtB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IACnB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;CAC5B;AAED;IACE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,kBAA0B,SAAQ,qBAAqB;IACrD,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,EAAE,OAAO,CAAC;IACvB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,KAAK,EAAE,GAAG,CAAC;IACX,aAAa,CAAC,EAAE,qBAAqB,CAAC;CACvC;AAED;IACE,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,mBAA2B,SAAQ,QAAQ;IACzC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;CACpB;AAED,iBAAuB,SAAQ,SAAS;IACtC,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,cAAsB,SAAQ,QAAQ;IACpC,WAAW,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IAC/B,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACzB,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAC7B,YAAY,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IAChC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IACnB,iBAAiB,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;CACpC;AAED,iBAAiB,QAAQ,CAAC;AAC1B,kBAAkB,QAAQ,CAAC;AAC3B,YAAY,QAAQ,CAAC;AACrB,eAAe,QAAQ,CAAC;AACxB,kBAAkB,QAAQ,CAAC;AAE3B,mBAA2B,SAAQ,gBAAgB;IACjD,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;CACpB;AAED,wBAAwB,qBAAqB,CAAC;AAC9C,YAAmB,qBAAqB,CAAC;AAEzC,sBAAuB,SAAQ,qBAAqB;IAClD,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAqB,UAAU,GAAG,SAAS,GAAG,aAAa,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,WAAW,GAAG,SAAS,CAAC;AACxH,mBAAmB,SAAS,GAAG,aAAa,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;AAC1G,kBACI,aAAa,GACb,SAAS,GACT,oBAAoB,GACpB,sBAAsB,GACtB,WAAW,GACX,SAAS,GACT,SAAS,GACT,SAAS,GACT,yBAAyB,GACzB,QAAQ,GACR,SAAS,GACT,6BAA6B,GAC7B,0BAA0B,GAC1B,0BAA0B,GAC1B,QAAQ,GACR,qBAAqB,GACrB,mBAAmB,GACnB,wBAAwB,CAAC;AAE7B,YAAY,qBAAqB,CAAC;AAElC,uBAAuB,QAAQ,GAAG,YAAY,CAAC;AAC/C,mBAAmB,sBAAsB,CAAC;AAC1C;IACE,QAAQ,EAAE,eAAe,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,WAAW,CAAC;CACnB;AAED,iBAAiB,CAAC,IAAI;KACnB,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;CACnC,CAAC;AAGF,sBAA6B,YAAY,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAExE,8BAAsC,SAAQ,QAAQ;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgC,SAAQ,QAAQ;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AE3HD,uBAAuB;IACrB,eAAe,EAAE,gBAAgB,CAAC;IAClC,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,EAAE,UAAU,CAAC;IACvB,uBAAuB,EAAE,uBAAuB,CAAC;CAClD,CAAC;AAEF,OAAO,MAAM,mQA0BX,CAAC;AAEH;gBAQc,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,IAAI;IAKlD,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC;IAQtD,aAAa,CAAC,EAAE,EAAE,oBAAoB,GAAG,OAAO,CAAC,WAAW,CAAC;IAK7D,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC;IAKtD,qBAAqB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAUvD,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAK/C,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAI/C,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAIrD,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;IAiBrC,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAc1D,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQxD,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYjC,aAAa,IAAI,MAAM;IAIvB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI1C,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;IAIlE,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC;CAuB/D","sources":["apps/release/pages/WithPage.ts","apps/release/pages/ReleasesListPage.ts","apps/release/pages/TriggersPage.ts","apps/release/pages/task-modal/TaskModal.ts","apps/release/pages/task-modal/CustomScriptTaskModal.ts","apps/release/pages/helper/index.ts","apps/release/pages/ReleaseVariablesPage.ts","apps/release/pages/task-drawer/TaskDrawer.ts","apps/release/pages/ReleasePage.ts","apps/release/pages/index.ts","apps/release/pages/LoginPage.ts","apps/release/pages/ApplicationsPage.ts","apps/release/pages/PersonalAccessTokenPage.ts","apps/release/types/index.ts","apps/release/fixtures/helper.ts","apps/release/fixtures/index.ts","apps/release/index.ts"],"sourcesContent":["import { Page } from '@playwright/test';\n\nexport class WithPage {\n protected readonly page: Page;\n\n constructor(page: Page) {\n this.page = page;\n }\n}\n","import { expect } from '@playwright/test';\nimport { ReleasePage } from './ReleasePage';\nimport { WithPage } from './WithPage';\n\nexport class ReleasesListPage extends WithPage {\n async expectNumberOfReleases(releaseTitle: string, amount: number): Promise<void> {\n if (amount === 1) {\n await expect(this.page.locator('.release').getByText(releaseTitle)).toBeVisible();\n } else {\n await expect(this.page.locator('.release').getByText(releaseTitle).count()).toBe(amount);\n }\n }\n\n async openReleaseByName(releaseTitle: string): Promise<ReleasePage> {\n await this.page.locator('.release-line .row-wrapper .release-title-wrapper a', { hasText: releaseTitle }).click();\n return new ReleasePage(this.page);\n }\n}\n","import { expect } from '@playwright/test';\nimport { ReleasesListPage } from './ReleasesListPage';\nimport { WithPage } from './WithPage';\n\nexport class TriggersPage extends WithPage {\n async openRelatedReleasesOf(title: string): Promise<ReleasesListPage> {\n await this.openContextMenu(title);\n await this.page.locator('.popover-content xlr-context-menu a', { hasText: 'View releases' }).click();\n return new ReleasesListPage(this.page);\n }\n\n private async openContextMenu(title: string): Promise<void> {\n await expect(async () => {\n await this.page.locator('.trigger-row-content', { hasText: title }).locator('.context-menu-button').click();\n await expect(this.page.locator('.popover-content')).toBeVisible();\n }).toPass();\n }\n}\n","import { Page, Locator } from '@playwright/test';\n\nimport { WithPage } from '../WithPage';\n\n/**\n * @deprecated Don't use this, use new TaskDrawer\n */\nexport class TaskModal extends WithPage {\n protected readonly taskModalLocator: Locator;\n\n constructor(page: Page) {\n super(page);\n this.taskModalLocator = this.page.locator('.modal-content.task-details');\n }\n\n async close(): Promise<void> {\n await this.taskModalLocator.locator('.modal-header button.close').click();\n }\n}\n","import { expect } from '@playwright/test';\nimport { TaskModal } from './TaskModal';\n\n/**\n * @deprecated Don't use this, use new TaskDrawer\n */\nexport class CustomScriptTaskModal extends TaskModal {\n async expectFieldNotEmpty(field: string): Promise<void> {\n await expect(this.taskModalLocator.locator(`#${field} .display`).textContent).toBeDefined();\n }\n\n async setSelectField(propertyName: string, value: string): Promise<void> {\n await this.focusOnField(propertyName);\n await this.taskModalLocator.locator(`select[name=\"${propertyName}\"]`).selectOption(value);\n }\n\n async setTextField(propertyName: string, value: string): Promise<void> {\n await this.focusOnField(propertyName);\n await this.taskModalLocator.locator(`input[name=\"${propertyName}\"]`).fill(value);\n }\n\n async setAutocompleteField(propertyName: string, value: string): Promise<void> {\n await this.focusOnAutocompleteField(propertyName);\n await this.taskModalLocator.locator(`#${propertyName} ul li`).getByText(value).click();\n }\n\n async expectOutputValueToBe(propertyName: string, value: string): Promise<void> {\n await expect(this.taskModalLocator.locator(`#${propertyName} .field-readonly span`)).toContainText(value);\n }\n\n // TODO move this to a new inline-editor\n private async focusOnField(propertyName: string): Promise<void> {\n await expect(async () => {\n await this.taskModalLocator.locator(`#${propertyName} .display`).click({ force: true });\n await expect(this.taskModalLocator.locator(`#${propertyName} label.edit`)).toBeVisible();\n }).toPass();\n }\n\n private async focusOnAutocompleteField(propertyName: string): Promise<void> {\n await expect(async () => {\n await this.taskModalLocator.locator(`#${propertyName} input`).click({ force: true });\n await expect(this.taskModalLocator.locator(`#${propertyName} ul`)).toBeVisible();\n }).toPass();\n }\n}\n","import { Locator } from '@playwright/test';\n\ntype WaitForRes = [ locatorIndex: number, locator: Locator ];\nexport async function waitForOneOf(\n locators: Locator[],\n): Promise<WaitForRes> {\n const res = await Promise.all([\n ...locators.map(async (locator, index): Promise<WaitForRes> => {\n let timedOut = false;\n await locator.waitFor({ state: 'visible', timeout: 2000}).catch(() => timedOut = true);\n return [ timedOut ? -1 : index, locator ];\n }),\n ]);\n const resolvedLocator = res.find(r => r[0] !== -1);\n if (!resolvedLocator) {\n console.warn('waitForOneOf', res);\n throw new Error('no locator visible before timeout');\n }\n return resolvedLocator;\n}\n","import { expect, Locator } from '@playwright/test';\nimport { WithPage } from './WithPage';\nimport { waitForOneOf } from './helper';\n\ntype ExpectWithLocator = (l: Locator) => void;\n\nexport class ReleaseVariablesPage extends WithPage {\n async openVariable(variableKey: string): Promise<ReleaseVariableModal> {\n await this.page.locator(`.variables-list .variable`).getByText(variableKey).click();\n return new ReleaseVariableModal(this.page);\n }\n}\n\nclass ReleaseVariableModal extends WithPage {\n private async expectValue(locators: Locator[], expectFn: ExpectWithLocator[]): Promise<void> {\n const [index, locator] = await waitForOneOf(locators);\n await expectFn[index](locator);\n }\n\n async expectValueToBe(value: string): Promise<void> {\n await this.expectValue(\n [\n this.page.locator('#modal .variable-value input'),\n this.page.locator('#modal .variable-value .field-readonly'),\n this.page.locator('#modal .variable-value .xl-map-string-string'),\n ],\n [(l) => expect(l).toHaveValue(value), (l) => expect(l).toHaveText(value), (l) => expect(l).toHaveText(value)],\n );\n }\n\n async expectValueToContain(value: string): Promise<void> {\n await this.expectValue(\n [\n this.page.locator('#modal .variable-value input'),\n this.page.locator('#modal .variable-value .field-readonly'),\n this.page.locator('#modal .variable-value .xl-map-string-string'),\n ],\n [\n (l) => expect(l.inputValue()).toContain(value),\n (l) => expect(l).toContainText(value),\n (l) => expect(l).toContainText(value),\n ],\n );\n }\n\n async close(): Promise<void> {\n await this.page.locator('#modal .modal-header button.close').click();\n }\n}\n","import { WithPage } from \"../WithPage\";\nimport { Locator, Page, expect } from \"@playwright/test\";\n\ntype Rail = 'Overview' | 'Activity' | 'Config' | 'Scheduling' | 'Conditions' | 'Attributes' | 'Attach'\n\nexport class TaskDrawer extends WithPage {\n\n protected readonly taskDrawerLocator: Locator;\n\n constructor(page: Page) {\n super(page);\n this.taskDrawerLocator = this.page.locator('task-drawer .dot-drawer');\n }\n\n async openConfigRail(): Promise<ConfigRail> {\n await this.openRail('Config')\n return new ConfigRail(this.page)\n }\n\n async openRail(rail: Rail): Promise<void> {\n await this.taskDrawerLocator.locator('.task-navigation-rail').getByText(rail).click();\n }\n\n async close(): Promise<void> {\n await this.taskDrawerLocator.locator('.task-drawer-header').getByTestId('close-btn').click();\n }\n\n}\n\nclass ConfigRail extends TaskDrawer {\n\n protected readonly railLocator: Locator;\n\n\n constructor(page: Page) {\n super(page);\n this.railLocator = this.taskDrawerLocator.locator('.task-config');\n }\n\n async openInputProperties(): Promise<void> {\n await this.railLocator.locator('.task-config-header').getByText('Input properties').click();\n }\n\n async openOutputProperties(): Promise<void> {\n await this.railLocator.locator('.task-config-header').getByText('Output properties').click();\n }\n\n async getValueFromCi(propertyName: string): Promise<string> {\n return this.railLocator.locator(`input[id=\"${propertyName}\"]`).inputValue()\n }\n\n async getAllOptionsFromCi(propertyName: string): Promise<string[]> {\n await this.railLocator.locator(`input[id=\"${propertyName}\"]`).click()\n return this.railLocator.locator(`.dot-popper ul li`).allInnerTexts();\n }\n\n async setValueFromCi(propertyName: string, value: string): Promise<void> {\n await this.railLocator.locator(`input[id=\"${propertyName}\"]`).clear()\n await this.railLocator.locator(`input[id=\"${propertyName}\"]`).click()\n await this.railLocator.locator(`.dot-popper ul li`, {hasText: value}).click()\n }\n\n async getValueFromString(propertyName: string): Promise<string | null> {\n await this.railLocator.locator(`.input-scalar-fake-input[id=\"${propertyName}\"]`).focus()\n return this.railLocator.locator(`input[id=\"${propertyName}\"]`).inputValue()\n }\n\n async setValueFromString(propertyName: string, value: string): Promise<void> {\n await this.railLocator.locator(`.input-scalar-fake-input[id=\"${propertyName}\"]`).focus()\n await this.railLocator.locator(`input[id=\"${propertyName}\"]`).fill(value)\n }\n\n async setValueFromLargeString(propertyName: string, value: string): Promise<void> {\n await this.railLocator.locator(`.input-scalar-fake-input[id=\"${propertyName}\"]`).focus()\n await this.railLocator.locator(`textarea[id=\"${propertyName}\"]`).fill(value)\n }\n\n async setValueFromPassword(propertyName: string, value: string): Promise<void> {\n await this.railLocator.locator(`input[id=\"${propertyName}\"]`).fill(value)\n }\n\n async setAndCreateVariable(propertyName: string, variableName: string): Promise<void> {\n await this.railLocator.locator(`input[id=\"${propertyName}\"]`).clear()\n await this.railLocator.locator(`input[id=\"${propertyName}\"]`).click()\n await this.railLocator.locator(`input[id=\"${propertyName}\"]`).fill(variableName)\n await this.railLocator.locator(`.dot-popper button`, {hasText: variableName}).click()\n }\n\n async setVariable(propertyName: string, variableName: string): Promise<void> {\n return this.setValueFromCi(propertyName, variableName);\n }\n\n async expectValueFromString(propertyName: string, propertyValue: string): Promise<void> {\n return await expect(this.railLocator.locator(`.input-scalar-fake-input[id=\"${propertyName}\"]`)).toHaveText(propertyValue);\n }\n}\n","import { Page, Locator, expect } from '@playwright/test';\nimport { TriggersPage } from './TriggersPage';\nimport { WithPage } from './WithPage';\nimport { CustomScriptTaskModal } from './task-modal/CustomScriptTaskModal';\nimport { ReleaseVariablesPage } from './ReleaseVariablesPage';\nimport { TaskDrawer } from \"./task-drawer/TaskDrawer\";\n\nexport class ReleasePage extends WithPage {\n async openTriggers(): Promise<TriggersPage> {\n await this.openSubPage('Triggers');\n return new TriggersPage(this.page);\n }\n\n async abort(comment = 'Abort for testing'): Promise<void> {\n await this.page.locator('action-toolbar button', { hasText: 'Abort' }).click();\n await this.page.locator('.modal textarea').fill(comment);\n await this.page.locator('.modal .continue').click();\n }\n\n getPhase(phaseName: string): Phase {\n return new Phase(this.page, phaseName);\n }\n\n async start(): Promise<void> {\n await this.page.locator('action-toolbar button', { hasText: 'Start' }).click();\n await this.page.locator('.modal button.primary').click();\n }\n\n async waitForTaskCompleted(taskTitle: string): Promise<void> {\n await expect(this.page.locator('.task.completed').getByText(taskTitle, { exact: true })).toBeVisible();\n }\n async waitForTaskFailed(taskTitle: string): Promise<void> {\n await expect(this.page.locator('.task.failed').getByText(taskTitle, { exact: true })).toBeVisible();\n }\n async waitForStatusLine(statusLine: string): Promise<void> {\n await expect(this.page.locator('.task .status-line').getByText(statusLine, { exact: true })).toBeVisible();\n }\n\n /**\n * @deprecated Don't use this, use new TaskDrawer\n */\n async openCustomScriptTaskModal(taskName: string): Promise<CustomScriptTaskModal> {\n await this.page.locator('.task-header').getByText(taskName).click();\n return new CustomScriptTaskModal(this.page);\n }\n\n async openTaskDrawer(taskName: string): Promise<TaskDrawer> {\n await this.page.locator('.task-header').getByText(taskName).click();\n return new TaskDrawer(this.page);\n }\n\n async openVariables(): Promise<ReleaseVariablesPage> {\n await this.openReleaseMenu('Variables');\n return new ReleaseVariablesPage(this.page);\n }\n\n async openReleaseMenu(menuItem: string): Promise<void> {\n await this.page.locator(`navigation-sidebar ul li`).getByText(menuItem, { exact: true }).click();\n }\n\n private async openSubPage(subpage: string): Promise<void> {\n await this.page.locator('ul.side-nav li', { hasText: subpage }).click();\n }\n}\n\nclass Phase extends WithPage {\n private readonly phaseLocator: Locator;\n\n constructor(page: Page, phaseName: string) {\n super(page);\n this.phaseLocator = page.locator('.phase', { hasText: phaseName });\n }\n\n async addTask(taskName: string, taskGroup: string, taskType: string): Promise<void> {\n await this.phaseLocator.getByText('Add task').click();\n await this.phaseLocator.locator('.quick-title').fill(taskName);\n await this.phaseLocator.locator('.xlr-ctx-menu-toggle').click();\n await this.page.locator(`.xlr-ctx-menu-item`).getByTitle(taskGroup, { exact: true }).scrollIntoViewIfNeeded();\n await this.page.locator(`.xlr-ctx-menu-item`).getByTitle(taskGroup, { exact: true }).hover();\n await this.page.locator(`.xlr-ctx-menu.active`).getByTitle(taskType, { exact: true }).click();\n await this.phaseLocator.locator('.quick-controls-container a').getByText('Add', { exact: true }).click();\n }\n}\n","import { Page } from '@playwright/test';\nimport { ReleasePage } from './ReleasePage';\n\nexport class Navigation {\n private readonly page: Page;\n\n constructor(page: Page) {\n this.page = page;\n }\n\n async openTemplate(id: string): Promise<ReleasePage> {\n return this.openReleaseOrTemplate(id, false);\n }\n\n async openRelease(id: string): Promise<ReleasePage> {\n return this.openReleaseOrTemplate(id, true);\n }\n\n private async openReleaseOrTemplate(id: string, release: boolean): Promise<ReleasePage> {\n const url = release ? 'releases' : 'templates';\n await this.page.goto(`./#/${url}/${id}`);\n await this.page.waitForSelector('#release');\n return new ReleasePage(this.page);\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './WithPage';\n\nexport class LoginPage extends WithPage {\n async login(userName: string, password: string): Promise<void> {\n await this.page.goto('./');\n await expect(this.page).toHaveTitle('Digital.ai Release');\n await this.page.locator('#inputLogin').fill(userName);\n await this.page.locator('#inputPassword').fill(password);\n await this.page.locator(\"button[type='submit']\").click();\n await expect(this.page.locator('#releases-content')).toBeVisible();\n }\n\n async logout(): Promise<void> {\n await this.page.locator('button.dot-avatar').click();\n await this.page.getByText('Log out').click();\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './WithPage';\n\nexport class ApplicationsPage extends WithPage {\n async goToApplicationsPage(): Promise<this> {\n await this.page.goto('./#/applications');\n await expect(this.page).toHaveTitle('Applications - Digital.ai Release');\n return this;\n }\n\n async addNewApplication(applicationName: string): Promise<this> {\n await this.page.locator(`//button[normalize-space()='New application']`).click();\n await this.page.locator(`input[placeholder='Add name...']`).type(applicationName);\n await this.page.locator(`//button[normalize-space()='Save']`).click();\n return this;\n }\n\n async verifyApplicationisCreated(applicationName: string): Promise<this> {\n await this.page.waitForSelector(`div[title='${applicationName}'] strong`);\n return this;\n }\n\n async createApplicationAndLinkEnvironment(environmentName: string, applicationName: string): Promise<this> {\n await this.page.locator(`//button[normalize-space()='New application']`).click();\n await this.page.locator(`input[placeholder='Add name...']`).type(applicationName);\n await this.page.locator(\"input[placeholder='Filter environment name...']\").type(environmentName);\n await this.page.locator(`div[title='${environmentName}']`).click();\n await this.page.locator(`//button[normalize-space()='Save']`).click();\n await this.page.locator('i.xl-icon.close-icon').click();\n return this;\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './WithPage';\n\nexport class PersonalAccessTokenPage extends WithPage {\n async openPersonalAccessTokenPage(): Promise<this> {\n // await this.page.locator(\"button.dot-avatar\").click()\n // await this.page.locator(\"//div[normalize-space()='Access tokens']\").click()\n await this.page.goto('./#/personal-access-token');\n await expect(this.page).toHaveTitle('Access tokens / Personal settings - Digital.ai Release');\n return this;\n }\n\n async addNewToken(tokenName: string): Promise<this> {\n //await expect(this.page).toHaveTitle('Access tokens / Personal settings - Digital.ai Release')\n\n await this.page.locator('#tokenText').fill(tokenName);\n await this.page.locator(\"button[type='submit']\").click();\n return this;\n }\n}\n","interface BaseConfigurationItem {\n id: string;\n type: string;\n}\n\ninterface PlanItem extends BaseConfigurationItem {\n title: string;\n}\n\nexport interface Release extends PlanItem {\n allowConcurrentReleasesFromTrigger: boolean;\n attachments: Array<Attachment>;\n description: string;\n dueDate?: Date;\n endDate?: Date;\n extensions: Array<ReleaseExtension>;\n owner?: string;\n passwordVariableValues?: VariableValues;\n phases: Array<Phase>;\n queryableEndDate?: Date;\n queryableStartDate?: Date;\n scheduledStartDate?: Date;\n scriptUserPassword?: string;\n scriptUsername?: string;\n startDate?: Date;\n status: ReleaseStatus;\n summary?: Dashboard;\n teams: Array<Team>;\n variableValues?: VariableValues;\n variables: Array<Variable>;\n}\n\ninterface VariableValues {\n [key: string]: any;\n}\n\nexport interface Variable extends BaseConfigurationItem {\n key: string;\n requiresValue: boolean;\n showOnReleaseStart: boolean;\n value: any;\n valueProvider?: VariableValueProvider;\n}\n\nexport interface VariableValueProvider {\n id: string;\n variable: string;\n}\n\nexport interface Container extends PlanItem {\n tasks: Array<Task>;\n}\n\nexport interface Phase extends Container {\n status: PhaseStatus;\n}\n\nexport interface Task extends PlanItem {\n attachments: Array<Attachment>;\n comments: Array<Comment>;\n conditions: Array<Condition>;\n dependencies: Array<Dependency>;\n links: Array<Link>;\n owner?: string;\n pythonScript?: PythonScript;\n status: TaskStatus;\n tasks: Array<Task>;\n templateVariables: Array<Variable>;\n}\n\ntype Condition = PlanItem;\ntype Dependency = PlanItem;\ntype Link = PlanItem;\ntype Comment = PlanItem;\ntype Attachment = PlanItem;\n\nexport interface Dashboard extends ReleaseExtension {\n tiles: Array<Tile>;\n}\n\ntype ReleaseExtension = BaseConfigurationItem;\nexport type Tile = BaseConfigurationItem;\n\ninterface PythonScript extends BaseConfigurationItem {\n customScriptTask: string;\n}\n\ntype ReleaseStatus = 'TEMPLATE' | 'PLANNED' | 'IN_PROGRESS' | 'PAUSED' | 'FAILING' | 'FAILED' | 'COMPLETED' | 'ABORTED';\ntype PhaseStatus = 'PLANNED' | 'IN_PROGRESS' | 'COMPLETED' | 'FAILING' | 'FAILED' | 'SKIPPED' | 'ABORTED';\ntype TaskStatus =\n | 'IN_PROGRESS'\n | 'PLANNED'\n | 'SKIPPED_IN_ADVANCE'\n | 'COMPLETED_IN_ADVANCE'\n | 'COMPLETED'\n | 'SKIPPED'\n | 'ABORTED'\n | 'PENDING'\n | 'FACET_CHECK_IN_PROGRESS'\n | 'FAILED'\n | 'FAILING'\n | 'FAILURE_HANDLER_IN_PROGRESS'\n | 'ABORT_SCRIPT_IN_PROGRESS'\n | 'PRECONDITION_IN_PROGRESS'\n | 'QUEUED'\n | 'ABORT_SCRIPT_QUEUED'\n | 'WAITING_FOR_INPUT'\n | 'FAILURE_HANDLER_QUEUED';\n\ntype Team = BaseConfigurationItem;\n\ntype FeatureCategory = 'Stable' | 'Incubating';\ntype FeatureType = 'xlrelease.TaskDrawer'; // add more as needed\nexport interface FixtureFeature {\n category: FeatureCategory;\n enabled: boolean;\n id: string;\n type: FeatureType;\n}\n\ntype DeepPartial<T> = {\n [P in keyof T]?: DeepPartial<T[P]>;\n};\n\n// for fixtures we allow releases with everything optional expect the `id`\nexport type FixtureRelease = DeepPartial<Release> & Pick<Release, 'id'>;\n\nexport interface FixtureConfiguration extends PlanItem {\n apiToken?: string;\n password?: string;\n url: string;\n username?: string;\n}\n\nexport interface FixtureTrigger extends PlanItem {\n folderId?: string;\n gitRepository?: string;\n periodicity?: number | string;\n pollType?: string;\n releaseTitle: string;\n template: string;\n}\n","import isUndefined from 'lodash/isUndefined';\nimport each from 'lodash/each';\nimport forEach from 'lodash/forEach';\nimport defaults from 'lodash/defaults';\nimport toPairs from 'lodash/toPairs';\n\nimport { Container, Dashboard, Phase, Release, Task, Tile, Variable, VariableValueProvider } from '../types';\n\nexport const initReleaseDefaults = (function () {\n const RELEASE_TYPE = 'xlrelease.Release';\n const PHASE_TYPE = 'xlrelease.Phase';\n const TEAM_TYPE = 'xlrelease.Team';\n const TASK_TYPE = 'xlrelease.Task';\n const COMMENT_TYPE = 'xlrelease.Comment';\n const CONDITION_TYPE = 'xlrelease.GateCondition';\n const DEPENDENCY_TYPE = 'xlrelease.Dependency';\n const LINK_TYPE = 'xlrelease.Link';\n const ATTACHMENT_TYPE = 'xlrelease.Attachment';\n const DASHBOARD_TYPE = 'xlrelease.Dashboard';\n const _TRIGGER_TYPE = 'xlrelease.ReleaseTrigger';\n const JIRA_TYPE = 'jira.CreateIssue';\n const DEFAULT_TASK_OWNER = 'Itchy';\n\n const processTasks = (task: Task, container: Container, index: number): void => {\n if (isUndefined(task.type)) task.type = TASK_TYPE;\n task.id = task.id || `${container.id}/Task${index}`;\n if (isUndefined(task.owner) && task.type !== JIRA_TYPE) task.owner = DEFAULT_TASK_OWNER;\n if (task.owner === null) delete task.owner;\n\n each(task.conditions, function (condition, idx) {\n condition.type = CONDITION_TYPE;\n condition.id = `${task.id}/GateCondition${idx}`;\n });\n each(task.dependencies, function (dependency, idx) {\n dependency.type = DEPENDENCY_TYPE;\n dependency.id = `${task.id}/Dependency${idx}`;\n });\n each(task.links, function (link, idx) {\n link.type = LINK_TYPE;\n link.id = `${task.id}/Link${idx}`;\n });\n each(task.comments, function (comment, idx) {\n comment.type = COMMENT_TYPE;\n comment.id = `${task.id}/Comment${idx}`;\n });\n each(task.tasks, function (subTask, idx) {\n processTasks(subTask, task, idx);\n });\n each(task.templateVariables, function (variable, idx) {\n defaults(variable, getVariableEntity(variable.value, variable.key, task.id, idx));\n });\n each(task.attachments, function (attachment, idx) {\n attachment.type = ATTACHMENT_TYPE;\n attachment.id = `${task.id}/Attachment${idx}`;\n });\n if (task.pythonScript) {\n const pythonScript = task.pythonScript;\n pythonScript.id = `${task.id}/PythonScript`;\n pythonScript.customScriptTask = task.id;\n }\n };\n\n const processPhases = (phase: Phase, release: Release, index: number): void => {\n phase.type = PHASE_TYPE;\n phase.id = `${release.id}/Phase${index}`;\n\n forEach(phase.tasks, (task, idx): void => {\n processTasks(task, phase, idx);\n });\n };\n\n const getVariableEntity = (\n value: string,\n key: string,\n containerId: string,\n index: number,\n password?: boolean,\n // eslint-disable-next-line max-params\n ): Variable => {\n const keyNoSyntax = key.replace('${', '').replace('}', '');\n return {\n id: `${containerId}/Variable${index}`,\n key: keyNoSyntax,\n requiresValue: true,\n showOnReleaseStart: true,\n type: password ? 'xlrelease.PasswordStringVariable' : 'xlrelease.StringVariable',\n value: value,\n };\n };\n\n const getValueProviderConfigurationEntity = function (containerId: string): VariableValueProvider {\n return {\n id: `${containerId}/valueProvider`,\n variable: containerId,\n };\n };\n\n const getDashboardExtension = (dashboard: Dashboard, releaseId: string): Dashboard => {\n const dashboardExtension: Dashboard = {\n id: `${releaseId}/summary`,\n type: DASHBOARD_TYPE,\n tiles: [],\n };\n if (dashboard.tiles) {\n forEach(dashboard.tiles, function (tile, index) {\n dashboardExtension.tiles.push(getTileEntity(tile, `${releaseId}/summary`, index));\n });\n }\n return dashboardExtension;\n };\n\n function getTileEntity(tile: Tile, containerId: string, index: number): Tile {\n tile.id = tile.id || `${containerId}/Tile${index}`;\n return tile;\n }\n\n return function (release: Release) {\n release.type = RELEASE_TYPE;\n if (release.id.indexOf('Applications/') === -1) {\n release.id = `Applications/${release.id}`;\n }\n if (release.startDate) {\n release.queryableStartDate = release.startDate;\n } else if (release.scheduledStartDate) {\n release.queryableStartDate = release.scheduledStartDate;\n }\n if (release.endDate) {\n release.queryableEndDate = release.endDate;\n } else if (release.dueDate) {\n release.queryableEndDate = release.dueDate;\n }\n if (isUndefined(release.owner)) release.owner = 'Itchy'; // default release manager\n\n forEach(release.phases, function (phase, index) {\n processPhases(phase, release, index);\n });\n forEach(release.teams, function (team, index) {\n team.type = TEAM_TYPE;\n team.id = `${release.id}/Team${index}`;\n });\n forEach(release.attachments, function (attachment, index) {\n attachment.type = ATTACHMENT_TYPE;\n attachment.id = `${release.id}/Attachment${index}`;\n });\n forEach(release.variables, function (variable: Variable, index) {\n defaults(variable, getVariableEntity(variable.value, variable.key, release.id, index));\n if (variable.valueProvider) {\n defaults(variable.valueProvider, getValueProviderConfigurationEntity(variable.id));\n }\n });\n forEach(toPairs(release.variableValues), function (keyValue, index) {\n if (!release.variables) release.variables = [];\n release.variables.push(getVariableEntity(keyValue[1], keyValue[0], release.id, 1000 + index));\n release.variableValues = undefined;\n });\n forEach(toPairs(release.passwordVariableValues), function (keyValue, index) {\n if (!release.variables) release.variables = [];\n release.variables.push(getVariableEntity(keyValue[1], keyValue[0], release.id, 1500 + index, true));\n release.passwordVariableValues = undefined;\n });\n\n if (release.summary) {\n release.extensions = [getDashboardExtension(release.summary, release.id)];\n release.summary = undefined;\n }\n };\n})();\n","import { test as base, expect, Page, APIResponse } from '@playwright/test';\nimport { execFile } from 'child_process';\nimport { APIRequestContext } from 'playwright-core';\nimport isNil from 'lodash/isNil';\nimport { Navigation } from '../pages';\nimport { LoginPage } from '../pages/LoginPage';\nimport { ApplicationsPage } from '../pages/ApplicationsPage';\nimport { PersonalAccessTokenPage } from '../pages/PersonalAccessTokenPage';\nimport { initReleaseDefaults } from './helper';\nimport * as process from 'process';\nimport { FixtureConfiguration, FixtureFeature, FixtureRelease, FixtureTrigger, Release } from '../types';\n\nconst adminHeaders = {\n Authorization: 'Basic YWRtaW46YWRtaW4=',\n Cookie: 'XSRF-TOKEN=1;',\n 'X-XSRF-TOKEN': '1',\n};\n\ntype ReleaseFixtures = {\n applicationPage: ApplicationsPage;\n fixtures: Fixtures;\n loginPage: LoginPage;\n navigation: Navigation;\n personalAccessTokenPage: PersonalAccessTokenPage;\n};\n\nexport const test = base.extend<ReleaseFixtures>({\n fixtures: async ({ request, page }, use) => {\n const fixtures = new Fixtures(request, page);\n await use(fixtures);\n return fixtures;\n },\n loginPage: async ({ page }, use) => {\n const loginPage = new LoginPage(page);\n await use(loginPage);\n return loginPage;\n },\n applicationPage: async ({ page }, use) => {\n const applicationPage = new ApplicationsPage(page);\n await use(applicationPage);\n return applicationPage;\n },\n personalAccessTokenPage: async ({ page }, use) => {\n const personalAccessTokenPage = new PersonalAccessTokenPage(page);\n await use(personalAccessTokenPage);\n return personalAccessTokenPage;\n },\n navigation: async ({ page }, use) => {\n const navigationPage = new Navigation(page);\n await use(navigationPage);\n return navigationPage;\n },\n});\n\nclass Fixtures {\n private readonly request: APIRequestContext;\n private readonly page: Page;\n\n private releaseIds: Array<string> = [];\n private triggerIds: Array<string> = [];\n private configurationIds: Array<string> = [];\n\n constructor(request: APIRequestContext, page: Page) {\n this.request = request;\n this.page = page;\n }\n\n release(release: FixtureRelease): Promise<APIResponse> {\n this.initDefaults(release);\n this.releaseIds.push(release.id);\n return this.deleteRelease(release.id)\n .then(() => this.deleteArchivedRelease(release.id))\n .then(() => this.doPost('fixtures/release', release));\n }\n\n configuration(ci: FixtureConfiguration): Promise<APIResponse> {\n this.configurationIds.push(ci.id);\n return this.doPost('fixtures/shared', [ci]);\n }\n\n trigger(trigger: FixtureTrigger): Promise<APIResponse> {\n this.triggerIds.push(trigger.id);\n return this.doPost('fixtures/trigger', trigger);\n }\n\n deleteArchivedRelease(id: string): Promise<APIResponse> {\n const releaseId = id.includes('Applications/') ? id : `Applications/${id}`;\n return this.doDelete('fixtures/cis', [\n {\n id: releaseId,\n type: 'xlrelease.Release',\n },\n ]);\n }\n\n deleteRelease(id: string): Promise<APIResponse> {\n const releaseId = id.includes('Applications/') ? id : `Applications/${id}`;\n return this.doDelete(`fixtures/${releaseId}`);\n }\n\n deleteTrigger(id: string): Promise<APIResponse> {\n return this.doDelete(`fixtures/trigger/${id}`);\n }\n\n deleteConfiguration(id: string): Promise<APIResponse> {\n return this.doDelete(`fixtures/shared`, [id]);\n }\n\n cleanAll(): Promise<Awaited<APIResponse>[]> {\n const promises = [];\n for (const releaseId of this.releaseIds.reverse()) {\n promises.push(this.deleteRelease(releaseId));\n }\n for (const triggerId of this.triggerIds) {\n promises.push(this.deleteTrigger(triggerId));\n }\n for (const confId of this.configurationIds) {\n promises.push(this.deleteConfiguration(confId));\n }\n this.releaseIds = [];\n this.triggerIds = [];\n this.configurationIds = [];\n return Promise.all(promises);\n }\n\n async waitForReleaseStarted(releaseTitle: string): Promise<void> {\n await expect(async () => {\n const resp = await this.doPost('releases/search', {\n inProgress: true,\n paused: true,\n failing: true,\n failed: true,\n title: releaseTitle,\n });\n const page = await resp.json();\n await expect(page.cis.length).toBeGreaterThan(0);\n }).toPass();\n }\n\n async waitForFirstPoll(triggerId: string): Promise<void> {\n await expect(async () => {\n const resp = await this.doGet(`api/v1/triggers/${triggerId}`);\n const trigger = await resp.json();\n await expect(isNil(trigger.triggerState)).toBe(false);\n }).toPass();\n }\n\n exec(path: string): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n execFile(path, (error) => {\n if (error === null) {\n return resolve();\n } else {\n return reject();\n }\n });\n });\n }\n\n getFakeApiUrl(): string {\n return this.getEnvVariable('ENV_FAKE_API') || 'http://localhost:5517';\n }\n\n getEnvVariable(name: string): string | undefined {\n return process.env[name];\n }\n\n async setFeatures(features: Array<FixtureFeature>): Promise<APIResponse> {\n return this.doPut('settings/features', features);\n }\n\n async enableTaskDrawer(enabled: boolean): Promise<APIResponse> {\n return this.setFeatures([{ id: 'Configuration/features/xlrelease.TaskDrawer', type: 'xlrelease.TaskDrawer', category: 'Stable', enabled: enabled }]);\n }\n\n private doPost(url: string, body: unknown): Promise<APIResponse> {\n return this.request.post(url, { data: body, headers: adminHeaders });\n }\n\n private doPut(url: string, body: unknown): Promise<APIResponse> {\n return this.request.put(url, { data: body, headers: adminHeaders });\n }\n\n private doGet(url: string): Promise<APIResponse> {\n return this.request.get(url, { headers: adminHeaders });\n }\n\n private doDelete(url: string, body?: unknown): Promise<APIResponse> {\n return this.request.delete(url, { data: body, headers: adminHeaders });\n }\n\n private initDefaults(ci: FixtureRelease): void {\n initReleaseDefaults(ci as Release);\n }\n}\n","export { test } from './fixtures';\n"],"names":[],"version":3,"file":"types.d.ts.map"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@digital-ai/devops-page-object-release",
3
- "version": "0.0.4",
3
+ "version": "0.0.6",
4
4
  "source": "index.ts",
5
5
  "main": "dist/main.js",
6
6
  "module": "dist/module.js",