Skip to content

Commit 5de02b9

Browse files
Add tests for Issue
1 parent d1f9f12 commit 5de02b9

File tree

20 files changed

+979
-206
lines changed

20 files changed

+979
-206
lines changed

api/.env

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,6 @@ DB_PASSWORD=TestDB
55
DB_PORT=3333
66

77
# Port for Tomcat
8-
TOMCAT_PORT=8888
8+
TOMCAT_PORT=8080
9+
10+
BRANCH=feature/issue

api/startup.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
docker-compose up

api/stop.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
docker-compose stop

api/update.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
docker-compose stop && docker-compose build --no-cache update && docker-compose up
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
[
2+
{
3+
"description": "Test Report",
4+
"keyword": "Feature",
5+
"name": "Test Feature with all results",
6+
"line": 2,
7+
"id": "Test-Report",
8+
"tags": [],
9+
"uri": "features/testdeature.feature",
10+
"elements": [
11+
{
12+
"id": "passed",
13+
"keyword": "Scenario",
14+
"line": 7,
15+
"name": "All passed",
16+
"tags": [],
17+
"type": "scenario",
18+
"steps": [
19+
{
20+
"arguments": [],
21+
"keyword": "Given ",
22+
"line": 8,
23+
"name": "passed step",
24+
"match": {
25+
"location": "Projects/nodejs-cucumber-sample-master/node_modules/cucumber/lib/support_code_library_builder/define_helpers.js:135"
26+
},
27+
"result": {
28+
"status": "passed",
29+
"duration": 1684328900
30+
}
31+
},
32+
{
33+
"arguments": [],
34+
"keyword": "Then ",
35+
"line": 9,
36+
"name": "passed step",
37+
"match": {
38+
"location": "Projects/nodejs-cucumber-sample-master/node_modules/cucumber/lib/support_code_library_builder/define_helpers.js:135"
39+
},
40+
"result": {
41+
"status": "passed",
42+
"duration": 1684328900
43+
}
44+
}
45+
]
46+
}, {
47+
"id": "failed",
48+
"keyword": "Scenario",
49+
"line": 7,
50+
"name": "step failed",
51+
"tags": [],
52+
"type": "scenario",
53+
"steps": [
54+
{
55+
"arguments": [],
56+
"keyword": "Given ",
57+
"line": 8,
58+
"name": "passed step",
59+
"match": {
60+
"location": "Projects/nodejs-cucumber-sample-master/node_modules/cucumber/lib/support_code_library_builder/define_helpers.js:135"
61+
},
62+
"result": {
63+
"status": "passed",
64+
"duration": 2667613100
65+
}
66+
},
67+
{
68+
"arguments": [],
69+
"keyword": "Then ",
70+
"line": 9,
71+
"name": "failed step",
72+
"match": {
73+
"location": "Projects/nodejs-cucumber-sample-master/node_modules/cucumber/lib/support_code_library_builder/define_helpers.js:135"
74+
},
75+
"result": {
76+
"status": "failed",
77+
"duration": 2667613100,
78+
"error_message": "step was failed\n as expected"
79+
}
80+
}
81+
]
82+
}, {
83+
"id": "failed",
84+
"keyword": "Scenario",
85+
"line": 7,
86+
"name": "Step skipped",
87+
"tags": [],
88+
"type": "scenario",
89+
"steps": [
90+
{
91+
"arguments": [],
92+
"keyword": "Given ",
93+
"line": 8,
94+
"name": "passed step",
95+
"match": {
96+
"location": "Projects/nodejs-cucumber-sample-master/node_modules/cucumber/lib/support_code_library_builder/define_helpers.js:135"
97+
},
98+
"result": {
99+
"status": "passed",
100+
"duration": 2667613100
101+
}
102+
},
103+
{
104+
"arguments": [],
105+
"keyword": "Then ",
106+
"line": 9,
107+
"name": "skipped step",
108+
"match": {
109+
"location": "Projects/nodejs-cucumber-sample-master/node_modules/cucumber/lib/support_code_library_builder/define_helpers.js:135"
110+
},
111+
"result": {
112+
"status": "skipped",
113+
"duration": 1684328900,
114+
"error_message": "step was skipped\n as not expected"
115+
}
116+
}
117+
]
118+
}
119+
]
120+
}
121+
]

e2e/data/issueStatuses.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"open":"Open",
3+
"inProgress":"In Progress",
4+
"canNotReproduce":"Can Not Reproduce",
5+
"closed":"Closed",
6+
"done":"Done"
7+
}
Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,42 @@
11
import { by, element } from 'protractor';
22
import { Lookup } from '../../../elements/lookup.element';
3+
import { Input } from '../../../elements/input.element';
4+
import { Autocomplete } from '../../../elements/autocomplete.element';
5+
import { SmartTable } from '../../../elements/smartTable.element';
36

47
export const elements = {
58
uniqueElement: element(by.id('issue-view')),
69
resolution: new Lookup(by.id('issue-resolution')),
7-
save: element(by.id('save'))
10+
save: element(by.id('save')),
11+
title: new Input(by.id('issue-title')),
12+
assignee: new Autocomplete(by.id('issue-assignee')),
13+
extarnalIssue: new Input(by.id('issue-external-url')),
14+
description: new Input(by.id('issue-description')),
15+
expressionError: element(by.css('#issue-expression + .invalid-feedback')),
16+
overlappedIssues: new SmartTable(by.id('overlapped-issues-table')),
17+
flowButtons: element(by.id('flow-buttons')).all(by.tagName('button')),
18+
regexpTestText: new Input(by.id('regexpTestText')),
19+
expression: new Input(by.id('issue-expression')),
20+
regexpTesterResult: element(by.css('regexp-tester .regex-viewer')),
21+
saveAndAssign: element(by.id('save-and-assign')),
22+
affectedTests: new SmartTable(by.id('affected-tests')),
23+
statusBadge: element(by.id('status-badge')),
24+
startProgress: element(by.id('start-progress')),
25+
cannotReproduce: element(by.id('cannot-reproduce')),
26+
reopen: element(by.id('reopen')),
27+
close: element(by.id('close')),
28+
done: element(by.id('done')),
829
};
930

