github.com/kubeshop/testkube@v1.17.23/test/cli-tests/helpers/api-helpers.js (about)

     1  //TODO: common module for both cli-tests and Dashboard E2E tests?
     2  
     3  import superagent from 'superagent'
     4  import {setTimeout} from "timers/promises";
     5  
     6  
     7  class ApiHelpers {
     8      constructor(apiUrl) {
     9          this.API_URL = apiUrl;
    10      }
    11  
    12      async getTests() {
    13          const request = `${this.API_URL}/tests`
    14  
    15          try {
    16              const response = await superagent.get(request)
    17  
    18              return response.body
    19          } catch (e) {
    20              throw Error(`getTests failed on "${request}" with: "${e}"`)
    21          }
    22      }
    23  
    24      async createTest(testData) {
    25          const request = `${this.API_URL}/tests`
    26          
    27          try {
    28              const response = await superagent.post(request)
    29              .set('Content-Type', 'application/json')
    30              .send(testData)
    31      
    32              return response.body
    33          } catch (e) {
    34              throw Error(`createTest failed on "${request}" with: "${e}"`)
    35          }
    36      }
    37      
    38      async removeTest(testName) {
    39          const request = `${this.API_URL}/tests/${testName}`
    40  
    41          try {
    42              await superagent.delete(request)
    43          } catch (e) {
    44              throw Error(`removeTest failed on "${request}" with: "${e}"`)
    45          }
    46      }
    47  
    48      async updateTest(testData) {
    49          const request = `${this.API_URL}/tests/${testData.name}`
    50          
    51          try {
    52              const response = await superagent.patch(request)
    53              .set('Content-Type', 'application/json')
    54              .send(testData)
    55      
    56              return response.body
    57          } catch (e) {
    58              throw Error(`updateTest failed on "${request}" with: "${e}"`)
    59          }
    60      }
    61  
    62      async runTest(testName) {
    63          const request = `${this.API_URL}/tests/${testName}/executions`
    64  
    65          try {
    66              const response = await superagent.post(request)
    67              .set('Content-Type', 'application/json')
    68              .send({"namespace":"testkube"})
    69      
    70              const executionName = response.body.name
    71      
    72              return executionName
    73          } catch (e) {
    74              throw Error(`runTest failed on "${request}" with: "${e}"`)
    75          }
    76      }
    77  
    78      async abortTest(testName, executionId) {
    79          const request = `${this.API_URL}/tests/${testName}/executions/${executionId}`
    80  
    81          try {
    82              const response = await superagent.patch(request)
    83  
    84              return response
    85          } catch (e) {
    86              throw Error(`abortTest failed on "${request}" with: "${e}"`)
    87          }
    88      }
    89  
    90      async isTestCreated(testName) {
    91          try {
    92              const currentTests = await this.getTests()
    93              const test = currentTests.find(singleTest => singleTest.name == testName)
    94      
    95              if(test != undefined) {
    96                  return true
    97              }
    98      
    99              return false
   100          } catch (e) {
   101              throw Error(`isTestCreated failed for "${testName}" with: "${e}"`)
   102          }
   103      }
   104  
   105      async assureTestNotCreated(testName) {
   106          try {
   107              const alreadyCreated = await this.isTestCreated(testName)
   108              if(alreadyCreated) {
   109                  await this.removeTest(testName)
   110              }
   111      
   112              return true
   113          } catch (e) {
   114              throw Error(`assureTestNotCreated failed for "${testName}" with: "${e}"`)
   115          }
   116      }
   117  
   118      async assureTestCreated(testData, fullCleanup=false) {
   119          try {
   120              const alreadyCreated = await this.isTestCreated(testData.name)
   121  
   122              if(alreadyCreated) {
   123                  if(fullCleanup) {
   124                      await this.removeTest(testData.name)
   125                      await this.createTest(testData)
   126                  } else {
   127                      await this.updateTest(testData)
   128                 }
   129              } else {
   130                  await this.createTest(testData)
   131              }
   132          } catch (e) {
   133              throw Error(`assureTestCreated failed for "${testData.name}" with: "${e}"`)
   134          }
   135      }
   136  
   137      async getTestData(testName) {
   138          const request = `${this.API_URL}/tests/${testName}`
   139  
   140          try {
   141              const response = await superagent.get(request)
   142  
   143              return response.body
   144          } catch (e) {
   145              throw Error(`getTestData failed on "${request}" with: "${e}"`)
   146          }
   147      }
   148  
   149      async getLastExecutionNumber(testName) {
   150          const request = `${this.API_URL}/tests/${testName}/executions`
   151  
   152          try {
   153              const response = await superagent.get(request)
   154              const totalsResults = response.body.totals.results
   155      
   156              if(totalsResults == 0) {
   157                  return totalsResults
   158              } else {
   159                  const lastExecutionResults = response.body.results[0]
   160      
   161                  return lastExecutionResults.number
   162              }
   163          } catch (e) {
   164              throw Error(`getLastExecutionNumber failed on "${request}" with: "${e}"`)
   165          }
   166      }
   167  
   168      async getExecution(executionName) {
   169          const request = `${this.API_URL}/executions/${executionName}`
   170  
   171          try {
   172              const response = await superagent.get(request)
   173          
   174              return response.body
   175          } catch(e) {
   176              throw Error(`getExecution failed on "${request}" with: "${e}"`)
   177          }
   178      }
   179  
   180      async getExecutionStatus(executionName) {
   181          try {
   182              const execution = await this.getExecution(executionName)
   183              const executionStatus = execution.executionResult.status
   184      
   185              return executionStatus
   186          } catch (e) {
   187              throw Error(`getExecutionStatus failed for "${executionName}" with: "${e}"`)
   188          }
   189      }
   190  
   191      async getExecutionArtifacts(executionId) {
   192          const request = `${this.API_URL}/executions/${executionId}/artifacts`
   193  
   194          try {
   195              const response = await superagent.get(request)
   196  
   197              return response.body
   198          } catch (e) {
   199              throw Error(`getExecutionArtifacts failed for "${request}" with: "${e}"`)
   200          }
   201      }
   202  
   203      async downloadArtifact(executionId, artifactFileName) {
   204          const request = `${this.API_URL}/executions/${executionId}/artifacts/${artifactFileName}`
   205  
   206          try {
   207              const response = await superagent.get(request)
   208              const artifactContents = response.text
   209          
   210              return artifactContents
   211          } catch(e) {
   212              throw Error(`downloadArtifact failed on "${request}" with: "${e}"`)
   213          }
   214      }
   215  
   216      async waitForExecutionFinished(executionName, timeout) {
   217          const startTime = Date.now();
   218          while (Date.now() - startTime < timeout) {
   219              let status = await this.getExecutionStatus(executionName)
   220  
   221              if(status == 'passed' || status == 'failed') {
   222                  return status
   223              }
   224  
   225              await setTimeout(1000);
   226          }
   227  
   228          throw Error(`waitForExecutionFinished timed out for "${executionName}" execution`)
   229      }
   230  }
   231  export default ApiHelpers