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