diff --git a/tests/e2e/CODE_STYLE.md b/tests/e2e/CODE_STYLE.md index 8508cbfd3be..04d6f48f2d9 100644 --- a/tests/e2e/CODE_STYLE.md +++ b/tests/e2e/CODE_STYLE.md @@ -33,8 +33,8 @@ Automated lint checking and code format performs with ESLint and Prettier tools pre-commit hook. Full set of rules can be found: -- [.eslintrc](.eslintrc.js) -- [.prettierrc](.prettierrc.json) +- [.eslintrc](.eslintrc.js) +- [.prettierrc](.prettierrc.json) ### Preferable code style diff --git a/tests/e2e/README.md b/tests/e2e/README.md index 2d8679b1df8..754798e0639 100644 --- a/tests/e2e/README.md +++ b/tests/e2e/README.md @@ -2,33 +2,33 @@ ## Requirements -- node 16.x -- "Chrome" browser 114.x or later -- deployed Che 7 with accessible URL +- node 16.x +- "Chrome" browser 114.x or later +- deployed Che 7 with accessible URL ## Before launch **Perform commands:** -- `export TS_SELENIUM_BASE_URL=` -- `npm ci` +- `export TS_SELENIUM_BASE_URL=` +- `npm ci` Note: If there is any modifications in package.json, manually execute the `npm install` to update the package-lock.json. So that errors can be avoided while executing npm ci ## Default launch -- Provide connection credentials: - - `export TS_SELENIUM_OCP_USERNAME=` - - `export TS_SELENIUM_OCP_PASSWORD=` - - `npm run test` +- Provide connection credentials: + - `export TS_SELENIUM_OCP_USERNAME=` + - `export TS_SELENIUM_OCP_PASSWORD=` + - `npm run test` ## Custom launch -- Use environment variables which described in the "constants" folder -- Use environment variables for setting timeouts if needed. You can see the list in **`'TimeoutConstants.ts'`**. You can see the list of those variables and their value if you set the `'TS_SELENIUM_PRINT_TIMEOUT_VARIABLES = true'` -- To test one specification export file name as `export USERSTORY= && npm run test` (example: `-e USERSTORY=Quarkus`) -- To run test without Selenium WebDriver (API tests etc.) use `export USERSTORY= && npm run driver-less-test` (example: `-e USERSTORY=CloneGitRepoAPI`) -- This project support application testing deployed on Kubernetes or Openshift platform. Openshift is default value. To switch into Kubernetes, please, use `TS_PLATFORM=kubernetes` environmental variable and `TS_SELENIUM_K8S_PASSWORD`, `TS_SELENIUM_K8S_USERNAME` to provide credentials. The sample of test command in this case: +- Use environment variables which described in the "constants" folder +- Use environment variables for setting timeouts if needed. You can see the list in **`'TimeoutConstants.ts'`**. You can see the list of those variables and their value if you set the `'TS_SELENIUM_PRINT_TIMEOUT_VARIABLES = true'` +- To test one specification export file name as `export USERSTORY= && npm run test` (example: `-e USERSTORY=Quarkus`) +- To run test without Selenium WebDriver (API tests etc.) use `export USERSTORY= && npm run driver-less-test` (example: `-e USERSTORY=CloneGitRepoAPI`) +- This project support application testing deployed on Kubernetes or Openshift platform. Openshift is default value. To switch into Kubernetes, please, use `TS_PLATFORM=kubernetes` environmental variable and `TS_SELENIUM_K8S_PASSWORD`, `TS_SELENIUM_K8S_USERNAME` to provide credentials. The sample of test command in this case: ``` export TS_PLATFORM=kubernetes && \ export TS_SELENIUM_K8S_USERNAME= && \ @@ -37,21 +37,21 @@ Note: If there is any modifications in package.json, manually execute the `npm i npm run test ``` Also, environmental variables can be set in files in "constants" folder. -- Local test results can be represented with Allure reporter `npm run open-allure-dasboard` +- Local test results can be represented with Allure reporter `npm run open-allure-dasboard` ## Docker launch -- open terminal and go to the "e2e" directory -- export the `"TS_SELENIUM_BASE_URL"` variable with "Che" url -- run command `"npm run test-docker"` +- open terminal and go to the "e2e" directory +- export the `"TS_SELENIUM_BASE_URL"` variable with "Che" url +- run command `"npm run test-docker"` ## Docker launch with changed tests **For launching tests with local changes perform next steps:** -- open terminal and go to the "e2e" directory -- export the `"TS_SELENIUM_BASE_URL"` variable with "Che" url -- run command `"npm run test-docker-mount-e2e"` +- open terminal and go to the "e2e" directory +- export the `"TS_SELENIUM_BASE_URL"` variable with "Che" url +- run command `"npm run test-docker-mount-e2e"` ## Debug docker launch @@ -62,27 +62,27 @@ The `'eclipse/che-e2e'` docker image has VNC server installed inside. For connec **The easiest way to do that is to perform steps which are described in the "Docker launch" paragraph. For running tests without docker, please perform next steps:** -- Deploy Che on Kubernetes infrastructure by using 'Minikube' and 'Chectl' -- Create workspace by using 'Chectl' and devfile - - link to 'Chectl' manual - - link to devfile ( **`For successfull test passing, exactly provided devfile should be used`** ) - -- Provide the **`'TS_SELENIUM_BASE_URL'`** environment variable as described above -- export TS_SELENIUM_HAPPY_PATH_WORKSPACE_NAME=EmptyWorkspace (default value, see BASE_TEST_CONSTANTS.ts) -- perform command **`export USERSTORY=$TS_SELENIUM_HAPPY_PATH_WORKSPACE_NAME && npm run test-all-devfiles`** +- Deploy Che on Kubernetes infrastructure by using 'Minikube' and 'Chectl' +- Create workspace by using 'Chectl' and devfile + - link to 'Chectl' manual + - link to devfile ( **`For successfull test passing, exactly provided devfile should be used`** ) + +- Provide the **`'TS_SELENIUM_BASE_URL'`** environment variable as described above +- export TS_SELENIUM_HAPPY_PATH_WORKSPACE_NAME=EmptyWorkspace (default value, see BASE_TEST_CONSTANTS.ts) +- perform command **`export USERSTORY=$TS_SELENIUM_HAPPY_PATH_WORKSPACE_NAME && npm run test-all-devfiles`** ## Launching the DevWorkspaceHappyPath spec file using Che with oauth authentication **Setup next environment variables:** -- export TS_SELENIUM_BASE_URL=\ -- export TS_SELENIUM_OCP_USERNAME=\ -- export TS_SELENIUM_OCP_PASSWORD=\ -- export TS_SELENIUM_VALUE_OPENSHIFT_OAUTH="true" -- export TS_OCP_LOGIN_PAGE_PROVIDER_TITLE=\ -- export TS_SELENIUM_DEVWORKSPACE_URL=\ -- export TS_SELENIUM_HAPPY_PATH_WORKSPACE_NAME=EmptyWorkspace (default value, see BASE_TEST_CONSTANTS.ts) +- export TS_SELENIUM_BASE_URL=\ +- export TS_SELENIUM_OCP_USERNAME=\ +- export TS_SELENIUM_OCP_PASSWORD=\ +- export TS_SELENIUM_VALUE_OPENSHIFT_OAUTH="true" +- export TS_OCP_LOGIN_PAGE_PROVIDER_TITLE=\ +- export TS_SELENIUM_DEVWORKSPACE_URL=\ +- export TS_SELENIUM_HAPPY_PATH_WORKSPACE_NAME=EmptyWorkspace (default value, see BASE_TEST_CONSTANTS.ts) **Execute the npm command:** -- perform command `export USERSTORY=$TS_SELENIUM_HAPPY_PATH_WORKSPACE_NAME && npm run test-all-devfiles` +- perform command `export USERSTORY=$TS_SELENIUM_HAPPY_PATH_WORKSPACE_NAME && npm run test-all-devfiles` diff --git a/tests/e2e/specs/api/PhpDevFileAPI.spec.ts b/tests/e2e/specs/api/PhpDevFileAPI.spec.ts index ea398b7fb64..86d3b5b5e05 100644 --- a/tests/e2e/specs/api/PhpDevFileAPI.spec.ts +++ b/tests/e2e/specs/api/PhpDevFileAPI.spec.ts @@ -1,5 +1,5 @@ /** ******************************************************************* - * copyright (c) 2023 Red Hat, Inc. + * copyright (c) 2024 Red Hat, Inc. * * This program and the accompanying materials are made * available under the terms of the Eclipse Public License 2.0 diff --git a/tests/e2e/specs/api/PythonDevFileAPI.spec.ts b/tests/e2e/specs/api/PythonDevFileAPI.spec.ts new file mode 100644 index 00000000000..7d15c1c1be9 --- /dev/null +++ b/tests/e2e/specs/api/PythonDevFileAPI.spec.ts @@ -0,0 +1,77 @@ +/** ******************************************************************* + * copyright (c) 2024 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 { BASE_TEST_CONSTANTS } from '../../constants/BASE_TEST_CONSTANTS'; +import { e2eContainer } from '../../configs/inversify.config'; +import { CLASSES } from '../../configs/inversify.types'; +import { DevfilesHelper } from '../../utils/DevfilesHelper'; +import { ContainerTerminal, KubernetesCommandLineToolsExecutor } from '../../utils/KubernetesCommandLineToolsExecutor'; +import { DevWorkspaceConfigurationHelper } from '../../utils/DevWorkspaceConfigurationHelper'; +import { DevfileContext } from '@eclipse-che/che-devworkspace-generator/lib/api/devfile-context'; +import { ShellString } from 'shelljs'; +import { expect } from 'chai'; +import { API_TEST_CONSTANTS } from '../../constants/API_TEST_CONSTANTS'; +import YAML from 'yaml'; +import { Logger } from '../../utils/Logger'; +import crypto from 'crypto'; + +suite('Python devfile API test', function (): void { + const devfilesRegistryHelper: DevfilesHelper = e2eContainer.get(CLASSES.DevfilesRegistryHelper); + const kubernetesCommandLineToolsExecutor: KubernetesCommandLineToolsExecutor = e2eContainer.get( + CLASSES.KubernetesCommandLineToolsExecutor + ); + const devfileID: string = 'python'; + const containerTerminal: ContainerTerminal = e2eContainer.get(CLASSES.ContainerTerminal); + let devWorkspaceConfigurationHelper: DevWorkspaceConfigurationHelper; + let devfileContext: DevfileContext; + let devfileContent: string = ''; + + suiteSetup(`Prepare login ${BASE_TEST_CONSTANTS.TEST_ENVIRONMENT}`, function (): void { + kubernetesCommandLineToolsExecutor.loginToOcp(); + }); + + test(`Create ${devfileID} workspace`, async function (): Promise { + const randomPref: string = crypto.randomBytes(4).toString('hex'); + kubernetesCommandLineToolsExecutor.namespace = API_TEST_CONSTANTS.TS_API_TEST_NAMESPACE || 'admin-devspaces'; + devfileContent = devfilesRegistryHelper.getDevfileContent(devfileID); + const editorDevfileContent: string = devfilesRegistryHelper.obtainCheDevFileEditorFromCheConfigMap('editors-definitions'); + const uniqName: string = YAML.parse(devfileContent).metadata.name + randomPref; + kubernetesCommandLineToolsExecutor.workspaceName = uniqName; + + devWorkspaceConfigurationHelper = new DevWorkspaceConfigurationHelper({ + editorContent: editorDevfileContent, + devfileContent: devfileContent + }); + devfileContext = await devWorkspaceConfigurationHelper.generateDevfileContext(); + if (devfileContext.devWorkspace.metadata) { + devfileContext.devWorkspace.metadata.name = uniqName; + } + const devWorkspaceConfigurationYamlString: string = + devWorkspaceConfigurationHelper.getDevWorkspaceConfigurationYamlAsString(devfileContext); + const output: ShellString = kubernetesCommandLineToolsExecutor.applyAndWaitDevWorkspace(devWorkspaceConfigurationYamlString); + expect(output.stdout).contains('condition met'); + }); + + test('Check running application', function (): void { + const workdir: string = YAML.parse(devfileContent).commands[0].exec.workingDir; + const commandLine: string = YAML.parse(devfileContent).commands[0].exec.commandLine; + const containerName: string = YAML.parse(devfileContent).commands[0].exec.component; + Logger.info(`workdir from exec section of DevWorkspace file: ${workdir}`); + Logger.info(`commandLine from exec section of DevWorkspace file: ${commandLine}`); + const runCommandInBash: string = `cd ${workdir} && ${commandLine}`; + const output: ShellString = containerTerminal.execInContainerCommand(runCommandInBash, containerName); + expect(output.code).eqls(0); + expect(output.stdout.trim()).contains('Hello, world!'); + }); + + suiteTeardown('Delete workspace', function (): void { + kubernetesCommandLineToolsExecutor.deleteDevWorkspace(); + }); +});