General information

Root URL

https://apps-qalityplus.soldevelo.com

All requests should be made there.

Get a JWT token:

You will need this token to make any request. The token is valid for ~5m.

If you need the token for a one-time use you can skip step 1 and paste the URL from step 2 into your browser.

  1. You need an Atlassian API token from https://id.atlassian.com/manage-profile/security/api-tokens

  2. Make a GET request with authorization:
    username = your email
    password = API token from step 1

    https://<your_instance>.atlassian.net/plugins/servlet/ac/com.soldevelo.apps.test_management_premium/test-cycles?classifier=json
  3. Copy the contextJwt property from the result.

Get Jira issue ID:

QAlity is integrated with Jira. This means test cases are represented as Issues of “QAlity test“ type. Often you will need their ID to make a request.

  1. You need an Atlassian API token from https://id.atlassian.com/manage-profile/security/api-tokens

  2. Make a GET request with authorization:
    username = your email
    password = API token from step 1

    https://<your_instance>.atlassian.net/rest/api/3/issue/<ISSUE KEY or ID>
  3. Copy the id property from the response.

Get Jira project ID:

  1. You need an Atlassian API token from https://id.atlassian.com/manage-profile/security/api-tokens

  2. Make a GET request with authorization:
    username = your email
    password = API token from step 1

    https://<your_instance>.atlassian.net/rest/api/3/project/<PROJECT KEY or ID>
  3. Copy the id property from the response.


Test cases

GET test steps

/testStep/<ISSUE_ID>?jwt=<JWT>

Params:

ISSUE_ID - id of the test case - Id of Jira issue

JWT - the authentication token

Response:

Array<TestStep>

TestStep: {
  attachments: Array<Attachement>, // TEST ATTACHMENTS
  data: String, // TEST DATA, stored as HTML
  id: Long,
  position: int, // step position
  result: String, // EXPECTED RESULT, stored as HTML
  step: String, //TEST STEP, stored as HTML
}

Attachement: {
  id: int, // id of attachement in Jira issue
}

POST test step

/testStep?jwt=<JWT>

Body:

TestStep: {
  step: String, //TEST STEP, stored as HTML
  result: String, // EXPECTED RESULT, stored as HTML
  data: String, // TEST DATA, stored as HTML
  attachments: String, // TEST ATTACHMENTS, Array<Attachement> stored as String (JSON.stringify)
  testCaseId: Long,
}

Attachement: {
  id: int, // id of attachement in Jira issue
}

PUT test step

/testStep/<STEP_ID>?jwt=<JWT>

Params:

STEP_ID - id of the step

JWT - the authentication token

Body:

TestStep: {
  attachments: String, // TEST ATTACHMENTS, Array<Attachement> stored as String (JSON.stringify)
  data: String, // TEST DATA, stored as HTML
  id: Long,
  testCaseId: Long,
  position: int, // step position
  result: String, // EXPECTED RESULT, stored as HTML
  step: String, //TEST STEP, stored as HTML
}

Attachement: {
  id: int, // id of attachement in Jira issue
}

Statuses

Status model

type Status = {
  id: number;
  name: string;
  isDefault: boolean;
  position: number;
  color: {
    name:
      | 'RED'
      | 'YELLOW'
      | 'GREEN'
      | 'BLUE'
      | 'GRAY'
      | 'MAGENTA'
      | 'TEAL'
      | 'PURPLE'
      | 'ORANGE'
      | 'DARK GRAY'
      | 'LIME';
    textToken: string;
    backgroundToken: string;
  };
}

GET

/statuses?jwt=<JWT>

Response

{
  statuses: Array<Status>;
}

Test Executions

GET history

/testExecution?jwt=<JWT>&testCaseId=<TEST_CASE_ID>&page=<PAGE>

Params:

TEST_CASE_ID - id of the test case - Id of Jira issue

JWT - the authentication token

PAGE - page number, starts from 0

Response:

LIst of executions for provided page. max 10 results.

GET execution

/testExecution/<TEST_EXECUTION_ID>?jwt=<JWT>

Params:

TEST_EXECUTION_ID - id of the execution

JWT - the authentication token

Response:

{
  comment: String, // stored as HTML,
  createdDate: String, // example: 2022-01-31T11:11:11.111+0000,
  executionAssignee: String, // Jira user accountId,
  id: Long,
  name: String,
  statusObject: Status,
  testCaseId: Long, // Jira issue Id
  version: Version,
}

Version: {
  id: Long,
  testCaseId: Long, // Jira issue Id
  testCaseName: String, // Jira issue name
  testSteps: Array<TestStep>,
}

TestStep: {
  attachments: String, // TEST ATTACHMENTS, Array<Attachement> stored as String (JSON.stringify)
  data: String, // TEST DATA, stored as HTML
  id: Long,
  testCaseId: Long,
  position: int, // step position
  result: String, // EXPECTED RESULT, stored as HTML
  step: String, //TEST STEP, stored as HTML
}

