UNPKG

swish-http

Version:

A Swish implementation that tunnels over HTTP

261 lines (228 loc) 9.24 kB
<!DOCTYPE html> <html> <head> <title>Swish HTTP test page</title> <link rel="shortcut icon" href="favicon.png"/> <script src="swish-test-suite.js"></script> <script src="swish-http.js"></script> <style> body { font-family: "Trebuchet MS", sans-serif; margin: 0; padding: 1em 2em; } #results { width: 100%; text-align: center; } #suites { width: 100%; max-width: 900px; margin: auto; padding: 0; box-sizing: border-box; } .suite { list-style: none; margin: 1em 0em; } .suite > .name { display: block; width: 100%; border-bottom: 1px solid #DDD; margin-bottom: 0.1em; } .test { clear: both; list-style: none; border-bottom: 1px solid #EEE; } .time { padding: 1em; color: #CCC; } .passed .time.medium { color: #CC8; } .passed .time.long { color: #D66; } .clickable { cursor: pointer; } .result { display: inline-block; float: right; font-size: 0.7em; vertical-align: baseline; border: 1px solid rgba(0, 0, 0, 0.2); border-radius: 0.3em; padding: 0.1em 0.3em; } .result-detail { margin: 0.3em 5em 1em 5em; font-size: 0.8em; color: #222; background-color: #EEE; border-radius: 0.3em; padding: 0.3em 0.5em; white-space: pre-wrap; } .waiting { opacity: 0.5; } .waiting .result { background-color: #FFF; } .running { color: #444; } .running .result { background-color: #DDD; } .passed { color: #080; } .passed .result { background-color: #DFD; } .failed { color: #800; } .failed .result { background-color: #FDD; } </style> </head> <body> <div id="results" class="running"></div> <ul id="suites"></ul> <script> var tests = []; var runTotal = 0, passTotal = 0; var stopOnFirst = /#(.*&)?stopOnFirst(&|$)/.test(location.href); function runNextTest() { var resultsElement = document.getElementById('results'); resultsElement.innerHTML = passTotal + '/' + runTotal; if (!tests.length || (passTotal < runTotal && stopOnFirst)) { if (passTotal < runTotal) { resultsElement.className = 'failed'; } else { resultsElement.className = 'passed'; } return; }; var test = tests.shift(); test.setState('running'); var alreadyHandled = false; var startTime = Date.now(); var handleResult = function (error) { test.updateTime(Date.now() - startTime); if (alreadyHandled) return true; alreadyHandled = true; runTotal++; clearTimeout(timeout); if (error) { test.setState('failed', error.stack || error.message); } else { passTotal++; test.setState('passed'); } runNextTest(); } var timeout = setTimeout(function () { handleResult(new Error('Timeout (2000ms)')); }, 2000); var r = new XMLHttpRequest(); r.open('POST', '/new-store'); r.onreadystatechange = function () { if (r.readyState !== 4) return; var data; try { data = JSON.parse(r.responseText); } catch (e) { } if (typeof data !== 'string') { return handleResult(new Error('Failed to create test store: ' + r.status + ' ' + r.statusText)); } var store = new SwishHttp(data); test.test.run(store, handleResult); }; r.send(''); } SwishTests.suites().forEach(function (suite) { var suiteElement = document.createElement('li'); suiteElement.className = 'suite'; var nameElement = document.createElement('span'); nameElement.className = 'name'; nameElement.appendChild(document.createTextNode(suite.name)); suiteElement.appendChild(nameElement); var testList = document.createElement('ul'); testList.className = 'tests'; suiteElement.appendChild(testList); suite.tests.forEach(function (test) { var testElement = document.createElement('li'); testList.appendChild(testElement); var resultElement = document.createElement('span'); resultElement.className = 'result'; testElement.appendChild(resultElement); var nameElement = document.createElement('span'); nameElement.className = 'name'; nameElement.appendChild(document.createTextNode(test.name)); testElement.appendChild(nameElement); var timeElement = document.createElement('span'); timeElement.className = 'time'; testElement.appendChild(timeElement); var detailElement = document.createElement('pre'); detailElement.className = 'result-detail'; testElement.appendChild(detailElement); var obj = { test: test, updateTime: function (ms) { timeElement.innerHTML = ''; timeElement.appendChild(document.createTextNode(ms + 'ms')); if (ms > 250) { timeElement.className = 'time long'; } else if (ms > 100) { timeElement.className = 'time medium'; } else { timeElement.className = 'time'; } timeElement.class }, setState: function (state, detail) { testElement.className = 'test ' + state; resultElement.innerHTML = ''; resultElement.appendChild(document.createTextNode(state)); detailElement.innerHTML = ''; detailElement.appendChild(document.createTextNode(detail || '')); if (detail) { if (typeof console === 'object' && console.log) { console.log(detail); } testElement.className += ' clickable'; testElement.onclick = function (event) { if (detailElement.style.display === 'block') { detailElement.style.display = 'none'; } else { detailElement.style.display = 'block'; } event.preventDefault(); }; detailElement.onclick = function (event) { return false; } } else { detailElement.style.display = 'none'; } } }; tests.push(obj); obj.setState('waiting'); }); document.getElementById('suites').appendChild(suiteElement); }); runNextTest(); </script> </body> </html>