blob: a7c82467a56d217b78867dcbd5d542a1d687f4e5 [file] [log] [blame]
<!--
Copyright 2016 The LUCI Authors. All rights reserved.
Use of this source code is governed under the Apache License, Version 2.0
that can be found in the LICENSE file.
-->
<!doctype html>
<title>rpc-client</title>
<link rel="import" href="../rpc-client.html">
<script src="../../bower_components/web-component-tester/browser.js"></script>
<test-fixture id="client">
<template>
<rpc-client service="service" method="ok"></rpc-client>
</template>
</test-fixture>
<script>
'use strict';
suite('<rpc-client>', function() {
var client;
var server;
setup(function() {
var prefix = ')]}\'\n';
server = sinon.fakeServer.create();
var okResponseHeaders = {
'Content-Type': 'application/json',
'X-Prpc-Grpc-Code': '' + luci.rpc.Code.OK
}
server.respondWith('POST', '/prpc/service/ok', [
200,
okResponseHeaders,
prefix + '{"secure": false}'
]);
server.respondWith(
'POST',
'https://' + document.location.host + '/prpc/service/ok',
[
200,
okResponseHeaders,
prefix + '{"secure": true}'
])
server.respondWith('POST', '/prpc/service/notFound', [
404,
{
'Content-Type': 'text/plain',
'X-Prpc-Grpc-Code': '' + luci.rpc.Code.NOT_FOUND
},
'Not found'
]);
server.respondWith('POST', '/prpc/service/noCode', [
200,
{
'Content-Type': 'text/json',
},
'{"blah": "bleh"}'
]);
server.respondWith('POST', '/prpc/service/invalidCode', [
200,
{
'Content-Type': 'text/json',
'X-Prpc-Grpc-Code': 'abc'
},
'{"blah": "bleh"}'
]);
server.respondWith('POST', '/prpc/service/malformedResponse', [
200,
{
'Content-Type': 'text/json',
'X-Prpc-Grpc-Code': '' + luci.rpc.Code.OK
},
'}}}'
]);
client = fixture('client');
});
teardown(function() {
server.restore();
});
function expectResponse(fn) {
var call = client.call();
server.respond();
return call.completes.then(function () {
expect(client.lastError).not.to.be.error;
expect(client.lastResponse).to.equal(call.response);
fn(call);
});
}
function expectError(fn) {
var call = client.call();
server.respond();
return call.completes.then(function() {
assert.fail('no error', 'error');
}).catch(function (error) {
expect(error).not.to.be.null;
expect(client.lastResponse).to.be.null;
expect(client.lastError).to.be.equal(error);
fn(error);
});
}
test('by default host is current', function() {
expect(client.host).to.be.equal(document.location.host);
});
test('with a request', function() {
client.request = { msg: 'hi' };
var call = client.call();
expect(call.xhr.requestBody).to.equal('{"msg":"hi"}');
});
test('loading property changes', function() {
expect(client.loading).to.be.false;
var call = client.call();
expect(client.loading).to.be.true;
server.respond();
return call.completes.then(function() {
expect(client.loading).to.be.false;
});
});
test('reads response', function() {
return expectResponse(function(call) {
expect(call.response).to.be.deep.equal({ secure: false });
expect(call.code).to.equal(luci.rpc.Code.OK);
});
});
test('sets code', function() {
return expectResponse(function(call) {
expect(call.code).to.equal(luci.rpc.Code.OK);
expect(client.lastCode).to.equal(call.code);
});
});
test('secure', function() {
client.insecure = false;
return expectResponse(function(call) {
expect(call.response).to.be.deep.equal({ secure: true });
});
});
test('authenticated', function() {
client.accessToken = 'deadbeef';
var call = client.call();
expect(call.xhr.requestHeaders['authorization']).to.equal(
'Bearer deadbeef'
);
});
test('with timeout', function() {
client.timeout = 1000;
var call = client.call();
var timeoutHeader = call.xhr.requestHeaders['x-prpc-timeout'];
expect(timeoutHeader).to.be.equal('1000m');
});
test('error code', function() {
client.method = 'notFound';
return expectError(function(e) {
expect(e).to.be.an.instanceof(luci.rpc.GrpcError);
expect(e.code).to.equal(luci.rpc.Code.NOT_FOUND);
expect(e.description).to.equal('Not found');
expect(client.lastCall.code).to.equal(luci.rpc.Code.NOT_FOUND);
expect(client.lastCode).to.equal(luci.rpc.Code.NOT_FOUND);
});
});
test('no code', function() {
client.method = 'noCode';
return expectError(function(e) {
expect(e.message).to.contain('no X-Prpc-Grpc-Code');
});
});
test('malformed response', function() {
client.method = 'malformedResponse';
return expectError(function(e) {
expect(e.message).to.contain('could not parse response');
});
});
test('invalid code', function() {
client.method = 'invalidCode';
return expectError(function(e) {
expect(e.message).to.contain('Invalid X-Prpc-Grpc-Code');
});
});
test('request event', function() {
client.request = { msg: 'hi' };
var event = null;
client.addEventListener('request', function(e) {
event = e;
});
expect(event).to.be.null;
var call = client.call();
expect(event).to.be.ok
expect(event.detail.call).to.equal(call);
expect(client.lastCall).to.equal(call);
expect(call.host).to.equal(document.location.host);
expect(call.service).to.equal('service');
expect(call.method).to.equal('ok');
expect(call.request).to.equal(client.request);
});
test('response event', function() {
var event = null;
client.addEventListener('response', function(e) {
event = e;
});
expect(event).to.be.null;
return expectResponse(function(call) {
expect(event).to.be.ok
expect(event.detail.call).to.equal(call);
expect(call.host).to.equal(document.location.host);
expect(call.service).to.equal('service');
expect(call.method).to.equal('ok');
expect(call.request).to.equal(client.request);
expect(call.response).to.deep.equal({secure: false});
expect(call.error).to.be.null;
});
});
test('error event', function() {
client.method = 'notFound';
var event = null;
client.addEventListener('error', function(e) {
event = e;
});
expect(event).to.be.null;
var call = client.call();
expect(event).to.be.null;
server.respond();
return expectError(function(call) {
var call = client.lastCall;
expect(event).to.be.ok
expect(event.detail.call).to.equal(call);
expect(call.host).to.equal(document.location.host);
expect(call.service).to.equal('service');
expect(call.method).to.equal('notFound');
expect(call.request).to.equal(client.request);
expect(call.response).to.be.null;
expect(call.error).to.be.an.instanceof(luci.rpc.GrpcError);
});
});
});
</script>