Skip to content

Commit f130c0a

Browse files
Merge pull request #39 from aquality-automation/feature/predefined_resolutions
Feature/predefined resolutions
2 parents c8d70a6 + 3b74136 commit f130c0a

File tree

12 files changed

+385
-27
lines changed

12 files changed

+385
-27
lines changed

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@
33
## 0.3.5 (unreleased)
44

55
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)
68
- Import: Mark import as debug -> [View Issue](https://github.com/aquality-automation/aquality-tracking/issues/47)
79

810
Bugfixes:
911
- Add ALLOW_UNQUOTED_CONTROL_CHARS for mapper -> [View Issue](https://github.com/aquality-automation/aquality-tracking/issues/45)
10-
- 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)
1112

1213
## 0.3.4 (2019-12-10)
1314

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
}
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);
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/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());

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public class Importer extends BaseImporter {
2121

2222
private HandlerFactory handlerFactory = new HandlerFactory();
2323

24-
public Importer(List<String> files, TestRunDto testRunTemplate, String pattern, String type, TestNameNodeType testNameNodeType, boolean singleTestRun, UserDto user) {
24+
public Importer(List<String> files, TestRunDto testRunTemplate, String pattern, String type, TestNameNodeType testNameNodeType, boolean singleTestRun, UserDto user) throws AqualityException {
2525
super(testRunTemplate.getProject_id(), pattern, user);
2626
this.testRunTemplate = testRunTemplate;
2727
this.suiteName = testRunTemplate.getTest_suite().getName();
@@ -77,7 +77,7 @@ private List<ImportDto> parseIntoMultiple() throws AqualityException {
7777
private void executeResultsCreation() throws AqualityException {
7878
fillTestRunWithInputData();
7979
fillTestSuiteWithInputData();
80-
this.createResults(testRunTemplate.getId() != null);
80+
this.processImport(testRunTemplate.getId() != null);
8181
this.testRun = new TestRunDto();
8282
this.testResults = new ArrayList<>();
8383
this.tests = new ArrayList<>();
@@ -88,7 +88,7 @@ private void storeResults(Handler handler) throws AqualityException {
8888
this.testResults.addAll(handler.getTestResults());
8989
this.tests.addAll(handler.getTests());
9090
this.testSuite = handler.getTestSuite();
91-
addLogToImport("File was parsed correctly!");
91+
logToImport("File was parsed correctly!");
9292
}
9393

9494
private void fillTestSuiteWithInputData(){
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package main.model.dto;
2+
3+
import lombok.Data;
4+
import lombok.EqualsAndHashCode;
5+
import main.annotations.DataBaseID;
6+
import main.annotations.DataBaseInsert;
7+
import main.annotations.DataBaseName;
8+
import main.annotations.DataBaseSearchable;
9+
10+
@Data @EqualsAndHashCode(callSuper = true)
11+
public class PredefinedResolutionDto extends BaseDto {
12+
@DataBaseID
13+
@DataBaseSearchable
14+
@DataBaseInsert
15+
@DataBaseName(name="request_id")
16+
private Integer id;
17+
@DataBaseSearchable
18+
@DataBaseInsert
19+
@DataBaseName(name="request_project_id")
20+
private Integer project_id;
21+
@DataBaseInsert
22+
@DataBaseName(name="request_resolution_id")
23+
private Integer resolution_id;
24+
@DataBaseInsert
25+
@DataBaseName(name="request_comment")
26+
private String comment;
27+
@DataBaseInsert
28+
@DataBaseName(name="request_assignee")
29+
private Integer assignee;
30+
@DataBaseInsert
31+
@DataBaseName(name="request_expression")
32+
private String expression;
33+
private ResultResolutionDto resolution;
34+
private UserDto assigned_user;
35+
}

src/main/java/main/utils/RegexpUtil.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,12 @@ public static boolean compareByRegexpGroups(String actual, String expected, Stri
2626
return result;
2727
}
2828

29+
public static boolean match(String value, String expression) {
30+
Pattern pattern = Pattern.compile(expression, Pattern.DOTALL);
31+
Matcher matcher = pattern.matcher(value);
32+
return matcher.matches();
33+
}
34+
2935
private static List<String> getGroups(Matcher matcher) {
3036
List<String> groups = new ArrayList<>();
3137
while (matcher.find()) {

0 commit comments

Comments
 (0)