1031
export const names = {
1132
pageName: 'Issue View Page'
1233
};
1334

35+
export const overlappedIsssueColumns = {
36+
title: 'Title'
37+
};
38+
39+
export const affectedTestsColumns = {
40+
name: 'Affected Test Name'
41+
};
42+

e2e/pages/issues/view.po/index.ts

Lines changed: 134 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,151 @@
1-
import { elements, names } from './constants';
1+
import { elements, names, overlappedIsssueColumns, affectedTestsColumns } from './constants';
22
import { BasePage } from '../../base.po';
33
import { promise } from 'protractor';
4+
import { removeNewLines } from '../../../utils/string.util';
45

56
class IssuesView extends BasePage {
67
constructor() {
78
super(elements.uniqueElement, names.pageName);
89
}
910

1011
save(): promise.Promise<void> {
11-
return elements.save.click();
12+
return elements.save
13+
.click();
1214
}
1315

1416
setResolution(name: string): Promise<void> {
1517
return elements.resolution.select(name);
1618
}
19+
20+
setDescription(value: string): Promise<void> {
21+
return elements.description.typeText(value);
22+
}
23+
24+
setExternalIssue(value: string): Promise<void> {
25+
return elements.extarnalIssue.typeText(value);
26+
}
27+
28+
setAssignee(fullName: string): Promise<void> {
29+
return elements.assignee.select(fullName);
30+
}
31+
32+
setTitle(value: string): Promise<void> {
33+
return elements.title.typeText(value);
34+
}
35+
36+
getTitle(): promise.Promise<string> {
37+
return elements.title.getValue();
38+
}
39+
40+
getResolution(): promise.Promise<string> {
41+
return elements.resolution.getValue();
42+
}
43+
44+
getAssignee(): promise.Promise<string> {
45+
return elements.assignee.getValue();
46+
}
47+
48+
getExternalIssue(): promise.Promise<string> {
49+
return elements.extarnalIssue.getValue();
50+
}
51+
52+
getDescription(): promise.Promise<string> {
53+
return elements.description.getValue();
54+
}
55+
56+
getExpressionError(): promise.Promise<string> {
57+
return elements.expressionError.getText();
58+
}
59+
60+
async isFlowButtonsDisabled(): Promise<boolean> {
61+
let disabled = true;
62+
const buttons = elements.flowButtons;
63+
for (let i = 0; i < buttons.length; i++) {
64+
const button = buttons.get(i);
65+
if (await button.isEnabled()) {
66+
disabled = false;
67+
}
68+
}
69+
return disabled;
70+
}
71+
72+
async areFlowButtonsPresent(): Promise<boolean> {
73+
const buttons = elements.flowButtons;
74+
for (let i = 0; i < buttons.length; i++) {
75+
const button = buttons.get(i);
76+
if (await button.isPresent()) {
77+
return true;
78+
}
79+
}
80+
return false;
81+
}
82+
83+
async isIssueOverlappedWith(title: string): Promise<boolean> {
84+
if (await elements.overlappedIssues.isPresent()) {
85+
return elements.overlappedIssues.isRowExists(title, overlappedIsssueColumns.title);
86+
}
87+
return false;
88+
}
89+
90+
setFailReasonExample(value: string): Promise<void> {
91+
return elements.regexpTestText.typeText(value);
92+
}
93+
94+
setExpression(expression: string) {
95+
return elements.expression.typeText(expression);
96+
}
97+
98+
async getRegexpTesterHtml(): Promise<string> {
99+
return removeNewLines(await elements.regexpTesterResult.getAttribute('innerHTML'));
100+
}
101+
102+
isSaveAndAssignAvailable(): promise.Promise<boolean> {
103+
return elements.saveAndAssign.isPresent();
104+
}
105+
106+
clickSaveAndAssigne(): promise.Promise<void> {
107+
return elements.saveAndAssign.click();
108+
}
109+
110+
isTestInAffectedTestsTable(name: string): any {
111+
return elements.affectedTests.isRowExists(name, affectedTestsColumns.name);
112+
}
113+
114+
done(): promise.Promise<void> {
115+
return elements.done.click();
116+
}
117+
118+
close(): promise.Promise<void> {
119+
return elements.close.click();
120+
}
121+
122+
cannotReproduce(): promise.Promise<void> {
123+
return elements.cannotReproduce.click();
124+
}
125+
126+
reopen(): promise.Promise<void> {
127+
return elements.reopen.click();
128+
}
129+
130+
getStatusBadge(): promise.Promise<string> {
131+
return elements.statusBadge.getText();
132+
}
133+
134+
startProgress(): promise.Promise<void> {
135+
return elements.startProgress.click();
136+
}
137+
138+
async isPageEditable(): Promise<boolean> {
139+
const title = await elements.title.isEnabled();
140+
const description = await elements.description.isEnabled();
141+
const resolution = await elements.resolution.isEnabled();
142+
const assignee = await elements.assignee.isEnabled();
143+
const extarnalIssue = await elements.extarnalIssue.isEnabled();
144+
const expression = await elements.expression.isEnabled();
145+
const saveAndAssign = await elements.saveAndAssign.isPresent();
146+
147+
return title || description || resolution || assignee || extarnalIssue || expression || saveAndAssign;
148+
}
17149
}
18150

19151
export const issueView = new IssuesView();

0 commit comments

Comments
 (0)