From 98c9cb78ff76e52dd23d267e431fd6265a908989 Mon Sep 17 00:00:00 2001 From: Krishna Acondy Date: Tue, 18 Aug 2020 10:05:34 +0100 Subject: [PATCH 1/2] fix(log): use compute log as-is when available --- src/SASjs.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/SASjs.ts b/src/SASjs.ts index 583e78c..c3c909a 100644 --- a/src/SASjs.ts +++ b/src/SASjs.ts @@ -1061,7 +1061,11 @@ export default class SASjs { generatedCode = parseGeneratedCode(response.log); if (this.sasjsConfig.debug) { - sasWork = JSON.parse(parseWeboutResponse(response.result)).WORK; + if (response.log) { + sasWork = response.log; + } else { + sasWork = JSON.parse(parseWeboutResponse(response.result)).WORK; + } } else { sasWork = JSON.parse(response.result).WORK; } From fb727788d05906a22542247be21b014737c02df4 Mon Sep 17 00:00:00 2001 From: Mihajlo Medjedovic Date: Tue, 18 Aug 2020 17:36:25 +0200 Subject: [PATCH 2/2] fix: log capture if job fails, test framework update, added test for log capture --- sasjs-tests/package-lock.json | 24 ++++++++--------- sasjs-tests/package.json | 4 +-- sasjs-tests/src/testSuites/SasjsRequests.ts | 21 +++++++++++++++ src/SASViyaApiClient.ts | 29 +++++++++++---------- src/SASjs.ts | 12 ++++++--- 5 files changed, 58 insertions(+), 32 deletions(-) diff --git a/sasjs-tests/package-lock.json b/sasjs-tests/package-lock.json index 15ed4a1..b86e8c0 100644 --- a/sasjs-tests/package-lock.json +++ b/sasjs-tests/package-lock.json @@ -1357,9 +1357,9 @@ "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==" }, "@sasjs/adapter": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@sasjs/adapter/-/adapter-1.2.0.tgz", - "integrity": "sha512-PcQcmb7TsfPJ94tzFnvycm+tMYD3wKx2a6niwHfsV9+g6XHtmwReVV3EPZZ5XB4s565vU6Qc+ZnFbMIAeik8QA==", + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/@sasjs/adapter/-/adapter-1.3.6.tgz", + "integrity": "sha512-d2B+cTII+vabKCU8mJy90mEz3tCWw2pEp4qIBGsDamJiTS0Rx69dgXGHuRUm8KtjLDHHrzwXATsqviU3dnU0QQ==", "requires": { "es6-promise": "^4.2.8", "form-data": "^3.0.0", @@ -1379,9 +1379,9 @@ } }, "@sasjs/test-framework": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@sasjs/test-framework/-/test-framework-1.3.3.tgz", - "integrity": "sha512-Ou4UXlxBAVR8jv7boVvJ/eKLHRTQvDi9LouPAasLCO2EC4AD0wX1hLMwVhmydCvsdgVEeXs6InvX3ROHiKSADg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@sasjs/test-framework/-/test-framework-1.4.0.tgz", + "integrity": "sha512-Pd8PUH5B5RO6q4w3OQXX7aWicvA/CJMXA/FCf2xp332ZTKBb/5uV+HphAOFKpCh58y+ykYYVSV0ZaDO/4t1h3A==", "requires": { "@types/react-highlight.js": "^1.0.0", "immer": "^7.0.7", @@ -12234,9 +12234,9 @@ } }, "semantic-ui-react": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/semantic-ui-react/-/semantic-ui-react-1.1.1.tgz", - "integrity": "sha512-QtzLNkK4MUe1HQo4S7/tIkSp4NFtxSGDzTMKxmvztMJ6jt+nKGmMyjpyxJsrm3ohU8Z3sTyBUyiBsDYW4jNtjw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/semantic-ui-react/-/semantic-ui-react-1.2.0.tgz", + "integrity": "sha512-9tNL94nEy16RdupTQNiURyemWUIxtTpQgFimCbOOHRBOe1ApsFz3FWFsrGjv9zFtE7dQMslLYov9BQOelTCVwA==", "requires": { "@babel/runtime": "^7.10.5", "@semantic-ui-react/event-stack": "^3.1.0", @@ -12260,9 +12260,9 @@ } }, "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" } } }, diff --git a/sasjs-tests/package.json b/sasjs-tests/package.json index d462e01..affa280 100644 --- a/sasjs-tests/package.json +++ b/sasjs-tests/package.json @@ -4,8 +4,8 @@ "homepage": ".", "private": true, "dependencies": { - "@sasjs/adapter": "^1.2.0", - "@sasjs/test-framework": "^1.3.3", + "@sasjs/adapter": "^1.3.6", + "@sasjs/test-framework": "^1.4.0", "@testing-library/jest-dom": "^4.2.4", "@testing-library/react": "^9.5.0", "@testing-library/user-event": "^7.2.1", diff --git a/sasjs-tests/src/testSuites/SasjsRequests.ts b/sasjs-tests/src/testSuites/SasjsRequests.ts index 9a4a5e5..12147c7 100644 --- a/sasjs-tests/src/testSuites/SasjsRequests.ts +++ b/sasjs-tests/src/testSuites/SasjsRequests.ts @@ -21,5 +21,26 @@ export const sasjsRequestTests = (adapter: SASjs): TestSuite => ({ } }, }, + { + title: "Make error and capture log", + description: "Should make an error and capture log", + test: async () => { + return new Promise( async (resolve, reject) => { + adapter.request("common/makeErr", data) + .then((res) => { + //no action here, this request must throw error + }) + .catch((err) => { + let sasRequests = adapter.getSasRequests(); + let makeErrRequest = sasRequests.find(req => req.serviceLink.includes('makeErr')) || null; + + resolve(!!makeErrRequest); + }) + }) + }, + assertion: (response) => { + return response; + }, + }, ], }); diff --git a/src/SASViyaApiClient.ts b/src/SASViyaApiClient.ts index 90305c9..25496c1 100644 --- a/src/SASViyaApiClient.ts +++ b/src/SASViyaApiClient.ts @@ -303,22 +303,8 @@ export class SASViyaApiClient { let jobResult, log; - if (jobStatus === "failed" || jobStatus === "error") { - return Promise.reject(currentJob.error); - } - const resultLink = `/compute/sessions/${executionSessionId}/filerefs/_webout/content`; const logLink = currentJob.links.find((l) => l.rel === "log"); - if (resultLink) { - jobResult = await this.request( - `${this.serverUrl}${resultLink}`, - { headers }, - "text" - ).catch((e) => ({ - result: JSON.stringify(e), - })); - } - if (true && logLink) { log = await this.request( `${this.serverUrl}${logLink.href}/content?limit=10000`, @@ -328,6 +314,21 @@ export class SASViyaApiClient { ).then((res: any) => res.result.items.map((i: any) => i.line).join("\n")); } + if (jobStatus === "failed" || jobStatus === "error") { + return Promise.reject({error: currentJob.error, log: log}); + } + const resultLink = `/compute/sessions/${executionSessionId}/filerefs/_webout/content`; + + if (resultLink) { + jobResult = await this.request( + `${this.serverUrl}${resultLink}`, + { headers }, + "text" + ).catch((e) => ({ + result: JSON.stringify(e), + })); + } + await this.sessionManager.clearSession(executionSessionId, accessToken); return { result: jobResult?.result, log }; diff --git a/src/SASjs.ts b/src/SASjs.ts index 480fdc4..46c55fd 100644 --- a/src/SASjs.ts +++ b/src/SASjs.ts @@ -579,8 +579,10 @@ export default class SASjs { resolve(responseJson); }) - .catch(async (e) => { - if (needsRetry(JSON.stringify(e))) { + .catch(async (response) => { + let error = response.error || response; + + if (needsRetry(JSON.stringify(error))) { if (this.retryCountComputeApi < requestRetryLimit) { let retryResponse = await this.executeJobViaComputeApi( sasJob, @@ -599,15 +601,17 @@ export default class SASjs { } } - if (e && e.status === 401) { + if (error && error.status === 401) { if (loginRequiredCallback) loginRequiredCallback(true); sasjsWaitingRequest.requestPromise.resolve = resolve; sasjsWaitingRequest.requestPromise.reject = reject; sasjsWaitingRequest.config = config; this.sasjsWaitingRequests.push(sasjsWaitingRequest); } else { - reject({ MESSAGE: e || "Job execution failed" }); + reject({ MESSAGE: error || "Job execution failed" }); } + + this.appendSasjsRequest(response.log, sasJob, null); }); } );