-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpassTree.js
160 lines (160 loc) · 5.64 KB
/
passTree.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
// Serves the pass-test-case report page.
const servePassReport = op => {
const {err, fs, reportPrep, reportScriptPrep, servePage} = op;
fs.readFile('passReport.html', 'utf8')
.then(
htmlContent => {
fs.readFile('report.js', 'utf8')
.then(
jsContent => {
const newJSContent = reportScriptPrep(
jsContent, '/passtally', ['total', 'changes']
);
const newContent = reportPrep(htmlContent, newJSContent);
servePage(newContent, true);
},
error => err(error, 'reading report script')
);
},
error => err(error, 'reading passReport page')
);
};
// Handles task-creation requests.
const passHandle = (op, bodyObject) => {
const {err, globals} = op;
globals.passBuild = bodyObject.passBuild;
if (! globals.passBuild) {
err('Build blank', 'passing test cases');
}
else {
globals.passNote = bodyObject.passNote;
// Serve a report on passing-result creation.
servePassReport(op);
}
};
// Creates passing results for test cases.
const passCases = (op, cases) => {
const {globals, err, shorten, report, getCollectionData} = op;
if (cases.length && ! globals.isError) {
const firstCase = cases[0];
const firstRef = shorten('testcase', 'testcase', firstCase.ref);
if (! globals.isError) {
report([['total']]);
// If the test case already has results or has no owner:
if (firstCase.results.count || ! firstCase.owner) {
// Skip it and process the remaining test cases.
return passCases(op, cases.slice(1));
}
// Otherwise, i.e. if it has no results and has an owner:
else {
// Determine which test set, if any, the new result will be in.
return (firstCase.testSets.count ? (
getCollectionData(firstCase.testSets.ref, [], [])
.then(testSets => testSets[0].ref)
) : Promise.resolve(null))
.then(
// When the test set, if any, has been determined:
testSet => {
// Create a passing result for the test case.
return globals.restAPI.create({
type: 'testcaseresult',
fetch: ['_ref'],
data: {
TestCase: firstRef,
Verdict: 'Pass',
Build: globals.passBuild,
Notes: globals.passNote,
Date: new Date(),
Tester: firstCase.owner,
TestSet: testSet
}
})
.then(
// When it has been created:
() => {
report([['changes']]);
// Process the remaining test cases.
return passCases(op, cases.slice(1));
},
error => err(error, 'creating passing result for test case')
);
},
error => err(error,'determining test set for passing result')
);
}
}
else {
return Promise.resolve('');
}
}
else {
return Promise.resolve('');
}
};
// Recursively creates passing test-case results for a tree or subtrees of user stories.
const passTree = (op, storyRefs) => {
const {globals, err, shorten, getItemData, getCollectionData} = op;
if (storyRefs.length && ! globals.isError) {
const firstRef = shorten('userstory', 'hierarchicalrequirement', storyRefs[0]);
if (! globals.isError) {
// Get data on the first user story.
return getItemData(firstRef, ['FormattedID'], ['Children', 'TestCases'])
.then(
// When the data arrive:
data => {
// Get data on the test cases, if any, of the user story.
return getCollectionData(
data.testCases.count ? data.testCases.ref : '', ['Owner'], ['Results', 'TestSets']
)
.then(
// When the data arrive:
cases => {
// Report progress in the console if requested.
if (globals.debug) {
console.log(`Processing ${data.formattedID}`);
}
// Process the test cases, if any, sequentially.
return passCases(op, cases)
.then(
// After any are processed:
() => {
if (! globals.isError) {
// Get data on the child user stories, if any, of the user story.
return getCollectionData(data.children.count ? data.children.ref : '', [], [])
.then(
// When the data, if any, arrive:
children => {
// Process the child user stories, if any.
return passTree(op, children.map(child => child.ref))
.then(
// When any have been processed, process the remaining user stories.
() => passTree(op, storyRefs.slice(1)),
error => err(error, 'creating passing results for child user stories')
);
},
error => err(error, 'getting data on child user stories')
);
}
else {
return '';
}
},
error => err(error, 'creating passing results for test cases of user story')
);
},
error => err(error, 'getting data on test cases of user story')
);
},
error => err(error, 'getting data on user story')
);
}
else {
return Promise.resolve('');
}
}
else {
return Promise.resolve('');
}
};
exports.passHandle = passHandle;
exports.passTree = passTree;