triam-sdk-contract
Version:
triam-sdk is a library for working with the Triam Horizon server.
334 lines (298 loc) • 12.6 kB
JavaScript
import http from "http";
import { Config } from "../../src/config";
describe("federation-server.js tests", function () {
beforeEach(function () {
this.server = new StellarSdk.FederationServer('https://acme.com:1337/federation', 'stellar.org');
this.axiosMock = sinon.mock(axios);
StellarSdk.Config.setDefault();
});
afterEach(function () {
this.axiosMock.verify();
this.axiosMock.restore();
});
describe('FederationServer.constructor', function () {
it("throws error for insecure server", function () {
expect(() => new StellarSdk.FederationServer('http://acme.com:1337/federation', 'stellar.org')).to.throw(/Cannot connect to insecure federation server/);
});
it("allow insecure server when opts.allowHttp flag is set", function () {
expect(() => new StellarSdk.FederationServer('http://acme.com:1337/federation', 'stellar.org', {allowHttp: true})).to.not.throw();
});
it("allow insecure server when global Config.allowHttp flag is set", function () {
StellarSdk.Config.setAllowHttp(true);
expect(() => new StellarSdk.FederationServer('http://acme.com:1337/federation', 'stellar.org', {allowHttp: true})).to.not.throw();
});
});
describe('FederationServer.resolveAddress', function () {
beforeEach(function () {
this.axiosMock.expects('get')
.withArgs(sinon.match('https://acme.com:1337/federation?type=name&q=bob%2Astellar.org'))
.returns(Promise.resolve({
data: {
stellar_address: 'bob*stellar.org',
account_id: 'GB5XVAABEQMY63WTHDQ5RXADGYF345VWMNPTN2GFUDZT57D57ZQTJ7PS'
}
}));
});
it("requests is correct", function (done) {
this.server.resolveAddress('bob*stellar.org')
.then(response => {
expect(response.stellar_address).equals('bob*stellar.org');
expect(response.account_id).equals('GB5XVAABEQMY63WTHDQ5RXADGYF345VWMNPTN2GFUDZT57D57ZQTJ7PS');
done();
})
.catch(function (err) {
done(err);
});
});
it("requests is correct for username as stellar address", function (done) {
this.server.resolveAddress('bob')
.then(response => {
expect(response.stellar_address).equals('bob*stellar.org');
expect(response.account_id).equals('GB5XVAABEQMY63WTHDQ5RXADGYF345VWMNPTN2GFUDZT57D57ZQTJ7PS');
done();
})
.catch(function (err) {
done(err);
});
});
});
describe('FederationServer.resolveAccountId', function () {
beforeEach(function () {
this.axiosMock.expects('get')
.withArgs(sinon.match('https://acme.com:1337/federation?type=id&q=GB5XVAABEQMY63WTHDQ5RXADGYF345VWMNPTN2GFUDZT57D57ZQTJ7PS'))
.returns(Promise.resolve({
data: {
stellar_address: 'bob*stellar.org',
account_id: 'GB5XVAABEQMY63WTHDQ5RXADGYF345VWMNPTN2GFUDZT57D57ZQTJ7PS'
}
}));
});
it("requests is correct", function (done) {
this.server.resolveAccountId('GB5XVAABEQMY63WTHDQ5RXADGYF345VWMNPTN2GFUDZT57D57ZQTJ7PS')
.then(response => {
expect(response.stellar_address).equals('bob*stellar.org');
expect(response.account_id).equals('GB5XVAABEQMY63WTHDQ5RXADGYF345VWMNPTN2GFUDZT57D57ZQTJ7PS');
done();
})
.catch(function (err) {
done(err);
});
});
});
describe('FederationServer.resolveTransactionId', function () {
beforeEach(function () {
this.axiosMock.expects('get')
.withArgs(sinon.match('https://acme.com:1337/federation?type=txid&q=3389e9f0f1a65f19736cacf544c2e825313e8447f569233bb8db39aa607c8889'))
.returns(Promise.resolve({
data: {
stellar_address: 'bob*stellar.org',
account_id: 'GB5XVAABEQMY63WTHDQ5RXADGYF345VWMNPTN2GFUDZT57D57ZQTJ7PS'
}
}));
});
it("requests is correct", function (done) {
this.server.resolveTransactionId('3389e9f0f1a65f19736cacf544c2e825313e8447f569233bb8db39aa607c8889')
.then(response => {
expect(response.stellar_address).equals('bob*stellar.org');
expect(response.account_id).equals('GB5XVAABEQMY63WTHDQ5RXADGYF345VWMNPTN2GFUDZT57D57ZQTJ7PS');
done();
})
.catch(function (err) {
done(err);
});
});
});
describe('FederationServer.createForDomain', function () {
it("creates correct object", function (done) {
this.axiosMock.expects('get')
.withArgs(sinon.match('https://acme.com/.well-known/stellar.toml'))
.returns(Promise.resolve({
data: `
# The endpoint which clients should query to resolve stellar addresses
# for users on your domain.
FEDERATION_SERVER="https://api.stellar.org/federation"
`
}));
StellarSdk.FederationServer.createForDomain('acme.com')
.then(federationServer => {
expect(federationServer.serverURL.protocol()).equals('https');
expect(federationServer.serverURL.hostname()).equals('api.stellar.org');
expect(federationServer.serverURL.path()).equals('/federation');
expect(federationServer.domain).equals('acme.com');
done();
});
});
it("fails when stellar.toml does not contain federation server info", function (done) {
this.axiosMock.expects('get')
.withArgs(sinon.match('https://acme.com/.well-known/stellar.toml'))
.returns(Promise.resolve({
data: ''
}));
StellarSdk.FederationServer.createForDomain('acme.com').should.be.rejectedWith(/stellar.toml does not contain FEDERATION_SERVER field/).and.notify(done);
});
});
describe('FederationServer.resolve', function () {
it("succeeds for a valid account ID", function (done) {
StellarSdk.FederationServer.resolve('GAFSZ3VPBC2H2DVKCEWLN3PQWZW6BVDMFROWJUDAJ3KWSOKQIJ4R5W4J')
.should.eventually.deep.equal({account_id: 'GAFSZ3VPBC2H2DVKCEWLN3PQWZW6BVDMFROWJUDAJ3KWSOKQIJ4R5W4J'})
.notify(done);
});
it("fails for invalid account ID", function (done) {
StellarSdk.FederationServer.resolve('invalid').should.be.rejectedWith(/Invalid Account ID/).notify(done);
});
it("succeeds for a valid Stellar address", function (done) {
this.axiosMock.expects('get')
.withArgs(sinon.match('https://stellar.org/.well-known/stellar.toml'))
.returns(Promise.resolve({
data: `
# The endpoint which clients should query to resolve stellar addresses
# for users on your domain.
FEDERATION_SERVER="https://api.stellar.org/federation"
`
}));
this.axiosMock.expects('get')
.withArgs(sinon.match('https://api.stellar.org/federation?type=name&q=bob%2Astellar.org'))
.returns(Promise.resolve({
data: {
stellar_address: 'bob*stellar.org',
account_id: 'GB5XVAABEQMY63WTHDQ5RXADGYF345VWMNPTN2GFUDZT57D57ZQTJ7PS',
memo_type: 'id',
memo: '100'
}
}));
StellarSdk.FederationServer.resolve('bob*stellar.org')
.should.eventually.deep.equal({
stellar_address: 'bob*stellar.org',
account_id: 'GB5XVAABEQMY63WTHDQ5RXADGYF345VWMNPTN2GFUDZT57D57ZQTJ7PS',
memo_type: 'id',
memo: '100'
})
.notify(done);
});
it("fails for invalid Stellar address", function (done) {
StellarSdk.FederationServer.resolve('bob*stellar.org*test').should.be.rejectedWith(/Invalid Stellar address/).notify(done);
});
it("fails when memo is not string", function (done) {
this.axiosMock.expects('get')
.withArgs(sinon.match('https://acme.com:1337/federation?type=name&q=bob%2Astellar.org'))
.returns(Promise.resolve({
data: {
stellar_address: 'bob*stellar.org',
account_id: 'GB5XVAABEQMY63WTHDQ5RXADGYF345VWMNPTN2GFUDZT57D57ZQTJ7PS',
memo_type: 'id',
memo: 100
}
}));
this.server.resolveAddress('bob*stellar.org')
.should.be.rejectedWith(/memo value should be of type string/).notify(done);
});
it("fails when response exceeds the limit", function (done) {
// Unable to create temp server in a browser
if (typeof window != 'undefined') {
return done();
}
var response = Array(StellarSdk.FEDERATION_RESPONSE_MAX_SIZE+10).join('a');
let tempServer = http.createServer((req, res) => {
res.setHeader('Content-Type', 'application/json; charset=UTF-8');
res.end(response);
}).listen(4444, () => {
new StellarSdk.FederationServer('http://localhost:4444/federation', 'stellar.org', {allowHttp: true})
.resolveAddress('bob*stellar.org')
.should.be.rejectedWith(/federation response exceeds allowed size of [0-9]+/)
.notify(done)
.then(() => tempServer.close());
});
});
});
describe('FederationServer times out when response lags and timeout set', function () {
afterEach(function() {
Config.setDefault();
});
let opts = {allowHttp: true};
let message;
for (let i = 0; i < 2; i++) {
if (i === 0) {
Config.setTimeout(1000);
message = "with global config set";
} else {
opts = {allowHttp: true, timeout: 1000};
message = "with instance opts set";
}
it(`resolveAddress times out ${message}`, function (done) {
// Unable to create temp server in a browser
if (typeof window != 'undefined') {
return done();
}
let tempServer = http.createServer((req, res) => {
setTimeout(() => {}, 10000);
}).listen(4444, () => {
new StellarSdk.FederationServer('http://localhost:4444/federation', 'stellar.org', opts)
.resolveAddress('bob*stellar.org')
.should.be.rejectedWith(/timeout of 1000ms exceeded/)
.notify(done)
.then(() => tempServer.close());
});
});
it(`resolveAccountId times out ${message}`, function (done) {
// Unable to create temp server in a browser
if (typeof window != 'undefined') {
return done();
}
let tempServer = http.createServer((req, res) => {
setTimeout(() => {}, 10000);
}).listen(4444, () => {
new StellarSdk.FederationServer('http://localhost:4444/federation', 'stellar.org', opts)
.resolveAccountId('GB5XVAABEQMY63WTHDQ5RXADGYF345VWMNPTN2GFUDZT57D57ZQTJ7PS')
.should.be.rejectedWith(/timeout of 1000ms exceeded/)
.notify(done)
.then(() => tempServer.close());
});
});
it(`resolveTransactionId times out ${message}`, function (done) {
// Unable to create temp server in a browser
if (typeof window != 'undefined') {
return done();
}
let tempServer = http.createServer((req, res) => {
setTimeout(() => {}, 10000);
}).listen(4444, () => {
new StellarSdk.FederationServer('http://localhost:4444/federation', 'stellar.org', opts)
.resolveTransactionId('3389e9f0f1a65f19736cacf544c2e825313e8447f569233bb8db39aa607c8889')
.should.be.rejectedWith(/timeout of 1000ms exceeded/)
.notify(done)
.then(() => tempServer.close());
});
});
it(`createForDomain times out ${message}`, function (done) {
// Unable to create temp server in a browser
if (typeof window != 'undefined') {
return done();
}
let tempServer = http.createServer((req, res) => {
setTimeout(() => {}, 10000);
}).listen(4444, () => {
StellarSdk.FederationServer
.createForDomain("localhost:4444", opts)
.should.be.rejectedWith(/timeout of 1000ms exceeded/)
.notify(done)
.then(() => tempServer.close());
});
});
it(`resolve times out ${message}`, function (done) {
// Unable to create temp server in a browser
if (typeof window != 'undefined') {
return done();
}
let tempServer = http.createServer((req, res) => {
setTimeout(() => {}, 10000);
}).listen(4444, () => {
StellarSdk.FederationServer
.resolve('bob*localhost:4444', opts)
.should.eventually.be.rejectedWith(/timeout of 1000ms exceeded/)
.notify(done)
.then(() => tempServer.close());
});
});
}
});
});