swish-http
Version:
A Swish implementation that tunnels over HTTP
261 lines (228 loc) • 9.24 kB
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>