diff options
Diffstat (limited to 'devtools/client/netmonitor/test/browser_net_status-codes.js')
-rw-r--r-- | devtools/client/netmonitor/test/browser_net_status-codes.js | 213 |
1 files changed, 213 insertions, 0 deletions
diff --git a/devtools/client/netmonitor/test/browser_net_status-codes.js b/devtools/client/netmonitor/test/browser_net_status-codes.js new file mode 100644 index 000000000..f38ee71e4 --- /dev/null +++ b/devtools/client/netmonitor/test/browser_net_status-codes.js @@ -0,0 +1,213 @@ +/* vim: set ft=javascript ts=2 et sw=2 tw=80: */ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ +"use strict"; + +/** + * Tests if requests display the correct status code and text in the UI. + */ + +add_task(function* () { + let { L10N } = require("devtools/client/netmonitor/l10n"); + + let { tab, monitor } = yield initNetMonitor(STATUS_CODES_URL); + + info("Starting test... "); + + let { document, EVENTS, NetMonitorView } = monitor.panelWin; + let { RequestsMenu, NetworkDetails } = NetMonitorView; + let requestItems = []; + + RequestsMenu.lazyUpdate = false; + NetworkDetails._params.lazyEmpty = false; + + const REQUEST_DATA = [ + { + // request #0 + method: "GET", + uri: STATUS_CODES_SJS + "?sts=100", + details: { + status: 101, + statusText: "Switching Protocols", + type: "plain", + fullMimeType: "text/plain; charset=utf-8", + size: L10N.getFormatStrWithNumbers("networkMenu.sizeB", 0), + time: true + } + }, + { + // request #1 + method: "GET", + uri: STATUS_CODES_SJS + "?sts=200", + details: { + status: 202, + statusText: "Created", + type: "plain", + fullMimeType: "text/plain; charset=utf-8", + size: L10N.getFormatStrWithNumbers("networkMenu.sizeB", 22), + time: true + } + }, + { + // request #2 + method: "GET", + uri: STATUS_CODES_SJS + "?sts=300", + details: { + status: 303, + statusText: "See Other", + type: "plain", + fullMimeType: "text/plain; charset=utf-8", + size: L10N.getFormatStrWithNumbers("networkMenu.sizeB", 22), + time: true + } + }, + { + // request #3 + method: "GET", + uri: STATUS_CODES_SJS + "?sts=400", + details: { + status: 404, + statusText: "Not Found", + type: "plain", + fullMimeType: "text/plain; charset=utf-8", + size: L10N.getFormatStrWithNumbers("networkMenu.sizeB", 22), + time: true + } + }, + { + // request #4 + method: "GET", + uri: STATUS_CODES_SJS + "?sts=500", + details: { + status: 501, + statusText: "Not Implemented", + type: "plain", + fullMimeType: "text/plain; charset=utf-8", + size: L10N.getFormatStrWithNumbers("networkMenu.sizeB", 22), + time: true + } + } + ]; + + let wait = waitForNetworkEvents(monitor, 5); + yield ContentTask.spawn(tab.linkedBrowser, {}, function* () { + content.wrappedJSObject.performRequests(); + }); + yield wait; + + info("Performing tests"); + yield verifyRequests(); + yield testTab(0, testSummary); + yield testTab(2, testParams); + + return teardown(monitor); + + /** + * A helper that verifies all requests show the correct information and caches + * RequestsMenu items to requestItems array. + */ + function* verifyRequests() { + info("Verifying requests contain correct information."); + let index = 0; + for (let request of REQUEST_DATA) { + let item = RequestsMenu.getItemAtIndex(index); + requestItems[index] = item; + + info("Verifying request #" + index); + yield verifyRequestItemTarget(item, request.method, request.uri, request.details); + + index++; + } + } + + /** + * A helper that opens a given tab of request details pane, selects and passes + * all requests to the given test function. + * + * @param Number tabIdx + * The index of NetworkDetails tab to activate. + * @param Function testFn(requestItem) + * A function that should perform all necessary tests. It's called once + * for every item of REQUEST_DATA with that item being selected in the + * NetworkMonitor. + */ + function* testTab(tabIdx, testFn) { + info("Testing tab #" + tabIdx); + EventUtils.sendMouseEvent({ type: "mousedown" }, + document.querySelectorAll("#details-pane tab")[tabIdx]); + + let counter = 0; + for (let item of REQUEST_DATA) { + info("Waiting tab #" + tabIdx + " to update with request #" + counter); + yield chooseRequest(counter); + + info("Tab updated. Performing checks"); + yield testFn(item); + + counter++; + } + } + + /** + * A function that tests "Summary" contains correct information. + */ + function* testSummary(data) { + let tabpanel = document.querySelectorAll("#details-pane tabpanel")[0]; + + let { method, uri, details: { status, statusText } } = data; + is(tabpanel.querySelector("#headers-summary-url-value").getAttribute("value"), + uri, "The url summary value is incorrect."); + is(tabpanel.querySelector("#headers-summary-method-value").getAttribute("value"), + method, "The method summary value is incorrect."); + is(tabpanel.querySelector("#headers-summary-status-circle").getAttribute("code"), + status, "The status summary code is incorrect."); + is(tabpanel.querySelector("#headers-summary-status-value").getAttribute("value"), + status + " " + statusText, "The status summary value is incorrect."); + } + + /** + * A function that tests "Params" tab contains correct information. + */ + function* testParams(data) { + let tabpanel = document.querySelectorAll("#details-pane tabpanel")[2]; + let statusParamValue = data.uri.split("=").pop(); + let statusParamShownValue = "\"" + statusParamValue + "\""; + + is(tabpanel.querySelectorAll(".variables-view-scope").length, 1, + "There should be 1 param scope displayed in this tabpanel."); + is(tabpanel.querySelectorAll(".variable-or-property").length, 1, + "There should be 1 param value displayed in this tabpanel."); + is(tabpanel.querySelectorAll(".variables-view-empty-notice").length, 0, + "The empty notice should not be displayed in this tabpanel."); + + let paramsScope = tabpanel.querySelectorAll(".variables-view-scope")[0]; + + is(paramsScope.querySelector(".name").getAttribute("value"), + L10N.getStr("paramsQueryString"), + "The params scope doesn't have the correct title."); + + is(paramsScope.querySelectorAll(".variables-view-variable .name")[0] + .getAttribute("value"), + "sts", "The param name was incorrect."); + is(paramsScope.querySelectorAll(".variables-view-variable .value")[0] + .getAttribute("value"), + statusParamShownValue, "The param value was incorrect."); + + is(tabpanel.querySelector("#request-params-box") + .hasAttribute("hidden"), false, + "The request params box should not be hidden."); + is(tabpanel.querySelector("#request-post-data-textarea-box") + .hasAttribute("hidden"), true, + "The request post data textarea box should be hidden."); + } + + /** + * A helper that clicks on a specified request and returns a promise resolved + * when NetworkDetails has been populated with the data of the given request. + */ + function chooseRequest(index) { + let onTabUpdated = monitor.panelWin.once(EVENTS.TAB_UPDATED); + EventUtils.sendMouseEvent({ type: "mousedown" }, requestItems[index].target); + return onTabUpdated; + } +}); |