Attachement: {
  id: number, // id of attachement in Jira issue
}

Post execution

/testExecution?jwt=<JWT>

Params:

JWT - the authentication token

Body:

{
  name: String,
  statusObject: Status,
  testCaseId: Long,
  testSteps: Array, // should be an empty array []
  testCaseInCycleId: Long, // OPTIONAL, retrieve this id from test cycle. Check POST Add Test Case To Cycle
}

Response:

{
  comment: String, // stored as HTML,
  createdDate: String, // example: 2022-01-31T11:11:11.111+0000,
  executionAssignee: String, // Jira user accountId,
  id: Long,
  name: String,
  statusObject: Status,
  testCaseId: Long, // Jira issue Id
  version: Version,
}

Version: {
  id: Long,
  testCaseId: Long, // Jira issue Id
  testCaseName: String, // Jira issue name
  testSteps: Array<TestStep>,
}

TestStep: {
  attachments: String, // TEST ATTACHMENTS, Array<Attachement> stored as String (JSON.stringify)
  data: String, // TEST DATA, stored as HTML
  id: Long,
  testCaseId: Long,
  position: int, // step position
  result: String, // EXPECTED RESULT, stored as HTML
  step: String, //TEST STEP, stored as HTML
}

Attachement: {
  id: number, // id of attachement in Jira issue
}

PUT execution

It is recommended to fetch test execution and edit existing data. To create an execution see POST.

/testExecution?jwt=<JWT>

Params:

JWT - the authentication token

Body:

{
  comment: String, // stored as HTML,
  executionAssignee: String, // Jira user accountId,
  id: Long,
  name: String,
  statusObject: Status,
  testCaseId: Long, // Jira issue Id
  testSteps: Array<TestStep>,
}

TestStep: {
  comment: String, // stored as HTML
  id: Long,
  statusObject: Status,
  testCaseStepId: Long,
}

Response:

Updated Execution

{
  comment: String, // stored as HTML,
  createdDate: String, // example: 2022-01-31T11:11:11.111+0000,
  executionAssignee: String, // Jira user accountId,
  id: Long,
  name: String,
  statusObject: Status,
  testCaseId: Long, // Jira issue Id
  version: Version,
}

Version: {
  id: Long,
  testCaseId: Long, // Jira issue Id
  testCaseName: String, // Jira issue name
  testSteps: Array<TestStep>,
}

TestStep: {
  attachments: String, // TEST ATTACHMENTS, Array<Attachement> stored as String (JSON.stringify)
  data: String, // TEST DATA, stored as HTML
  id: Long,
  testCaseId: Long,
  position: int, // step position
  result: String, // EXPECTED RESULT, stored as HTML
  step: String, //TEST STEP, stored as HTML
}

Attachement: {
  id: number, // id of attachement in Jira issue
}


Test Cycles

GET all

Fetch all test cycles available for the user (based on the JWT token).

/testCycles?jwt=<JWT>

Params:

&projectIds=<ID1, ID2...> // comma-separated list of project IDs
&name=<NAME>              // name of Test Cycle
&versionId=<ID>           // version ID
&isClosed=<Boolean>       // is closed
&testCaseId=<ID>          // test case ID, to get the information if the the test case is already present in test cycles (testCaseExistInCycle in the response)
&page=<PAGE>              // pagination: current page
&size=<SIZE>              // pagination: results per page
&sort=<SORT>              // pagination: field to sort by
&direction=<DIRECTION>    // pagination: sort strategy

Response (paginated):

Response: {
  content: Array<TestCycle>;
  pageable: Pageable;
  totalElements: number;
  totalPages: number;
  last: boolean;
  sort: Sort;
  first: boolean;
  number: number;
  numberOfElements: number;
  size: number;
  empty: boolean;
}

TestCycle: {
  id: number;
  name: string;
  versionId: null | string;
  dueDate: null;
  comment: null | string;
  isClosed: boolean;
  projectId: string;
  createdDate: Date;
  numberOfTestCases: number;
  testCaseExistInCycle: null;
  statuses: StatusesSummary;
}

StatusesSummary: Array<{
  status: Status;
  total: number;
  percent: number;
}>

Pageable: {
  sort: Sort;
  pageNumber: number;
  pageSize: number;
  offset: number;
  paged: boolean;
  unpaged: boolean;
}

Sort: {
  sorted: boolean;
  unsorted: boolean;
  empty: boolean;
}

POST Add Test Case To Cycle

/testCasesInCycle?jwt=<JWT>

Params:

JWT - the authentication token

Body:

{
  testCases: Array<Long>, // list of jira issue ids that you want to add to cycle
  testCycleId: Long // id of the test cycle 
}

Response:

Array<TestCaseInCycle>

TestCaseInCycle: {
  id: Long, // id of create object, can be used when executiong test case to make the execution in cycle
  testCaseId: Long, // id of the test case
  testCycleId: Long // id of the cycle
}