diff --git a/tests/e2e/specs/miscellaneous/WorkpaseWithParent.spec.ts b/tests/e2e/specs/miscellaneous/WorkpaseWithParent.spec.ts new file mode 100644 index 000000000000..505be9629c9e --- /dev/null +++ b/tests/e2e/specs/miscellaneous/WorkpaseWithParent.spec.ts @@ -0,0 +1,96 @@ +/** ******************************************************************* + * copyright (c) 2023 Red Hat, Inc. + * + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + **********************************************************************/ +import { e2eContainer } from '../../configs/inversify.config'; +import { ShellExecutor } from '../../utils/ShellExecutor'; +import { InputBox, QuickOpenBox, QuickPickItem, SideBarView, ViewItem, ViewSection, Workbench } from 'monaco-page-objects'; +import { CLASSES } from '../../configs/inversify.types'; +import { ProjectAndFileTests } from '../../tests-library/ProjectAndFileTests'; +import { LoginTests } from '../../tests-library/LoginTests'; +import { Dashboard } from '../../pageobjects/dashboard/Dashboard'; +import { BrowserTabsUtil } from '../../utils/BrowserTabsUtil'; +import { BASE_TEST_CONSTANTS } from '../../constants/BASE_TEST_CONSTANTS'; +import { expect } from 'chai'; +import { API_TEST_CONSTANTS } from '../../constants/API_TEST_CONSTANTS'; +import { WorkspaceHandlingTests } from '../../tests-library/WorkspaceHandlingTests'; +import { registerRunningWorkspace } from '../MochaHooks'; +import { KubernetesCommandLineToolsExecutor } from '../../utils/KubernetesCommandLineToolsExecutor'; + +suite('Workspace using a parent test suite', function (): void { + const projectAndFileTests: ProjectAndFileTests = e2eContainer.get(CLASSES.ProjectAndFileTests); + const loginTests: LoginTests = e2eContainer.get(CLASSES.LoginTests); + const browserTabsUtil: BrowserTabsUtil = e2eContainer.get(CLASSES.BrowserTabsUtil); + const dashboard: Dashboard = e2eContainer.get(CLASSES.Dashboard); + const shellExecutor: ShellExecutor = e2eContainer.get(CLASSES.ShellExecutor); + const workspaceHandlingTests: WorkspaceHandlingTests = e2eContainer.get(CLASSES.WorkspaceHandlingTests); + const kubernetesCommandLineToolsExecutor: KubernetesCommandLineToolsExecutor = e2eContainer.get( + CLASSES.KubernetesCommandLineToolsExecutor + ); + let podName: string = ''; + loginTests.loginIntoChe(); + kubernetesCommandLineToolsExecutor.loginToOcp(); + + test('Create a workspace using a parent', async function (): Promise { + const factoryUrl: string = `${BASE_TEST_CONSTANTS.TS_SELENIUM_BASE_URL}/dashboard/#https://github.com/testsfactory/parentDevfile`; + await dashboard.waitPage(); + await browserTabsUtil.navigateTo(factoryUrl); + await workspaceHandlingTests.obtainWorkspaceNameFromStartingPage(); + registerRunningWorkspace(WorkspaceHandlingTests.getWorkspaceName()); + await projectAndFileTests.waitWorkspaceReadinessForCheCodeEditor(); + await projectAndFileTests.performTrustAuthorDialog(); + }); + + test('Check cloning of the test project', async function (): Promise { + const expectedProjectItems: string[] = ['.devfile.yaml', 'parent.yaml', 'README.md']; + const visibleContent: ViewSection = await new SideBarView().getContent().getSection('parentdevfile'); + + for (const expectedProjectItem of expectedProjectItems) { + const visibleItem: ViewItem | undefined = await visibleContent.findItem(expectedProjectItem); + expect(visibleItem).not.equal(undefined); + } + }); + + test('Check devfile VS Code tasks ', async function (): Promise { + const input: QuickOpenBox | InputBox = await new Workbench().openCommandPrompt(); + await input.setText('>Tasks: Run Task'); + const runTaskItem: QuickPickItem | undefined = await input.findQuickPick('Tasks: Run Task'); + await runTaskItem?.click(); + const devFileTask: QuickPickItem | undefined = await input.findQuickPick('devfile'); + await devFileTask?.click(); + const firstExpectedQuickPick: QuickPickItem | undefined = await input.findQuickPick('1. This command from the devfile'); + const secondExpectedQuickPick: QuickPickItem | undefined = await input.findQuickPick('2. This command from the parent'); + expect(firstExpectedQuickPick).not.eqls(undefined); + expect(secondExpectedQuickPick).not.undefined; + }); + + test('Check expected containers in the parent POD', function (): void { + const getPodNameCommand: string = `${API_TEST_CONSTANTS.TS_API_TEST_KUBERNETES_COMMAND_LINE_TOOL} get pods --selector=controller.devfile.io/devworkspace_name=sample-using-parent --output jsonpath=\'{.items[0].metadata.name}\'`; + + podName = shellExecutor.executeArbitraryShellScript(getPodNameCommand); + const containerNames: string = shellExecutor.executeArbitraryShellScript( + `${API_TEST_CONSTANTS.TS_API_TEST_KUBERNETES_COMMAND_LINE_TOOL} get pod ${podName} --output jsonpath=\'{.spec.containers[*].name}\'` + ); + expect(containerNames).contain('tools'); + expect(containerNames).contains('che-gateway'); + + const initContainerName: string = shellExecutor.executeArbitraryShellScript( + `${API_TEST_CONSTANTS.TS_API_TEST_KUBERNETES_COMMAND_LINE_TOOL} get pod ${podName} --output jsonpath=\'{.spec.initContainers[].name}\'` + ); + expect(initContainerName).contain('che-code-injector'); + }); + + test('Check expected environment variables', function (): void { + const envList: string = shellExecutor.executeArbitraryShellScript( + `${API_TEST_CONSTANTS.TS_API_TEST_KUBERNETES_COMMAND_LINE_TOOL} exec -i ${podName} -c tools -- sh -c env` + ); + expect(envList).contain('DEVFILE_ENV_VAR=true'); + expect(envList).contain('PARENT_ENV_VAR=true'); + }); + loginTests.logoutFromChe(); +}); diff --git a/tests/e2e/specs/miscellaneous/WorkspaceWithParent.spec.ts b/tests/e2e/specs/miscellaneous/WorkspaceWithParent.spec.ts index 5b034919afd1..505be9629c9e 100644 --- a/tests/e2e/specs/miscellaneous/WorkspaceWithParent.spec.ts +++ b/tests/e2e/specs/miscellaneous/WorkspaceWithParent.spec.ts @@ -16,27 +16,25 @@ import { LoginTests } from '../../tests-library/LoginTests'; import { Dashboard } from '../../pageobjects/dashboard/Dashboard'; import { BrowserTabsUtil } from '../../utils/BrowserTabsUtil'; import { BASE_TEST_CONSTANTS } from '../../constants/BASE_TEST_CONSTANTS'; -import { assert, expect } from 'chai'; +import { expect } from 'chai'; import { API_TEST_CONSTANTS } from '../../constants/API_TEST_CONSTANTS'; -import { ShellString } from 'shelljs'; import { WorkspaceHandlingTests } from '../../tests-library/WorkspaceHandlingTests'; import { registerRunningWorkspace } from '../MochaHooks'; -const projectAndFileTests: ProjectAndFileTests = e2eContainer.get(CLASSES.ProjectAndFileTests); -const loginTests: LoginTests = e2eContainer.get(CLASSES.LoginTests); -const browserTabsUtil: BrowserTabsUtil = e2eContainer.get(CLASSES.BrowserTabsUtil); -const dashboard: Dashboard = e2eContainer.get(CLASSES.Dashboard); -const shellExecutor: ShellExecutor = e2eContainer.get(CLASSES.ShellExecutor); -const workspaceHandlingTests: WorkspaceHandlingTests = e2eContainer.get(CLASSES.WorkspaceHandlingTests); -function executeArbitraryShellScript(command: string): string { - const output: ShellString = shellExecutor.executeCommand(command); - if (output.stderr.length > 0) { - assert.fail(output.stderr); - } - return output.stdout; -} +import { KubernetesCommandLineToolsExecutor } from '../../utils/KubernetesCommandLineToolsExecutor'; + suite('Workspace using a parent test suite', function (): void { - loginTests.loginIntoChe(); + const projectAndFileTests: ProjectAndFileTests = e2eContainer.get(CLASSES.ProjectAndFileTests); + const loginTests: LoginTests = e2eContainer.get(CLASSES.LoginTests); + const browserTabsUtil: BrowserTabsUtil = e2eContainer.get(CLASSES.BrowserTabsUtil); + const dashboard: Dashboard = e2eContainer.get(CLASSES.Dashboard); + const shellExecutor: ShellExecutor = e2eContainer.get(CLASSES.ShellExecutor); + const workspaceHandlingTests: WorkspaceHandlingTests = e2eContainer.get(CLASSES.WorkspaceHandlingTests); + const kubernetesCommandLineToolsExecutor: KubernetesCommandLineToolsExecutor = e2eContainer.get( + CLASSES.KubernetesCommandLineToolsExecutor + ); let podName: string = ''; + loginTests.loginIntoChe(); + kubernetesCommandLineToolsExecutor.loginToOcp(); test('Create a workspace using a parent', async function (): Promise { const factoryUrl: string = `${BASE_TEST_CONSTANTS.TS_SELENIUM_BASE_URL}/dashboard/#https://github.com/testsfactory/parentDevfile`; @@ -45,8 +43,6 @@ suite('Workspace using a parent test suite', function (): void { await workspaceHandlingTests.obtainWorkspaceNameFromStartingPage(); registerRunningWorkspace(WorkspaceHandlingTests.getWorkspaceName()); await projectAndFileTests.waitWorkspaceReadinessForCheCodeEditor(); - // sometimes the trust dialog does not appear at first time, for avoiding this problem we send click event for activating - await new Workbench().click(); await projectAndFileTests.performTrustAuthorDialog(); }); @@ -70,30 +66,31 @@ suite('Workspace using a parent test suite', function (): void { const firstExpectedQuickPick: QuickPickItem | undefined = await input.findQuickPick('1. This command from the devfile'); const secondExpectedQuickPick: QuickPickItem | undefined = await input.findQuickPick('2. This command from the parent'); expect(firstExpectedQuickPick).not.eqls(undefined); - expect(secondExpectedQuickPick).not.eqls(undefined); + expect(secondExpectedQuickPick).not.undefined; }); test('Check expected containers in the parent POD', function (): void { const getPodNameCommand: string = `${API_TEST_CONSTANTS.TS_API_TEST_KUBERNETES_COMMAND_LINE_TOOL} get pods --selector=controller.devfile.io/devworkspace_name=sample-using-parent --output jsonpath=\'{.items[0].metadata.name}\'`; - podName = executeArbitraryShellScript(getPodNameCommand); - const containerNames: string = executeArbitraryShellScript( + podName = shellExecutor.executeArbitraryShellScript(getPodNameCommand); + const containerNames: string = shellExecutor.executeArbitraryShellScript( `${API_TEST_CONSTANTS.TS_API_TEST_KUBERNETES_COMMAND_LINE_TOOL} get pod ${podName} --output jsonpath=\'{.spec.containers[*].name}\'` ); expect(containerNames).contain('tools'); expect(containerNames).contains('che-gateway'); - const initContainerName: string = executeArbitraryShellScript( + const initContainerName: string = shellExecutor.executeArbitraryShellScript( `${API_TEST_CONSTANTS.TS_API_TEST_KUBERNETES_COMMAND_LINE_TOOL} get pod ${podName} --output jsonpath=\'{.spec.initContainers[].name}\'` ); expect(initContainerName).contain('che-code-injector'); }); test('Check expected environment variables', function (): void { - const envList: string = executeArbitraryShellScript( + const envList: string = shellExecutor.executeArbitraryShellScript( `${API_TEST_CONSTANTS.TS_API_TEST_KUBERNETES_COMMAND_LINE_TOOL} exec -i ${podName} -c tools -- sh -c env` ); expect(envList).contain('DEVFILE_ENV_VAR=true'); expect(envList).contain('PARENT_ENV_VAR=true'); }); + loginTests.logoutFromChe(); }); diff --git a/tests/e2e/tests-library/ProjectAndFileTests.ts b/tests/e2e/tests-library/ProjectAndFileTests.ts index e437e8866539..5f5320fdd977 100644 --- a/tests/e2e/tests-library/ProjectAndFileTests.ts +++ b/tests/e2e/tests-library/ProjectAndFileTests.ts @@ -15,6 +15,7 @@ import { CLASSES } from '../configs/inversify.types'; import { Logger } from '../utils/Logger'; import { TIMEOUT_CONSTANTS } from '../constants/TIMEOUT_CONSTANTS'; import { CheCodeLocatorLoader } from '../pageobjects/ide/CheCodeLocatorLoader'; +import { Workbench } from 'monaco-page-objects'; @injectable() export class ProjectAndFileTests { @@ -43,7 +44,8 @@ export class ProjectAndFileTests { async performTrustAuthorDialog(): Promise { Logger.debug(); - + // sometimes the trust dialog does not appear at first time, for avoiding this problem we send click event for activating + await new Workbench().click(); await this.driverHelper.waitAndClick( this.cheCodeLocatorLoader.webCheCodeLocators.WelcomeContent.button, TIMEOUT_CONSTANTS.TS_DIALOG_WINDOW_DEFAULT_TIMEOUT diff --git a/tests/e2e/utils/ShellExecutor.ts b/tests/e2e/utils/ShellExecutor.ts index 00f436d20a87..66f1a7646f37 100644 --- a/tests/e2e/utils/ShellExecutor.ts +++ b/tests/e2e/utils/ShellExecutor.ts @@ -10,6 +10,7 @@ import { exec, ShellString } from 'shelljs'; import { Logger } from './Logger'; import { injectable } from 'inversify'; +import { assert } from 'chai'; @injectable() export class ShellExecutor { @@ -25,4 +26,11 @@ export class ShellExecutor { Logger.debug(command); return exec(command); } + executeArbitraryShellScript(command: string): string { + const output: ShellString = this.executeCommand(command); + if (output.stderr.length > 0) { + assert.fail(output.stderr); + } + return output.stdout; + } }