From 60ab7471489f7876d6b0d3cc52da91267a2f110e Mon Sep 17 00:00:00 2001 From: Frank Jogeleit Date: Thu, 30 Jul 2020 18:27:27 +0200 Subject: [PATCH] Split Action in multiple files to improve testing Add a new InputOption to ignore a failure for no response receive --- README.md | 1 + action.yml | 4 +- dist/index.js | 140 ++++++++++++++++++++++++++++++++----------- package-lock.json | 2 +- package.json | 2 +- src/githubActions.js | 39 ++++++++++++ src/httpClient.js | 44 ++++++++++++++ src/index.js | 41 ++----------- 8 files changed, 198 insertions(+), 75 deletions(-) create mode 100644 src/githubActions.js create mode 100644 src/httpClient.js diff --git a/README.md b/README.md index 9a386fd..ef619b0 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,7 @@ jobs: |password| Password for Basic Auth || |bearerToken| Bearer Authentication Token (without Bearer Prefix) || |customHeaders| Additional header values as JSON string, keys in this object overwrite default headers like Content-Type |'{}'| +|preventFailureOnNoResponse| Prevent this Action to fail if the request respond without an response. Use 'true' (string) as value to enable it || ### Output diff --git a/action.yml b/action.yml index 2c3ddbe..f3fe8d5 100644 --- a/action.yml +++ b/action.yml @@ -29,8 +29,8 @@ inputs: bearerToken: description: 'Bearer Authentication Token' required: false - customHeaders: - description: 'Custom HTTP Headers' + preventFailureOnNoResponse: + description: 'Prevent this Action to fail if the request respond without an response' required: false outputs: response: diff --git a/dist/index.js b/dist/index.js index 3592ed6..20fe718 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1197,6 +1197,52 @@ module.exports = function xhrAdapter(config) { }; +/***/ }), + +/***/ 230: +/***/ (function(module, __unusedexports, __webpack_require__) { + +const core = __webpack_require__(470); + +class GithubActions { + debug(message) { + core.debug(message) + } + + warning(message) { + core.warning(message) + } + + setOutput(name, output) { + core.setOutput(name, output) + } + + setFailed(message) { + core.setFailed(message) + } +} + +class LogActions { + debug(message) { + console.info(message) + } + + warning(message) { + console.warn(message) + } + + setOutput(name, output) { + console.log(name, output) + } + + setFailed(message) { + console.error(message) + } +} + +module.exports = { GithubActions, LogActions } + + /***/ }), /***/ 283: @@ -1318,6 +1364,57 @@ module.exports = axios; module.exports.default = axios; +/***/ }), + +/***/ 354: +/***/ (function(module, __unusedexports, __webpack_require__) { + +const axios = __webpack_require__(53); + +const METHOD_GET = 'GET' +const METHOD_POST = 'POST' + +const request = async({ method, instanceConfig, data, auth, actions, preventFailureOnNoResponse }) => { + try { + const instance = axios.create(instanceConfig); + + const jsonData = method === METHOD_GET ? undefined : JSON.parse(data) + + const requestData = { + auth, + method, + data: jsonData + } + + actions.debug('Request Data: ' + JSON.stringify(requestData)) + + const response = await instance.request(requestData) + + actions.setOutput('response', JSON.stringify(response.data)) + } catch (error) { + if (error.toJSON) { + actions.setOutput(JSON.stringify(error.toJSON())); + } + + if (error.response) { + actions.setFailed(JSON.stringify({ code: error.response.code, message: error.response.data })) + } else if (error.request && !preventFailureOnNoResponse) { + actions.setFailed(JSON.stringify({ error: "no response received" })); + } else if (error.request && preventFailureOnNoResponse) { + actions.warning(JSON.stringify(error)); + } else { + actions.setFailed(error.message); + } + } +} + +module.exports = { + request, + METHOD_POST, + METHOD_GET, +} + + /***/ }), /***/ 357: @@ -1330,7 +1427,7 @@ module.exports = require("assert"); /***/ 361: /***/ (function(module) { -module.exports = {"_from":"axios","_id":"axios@0.19.2","_inBundle":false,"_integrity":"sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==","_location":"/axios","_phantomChildren":{},"_requested":{"type":"tag","registry":true,"raw":"axios","name":"axios","escapedName":"axios","rawSpec":"","saveSpec":null,"fetchSpec":"latest"},"_requiredBy":["#USER","/"],"_resolved":"https://registry.npmjs.org/axios/-/axios-0.19.2.tgz","_shasum":"3ea36c5d8818d0d5f8a8a97a6d36b86cdc00cb27","_spec":"axios","_where":"/Users/f.jogeleit/Workspace/Other/http-request-action","author":{"name":"Matt Zabriskie"},"browser":{"./lib/adapters/http.js":"./lib/adapters/xhr.js"},"bugs":{"url":"https://github.com/axios/axios/issues"},"bundleDependencies":false,"bundlesize":[{"path":"./dist/axios.min.js","threshold":"5kB"}],"dependencies":{"follow-redirects":"1.5.10"},"deprecated":false,"description":"Promise based HTTP client for the browser and node.js","devDependencies":{"bundlesize":"^0.17.0","coveralls":"^3.0.0","es6-promise":"^4.2.4","grunt":"^1.0.2","grunt-banner":"^0.6.0","grunt-cli":"^1.2.0","grunt-contrib-clean":"^1.1.0","grunt-contrib-watch":"^1.0.0","grunt-eslint":"^20.1.0","grunt-karma":"^2.0.0","grunt-mocha-test":"^0.13.3","grunt-ts":"^6.0.0-beta.19","grunt-webpack":"^1.0.18","istanbul-instrumenter-loader":"^1.0.0","jasmine-core":"^2.4.1","karma":"^1.3.0","karma-chrome-launcher":"^2.2.0","karma-coverage":"^1.1.1","karma-firefox-launcher":"^1.1.0","karma-jasmine":"^1.1.1","karma-jasmine-ajax":"^0.1.13","karma-opera-launcher":"^1.0.0","karma-safari-launcher":"^1.0.0","karma-sauce-launcher":"^1.2.0","karma-sinon":"^1.0.5","karma-sourcemap-loader":"^0.3.7","karma-webpack":"^1.7.0","load-grunt-tasks":"^3.5.2","minimist":"^1.2.0","mocha":"^5.2.0","sinon":"^4.5.0","typescript":"^2.8.1","url-search-params":"^0.10.0","webpack":"^1.13.1","webpack-dev-server":"^1.14.1"},"homepage":"https://github.com/axios/axios","keywords":["xhr","http","ajax","promise","node"],"license":"MIT","main":"index.js","name":"axios","repository":{"type":"git","url":"git+https://github.com/axios/axios.git"},"scripts":{"build":"NODE_ENV=production grunt build","coveralls":"cat coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js","examples":"node ./examples/server.js","fix":"eslint --fix lib/**/*.js","postversion":"git push && git push --tags","preversion":"npm test","start":"node ./sandbox/server.js","test":"grunt test && bundlesize","version":"npm run build && grunt version && git add -A dist && git add CHANGELOG.md bower.json package.json"},"typings":"./index.d.ts","version":"0.19.2"}; +module.exports = {"_args":[["axios@0.19.2","/Users/frankjogeleit/Workspace/http-request-action"]],"_from":"axios@0.19.2","_id":"axios@0.19.2","_inBundle":false,"_integrity":"sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==","_location":"/axios","_phantomChildren":{},"_requested":{"type":"version","registry":true,"raw":"axios@0.19.2","name":"axios","escapedName":"axios","rawSpec":"0.19.2","saveSpec":null,"fetchSpec":"0.19.2"},"_requiredBy":["/"],"_resolved":"https://registry.npmjs.org/axios/-/axios-0.19.2.tgz","_spec":"0.19.2","_where":"/Users/frankjogeleit/Workspace/http-request-action","author":{"name":"Matt Zabriskie"},"browser":{"./lib/adapters/http.js":"./lib/adapters/xhr.js"},"bugs":{"url":"https://github.com/axios/axios/issues"},"bundlesize":[{"path":"./dist/axios.min.js","threshold":"5kB"}],"dependencies":{"follow-redirects":"1.5.10"},"description":"Promise based HTTP client for the browser and node.js","devDependencies":{"bundlesize":"^0.17.0","coveralls":"^3.0.0","es6-promise":"^4.2.4","grunt":"^1.0.2","grunt-banner":"^0.6.0","grunt-cli":"^1.2.0","grunt-contrib-clean":"^1.1.0","grunt-contrib-watch":"^1.0.0","grunt-eslint":"^20.1.0","grunt-karma":"^2.0.0","grunt-mocha-test":"^0.13.3","grunt-ts":"^6.0.0-beta.19","grunt-webpack":"^1.0.18","istanbul-instrumenter-loader":"^1.0.0","jasmine-core":"^2.4.1","karma":"^1.3.0","karma-chrome-launcher":"^2.2.0","karma-coverage":"^1.1.1","karma-firefox-launcher":"^1.1.0","karma-jasmine":"^1.1.1","karma-jasmine-ajax":"^0.1.13","karma-opera-launcher":"^1.0.0","karma-safari-launcher":"^1.0.0","karma-sauce-launcher":"^1.2.0","karma-sinon":"^1.0.5","karma-sourcemap-loader":"^0.3.7","karma-webpack":"^1.7.0","load-grunt-tasks":"^3.5.2","minimist":"^1.2.0","mocha":"^5.2.0","sinon":"^4.5.0","typescript":"^2.8.1","url-search-params":"^0.10.0","webpack":"^1.13.1","webpack-dev-server":"^1.14.1"},"homepage":"https://github.com/axios/axios","keywords":["xhr","http","ajax","promise","node"],"license":"MIT","main":"index.js","name":"axios","repository":{"type":"git","url":"git+https://github.com/axios/axios.git"},"scripts":{"build":"NODE_ENV=production grunt build","coveralls":"cat coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js","examples":"node ./examples/server.js","fix":"eslint --fix lib/**/*.js","postversion":"git push && git push --tags","preversion":"npm test","start":"node ./sandbox/server.js","test":"grunt test && bundlesize","version":"npm run build && grunt version && git add -A dist && git add CHANGELOG.md bower.json package.json"},"typings":"./index.d.ts","version":"0.19.2"}; /***/ }), @@ -2595,10 +2692,8 @@ module.exports = function httpAdapter(config) { /***/ (function(__unusedmodule, __unusedexports, __webpack_require__) { const core = __webpack_require__(470); -const axios = __webpack_require__(53); - -const METHOD_GET = 'GET' -const METHOD_POST = 'POST' +const { request, METHOD_POST } = __webpack_require__(354); +const { GithubActions } = __webpack_require__(230); let auth = undefined let customHeaders = {} @@ -2634,38 +2729,11 @@ const instanceConfig = { core.debug('Instance Configuration: ' + JSON.stringify(instanceConfig)) -const instance = axios.create(instanceConfig); +const data = core.getInput('data') || '{}'; +const method = core.getInput('method') || METHOD_POST; +const preventFailureOnNoResponse = core.getInput('preventFailureOnNoResponse') === 'true'; -(async() => { - try { - const method = core.getInput('method') || METHOD_POST; - const data = method === METHOD_GET ? undefined : JSON.parse(core.getInput('data') || '{}') - - const requestData = { - auth, - method, - data - } - - core.debug('Request Data: ' + JSON.stringify(requestData)) - - const response = await instance.request(requestData) - - core.setOutput('response', JSON.stringify(response.data)) - } catch (error) { - if (error.toJSON) { - core.setOutput(JSON.stringify(error.toJSON())); - } - - if (error.response) { - core.setFailed(JSON.stringify({ code: error.response.code, message: error.response.data })) - } else if (error.request) { - core.setFailed(JSON.stringify({ error: "no response received" })); - } else { - core.setFailed(error.message); - } - } -})() +request({ data, method, instanceConfig, auth, preventFailureOnNoResponse, actions: new GithubActions() }) /***/ }), diff --git a/package-lock.json b/package-lock.json index 6a4e2b7..c9275e0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "http-request-action", - "version": "1.0.0", + "version": "1.4.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index eae551c..21bbff0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "http-request-action", - "version": "1.3.2", + "version": "1.4.0", "description": "", "main": "src/index.js", "private": false, diff --git a/src/githubActions.js b/src/githubActions.js new file mode 100644 index 0000000..cadc174 --- /dev/null +++ b/src/githubActions.js @@ -0,0 +1,39 @@ +const core = require("@actions/core"); + +class GithubActions { + debug(message) { + core.debug(message) + } + + warning(message) { + core.warning(message) + } + + setOutput(name, output) { + core.setOutput(name, output) + } + + setFailed(message) { + core.setFailed(message) + } +} + +class LogActions { + debug(message) { + console.info(message) + } + + warning(message) { + console.warn(message) + } + + setOutput(name, output) { + console.log(name, output) + } + + setFailed(message) { + console.error(message) + } +} + +module.exports = { GithubActions, LogActions } diff --git a/src/httpClient.js b/src/httpClient.js new file mode 100644 index 0000000..3a4ff02 --- /dev/null +++ b/src/httpClient.js @@ -0,0 +1,44 @@ +const axios = require("axios"); + +const METHOD_GET = 'GET' +const METHOD_POST = 'POST' + +const request = async({ method, instanceConfig, data, auth, actions, preventFailureOnNoResponse }) => { + try { + const instance = axios.create(instanceConfig); + + const jsonData = method === METHOD_GET ? undefined : JSON.parse(data) + + const requestData = { + auth, + method, + data: jsonData + } + + actions.debug('Request Data: ' + JSON.stringify(requestData)) + + const response = await instance.request(requestData) + + actions.setOutput('response', JSON.stringify(response.data)) + } catch (error) { + if (error.toJSON) { + actions.setOutput(JSON.stringify(error.toJSON())); + } + + if (error.response) { + actions.setFailed(JSON.stringify({ code: error.response.code, message: error.response.data })) + } else if (error.request && !preventFailureOnNoResponse) { + actions.setFailed(JSON.stringify({ error: "no response received" })); + } else if (error.request && preventFailureOnNoResponse) { + actions.warning(JSON.stringify(error)); + } else { + actions.setFailed(error.message); + } + } +} + +module.exports = { + request, + METHOD_POST, + METHOD_GET, +} diff --git a/src/index.js b/src/index.js index f817158..2ab8255 100644 --- a/src/index.js +++ b/src/index.js @@ -1,8 +1,6 @@ const core = require("@actions/core"); -const axios = require("axios"); - -const METHOD_GET = 'GET' -const METHOD_POST = 'POST' +const { request, METHOD_POST } = require('./httpClient'); +const { GithubActions } = require('./githubActions'); let auth = undefined let customHeaders = {} @@ -38,35 +36,8 @@ const instanceConfig = { core.debug('Instance Configuration: ' + JSON.stringify(instanceConfig)) -const instance = axios.create(instanceConfig); +const data = core.getInput('data') || '{}'; +const method = core.getInput('method') || METHOD_POST; +const preventFailureOnNoResponse = core.getInput('preventFailureOnNoResponse') === 'true'; -(async() => { - try { - const method = core.getInput('method') || METHOD_POST; - const data = method === METHOD_GET ? undefined : JSON.parse(core.getInput('data') || '{}') - - const requestData = { - auth, - method, - data - } - - core.debug('Request Data: ' + JSON.stringify(requestData)) - - const response = await instance.request(requestData) - - core.setOutput('response', JSON.stringify(response.data)) - } catch (error) { - if (error.toJSON) { - core.setOutput(JSON.stringify(error.toJSON())); - } - - if (error.response) { - core.setFailed(JSON.stringify({ code: error.response.code, message: error.response.data })) - } else if (error.request) { - core.setFailed(JSON.stringify({ error: "no response received" })); - } else { - core.setFailed(error.message); - } - } -})() +request({ data, method, instanceConfig, auth, preventFailureOnNoResponse, actions: new GithubActions() })