UNPKG

phantomjscloud

Version:

Official PhantomJs Cloud Client API Library for Node.js

642 lines 37.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const xlib = require("xlib"); const phantomjscloud = require("./_index"); var ioDatatypes = phantomjscloud.ioDatatypes; const __ = xlib.lolo; const log = __.log; const _ = xlib.lodash; const __verifyResponseStatus_defaultOptions = { contentStatusCode: 200, userResponseStatusCode: 200, backend: "chrome", doneDetail: "normal", contentType: "" }; /** does basic verification of the userResponse common among most tests */ function verifyResponseStatus(userResponse, options = __verifyResponseStatus_defaultOptions) { options = xlib.lodash.defaultsDeep(options, __verifyResponseStatus_defaultOptions); const responseSummary = xlib.serialization.jsonX.inspectParse(userResponse); log.assert(userResponse != null, "response null", { options, userResponse }); log.assert(userResponse.statusCode === options.userResponseStatusCode, "responseStatusCode", userResponse.statusCode, { options, responseSummary }); log.assert(userResponse.content.statusCode === options.contentStatusCode, "contentStatusCode", userResponse.content.statusCode, { options, responseSummary }); log.assert(userResponse.meta.backend.platform.toLowerCase() === options.backend.toLowerCase(), "backend", userResponse.meta.backend, { options, responseSummary }); if (options.backend === "chrome") { log.assert(JSON.stringify(userResponse.content.doneDetail).includes(options.doneDetail), "doneDetail", userResponse.content.doneDetail, { options, responseSummary }); } if (options.contentType != null && options.contentType.length > 0) { log.assert(userResponse.content.headers["content-type"].includes(options.contentType), `content-type header not what expected. got ${userResponse.content.headers["content-type"]} but expect it to include "${options.contentType}"`); } log.assert(userResponse.meta.billing.creditCost > 0, "invalid creditCost"); log.assert(userResponse.meta.billing.dailySubscriptionCreditsRemaining >= 0, "invalid dailySubscriptionCreditsRemaining"); log.assert(userResponse.meta.billing.prepaidCreditsRemaining >= 0, "invalid prepaidCreditsRemaining"); xlib.lodash.forEach(userResponse.pageResponses, (pageResponse) => { //log.assert( pageResponse.metrics.pageStatus === options.contentStatusCode.toString(), "pageResponse.metrics.pageStatus", pageResponse.metrics.pageStatus, { options, pageResponse: JSON.stringify( pageResponse ) } ); if (options.backend === "chrome") { log.assert(JSON.stringify(pageResponse.doneDetail).includes(options.doneDetail), "pageResponse.doneDetail", pageResponse.doneDetail, { options, pageResponse: JSON.stringify(pageResponse) }); } }); } /** helper to set all properties to null */ function _nullAllProperties(obj) { _.forEach(obj, (value, key) => { if (_.isObject(value)) { _nullAllProperties(value); obj[key] = value; } else { obj[key] = null; } }); } /** hack fix for mocha bug, unable to have a timeout for async tests */ function it2(testFcn) { const testName = xlib.reflection.getTypeName(testFcn); return it(testName, async function () { const timeoutMs = this.timeout(); return xlib.promise.bluebird.resolve(testFcn.apply(this)).timeout(timeoutMs, new xlib.promise.bluebird.TimeoutError(`operation timed out. Max of ${timeoutMs}ms exceeded`)); }); } describe(__filename, function unitTests() { let browser; this.timeout(10000); //set default timeout for these pjsc tests this.beforeAll(function beforeAll() { const apiKey = xlib.environment.getEnvironmentVariable("phantomjscloud_apikey"); const endpointOrigin = // "http://localhost:80"; //used for UAT testing //"https://phantomjscloud.com"; //PROD (explicit) //"http://35.232.215.225"; //PREPROD undefined; //PROD (implicit, default) browser = new phantomjscloud.BrowserApi({ apiKey, endpointOrigin }); }); describe("e2eDefaultBrowser", function e2eDefaultBrowser() { let test = it2(async function basicE2e() { const pageRequest = { url: "https://localhost/examples/corpus/example.com.html", renderType: "html", backend: "chrome" }; const userResponse = await browser.requestSingle(pageRequest); log.assert(userResponse.content.data.indexOf("Example Domain") >= 0); }); test.timeout(20000); it2(async function htmlBasicPageRequest() { const pageRequest = { url: "http://localhost/examples/corpus/example.com.html", renderType: "plainText", }; const response = await browser.requestSingle(pageRequest); verifyResponseStatus(response); log.assert(response.content.data.includes("Example Domain"), "content verification failed", response.content.data); }); // ! production servers fulfill this too fast, so even 50ms ajax calls finish too rapidly for it to be waited on. // // it2( async function gracefulFailureExceedMaxWait() { // // const pageRequest: ioDatatypes.IPageRequest = { // // url: "http://localhost/examples/corpus/ajax-fast.html", // // renderType: "plainText", // // requestSettings: { // // maxWait: 3000, // // } // // }; // // const response = await browser.requestSingle( pageRequest ); // // verifyResponseStatus( response, { contentStatusCode: 408, doneDetail: "error:maxWait" } ); // // log.assert( response.content.data.includes( "this page will make ajax calls" ), "content verification failed", response.content.data ); // // } ); it2(async function contentInjection() { const pageRequest = { url: "http://localhost/examples/helpers/requestdata", renderType: "plainText", content: "<html><h1>hello-world</h1></html>", }; const response = await browser.requestSingle(pageRequest); verifyResponseStatus(response); log.assert(response.content.data.includes("hello-world"), "content verification failed", response.content.data); }); it2(async function redirectJs() { const pageRequest = { url: "http://localhost/examples/helpers/requestdata", renderType: "plainText", content: "<html><script>window.location='https://localhost/examples/corpus/example.com.html';</script><h1>hello-world</h1></html>", }; const response = await browser.requestSingle(pageRequest); verifyResponseStatus(response); log.assert(response.content.data.includes("This domain is established to be used"), "content verification failed", response.content.data); }); it2(async function doneWhenSelector() { const pageRequest = { url: "http://localhost/examples/corpus/ajax.html", renderType: "plainText", requestSettings: { doneWhen: [{ text: `"statusCode":206`, statusCode: 202 }, { selector: "pre#fill-target", statusCode: 201 }], }, }; const response = await browser.requestSingle(pageRequest); verifyResponseStatus(response, { contentStatusCode: 201, doneDetail: "pre#fill-target" }); log.assert(response.content.data.includes("this page will make ajax calls"), "content verification failed", response.content.data); }); it2(async function doneWhenDomReady() { // loads up an expensive page and renders as soon as possible, tossing out unneeded contents const pageRequest = { url: "http://cnn.com", renderType: "plainText", requestSettings: { doneWhen: [{ event: "domReady" }], ignoreImages: true, waitInterval: 0, resourceWait: 100, //disableJavascript:true, resourceModifier: [ { isBlacklisted: true, regex: ".*" }, { isBlacklisted: false, regex: ".*cnn.*" }, { isBlacklisted: true, category: "subFrameResource" }, { isBlacklisted: true, type: "stylesheet" }, { isBlacklisted: true, type: "image" }, { isBlacklisted: true, type: "media" }, { isBlacklisted: true, type: "texttrack" }, { isBlacklisted: true, type: "websocket" }, { isBlacklisted: true, type: "other" }, { isBlacklisted: true, type: "eventsource" }, { isBlacklisted: true, type: "fetch" }, { isBlacklisted: true, type: "font" }, { isBlacklisted: true, type: "manifest" }, ], } }; const response = await browser.requestSingle(pageRequest); verifyResponseStatus(response, { doneDetail: "domReady" }); log.assert(response.content.data.includes("Politics"), "content verification failed", response.content.data); }).timeout(15000); // ! prod is too fast for the ajax to delay rendering. so this forceFinish() test doesn't work. // it2( async function forceFinish() { // const pageRequest: ioDatatypes.IPageRequest = { // url: "http://localhost/examples/corpus/ajax-fast.html", // renderType: "plainText", // requestSettings: { waitInterval: 500 }, // renderSettings: { // viewport: { height: 20, width: 200 }, // }, // scripts: { domReady: [ "setInterval(function(){var lastY=window.scrollY;window.scrollBy(0,20);if(lastY===window.scrollY){window._pjscMeta.forceFinish=true;}},50);" ] }, // }; // const response = await browser.requestSingle( pageRequest ); // verifyResponseStatus( response, { contentStatusCode: 200, doneDetail: "forceFinish" } ); // log.assert( response.content.data.includes( "this page will make ajax calls" ), "content verification failed", response.content.data ); // } ); it2(async function htmlBasicUserRequest() { const userRequest = { pages: [{ url: "http://localhost/examples/helpers/requestdata", renderType: "plainText", requestSettings: { maxWait: 5000, } }], }; const response = await browser.requestSingle(userRequest); verifyResponseStatus(response); log.assert(response.content.data.includes(`"user-agent": "Mozilla`), "content verification failed", response.content.data); }); it2(async function resourceModifier_changeUrl() { const pageRequest = { url: "http://www.highcharts.com/demo/pie-donut", renderType: "html", requestSettings: { resourceModifier: [{ regex: ".*highcharts.com.*", changeUrl: "$$protocol:$$port//en.wikipedia.org/wiki$$path" }] } }; const response = await browser.requestSingle(pageRequest); verifyResponseStatus(response, { contentStatusCode: 404 }); log.assert(response.content.data.includes("<title>Demo/pie-donut - Wikipedia</title>"), "content verification failed", response.content.data); }); it2(async function cookies_inject() { const pageRequest = { url: "http://localhost/examples/corpus/example.com.html", renderType: "plainText", requestSettings: { cookies: [ { domain: "example.com", name: "myCookie1", value: "value1" }, { domain: "localhost", name: "myCookie2", value: "value2" } ] } }; const response = await browser.requestSingle(pageRequest); verifyResponseStatus(response); log.assert(response.pageResponses[0].cookies.length === 1, "cookie verification failed: cookie count", response.pageResponses[0].cookies.length); log.assert(response.pageResponses[0].cookies[0].name === "myCookie2", "cookie verification failed: name"); log.assert(response.pageResponses[0].cookies[0].value === "value2", "cookie verification failed: value"); log.assert(response.content.data.includes("Example Domain"), "content verification failed", response.content.data); }); it2(async function cors_bypass_and_loadFinished_script() { const pageRequest = { url: "https://news.ycombinator.com/", renderType: "html", backend: "chrome", requestSettings: { maxWait: 10000, disableSecureHeaders: true, }, scripts: { domReady: ["http://localhost/examples/scripts/hilitor.js"], loadFinished: ["var myHilitor = new Hilitor(); myHilitor.apply('ask,who,jobs,new');"] } }; const response = await browser.requestSingle(pageRequest); verifyResponseStatus(response); log.assert(response.content.data.includes(`<em class="hilitor"`), "content verification failed", response.content.data); }); it2(async function translation() { const pageRequest = { url: "http://localhost/examples/corpus/example.com.html", renderType: "plainText", requestSettings: { disableSecureHeaders: true, }, scripts: { pageNavigated: ["http://localhost/examples/scripts/google-translate.js?targetLang=ko&hideUi=true"] } }; const response = await browser.requestSingle(pageRequest); verifyResponseStatus(response); log.assert(response.content.data.indexOf(`예 도메인`) === 0, "content verification failed", response.content.data); }); it2(async function redirect_with_scripts_also_verify_content_properties() { const pageRequest = { url: "http://localhost/examples/corpus/redirect.html", renderType: "html", scripts: { domReady: ["http://localhost/examples/scripts/hilitor.js"], loadFinished: ["var myHilitor = new Hilitor(); myHilitor.apply('simple,page,example,http');"] } }; const response = await browser.requestSingle(pageRequest); verifyResponseStatus(response); log.assert(response.content.url === "http://localhost/examples/corpus/simple.html", "should have reddirected"); log.assert(response.content.data.includes(`<em class="hilitor" style="background-color: rgb(255, 255, 102); font-style: inherit; color: rgb(0, 0, 0);">Simple</em> Html`), "content verification failed, scripts did not exec properly", response.content.data); log.assert(response.content.name === "localhost-examples-corpus-simple.html", "content name not set properly"); log.assert(response.content.pageExecLastWaitedOn.includes("waitInterval"), "expected waitInterval to be last thing our page wated on finishing"); log.assert(response.content.encoding === "utf8", "expect utf8 encoding for our html output"); }); it2(async function postBasic() { const pageRequest = { url: "http://localhost/examples/helpers/requestdata", renderType: "html", urlSettings: { data: "my=postData", operation: "POST", }, }; const response = await browser.requestSingle(pageRequest); verifyResponseStatus(response); log.assert(response.content.data.includes(`"my": "postData"`), "content verification failed, post payload not found", response.content.data); }); it2(async function postJson_with_passThroughHeaders() { const pageRequest = { url: "http://localhost/examples/helpers/requestdata", renderType: "plainText", outputAsJson: true, urlSettings: { operation: "POST", headers: { hello: "world", "Content-Type": "application/json" }, data: "{\"yourPostData\":123}", }, renderSettings: { passThroughHeaders: true, } }; const response = await browser.requestSingle(pageRequest); verifyResponseStatus(response, { contentType: "application/json" }); log.assert(response.content.data.includes(`"yourPostData": 123`), "content verification failed, post payload not found", response.content.data); }); it2(async function postUnicode() { const pageRequest = { url: "http://localhost/examples/helpers/requestdata", renderType: "plainText", outputAsJson: false, urlSettings: { operation: "POST", // tslint:disable-next-line: max-line-length data: "{\"loans\":[{\"account_id\":\"49790094591\",\"account_name\":\"สินเชื่อรถยนต์ใหม่\",\"account_type\":\"CARLOAN\",\"customer_name\":\"นาย บีเอสซีบีคอนเนค คอนเนค นาย\",\"status\":\"ACTIVE\",\"scb_connect\":true,\"linked_date\":\"1537499724000\"},{\"account_id\":\"49790094606\",\"account_name\":\"สินเชื่อรถยนต์ใหม่\",\"account_type\":\"CARLOAN\",\"customer_name\":\"นาย บีเอสซีบีคอนเนค คอนเนค นาย\",\"status\":\"INACTIVE\",\"scb_connect\":true,\"linked_date\":\"1537499724000\"},{\"account_id\":\"49790094614\",\"account_name\":\"สินเชื่อรถยนต์ใหม่\",\"account_type\":\"CARLOAN\",\"customer_name\":\"นาย บีเอสซีบีคอนเนค คอนเนค นาย\",\"status\":\"ACTIVE\",\"scb_connect\":true,\"linked_date\":\"1537499724000\"},{\"account_id\":\"49790094648\",\"account_name\":\"สินเชื่อรถยนต์ใหม่\",\"account_type\":\"CARLOAN\",\"customer_name\":\"นาย บีเอสซีบีคอนเนค คอนเนค นาย\",\"status\":\"ACTIVE\",\"scb_connect\":true,\"linked_date\":\"1537499724000\"},{\"account_id\":\"49790094656\",\"account_name\":\"สินเชื่อรถยนต์ใหม่\",\"account_type\":\"CARLOAN\",\"customer_name\":\"นาย บีเอสซีบีคอนเนค คอนเนค นาย\",\"status\":\"ACTIVE\",\"scb_connect\":true,\"linked_date\":\"1537499724000\"}]}" }, }; const response = await browser.requestSingle(pageRequest); verifyResponseStatus(response); log.assert(response.content.data.includes(`สินเชื่อรถยนต`), "content verification failed, post payload not found", response.content.data); }); it2(async function scriptOutputDomElement() { const pageRequest = { outputAsJson: false, url: "http://localhost/examples/corpus/example.com.html", renderType: "script", scripts: { domReady: ["http://localhost/examples/scripts/jquery-3.3.1.min.js"], loadFinished: ["window._pjscMeta.scriptOutput={h1:$('h1').text()};"] } }; const response = await browser.requestSingle(pageRequest); verifyResponseStatus(response); log.assert(_.isPlainObject(response.content.data), "content verification failed, script output not as expected. expect a POJO", response.content.data); const scriptOutput = response.content.data; log.assert(scriptOutput.h1 === "Example Domain", "content verification failed, script output h1 element not as expected. expect contents 'Example Domain'", response.content.data); log.assert(response.content.name === "localhost-examples-corpus-example-com.json", "expect file extension to be JSON"); }); it2(async function selectorTest() { const pageRequest = { url: "http://localhost/examples/corpus/news.ycombinator.com.html", renderType: "plainText", renderSettings: { selector: ".itemlist", }, }; const response = await browser.requestSingle(pageRequest); verifyResponseStatus(response); log.assert(response.content.data.indexOf("1.") === 0, "content verification failed, expect first post 'index number' in beginning of content", response.content.data); }); it2(async function nullOptionalParameters() { const pageRequest = ioDatatypes.pageRequestDefaultsGet(); _nullAllProperties(pageRequest); pageRequest.url = "http://localhost/examples/corpus/example.com.html"; const response = await browser.requestSingle(pageRequest); verifyResponseStatus(response); log.assert(response.content.encoding === "base64", `content verification failed, expect base64 image. instead got ${response.content.encoding}`); log.assert(response.content.name === "localhost-examples-corpus-example-com.jpeg", `content verification failed, expect jpeg name. instead got ${response.content.name}`); log.assert(response.content.size > 30000 && response.content.size < 60000, `content verification failed, expect about 40880 bytes. instead got ${response.content.size}`); }); }); //end describe("e2e tests"); describe("user scenarios", function userScenarios() { /** suggested output of the pdfMake tests */ const pdfMakeOutputStart = "JVBERi0xLjMKJf////8KNSAwIG9iago8PAovVHlwZSAvUGFnZQ"; const pdfMakeOutputEnd = "Jvb3QgMiAwIFIKL0luZm8gNyAwIFIKPj4Kc3RhcnR4cmVmCjMwMzAKJSVFT0YK"; /** from email conversation with sean.colonello on 20181017, made script execution synchronous by default, to make this work same as webkit */ it2(async function chromePdfMake() { const pageRequest = { url: null, backend: "chrome", outputAsJson: true, content: "", requestSettings: { maxWait: 6000, }, renderType: "script", scripts: { domReady: [], load: [], loadFinished: ["http://localhost/examples/scripts/pdfmake-0.1.38.min.js", "http://localhost/examples/scripts/pdfmake-0.1.38.vfs_fonts.js", "_pjscMeta.manualWait=true; var dd={content:'Test'};var pdf=pdfMake.createPdf(dd);pdf.getBase64(function(enc){_pjscMeta.scriptOutput=enc;_pjscMeta.manualWait=false;});"], } }; const response = await browser.requestSingle(pageRequest); verifyResponseStatus(response); log.assert(response.content.name === "localhost-blank.json"); log.assert(response.content.size === 4466); log.assert(response.content.data.indexOf(pdfMakeOutputStart) === 0); log.assert(response.content.data.indexOf(pdfMakeOutputEnd) === response.content.data.length - pdfMakeOutputEnd.length); log.assert(response.content.resourceSummary.complete === 3); log.assert(response.content.resourceSummary.failed === 0); log.assert(response.content.execErrors == null); }).timeout(6000); /** from email conversation with sean.colonello on 20181017, * made script execution synchronous by default, this should thus fail because the scripts execute asynchronously * this request is identical to the one above in ```chromePdfMake()``` but this one specifies ```scriptSettings.async=true``` and thus should fail due to race conditions * */ it2(async function chromePdfMakeFailDueToAsync() { const pageRequest = { url: null, backend: "chrome", outputAsJson: true, content: "", requestSettings: { maxWait: 6000, }, renderType: "script", scripts: { domReady: [], load: [], loadFinished: ["http://localhost/examples/scripts/pdfmake-0.1.38.min.js", "http://localhost/examples/scripts/pdfmake-0.1.38.vfs_fonts.js", "_pjscMeta.manualWait=true; var dd={content:'Test'};var pdf=pdfMake.createPdf(dd);pdf.getBase64(function(enc){_pjscMeta.scriptOutput=enc;_pjscMeta.manualWait=false;});"], }, scriptSettings: { async: true, }, }; const response = await browser.requestSingle(pageRequest); verifyResponseStatus(response, { contentStatusCode: 424, doneDetail: "error:maxWait" }); log.assert(response.content.name === "localhost-blank.json"); log.assert(response.content.size === 2); log.assert(_.isPlainObject(response.content.data)); log.assert(_.isEmpty(response.content.data)); log.assert(response.content.resourceSummary.complete === 3); log.assert(response.content.resourceSummary.failed === 0); log.assert(response.content.execErrors.length === 2); log.assert(_.find(response.content.execErrors, (execErr) => execErr.message.includes("pdfMake is not defined")) != null, "could not find expected error message in content.execErrors"); }).timeout(10000); /** from email conversation with sean.colonello on 20181017, this worked in webkit but not chrome */ it2(async function webkitPdfMake() { const pageRequest = { url: null, backend: "webkit", outputAsJson: true, content: "", renderType: "script", scripts: { domReady: [], load: [], loadFinished: ["http://localhost/examples/scripts/pdfmake-0.1.38.min.js", "http://localhost/examples/scripts/pdfmake-0.1.38.vfs_fonts.js", "_pjscMeta.manualWait=true; var dd={content:'Test'};var pdf=pdfMake.createPdf(dd);pdf.getBase64(function(enc){_pjscMeta.scriptOutput=enc;_pjscMeta.manualWait=false;});"], } }; const response = await browser.requestSingle(pageRequest); verifyResponseStatus(response, { backend: "phantomjs" }); log.assert(response.content.name === "content.json"); log.assert(response.content.size === 4466); log.assert(response.content.data.indexOf(pdfMakeOutputStart) === 1); log.assert(response.content.data.indexOf(pdfMakeOutputEnd) === response.content.data.length - 1 - pdfMakeOutputEnd.length); }); /** from email conversation with priceline around 20181017, they need to know when a page fails to load properly */ it2(async function pricelineBlankPageDetectableError() { const pageRequest = { url: null, content: "http://localhost/examples/customer-tests/priceline-blank.html", "outputAsJson": true, "requestSettings": { "disableJavascript": true, "resourceWait": 500, "waitInterval": 500, }, "renderSettings": { "pdfOptions": { "format": "onepage" } }, "renderType": "plainText", }; const response = await browser.requestSingle(pageRequest); verifyResponseStatus(response, { contentStatusCode: 408 }); //prod times out on this log.assert(response.content.name === "localhost-blank.text"); log.assert(response.content.data.includes("Complete Your Booking")); //"Hotels Cars Flights" ) ); log.assert(response.content.resourceSummary.failed > 0); }).timeout(40000); /** from email conversation with priceline around 20181017, they need to know when a page fails to load properly */ it2(async function pricelineBlankPageDetectableErrorViaTimeout() { const pageRequest = { url: null, content: "http://localhost/examples/customer-tests/priceline-blank.html", "outputAsJson": true, "requestSettings": { "disableJavascript": true, "resourceWait": 500, "waitInterval": 500, maxWait: 10000 //"resourceModifier": [ { "regex": ".*qaa.priceline.com.*", "changeUrl": "$$protocol://www.priceline.com$$path", } ], }, "renderSettings": { "pdfOptions": { "format": "onepage" } }, "renderType": "plainText", }; const response = await browser.requestSingle(pageRequest); verifyResponseStatus(response, { contentStatusCode: 408, doneDetail: "error:maxWait" }); log.assert(response.content.name === "localhost-blank.text"); log.assert(response.content.data.includes("Complete Your Booking")); //"Hotels Cars Flights" ) ); log.assert(response.content.resourceSummary.late > 0); }).timeout(40000); /** from email conversation with priceline around 20181017, they need to know when a page fails to load properly */ it2(async function pricelineBlankPageFix() { const pageRequest = { url: null, content: "http://localhost/examples/customer-tests/priceline-blank.html", "outputAsJson": true, "requestSettings": { "disableJavascript": true, "resourceWait": 500, "waitInterval": 500, "resourceModifier": [{ "regex": ".*qaa.priceline.com.*", "changeUrl": "$$protocol://www.priceline.com$$path", }], }, "renderSettings": { "pdfOptions": { "format": "onepage" } }, "renderType": "plainText", }; const response = await browser.requestSingle(pageRequest); verifyResponseStatus(response); log.assert(response.content.name === "localhost-blank.text"); log.assert(response.content.data.includes("Complete Your Booking")); log.assert(response.content.resourceSummary.failed === 0); }).timeout(10000); }); //end describe userScenarios describe("failureTests", function failureTests() { it2(async function invalidDomain() { let pageRequest = { url: "https://www.exadsfakjalkjghlalkjrtiuibe.com", renderType: "plainText", }; try { const userResponse = await browser.requestSingle(pageRequest); throw log.error("should have failed...", { userResponse }); } catch (_err) { if (_err.response != null && _err.request && _err instanceof Error) { const axiosErr = _err; log.assert(axiosErr.response != null && axiosErr.response.status === 424, "expected error status 424", { axiosErr }); } else { throw _err; } } }).timeout(20000); it2(async function invalidPort() { let pageRequest = { url: "https://www.example.com:82728", renderType: "plainText", requestSettings: { maxWait: 3000 }, }; try { const userResponse = await browser.requestSingle(pageRequest); log.error("should have failed...", { userResponse }); throw new Error("the request should have failed due to invalid URL port"); } catch (_err) { if (_err.response != null && _err.request && _err instanceof Error) { const axiosErr = _err; log.assert(axiosErr.response != null && axiosErr.response.status === 424, "expected error status 424", { axiosErr }); } else { throw _err; } } }).timeout(6000); it2(async function invalidUrl() { let pageRequest = { url: "//example.com", }; try { const userResponse = await browser.requestSingle(pageRequest); log.error("should have failed...", { userResponse }); throw new Error("the request should have failed due to invalid URL"); } catch (_err) { if (_err.response != null && _err.request && _err instanceof Error) { const axiosErr = _err; log.assert(axiosErr.response != null && axiosErr.response.status === 400, "expected error status 400", { axiosErr }); } else { throw _err; } } }).timeout(6000); it2(async function invalidUrlFile() { let pageRequest = { url: "file://.", }; try { const userResponse = await browser.requestSingle(pageRequest); log.error("should have failed...", { userResponse }); throw new Error("the request should have failed due to invalid URL"); } catch (_err) { if (_err.response != null && _err.request && _err instanceof Error) { const axiosErr = _err; log.assert(axiosErr.response != null && axiosErr.response.status === 400, "expected error status 400", { axiosErr }); } else { throw _err; } } }).timeout(6000); it2(async function allNullParameters() { let pageRequest = ioDatatypes.pageRequestDefaultsGet(); pageRequest.url = "http://localhost/examples/corpus/example.com.html"; _nullAllProperties(pageRequest); try { const userResponse = await browser.requestSingle(pageRequest); log.error("should have failed...", { userResponse }); throw new Error("the request should have failed due to invalid URL"); } catch (_err) { if (_err.response != null && _err.request && _err instanceof Error) { const axiosErr = _err; log.assert(axiosErr.response != null && axiosErr.response.status === 400, "expected error status 400", { axiosErr }); } else { throw _err; } } }); it2(async function scriptFailureInjected() { const pageRequest = { url: "http://localhost/examples/corpus/simple.html", backend: "chrome", outputAsJson: true, renderType: "script", scripts: { loadFinished: [ "throw new Error('boom');", ], }, }; const response = await browser.requestSingle(pageRequest); verifyResponseStatus(response, { contentStatusCode: 424 }); //, doneDetail: "error:scripts.loadFinished" } ); }).timeout(6000); it2(async function scriptFailureLoad() { const pageRequest = { url: "http://localhost/examples/corpus/simple.html", backend: "chrome", outputAsJson: true, renderType: "script", scripts: { domReady: ["http://localhost/examples/scripts/does-not-exist.js",], }, }; const response = await browser.requestSingle(pageRequest); verifyResponseStatus(response, { contentStatusCode: 424 }); //, doneDetail: "error:scripts.domReady" } ); }).timeout(6000); }); //end describe("failure tests"); }); //end describe(__filename); //# sourceMappingURL=_unit.test.js.map