Skip to content

Commit

Permalink
pipeline test iteration v2
Browse files Browse the repository at this point in the history
  • Loading branch information
Sanket committed Feb 26, 2020
1 parent 4eedb4b commit a075823
Show file tree
Hide file tree
Showing 15 changed files with 251 additions and 26 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ describe('Application Launcher Menu', () => {
expect(pageSidebar.getText()).toContain('Topology');
expect(pageSidebar.getText()).toContain('+Add');
expect(pageSidebar.getText()).toContain('Builds');
expect(pageSidebar.getText()).toContain('Advanced');
expect(pageSidebar.getText()).toContain('More');
expect(pageSidebar.getText()).toContain('Project Details');
expect(pageSidebar.getText()).toContain('Project Access');
expect(pageSidebar.getText()).toContain('Search');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,27 @@ import {
pipelineScriptRunner,
createPipelineYamlError,
pipelineOverviewName,
pipelineTable,
pipelineTableBody,
pipelineStartKebab,
pipelineFilter,
pipelineStart,
pipelineRun,
pipelineRerun,
pipelineActionList,
pipelineStartLastRun,
pipelineSelect,
pipelineRuns,
pipelineRunLogs,
samplePipelineElement,
pipelineRunOverview,
pipelines,
pipelineRunLogList,
pipelineRunStartLoaded,
pipelineTableBodyElement,
pipelineYaml,
pipelineActions,
pipelineTab,
pipelineRunLogContainer,
} from '../views/pipeline.view';
import * as sidenavView from '../../../../integration-tests/views/sidenav.view';
import * as crudView from '../../../../integration-tests/views/crud.view';
Expand All @@ -26,10 +45,11 @@ import * as operatorView from '../../../operator-lifecycle-manager/integration-t
import * as operatorHubView from '../../../operator-lifecycle-manager/integration-tests/views/operator-hub.view';

const JASMINE_DEFAULT_TIMEOUT_INTERVAL = jasmine.DEFAULT_TIMEOUT_INTERVAL;
const JASMINE_EXTENDED_TIMEOUT_INTERVAL = 1000 * 60 * 3;
const JASMINE_EXTENDED_TIMEOUT_INTERVAL = 1000 * 60 * 5;

describe('Pipeline', async () => {
beforeAll(async () => {
await switchPerspective(Perspective.Administrator);
await browser.get(`${appHost}/k8s/cluster/projects`);
await browser.wait(until.presenceOf(sidenavView.navSectionFor('Operators')));
await sidenavView.clickNavLink(['Operators', 'OperatorHub']);
Expand All @@ -54,9 +74,10 @@ describe('Pipeline', async () => {
await catalogView.categoryTabsPresent();
await catalogView.categoryTabs.get(0).click();
await catalogPageView.catalogTileFor('Pipelines Operator').click();
await browser.wait(until.visibilityOf(operatorHubView.operatorModal));
await browser.wait(until.visibilityOf(operatorHubView.communityWarningModal));
await browser.wait(until.presenceOf(element(by.id('confirm-action'))));
await element(by.id('confirm-action')).click();
await browser.wait(until.visibilityOf(operatorHubView.operatorModalBody));
await browser.wait(until.presenceOf(operatorHubView.operatorModalInstallBtn));
await operatorHubView.operatorModalInstallBtn.click();
await operatorHubView.createSubscriptionFormLoaded();
Expand All @@ -79,7 +100,7 @@ describe('Pipeline', async () => {

it(`displays Operator in "Cluster Service Versions" view for "${testName}" namespace`, async () => {
await retry(() => catalogPageView.catalogTileFor('OpenShift Pipelines Operator').click());
await operatorHubView.operatorModalIsLoaded();
await browser.wait(until.visibilityOf(operatorHubView.communityWarningModal));
await element(by.id('confirm-action')).click();
await operatorHubView.viewInstalledOperator();
await crudView.isLoaded();
Expand All @@ -91,13 +112,15 @@ describe('Pipeline', async () => {
});

it('pipeline is installed', async () => {
await browser.get(`${appHost}/k8s/cluster/projects/${testName}`);
await switchPerspective(Perspective.Developer);
expect(sideHeader.getText()).toContain('Developer');
await browser.wait(until.visibilityOf(pageSidebar));
await browser.wait(until.visibilityOf(pipelineTab));
expect(pageSidebar.getText()).toContain('Pipelines');
});

it('pipeline tab scenario', async () => {
it('create pipeline through cli & UI', async () => {
await switchPerspective(Perspective.Developer);
expect(sideHeader.getText()).toContain('Developer');
await browser.wait(until.visibilityOf(pageSidebar));
Expand All @@ -112,12 +135,66 @@ describe('Pipeline', async () => {
`oc create -f ./packages/dev-console/integration-tests/views/simple-pipeline-demo.yaml -n ${testName}`,
);
await pipelinecheckStatus();
await browser.wait(until.visibilityOf(pipelineTable));
expect(pipelineTableBody.element(by.css('[data-test-id="simple-pipeline"]')).isPresent()).toBe(
true,
await browser.wait(until.visibilityOf(pipelineTableBodyElement(testName, 'simple-pipeline')));
expect(element(by.css('[data-test-id="simple-pipeline"]')).isPresent()).toBe(true);
await browser.wait(until.visibilityOf(pipelineTableBodyElement(testName, 'new-pipeline')));
expect(element(by.css('[data-test-id="new-pipeline"]')).isPresent()).toBe(true);
});

it('run pipeline and generate pipeline logs scenario', async () => {
await switchPerspective(Perspective.Developer);
await browser.wait(until.visibilityOf(pageSidebar));
await pipelinecheckStatus();
await execSync(
`oc create -f ./packages/dev-console/integration-tests/views/sample-app-pipeline.yaml -n ${testName}`,
);
expect(pipelineTableBody.element(by.css('[data-test-id="new-pipeline"]')).isPresent()).toBe(
true,
await browser.wait(until.visibilityOf(samplePipelineElement));
const samplePipelineText = await samplePipelineElement.getText();
expect(samplePipelineText).toBe('sample-app-pipeline');
expect(samplePipelineElement.isPresent()).toBe(true);
await pipelineFilter.click();
await pipelineFilter.sendKeys('sample-app-pipeline');
await browser.wait(until.visibilityOf(samplePipelineElement));
await browser.wait(until.elementToBeClickable(pipelineStartKebab));
await pipelineStartKebab.click();
await browser.wait(until.visibilityOf(pipelineActions), 5000);
await browser.wait(until.visibilityOf(pipelineStart), 5000);
await pipelineRunStartLoaded();
await pipelineStart.click();
await browser.wait(until.visibilityOf(pipelineRunOverview));
const runName = await pipelineOverviewName.getText();
await pipelinecheckStatus();
await browser.wait(
until.visibilityOf(pipelineTableBodyElement(testName, 'sample-app-pipeline')),
);
await samplePipelineElement.click();
await browser.wait(until.visibilityOf(pipelineRun));
await pipelineRun.click();
await browser.wait(until.visibilityOf(pipelines(runName)));
const pipelineRunName = await pipelines(runName).getText();
expect(pipelineRunName).toBe(runName);
await pipelineStartKebab.click();
await browser.wait(until.visibilityOf(pipelineRerun));
await pipelineRerun.click();
await browser.wait(until.visibilityOf(pipelineActionList));
await pipelineActionList.click();
await pipelineStartLastRun.click();
const tempUrlText = await pipelineOverviewName.getText();
await browser.wait(until.urlContains(tempUrlText));
await browser.wait(until.visibilityOf(pipelineYaml), 5000);
await browser.wait(until.elementToBeClickable(pipelineYaml));
await pipelineYaml.click();
await browser.wait(until.visibilityOf(pipelineRuns), 5000);
await browser.wait(until.elementToBeClickable(pipelineRuns)).then(() => pipelineRuns.click());
await browser.wait(until.visibilityOf(pipelines(runName)));
const pipelineRunNumber = await pipelineTableBody.getAttribute('childElementCount');
expect(pipelineRunNumber).toBe('3');
await pipelineSelect(runName).click();
await pipelineRunLogs.click();
await browser.wait(until.presenceOf(pipelineRunLogList));
expect(pipelineRunLogContainer.isPresent()).toBe(true);
expect(pipelineRunLogList.isPresent()).toBe(true);
const sample = await pipelineRunLogList.getText();
expect(sample.replace(/\s+/g, ' ')).toContain('install-deps');
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ describe('Topology', () => {
await expect(topologyConnectors.count()).toBe(0);

// Find the source app to be connected
await expect(findNodes(newApplication1).count()).toBe(1);
await expect(findNodes(newApplication1).count()).toBe(2);
await findNode(newApplication1);
await findWorkloadNode(newApplication1);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ export const addApplication = async function(name: string, nodeName: string) {
};

export const addApplicationWithExistingApps = async function(name: string, nodeName: string) {
await browser.wait(until.visibilityOf(applicationSelector));
await browser.wait(until.elementToBeClickable(applicationSelector));
await applicationSelector.click();
await browser.wait(until.presenceOf(applicationDropdown));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,55 @@ import { browser, ExpectedConditions as until, by, element, $ } from 'protractor
export const pageSidebar = element(by.id('page-sidebar'));
export const pipelineTab = element(by.css('[data-test-id="pipeline-header"]'));
export const pipelinePage = element(by.css('[data-test-id="resource-title"]'));
export const selectTask = element(by.className('odc-task-list-node__trigger'));
export const selectBuildah = element(by.css('[data-test-action="buildah"]'));
export const createPipeline = element(by.css('[data-test-id="import-git-create-button"]'));
export const createPipelineYaml = element(by.id('yaml-create'));
export const yamlPipeline = element(by.className('lines-content monaco-editor-background'));
export const saveChangesYamlPipeline = element(by.id('save-changes'));
export const createPipelineYamlError = $('.pf-c-alert.pf-m-danger');
export const pipelineTable = element(
by.className('ReactVirtualized__VirtualGrid ReactVirtualized__List'),
);
export const pipelineTableBody = element(
by.className('ReactVirtualized__VirtualGrid__innerScrollContainer'),
);
export const pipelineGraph = $('.odc-pipeline-vis-graph__stages');
export const pipelineTableBodyElement = (testname, pipelinename) =>
element(by.css(`[data-test-id="${testname}-${pipelinename}"]`));
export const samplePipelineElement = element(by.css('[data-test-id="sample-app-pipeline"]'));
export const pipelineGraph = element(by.css('[data-test-id="topology"]'));
export const pipelineOverviewName = element(by.css('[data-test-id="resource-title"]'));
export const pipelineFilter = element(by.css('[data-test-id="item-filter"]'));
export const pipelineStartKebab = element(by.css('[data-test-id="kebab-button"]'));
export const pipelineActions = element(by.css('[data-test-id="action-items"]'));

export const pipelineStart = element(by.css('[data-test-action="Start"]'));
export const pipelineRunStartLoaded = () =>
browser.wait(until.elementToBeClickable(pipelineStart), 1000).then(() => browser.sleep(5000));

export const pipelineDelete = element(by.css('[data-test-action="Delete Pipeline"]'));

export const pipelineRunOverview = element(by.cssContainingText('h2', 'Pipeline Run Details'));
export const pipelineRun = element(by.css('[data-test-id="horizontal-link-Pipeline Runs"]'));
export const pipelines = (runName) => element(by.css(`[data-test-id="${runName}"]`));
export const pipelineRuns = element(by.css('[data-test-id="breadcrumb-link-0"]'));
export const pipelineSelect = (name) => element(by.css(`[data-test-id="${name}"]`));
export const pipelineRerun = element(by.cssContainingText('button', 'Rerun'));
export const pipelineActionList = element(by.css('[data-test-id="actions-menu-button"]'));
export const pipelineStartLastRun = element(by.cssContainingText('button', 'Start Last Run'));
export const pipelineRunLogs = element(by.css('[data-test-id="horizontal-link-Logs"]'));
export const pipelineYaml = element(by.css('[data-test-id="horizontal-link-YAML"]'));
export const pipelineRunLogList = element(by.css('[data-test-id="logs-tasklist"]'));
export const pipelineRunLogContainer = element(by.css('[data-test-id="logs-task-container"]'));

export const pipelineScriptRunner = async function() {
await browser.wait(until.presenceOf(createPipelineYaml));
await createPipelineYaml.click();
await browser.wait(until.presenceOf(saveChangesYamlPipeline));
await saveChangesYamlPipeline.click();
await browser.wait(until.visibilityOf(pipelineGraph), 5000);
await browser.wait(until.presenceOf(selectTask));
await selectTask.click();
await browser.wait(until.visibilityOf(selectBuildah));
await selectBuildah.click();
await browser.wait(until.elementToBeClickable(createPipeline));
await createPipeline.click();
await browser.wait(until.visibilityOf(pipelineGraph));
};

export const pipelinecheckStatus = async function() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
apiVersion: tekton.dev/v1alpha1
kind: Pipeline
metadata:
name: sample-app-pipeline
spec:
tasks:
- name: install-deps
taskRef:
name: install-dependencies
- name: code-sanity
taskRef:
name: lint-and-test
runAfter:
- install-deps
- name: compile
taskRef:
name: build-dist
runAfter:
- install-deps
- name: e2e-tests
taskRef:
name: run-e2e-tests
runAfter:
- code-sanity
- compile

---

apiVersion: tekton.dev/v1alpha1
kind: Task
metadata:
name: install-dependencies
spec:
steps:
- name: install
image: ubuntu
command:
- echo
args:
- "Installing dependencies...\n\nDependencies installed successfully."
---
apiVersion: tekton.dev/v1alpha1
kind: Task
metadata:
name: lint-and-test
spec:
steps:
- name: startup
image: ubuntu
command:
- echo
args:
- "Running Linter and Tests"
- name: lint-errors
image: ubuntu
command:
- echo
args:
- "0 Lint Errors"
- name: test-status
image: ubuntu
command:
- echo
args:
- "0 Test Failures"
- name: coverage-report
image: ubuntu
command:
- echo
args:
- "Exporting Test Coverage Report...\n\nCoverage report can be found in __coverage__"
---
apiVersion: tekton.dev/v1alpha1
kind: Task
metadata:
name: build-dist
spec:
steps:
- name: build
image: ubuntu
command:
- echo
args:
- "Compiling code and producing dist folder...\n\nFolder public/dist created"
---
apiVersion: tekton.dev/v1alpha1
kind: Task
metadata:
name: run-e2e-tests
spec:
steps:
- name: status
image: ubuntu
command:
- echo
args:
- "Running end-to-end tests...\n\nAll tests pass"
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,10 @@ export const findNode = function(nodeName: string) {
export const findWorkloadNode = function(nodeName: string) {
const tempString = '[data-id="group:';
const searchString = tempString.concat(nodeName, '"]');
const returnNode = element(by.css(searchString)).element(by.css('[data-type="workload"]'));
const returnNode = element
.all(by.css(searchString))
.last()
.element(by.css('[data-type="workload"]'));
return returnNode;
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ class PipelineRunLogs extends React.Component<PipelineRunLogsProps, PipelineRunL
)}/logs/`;
return (
<div className="odc-pipeline-run-logs">
<div className="odc-pipeline-run-logs__tasklist">
<div className="odc-pipeline-run-logs__tasklist" data-test-id="logs-tasklist">
{taskCount > 0 ? (
<Nav onSelect={this.onNavSelect}>
<NavList className="odc-pipeline-run-logs__nav">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,7 @@ class PipelineTaskLogs extends React.Component<PipelineTaskLogsProps, PipelineTa
}
style={{ height: targetHeight }}
ref={this.scrollPane}
data-test-id="logs-task-container"
>
<div className="odc-pipeline-task-logs__taskName">
{taskName}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ const PipelineRunRow: React.FC<PipelineRunRowProps> = ({ obj, index, key, style
name={obj.metadata.name}
namespace={obj.metadata.namespace}
title={obj.metadata.name}
data-test-id={obj.metadata.name}
/>
</TableData>
<TableData className={tableColumnClasses[1]}>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,13 @@ const PipelineRow: React.FC<PipelineRowProps> = ({ obj, index, key, style }) =>
Kebab.factory.Delete,
];
return (
<TableRow id={obj.metadata.uid} index={index} trKey={key} style={style}>
<TableRow
id={obj.metadata.uid}
data-test-id={`${obj.metadata.namespace}-${obj.metadata.name}`}
index={index}
trKey={key}
style={style}
>
<TableData className={tableColumnClasses[0]}>
<ResourceLink
kind={pipelineReference}
Expand Down

0 comments on commit a075823

Please sign in to comment.