/*
* The MIT License
*
* Copyright (c) <2011> <Bruno P. Kinoshita>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package hudson.plugins.testlink;
import hudson.plugins.testlink.result.TestCaseWrapper;
import br.eti.kinoshita.testlinkjavaapi.TestLinkAPI;
import br.eti.kinoshita.testlinkjavaapi.constants.ExecutionStatus;
import br.eti.kinoshita.testlinkjavaapi.constants.ExecutionType;
import br.eti.kinoshita.testlinkjavaapi.constants.ResponseDetails;
import br.eti.kinoshita.testlinkjavaapi.constants.TestCaseDetails;
import br.eti.kinoshita.testlinkjavaapi.model.Attachment;
import br.eti.kinoshita.testlinkjavaapi.model.Build;
import br.eti.kinoshita.testlinkjavaapi.model.CustomField;
import br.eti.kinoshita.testlinkjavaapi.model.Platform;
import br.eti.kinoshita.testlinkjavaapi.model.ReportTCResultResponse;
import br.eti.kinoshita.testlinkjavaapi.model.TestCase;
import br.eti.kinoshita.testlinkjavaapi.model.TestPlan;
import br.eti.kinoshita.testlinkjavaapi.model.TestProject;
import java.util.ArrayList;
/**
* Immutable object that represents the TestLink site with a Test Project,
* a Test Plan and a Build.
*
* @author Bruno P. Kinoshita - http://www.kinoshita.eti.br
* @since 3.0
*/
public class TestLinkSite {
protected final TestLinkAPI api;
protected final TestProject testProject;
protected final TestPlan testPlan;
protected final Platform platform;
protected final Build build;
protected final Report report;
/**
* Kept for backward compatibility. Don't add fields.
* @deprecated
*/
public TestLinkSite(TestLinkAPI api, TestProject testProject, TestPlan testPlan, Build build) {
this(api, testProject, testPlan, null, build);
}
/**
* @param api TestLink Java API object
* @param testProject TestLink Test Project
* @param testPlan TestLink Test Plan
* @param platform TestLink platform
* @param build TestLink Build
*/
public TestLinkSite(TestLinkAPI api, TestProject testProject, TestPlan testPlan,
Platform platform, Build build) {
super();
this.api = api;
this.testProject = testProject;
this.testPlan = testPlan;
this.platform = platform;
this.build = build;
if(build != null) {
report = new Report(build.getId() == null ? 0 : build.getId(), build.getName());
} else {
report = new Report(0, null);
}
}
/**
* @return the TestLink Java API object
*/
public TestLinkAPI getApi() {
return api;
}
/**
* @return the testProject
*/
public TestProject getTestProject() {
return testProject;
}
/**
* @return the testPlan
*/
public TestPlan getTestPlan() {
return testPlan;
}
/**
* @return the platform
*/
public Platform getPlatform() {
return platform;
}
/**
* @return the build
*/
public Build getBuild() {
return build;
}
/**
* @return the report
*/
public Report getReport() {
return report;
}
/**
* @param customFieldsNames Array of custom fields names
* @return Array of automated test cases with custom fields
*/
public TestCase[] getAutomatedTestCases(String[] customFieldsNames) {
final TestCase[] testCases = this.api.getTestCasesForTestPlan(
getTestPlan().getId(),
null,
null,
null,
null,
null,
null,
null, // execute status
ExecutionType.AUTOMATED,
Boolean.TRUE,
TestCaseDetails.FULL);
ArrayList<TestCase> filteredTestcases = new ArrayList<TestCase>();
for( final TestCase testCase : testCases ) {
testCase.setTestProjectId(getTestProject().getId());
testCase.setExecutionStatus(ExecutionStatus.NOT_RUN);
if (customFieldsNames != null) {
for(String customFieldName : customFieldsNames) {
final CustomField customField = this.api.getTestCaseCustomFieldDesignValue(
testCase.getId(),
null, /* testCaseExternalId */
testCase.getVersion(),
testCase.getTestProjectId(),
customFieldName,
ResponseDetails.FULL);
testCase.getCustomFields().add(customField);
}
}
if(platform == null || testCase.getPlatform().getName().equals(platform.getName()))
filteredTestcases.add(testCase);
}
return filteredTestcases.toArray(new TestCase[filteredTestcases.size()]);
}
public TestPlan getTestPlanWithCustomFields(String[] customFieldNames){
TestPlan testPlan = getTestPlan();
for(String customFieldName: customFieldNames){
final CustomField customField = this.api.getTestPlanCustomFieldDesignValue(testPlan.getId(),
getTestProject().getId(),
customFieldName,
ResponseDetails.FULL);
testPlan.getCustomFields().add(customField);
}
return testPlan;
}
/**
* Updates the test cases status in TestLink (note and status) and
* uploads any existing attachments.
*
* @param testCases Test Cases
*/
public int updateTestCase(TestCaseWrapper testCase) {
int executionId = 0;
Integer platformId = null;
String platformName = null;
if (testCase.getPlatform() == null) {
if (platform != null) {
platformId = platform.getId(); // platform id
platformName = platform.getName(); // platform name
}
} else {
// platformId is set to null
platformName = testCase.getPlatform(); // platform name
}
if (testCase.getExecutionStatus() != null && !ExecutionStatus.NOT_RUN.equals(testCase.getExecutionStatus())) {
// Update Test Case status
final ReportTCResultResponse reportTCResultResponse = api.reportTCResult(
testCase.getId(),
testCase.getInternalId(),
testPlan.getId(),
testCase.getExecutionStatus(),
build.getId(),
build.getName(),
testCase.getNotes(),
null, // guess
null, // bug id
platformId, // platform id
platformName, // platform name
null, // custom fields
null);
switch(testCase.getExecutionStatus()) {
case PASSED:
report.setPassed(report.getPassed()+1);
break;
case FAILED:
report.setFailed(report.getFailed()+1);
break;
case BLOCKED:
report.setBlocked(report.getBlocked()+1);
break;
default:
break;
}
executionId = reportTCResultResponse.getExecutionId();
//report.addTestCase(testCase);
}
return executionId;
}
public Attachment uploadAttachment(int executionId, Attachment attachment) {
return api.uploadExecutionAttachment(
executionId,
attachment.getTitle(),
attachment.getDescription(),
attachment.getFileName(),
attachment.getFileType(),
attachment.getContent());
}
}