001package com.thed.util;
002
003import com.google.gson.reflect.TypeToken;
004import com.thed.model.*;
005import com.thed.util.gson.GsonUtil;
006import com.thed.zblast.parser.model.TCRCatalogTreeTestcase;
007import com.thed.zblast.parser.model.TCRTestcase;
008import com.thed.zblast.parser.model.TreeSelectionInfo;
009import com.thed.zblast.util.RestUtil;
010import org.apache.commons.lang.StringUtils;
011
012import java.io.File;
013import java.io.IOException;
014import java.lang.reflect.Type;
015import java.text.ParseException;
016import java.text.SimpleDateFormat;
017import java.util.*;
018import java.util.logging.Level;
019import java.util.logging.Logger;
020import java.util.stream.Collectors;
021
022public class ZephyrSoapClient {
023        private static Logger logger = Logger.getLogger(ZephyrSoapClient.class.getName());
024
025        /**
026         * @param zephyrData
027         * @param cyclePhaseDto
028         * @param testCaseIdResultMap
029         * @param attachmentMap
030         * @param testStepResult
031         * @return
032         * @throws IOException
033         */
034        private static List<ReleaseTestSchedule> fetchTestSchedules(ZephyrConfigModel zephyrData,
035                        CyclePhaseDTO cyclePhaseDto, Map<Long, ExecutionRequest> testCaseIdResultMap,
036                        Map<Long, List<File>> attachmentMap, Map<Long, TestStep> testStepResult, Map<Long, List<File>> testcaseAttachmentFile) throws IOException {
037                long userId = zephyrData.getUserId();
038                boolean status = false;
039                SearchResult searchResults = RestUtil.getReleaseTestSchedules(cyclePhaseDto, zephyrData.getReleaseId());
040                List<ReleaseTestSchedule> testSchedulesByCriteria = (List<ReleaseTestSchedule>) ((searchResults!=null && searchResults.getResults().size() > 0)
041                                ? searchResults.getResults()
042                                : new ArrayList());
043
044                Set<String> activeStatusIdSet = getTestExecutionStatusIds(true);
045                Set<String> invalidStatusIdSet = new HashSet<>();
046                // prepare list to be posted.
047                List<ReleaseTestSchedule> releaseSchedulesList = new ArrayList<>();
048                for (Iterator<ReleaseTestSchedule> iterator = testSchedulesByCriteria.iterator(); iterator.hasNext();) {
049                        ReleaseTestSchedule releaseTestSchedule = iterator.next();
050                        long testcaseId = releaseTestSchedule.getTcrTreeTestcase().getTestcase().getId();
051                        if(!testCaseIdResultMap.containsKey(testcaseId)) {
052                                continue;
053                        }
054                        long testScheduleId = releaseTestSchedule.getId();
055
056                        releaseTestSchedule.setTesterId(zephyrData.getAssignResultsTo());
057                        releaseTestSchedule.setChangeBy(userId);
058                        TestResult testResult = new TestResult();
059                        testResult.setTesterId(userId);
060                        testResult.setExecutionNotes(ZeeConstants.TEST_EXECUTE_COMMENT);
061                        releaseTestSchedule.setExecutedBy(userId);
062                        testResult.setReleaseTestScheduleId(testScheduleId);
063                        releaseTestSchedule.setAssignmentDate(new Date());
064                        releaseTestSchedule.setComment(ZeeConstants.TEST_EXECUTE_COMMENT);
065                        if(releaseTestSchedule.getTcrTreeTestcase().getTestcase().getEstimatedTime() != null) {
066                                releaseTestSchedule.setActualTime(releaseTestSchedule.getTcrTreeTestcase().getTestcase().getEstimatedTime());
067                        }
068                        releaseTestSchedule.setLastTestResult(testResult);
069                        if(testCaseIdResultMap.get(testcaseId) != null) {
070                                ExecutionRequest executionRequest = testCaseIdResultMap.get(testcaseId);
071                                if(activeStatusIdSet.contains(executionRequest.getStatus())) {
072                                        ScriptUtil.setExecutionInRTS(releaseTestSchedule, testCaseIdResultMap.get(testcaseId));
073                                } else {
074                                        invalidStatusIdSet.add(executionRequest.getStatus());
075                                        continue;
076                                }
077                        }
078                        releaseSchedulesList.add(releaseTestSchedule);
079                }
080
081                for(String statusId : invalidStatusIdSet) {
082                        logger.warning("No active testcase execution status found for id: " + statusId);
083                }
084
085                Map<Long,List<File>> releaseAttachmentFile=new HashMap<Long,List<File>>();
086        Map<Long,List<File>> releaseTestCaseAttachmentFile=new HashMap<Long,List<File>>();
087
088        if (releaseSchedulesList==null || releaseSchedulesList.isEmpty()) {
089                        return Collections.emptyList();
090        }
091
092                        releaseSchedulesList = RestUtil.updateExecutions(releaseSchedulesList);
093                        if (attachmentMap.size() > 0) {
094                                for (ReleaseTestSchedule release : testSchedulesByCriteria) {
095                                        List<File> attachment = attachmentMap.get(release.getTcrTreeTestcase().getTestcase().getId());
096                                        if (attachment == null) {
097                                                continue;
098                                        }
099                                        releaseAttachmentFile.put(release.getId(), attachmentMap.get(release.getTcrTreeTestcase().getTestcase().getId()));
100                                }
101                        }
102                        RestUtil.addAttachment(releaseAttachmentFile, zephyrData.getAssignResultsTo());
103
104            if (testcaseAttachmentFile.size() > 0) {
105                for (ReleaseTestSchedule release : testSchedulesByCriteria) {
106                        List<File> attachment = testcaseAttachmentFile.get(release.getTcrTreeTestcase().getTestcase().getId());
107                        if (attachment == null) {
108                        continue;
109                    }
110                    releaseTestCaseAttachmentFile.put(release.getId(), testcaseAttachmentFile.get(release.getTcrTreeTestcase().getTestcase().getId()));
111                }
112            }
113        RestUtil.addTestCaseAttachment(releaseTestCaseAttachmentFile, zephyrData.getAssignResultsTo());
114
115                        if (releaseSchedulesList == null) return Collections.emptyList();
116                        List<TestStepResult> releaseStepList = getStepExecutions(testSchedulesByCriteria, testStepResult);
117                        RestUtil.updateStepExecutions(releaseStepList);
118
119            return releaseSchedulesList;
120    }
121
122        private static List<TestStepResult> getStepExecutions(List<ReleaseTestSchedule> releaseSchedulesList,
123                        Map<Long, TestStep> testStepExecutionResult) {
124            if(releaseSchedulesList != null && releaseSchedulesList.isEmpty()){
125                return Collections.emptyList();
126        }
127                List<TestStepResult> releaseStepList = new ArrayList<TestStepResult>();
128                for (ReleaseTestSchedule release : releaseSchedulesList) {
129                        TestStep step = testStepExecutionResult.get(release.getTcrTreeTestcase().getTestcase().getId());
130                        if (step == null) {
131                                continue;
132                        }
133                                long i = 0;
134                                for (TestStepDetail detail : step.getSteps()) {
135                                        i++;
136                                        TestStepResult stepResult = new TestStepResult();
137                                        stepResult.setCyclePhaseId(release.getCyclePhaseId());
138                                        stepResult.setReleaseTestScheduleId(release.getId());
139                                        if (detail.getExecutionStatus().equals("true")) {
140                                                stepResult.setStatus("1");
141                                        } else if(detail.getExecutionStatus().equals("false")) {
142                                                stepResult.setStatus("2");
143                                        }else {
144                                                stepResult.setStatus("10");
145                                        }
146                                        stepResult.setTestStepId(i);
147                                        releaseStepList.add(stepResult);
148                                }
149                }
150                return releaseStepList;
151        }
152
153        public static String findPackageName(String testCaseNameWithPackage) {
154                String packageName = "";
155                if (StringUtils.isBlank(testCaseNameWithPackage)) {
156                        return packageName;
157                }
158                String[] split = testCaseNameWithPackage.split("\\.");
159                int splitCount = split.length;
160                for (int i = 0; i < split.length; i++) {
161                        if (splitCount > 1) {
162                                if (i == splitCount - 1)
163                                        break;
164                                packageName += split[i];
165                                packageName += ".";
166                        }
167                }
168                String removeEnd = StringUtils.removeEnd(packageName, ".");
169                return removeEnd;
170        }
171
172        public void uploadTestResults(ZephyrConfigModel zephyrData, List<TCRCatalogTreeTestcase> testcasesList, AutomationJobDetail automationJobDetail) throws Exception {
173                Map<Long, ExecutionRequest> testCaseIdResultMap = new HashMap<Long, ExecutionRequest>();
174                Map<Long, TestStep> testStepResult = new HashMap<Long, TestStep>();
175                Map<Long, List<File>> attachmentMap = new HashMap<>();
176        Map<Long,List<File>> testcaseAttachmentFile=new HashMap<Long,List<File>>();
177                List<TestCaseResultModel> testcases = zephyrData.getTestcases();
178                try {
179                        UserDTO user = RestUtil.getCurrentLoggedinUser();
180                        zephyrData.setUserId(user.getId());
181                        List<TCRTestcase> tcrList = testcasesList.stream().map(tc -> tc.getTestcase()).collect(Collectors.toList());
182                        if(testCaseIdResultMap.isEmpty()) {
183                                tcrList.forEach(tcrTestcase -> testCaseIdResultMap.put(tcrTestcase.getId(), tcrTestcase.getExecutionRequest()));
184                        }
185
186                        for(TestCaseResultModel test: testcases ) {
187                                if(test.getAttachment()==null){
188                                        continue;
189                                }
190                                TCRCatalogTreeTestcase testCase=testcasesList.parallelStream().filter(t->t.getTestcase().getName().equals(test.getTestcase().getName())).findAny().orElse(null);
191                                attachmentMap.put(testCase.getTestcase().getId(), test.getAttachment());
192                        }
193            for(TestCaseResultModel test: testcases ) {
194                if(test.getTestcaseAttachement()==null){
195                    continue;
196                }
197                TCRCatalogTreeTestcase testCase=testcasesList.parallelStream().filter(t->t.getTestcase().getName().equals(test.getTestcase().getName())).findAny().orElse(null);
198                testcaseAttachmentFile.put(testCase.getTestcase().getId(), test.getTestcaseAttachement());
199            }
200                        for(TCRTestcase tcase:tcrList){
201                                if(tcase.getTestSteps()==null){
202                                        continue;
203                                }
204                                testStepResult.put(tcase.getId(),tcase.getTestSteps());
205                        }
206                        
207                        CycleDTO cycle = fetchCycle(automationJobDetail,zephyrData);
208                        CyclePhaseDTO cyclePhase = fetchCyclePhase(cycle,automationJobDetail,zephyrData);
209            for(int i=0;i<testcasesList.size();i+=ZeeConstants.BATCH_SIZE) {
210                                List<TCRCatalogTreeTestcase> tcrCatalogTreeTestcases = testcasesList.stream().skip(i).limit(ZeeConstants.BATCH_SIZE).collect(Collectors.toList());
211                                List<TreeSelectionInfo> selectionTree = getTreeInfo(tcrCatalogTreeTestcases);
212                                browseTestcasesIntoFFform(cyclePhase, selectionTree, zephyrData, automationJobDetail);
213                                //set createPackage false so that it will not create package for each loop
214                                zephyrData.setCreatePackage(Boolean.FALSE);
215                        }
216                        RestUtil.assignExecutions(cyclePhase,zephyrData);
217                        //Introduces sleep to let elastic search to index RTS.
218                        Thread.sleep(5000);
219
220                        if(updateVersionOfTCRTestCases(automationJobDetail.getCycleName(), testcasesList) == null){
221                                logger.info("No cloned tcrTestCases are updated with latest version in current cycle");
222                        }
223
224                        List<ReleaseTestSchedule> releaseList = fetchTestSchedules(zephyrData, cyclePhase,testCaseIdResultMap, attachmentMap, testStepResult, testcaseAttachmentFile);
225                        zephyrData.setCycleId(cycle.getId());
226                        automationJobDetail.setCycleId(cycle.getId());
227                        automationJobDetail.setCyclePhaseId(cyclePhase.getId());
228                        } catch (Exception e) {
229                        logger.log(Level.SEVERE, e.getMessage(),e);
230                        throw new Exception(e.getMessage());
231                }
232        }
233
234        String updateVersionOfTCRTestCases(String cycleName, List<TCRCatalogTreeTestcase> tcrCatalogTreeTestcaseList) throws IOException {
235                return RestUtil.updateTCRTestCasesForCycleName(cycleName, tcrCatalogTreeTestcaseList.stream()
236                                .map(TCRCatalogTreeTestcase::getId).collect(Collectors.toList())) ;
237        }
238
239        private void browseTestcasesIntoFFform(CyclePhaseDTO cyclePhase, List<TreeSelectionInfo> selectionTree, ZephyrConfigModel zephyrData, AutomationJobDetail automationJobDetail) throws IOException {
240                RestUtil.browseTestcases(cyclePhase,selectionTree,zephyrData.isCreatePackage());
241        }
242
243        private CyclePhaseDTO fetchCyclePhase(CycleDTO cycle, AutomationJobDetail automationJobDetail, ZephyrConfigModel zephyrData) throws IOException, ParseException {
244                CyclePhaseDTO cyclePhase = null;
245                if(automationJobDetail.getCyclePhaseId()!=null) {
246                        cyclePhase = cycle.getCyclePhases().stream().filter(phase -> phase.getId().longValue() == automationJobDetail.getCyclePhaseId().longValue()).findAny().orElse(null);
247//              Fix for ZEPHYR-27056
248                        if(cyclePhase!=null &&!cyclePhase.getName().equals(automationJobDetail.getPhaseName())){
249                        cyclePhase.setName(automationJobDetail.getPhaseName());
250                }
251                }
252                if (cyclePhase==null) {
253                        cyclePhase = cycle.getCyclePhases().stream().filter(phase -> phase.getName().equals(automationJobDetail.getPhaseName())).findAny().orElse(null);
254                        if (cyclePhase == null) {
255                                cyclePhase = createCyclePhase(cycle, zephyrData, automationJobDetail);
256                        }
257                }
258                return cyclePhase;
259        }
260
261        private CycleDTO fetchCycle(AutomationJobDetail automationJobDetail, ZephyrConfigModel zephyrData) throws Exception {
262        CycleDTO cycle=null;
263//      Fix for ZEPHYR-27019,ZEPHYR-27020 ,ZEPHYR-27056-Divija
264                if(automationJobDetail.getIsReuse()) {
265                        if (automationJobDetail.getCycleId() != null) {
266                                cycle = RestUtil.getCycle(automationJobDetail.getCycleId());
267
268                        }
269                                if (cycle == null && automationJobDetail.getCycleName() != null) {
270                                        cycle = RestUtil.getCycleNames((long) automationJobDetail.getReleaseId(), "createdOn", automationJobDetail.getCycleName());
271                        }
272                }
273        if(cycle== null){
274                cycle=createNewCycle(zephyrData);
275        }
276                Date cycleStratDate=new SimpleDateFormat("dd/MM/yyyy").parse(cycle.getCycleStartDate());
277                Date cycleEndDate=new SimpleDateFormat("dd/MM/yyyy").parse(cycle.getCycleEndDate());
278                if(cycleStratDate.compareTo(automationJobDetail.getCycleStartDate())!=0 || cycleEndDate.compareTo(automationJobDetail.getCycleEndDate())!=0){
279                        cycle=updateCycleAndPhaseDates(cycle,zephyrData);
280                }
281                if(cycle.getStatus()==1){
282                        logger.severe("cycle is hidden. Please un-hide the cycle");
283                }
284                return cycle;
285        }
286
287        CycleDTO updateCycleAndPhaseDates(CycleDTO cycle, ZephyrConfigModel zephyrData) throws ParseException, IOException {
288                CycleDTO cycleChange=cycle;
289                cycleChange.setCycleStartDate(Utils.convertStringToDate("MM/dd/yyyy",zephyrData.getCycleStartDate()));
290                cycleChange.setCycleEndDate(Utils.convertStringToDate("MM/dd/yyyy", zephyrData.getCycleEndDate()));
291                Set<CyclePhaseDTO> cyclePhases = cycleChange.getCyclePhases();
292                CycleDTO finalCycleChange = cycleChange;
293                cyclePhases.stream().forEach(phase->{
294                        if (phase.getPhaseStartDate() == null || phase.getPhaseStartDate().isEmpty() || !phase.getPhaseStartDate().equals(finalCycleChange.getCycleStartDate())) {
295                                if (phase.getPhaseStartDate().compareTo(finalCycleChange.getCycleStartDate()) < 0) {
296                                        phase.setPhaseStartDate(cycle.getCycleStartDate());
297                                }
298
299                        }
300                        if (phase.getPhaseEndDate() == null || phase.getPhaseEndDate().isEmpty() || !phase.getPhaseEndDate().equals(finalCycleChange.getCycleEndDate())) {
301                                if (phase.getPhaseEndDate().compareTo(finalCycleChange.getCycleEndDate()) > 0) {
302                                        phase.setPhaseEndDate(cycle.getCycleEndDate());
303                                }
304                        }
305                });
306                cycleChange.setCyclePhases(cyclePhases);
307                cycleChange=RestUtil.updateCycle(cycleChange);
308                return cycleChange;
309        }
310
311        private List<TreeSelectionInfo> getTreeInfo(List<TCRCatalogTreeTestcase> testcasesList) {
312                HashMap<Long, List<TCRCatalogTreeTestcase>> treeTctMap = testcasesList.stream().collect(Collectors.groupingBy(TCRCatalogTreeTestcase::getTcrCatalogTreeId, HashMap::new, Collectors.toCollection(ArrayList::new)));
313                List<TreeSelectionInfo> infoTreeList=new ArrayList<>();
314                treeTctMap.forEach((treeid,tctList)->{
315                        TreeSelectionInfo info=new TreeSelectionInfo(treeid,tctList.stream().map(t->t.getTestcase().getId()).collect(Collectors.toList()), true);
316                        infoTreeList.add(info);
317                });
318                return infoTreeList;
319        }
320
321        private CycleDTO createNewCycle(ZephyrConfigModel zephyrData) throws Exception {
322                CycleDTO cycle = null;
323                if (zephyrData.getCycleId() == ZeeConstants.NEW_CYCLE_KEY_IDENTIFIER) {
324                        ProjectDTO projectById = RestUtil.getMethodForProject(zephyrData.getZephyrProjectId());
325                        CycleDTO rCycle = new CycleDTO();
326                        try {
327                                rCycle.setCycleStartDate(Utils.convertStringToDate("MM/dd/yyyy",zephyrData.getCycleStartDate()));
328                                rCycle.setCycleEndDate(Utils.convertStringToDate("MM/dd/yyyy", zephyrData.getCycleEndDate()));
329                                rCycle.setName(zephyrData.getCycleName());
330                                rCycle.setReleaseId(zephyrData.getReleaseId());
331                                rCycle.setEnvironment("");
332                                rCycle.setBuild("");
333                                cycle = RestUtil.CreateCycle(rCycle);
334                                zephyrData.setCycleId(cycle.getId());
335                        } catch (Exception e) {
336                                logger.log(Level.SEVERE, e.getMessage(),e);
337                                throw new Exception(e.getMessage());
338                        }
339                }
340                return cycle;
341        }
342
343        private CyclePhaseDTO createCyclePhase(CycleDTO cycle, ZephyrConfigModel zephyrData, AutomationJobDetail automationJobDetail)
344                        throws ParseException, IOException {
345                CyclePhaseDTO cyclePhase = new CyclePhaseDTO();
346                cyclePhase.setName(zephyrData.getPhaseName());
347                cyclePhase.setCycleId(cycle.getId());
348                cyclePhase.setFreeForm(true);
349                cyclePhase.setPhaseStartDate(cycle.getCycleStartDate());
350                cyclePhase.setPhaseEndDate(cycle.getCycleEndDate());
351                cyclePhase=RestUtil.addPhaseToCycle(cyclePhase,automationJobDetail);
352                return cyclePhase;
353        }
354
355        public static Set<String> getTestExecutionStatusIds(Boolean searchActive) throws IOException {
356                PreferenceDTO preferenceDTO = RestUtil.getTestExecutionStatuses();
357                Set<String> statusIds = new HashSet<>();
358
359                if(preferenceDTO != null) {
360                        Type mapListType = new TypeToken<List<Map>>(){}.getType();
361                        List<Map> mapList = GsonUtil.CUSTOM_GSON.fromJson(preferenceDTO.getValue(), mapListType);
362
363                        for(Map map : mapList) {
364                                if(map.containsKey("id")) {
365                                        String id = map.get("id").toString();
366                                        if(searchActive != null && map.containsKey("active")) {
367                                                Boolean active = Boolean.valueOf(map.get("active").toString());
368                                                if(searchActive == active) {
369                                                        statusIds.add(id);
370                                                }
371                                        } else {
372                                                statusIds.add(id);
373                                        }
374                                }
375                        }
376
377                }
378                return statusIds;
379        }
380}