Skip to content

Commit 5ba157b

Browse files
committed
Merge remote-tracking branch 'origin/feature/project-id-as-part-of-api-url' into feature/project-id-as-part-of-api-url
2 parents f21a410 + 593a5e8 commit 5ba157b

24 files changed

+646
-61
lines changed

CHANGELOG.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,17 @@
11
# CHANGELOG
22

3+
## 0.3.5 (unreleased)
4+
5+
Features:
6+
- Milestone View: Add functionality that displays the latest results of the tests from the test runs -> [View Issue](https://github.com/aquality-automation/aquality-tracking/issues/11)
7+
- List of predefined Resolutions -> [View Issue](https://github.com/aquality-automation/aquality-tracking/issues/26)
8+
- Import: Mark import as debug -> [View Issue](https://github.com/aquality-automation/aquality-tracking/issues/47)
9+
- Add JUnit 5 support -> [View Issue](https://github.com/aquality-automation/aquality-tracking/issues/33)
10+
11+
Bugfixes:
12+
- Add ALLOW_UNQUOTED_CONTROL_CHARS for mapper -> [View Issue](https://github.com/aquality-automation/aquality-tracking/issues/45)
13+
- Cannot remove milestone from TestRun -> [View Issue](https://github.com/aquality-automation/aquality-tracking/issues/50)
14+
315
## 0.3.4 (2019-12-10)
416

517
Features:

src/main/java/main/controllers/ControllerFactory.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,4 +70,7 @@ public StepResultController getHandler(StepResultDto entity) {
7070
public StepTypeController getHandler(StepTypeDto entity) {
7171
return new StepTypeController(user);
7272
}
73+
public PredefinedResolutionController getHandler(PredefinedResolutionDto entity) {
74+
return new PredefinedResolutionController(user);
75+
}
7376
}

src/main/java/main/controllers/Project/MilestoneController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public List<MilestoneDto> get(MilestoneDto template) throws AqualityException {
3737

3838
@Override
3939
public boolean delete(MilestoneDto template) throws AqualityException {
40-
if(baseUser.isManager() || baseUser.getProjectUser(template.getProject_id()).isEditor()){
40+
if(baseUser.isManager() || baseUser.getProjectUserByMilestoneId(template.getId()).isEditor()){
4141
return milestoneDao.delete(template);
4242
}else{
4343
throw new AqualityPermissionsException("Account is not allowed to delete Milestones", baseUser);
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package main.controllers.Project;
2+
3+
import main.controllers.BaseController;
4+
import main.exceptions.AqualityException;
5+
import main.exceptions.AqualityPermissionsException;
6+
import main.model.db.dao.project.PredefinedResolutionDao;
7+
import main.model.dto.*;
8+
9+
import java.util.List;
10+
11+
public class PredefinedResolutionController extends BaseController<PredefinedResolutionDto> {
12+
private PredefinedResolutionDao predefinedResolutionDao;
13+
private ProjectUserController projectUserController;
14+
private ResultResolutionController resultResolutionController;
15+
16+
public PredefinedResolutionController(UserDto user) {
17+
super(user);
18+
predefinedResolutionDao = new PredefinedResolutionDao();
19+
projectUserController = new ProjectUserController(user);
20+
resultResolutionController = new ResultResolutionController(user);
21+
}
22+
23+
@Override
24+
public List<PredefinedResolutionDto> get(PredefinedResolutionDto entity) throws AqualityException {
25+
if (baseUser.isManager() || baseUser.getProjectUser(entity.getProject_id()).isEditor()) {
26+
return fillPredefinedResolutions(predefinedResolutionDao.searchAll(entity));
27+
} else {
28+
throw new AqualityPermissionsException("Account is not allowed to get Predefined Resolutions", baseUser);
29+
}
30+
}
31+
32+
@Override
33+
public PredefinedResolutionDto create(PredefinedResolutionDto entity) throws AqualityException {
34+
if (baseUser.isManager() || baseUser.getProjectUser(entity.getProject_id()).isEditor()) {
35+
return predefinedResolutionDao.create(entity);
36+
} else {
37+
throw new AqualityPermissionsException("Account is not allowed to create Predefined Resolutions", baseUser);
38+
}
39+
}
40+
41+
@Override
42+
public boolean delete(PredefinedResolutionDto entity) throws AqualityException {
43+
if (baseUser.isManager() || baseUser.getProjectUser(entity.getProject_id()).isEditor()) {
44+
return predefinedResolutionDao.delete(entity);
45+
} else {
46+
throw new AqualityPermissionsException("Account is not allowed to delete Predefined Resolutions", baseUser);
47+
}
48+
}
49+
50+
private List<PredefinedResolutionDto> fillPredefinedResolutions(List<PredefinedResolutionDto> p_resolutions) throws AqualityException {
51+
if (p_resolutions.size() > 0) {
52+
List<ResultResolutionDto> resolutions = resultResolutionController.get(new ResultResolutionDto());
53+
54+
ProjectUserDto projectUserDto = new ProjectUserDto();
55+
projectUserDto.setProject_id(p_resolutions.get(0).getProject_id());
56+
List<ProjectUserDto> projectUsers = projectUserController.get(projectUserDto);
57+
58+
for (PredefinedResolutionDto p_resolution : p_resolutions) {
59+
fillPredefinedResolution(p_resolution, resolutions, projectUsers);
60+
}
61+
}
62+
63+
return p_resolutions;
64+
}
65+
66+
private void fillPredefinedResolution(PredefinedResolutionDto p_resolution, List<ResultResolutionDto> resolutions, List<ProjectUserDto> users) {
67+
resolutions.stream().filter(x -> x.getId().equals(p_resolution.getResolution_id())).findFirst().ifPresent(p_resolution::setResolution);
68+
if (p_resolution.getAssignee() != null) {
69+
users.stream().filter(user -> user.getUser_id().equals(p_resolution.getAssignee())).findFirst()
70+
.ifPresent(projectUser -> p_resolution.setAssigned_user(projectUser.getUser()));
71+
}
72+
}
73+
}

src/main/java/main/controllers/Project/ProjectUserController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public ProjectUserDto create(ProjectUserDto template) throws AqualityException {
3131

3232
@Override
3333
public List<ProjectUserDto> get(ProjectUserDto template) throws AqualityException {
34-
if(baseUser.isFromGlobalManagement() || baseUser.getProjectUser(template.getProject_id()).isViewer()){
34+
if(baseUser.isFromGlobalManagement() || baseUser.getProjectUser(template.getProject_id()).isViewer() || template.getUser_id() != null){
3535
return fillProjectUsers(projectUserDao.searchAll(template));
3636
}else{
3737
throw new AqualityPermissionsException("Account is not allowed to view Project Users", baseUser);

src/main/java/main/controllers/Project/ResultController.java

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,14 @@ public boolean delete(TestResultDto template) throws AqualityException {
6969
}
7070
}
7171

72+
public List<TestResultDto> getLatestResultsByMilestone(Integer milestoneId) throws AqualityException {
73+
if(baseUser.isFromGlobalManagement() || baseUser.getProjectUserByMilestoneId(milestoneId).isViewer()){
74+
return fillResults(testResultDao.selectLatestResultsByMilestone(milestoneId));
75+
}else{
76+
throw new AqualityPermissionsException("Account is not allowed to view Test Results", baseUser);
77+
}
78+
}
79+
7280
public boolean updateMultipleTestResults(List<TestResultDto> entities) throws AqualityException {
7381
if(entities.size() > 0 && (baseUser.isManager() || baseUser.getProjectUser(entities.get(0).getProject_id()).isEditor())){
7482
return testResultDao.updateMultiply(entities);
@@ -107,27 +115,32 @@ private List<TestResultDto> fillResults(List<TestResultDto> results) throws Aqua
107115
if(results.size() > 0){
108116
List<FinalResultDto> finalResults = finalResultController.get(new FinalResultDto());
109117
List<ResultResolutionDto> resolutions = resultResolutionController.get(new ResultResolutionDto());
118+
110119
TestDto testTemplate = new TestDto();
111120
testTemplate.setProject_id(results.get(0).getProject_id());
112121
List<TestDto> tests = testDao.searchAll(testTemplate);
113122

123+
ProjectUserDto projectUserDto = new ProjectUserDto();
124+
projectUserDto.setProject_id(results.get(0).getProject_id());
125+
List<ProjectUserDto> projectUsers = projectUserController.get(projectUserDto);
126+
114127
for (TestResultDto result: results){
115-
fillResult(result, finalResults, resolutions, tests);
128+
fillResult(result, finalResults, resolutions, tests, projectUsers);
116129
}
117130
}
118131

119132
return results;
120133
}
121134

122-
private void fillResult(TestResultDto result, List<FinalResultDto> finalResults, List<ResultResolutionDto> resolutions, List<TestDto> tests) throws AqualityException {
135+
private void fillResult(TestResultDto result, List<FinalResultDto> finalResults, List<ResultResolutionDto> resolutions, List<TestDto> tests, List<ProjectUserDto> projectUsers) throws AqualityException {
123136
if (projectController.isStepsEnabled(result.getProject_id())) {
124137
fillResultSteps(result);
125138
}
126139

127140
result.setFinal_result(finalResults.stream().filter(x -> x.getId().equals(result.getFinal_result_id())).findFirst().orElse(null));
128141
result.setTest(tests.stream().filter(x -> x.getId().equals(result.getTest_id())).findFirst().orElse(null));
129142
result.setTest_resolution(resolutions.stream().filter(x -> x.getId().equals(result.getTest_resolution_id())).findFirst().orElse(null));
130-
fillResultAssignee(result);
143+
fillResultAssignee(result, projectUsers);
131144
}
132145

133146
private void fillResultSteps(TestResultDto result) throws AqualityException {
@@ -137,12 +150,10 @@ private void fillResultSteps(TestResultDto result) throws AqualityException {
137150
result.setSteps(stepResultController.get(stepResultTemplate));
138151
}
139152

140-
private void fillResultAssignee(TestResultDto result) throws AqualityException {
153+
private void fillResultAssignee(TestResultDto result, List<ProjectUserDto> projectUsers) throws AqualityException {
141154
if (result.getAssignee() != null) {
142-
ProjectUserDto projectUserDto = new ProjectUserDto();
143-
projectUserDto.setUser_id(result.getAssignee());
144-
projectUserDto.setProject_id(result.getProject_id());
145-
result.setAssigned_user(projectUserController.get(projectUserDto).get(0));
155+
ProjectUserDto projectUser = projectUsers.stream().filter(user -> user.getUser_id().equals(result.getAssignee())).findFirst().orElse(null);
156+
result.setAssigned_user(projectUser);
146157
}
147158
}
148159

src/main/java/main/controllers/Project/TestController.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,10 @@ public TestDto create(TestDto template) throws AqualityException {
4646
}
4747

4848
public List<TestDto> get(TestDto template, boolean withChildren) throws AqualityException {
49-
if(baseUser.isFromGlobalManagement() || baseUser.getProjectUser(template.getProject_id()).isViewer()){
49+
if(baseUser.isFromGlobalManagement() || baseUser.getProjectUserByTest(template).isViewer()){
5050
return fillTests(testDao.searchAll(template), withChildren);
5151
}else{
52-
throw new AqualityPermissionsException("Account is not allowed to view Milestones", baseUser);
52+
throw new AqualityPermissionsException("Account is not allowed to view Tests", baseUser);
5353
}
5454
}
5555

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package main.model.db.dao.project;
2+
3+
import main.model.db.dao.DAO;
4+
import main.model.dto.PredefinedResolutionDto;
5+
6+
public class PredefinedResolutionDao extends DAO<PredefinedResolutionDto> {
7+
public PredefinedResolutionDao() {
8+
super(PredefinedResolutionDto.class);
9+
select = "{call SELECT_PREDEFINED_RESOLUTION(?,?)}";
10+
insert = "{call INSERT_PREDEFINED_RESOLUTION(?,?,?,?,?,?)}";
11+
remove = "{call REMOVE_PREDEFINED_RESOLUTION(?)}";
12+
}
13+
}

src/main/java/main/model/db/dao/project/TestResultDao.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ public TestResultDao() {
1919

2020

2121
private String syncSuiteQuery = "{call SELECT_LEGACY_RESULTS(?,?)}";
22+
private String latestResultsByMilestone = "{call SELECT_LATEST_RESULTS_BY_MILESTONE(?)}";
2223

2324
/**
2425
* @param suiteId suite id for search
@@ -32,4 +33,10 @@ public List<TestResultDto> selectSuiteLegacyResults(@NotNull Integer suiteId, @N
3233
parameters.add(new ConnectionUrlParser.Pair<>("request_test_id", testId.toString()));
3334
return dtoMapper.mapObjects(CallStoredProcedure(syncSuiteQuery, parameters).toString());
3435
}
36+
37+
public List<TestResultDto> selectLatestResultsByMilestone(@NotNull Integer milestoneId) throws AqualityException {
38+
List<ConnectionUrlParser.Pair<String, String>> parameters = new ArrayList<>();
39+
parameters.add(new ConnectionUrlParser.Pair<>("request_milestone_id", milestoneId.toString()));
40+
return dtoMapper.mapObjects(CallStoredProcedure(latestResultsByMilestone, parameters).toString());
41+
}
3542
}

src/main/java/main/model/db/imports/BaseImporter.java

Lines changed: 55 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,15 @@ class BaseImporter {
1818
private ControllerFactory controllerFactory;
1919
private String pattern;
2020
protected File file;
21+
private List<PredefinedResolutionDto> predefinedResolutions;
2122

22-
BaseImporter(int projectId, String pattern, UserDto user){
23+
BaseImporter(int projectId, String pattern, UserDto user) throws AqualityException {
2324
this.projectId = projectId;
2425
this.pattern = pattern;
2526
controllerFactory = new ControllerFactory(user);
27+
PredefinedResolutionDto predefinedResolutionTemplate = new PredefinedResolutionDto();
28+
predefinedResolutionTemplate.setProject_id(this.projectId);
29+
predefinedResolutions = controllerFactory.getHandler(predefinedResolutionTemplate).get(predefinedResolutionTemplate);
2630
}
2731

2832
private List<TestResultDto> existingResults = new ArrayList<>();
@@ -37,46 +41,52 @@ class BaseImporter {
3741
ImportDao importDao = new ImportDao();
3842
ImportDto importDto = new ImportDto();
3943

40-
void createResults(boolean update) throws AqualityException {
44+
void processImport(boolean update) throws AqualityException {
4145
createTestSuite();
42-
addLogToImport("Suites are updated.");
4346
createTests();
44-
addLogToImport("Tests are updated.");
4547
createTestRun();
46-
addLogToImport("Test Run is updated.");
47-
updateImportTestRun();
48+
createResults(update);
49+
}
4850

49-
TestResultDto template = new TestResultDto();
50-
template.setTest_run_id(testRun.getId());
51-
template.setProject_id(testRun.getProject_id());
52-
template.setLimit(10000);
53-
existingResults = testResultDao.searchAll(template);
51+
private void createResults(boolean update) throws AqualityException {
52+
existingResults = getExistingResults();
53+
54+
logToImport("Starting test results creation.");
5455

55-
int testRunId = testRun.getId();
56-
addLogToImport("Starting test results creation.");
5756
for (int i = 0; i < testResults.size(); i++) {
5857
TestResultDto result = testResults.get(i);
58+
5959
if(result.getInternalTestId() != null){
6060
result.setTest(tests.stream().filter(x-> Objects.equals(x.getInternalId(), result.getInternalTestId())).findFirst().orElse(null));
6161
}else{
6262
result.setTest(tests.get(i));
6363
}
64+
6465
result.setTest_id(result.getTest().getId());
65-
result.setTest_run_id(testRunId);
66+
result.setTest_run_id(testRun.getId());
6667
result.setFinal_result_updated(result.getFinish_date());
6768
result.setProject_id(testRun.getProject_id());
6869

6970
createResult(result, update);
7071
}
71-
addLogToImport("Test results were created.");
72+
73+
logToImport("Test results were created.");
74+
}
75+
76+
private List<TestResultDto> getExistingResults() throws AqualityException {
77+
TestResultDto template = new TestResultDto();
78+
template.setTest_run_id(testRun.getId());
79+
template.setProject_id(testRun.getProject_id());
80+
template.setLimit(10000);
81+
return testResultDao.searchAll(template);
7282
}
7383

7484
private void updateImportTestRun() throws AqualityException {
7585
importDto.setTestrun_id(testRun.getId());
7686
importDto = importDao.create(importDto);
7787
}
7888

79-
void addLogToImport(String log) throws AqualityException {
89+
void logToImport(String log) throws AqualityException {
8090
importDto.addToLog(log);
8191
importDto = importDao.create(importDto);
8292
}
@@ -98,6 +108,8 @@ private void createTestRun() throws AqualityException {
98108
? testRun.getBuild_name()
99109
: file.getName().substring(0, file.getName().lastIndexOf(".")));
100110
}
111+
updateImportTestRun();
112+
logToImport("Test Run is updated.");
101113
}
102114

103115
private void createTestRun(String buildName) throws AqualityException {
@@ -133,6 +145,8 @@ private void createTestSuite() throws AqualityException {
133145
} else {
134146
testSuite.setId(controllerFactory.getHandler(testSuite).create(testSuite).getId());
135147
}
148+
149+
logToImport("Suites are updated.");
136150
}
137151

138152
private void createTests() throws AqualityException {
@@ -157,6 +171,8 @@ private void createTests() throws AqualityException {
157171
completedTests.add(test);
158172
}
159173
this.tests = completedTests;
174+
175+
logToImport("Tests are updated.");
160176
}
161177

162178
private TestDto tryGetExistingTest(List<TestDto> allTests, TestDto test) throws AqualityException {
@@ -192,7 +208,7 @@ private void createResult(TestResultDto result, boolean update) throws AqualityE
192208
}
193209

194210
if(result.getFail_reason() != null && !result.getFail_reason().equals("")){
195-
updateResultWithSimilarError(result);
211+
predictResultResolution(result);
196212
}
197213
controllerFactory.getHandler(result).create(result);
198214
} catch (AqualityException e){
@@ -202,7 +218,13 @@ private void createResult(TestResultDto result, boolean update) throws AqualityE
202218
}
203219
}
204220

205-
private TestResultDto updateResultWithSimilarError(TestResultDto result) throws AqualityException {
221+
private void predictResultResolution(TestResultDto result) throws AqualityException {
222+
if(!tryFillByPredefinedResolution(result, predefinedResolutions)) {
223+
updateResultWithSimilarError(result);
224+
}
225+
}
226+
227+
private void updateResultWithSimilarError(TestResultDto result) throws AqualityException {
206228
try{
207229
ProjectDto project = new ProjectDto();
208230
project.setId(result.getProject_id());
@@ -227,8 +249,6 @@ private TestResultDto updateResultWithSimilarError(TestResultDto result) throws
227249
result.setAssignee(similarResult.getAssignee());
228250
}
229251
}
230-
231-
return result;
232252
} catch (Exception e){
233253
throw new AqualityException("Failed on update Result with similar error");
234254
}
@@ -245,6 +265,21 @@ private TestResultDto compareByRegexp(TestResultDto result, List<TestResultDto>
245265
return null;
246266
}
247267

268+
private boolean tryFillByPredefinedResolution(TestResultDto result, List<PredefinedResolutionDto> predefinedResolutions) {
269+
if (result.getFail_reason() != null) {
270+
for (PredefinedResolutionDto predefinedResolution : predefinedResolutions) {
271+
if (RegexpUtil.match(result.getFail_reason(), predefinedResolution.getExpression())) {
272+
result.setTest_resolution_id(predefinedResolution.getResolution_id());
273+
result.setComment(predefinedResolution.getComment());
274+
result.setAssignee(predefinedResolution.getAssignee());
275+
return true;
276+
}
277+
}
278+
}
279+
280+
return false;
281+
}
282+
248283
private TestDto getTestByPatternOrName(List<TestDto> tests, TestDto importTest) throws AqualityException {
249284
Pattern pattern = Pattern.compile(this.pattern);
250285
Matcher matcher = pattern.matcher(importTest.getBody());

0 commit comments

Comments
 (0)