Add route53 dns tests

Fixes #120
This commit is contained in:
Johannes
2016-11-30 18:04:47 +01:00
parent ac09ad3393
commit e1ee4973eb

View File

@@ -7,11 +7,13 @@
'use strict';
var async = require('async'),
AWS = require('aws-sdk'),
database = require('../database.js'),
expect = require('expect.js'),
nock = require('nock'),
settings = require('../settings.js'),
subdomains = require('../subdomains.js');
subdomains = require('../subdomains.js'),
util = require('util');
describe('dns provider', function () {
before(function (done) {
@@ -338,4 +340,217 @@ describe('dns provider', function () {
});
});
});
describe('route53', function () {
// do not clear this with [] but .length = 0 so we don't loose the reference in mockery
var awsAnswerQueue = [];
var AWS_HOSTED_ZONES = {
HostedZones: [{
Id: '/hostedzone/Z34G16B38TNZ9L',
Name: 'localhost.',
CallerReference: '305AFD59-9D73-4502-B020-F4E6F889CB30',
ResourceRecordSetCount: 2,
ChangeInfo: {
Id: '/change/CKRTFJA0ANHXB',
Status: 'INSYNC'
}
}, {
Id: '/hostedzone/Z3OFC3B6E8YTA7',
Name: 'cloudron.us.',
CallerReference: '0B37F2DE-21A4-E678-BA32-3FC8AF0CF635',
Config: {},
ResourceRecordSetCount: 2,
ChangeInfo: {
Id: '/change/C2682N5HXP0BZ5',
Status: 'INSYNC'
}
}],
IsTruncated: false,
MaxItems: '100'
};
before(function (done) {
var data = {
provider: 'route53',
accessKeyId: 'unused',
secretAccessKey: 'unused'
};
function mockery (queue) {
return function(options, callback) {
expect(options).to.be.an(Object);
var elem = queue.shift();
if (!util.isArray(elem)) throw(new Error('Mock answer required'));
// if no callback passed, return a req object with send();
if (typeof callback !== 'function') {
return {
httpRequest: { headers: {} },
send: function (callback) {
expect(callback).to.be.a(Function);
callback(elem[0], elem[1]);
}
};
} else {
callback(elem[0], elem[1]);
}
};
}
function Route53Mock(cfg) {
expect(cfg).to.eql({
accessKeyId: data.accessKeyId,
secretAccessKey: data.secretAccessKey,
region: 'us-east-1'
});
}
Route53Mock.prototype.getHostedZone = mockery(awsAnswerQueue);
Route53Mock.prototype.getChange = mockery(awsAnswerQueue);
Route53Mock.prototype.changeResourceRecordSets = mockery(awsAnswerQueue);
Route53Mock.prototype.listResourceRecordSets = mockery(awsAnswerQueue);
Route53Mock.prototype.listHostedZones = mockery(awsAnswerQueue);
// override route53 in AWS
// Comment this out and replace the config with real tokens to test against AWS proper
AWS.Route53 = Route53Mock;
settings.setDnsConfig(data, done);
});
it('upsert non-existing record succeeds', function (done) {
awsAnswerQueue.push([null, AWS_HOSTED_ZONES]);
awsAnswerQueue.push([null, {
ChangeInfo: {
Id: '/change/C2QLKQIWEI0BZF',
Status: 'PENDING',
SubmittedAt: 'Mon Aug 04 2014 17: 44: 49 GMT - 0700(PDT)'
}
}]);
subdomains.upsert('test', 'A', [ '1.2.3.4' ], function (error, result) {
expect(error).to.eql(null);
expect(result).to.eql('/change/C2QLKQIWEI0BZF');
expect(awsAnswerQueue.length).to.eql(0);
done();
});
});
it('upsert existing record succeeds', function (done) {
awsAnswerQueue.push([null, AWS_HOSTED_ZONES]);
awsAnswerQueue.push([null, {
ChangeInfo: {
Id: '/change/C2QLKQIWEI0BZF',
Status: 'PENDING',
SubmittedAt: 'Mon Aug 04 2014 17: 44: 49 GMT - 0700(PDT)'
}
}]);
subdomains.upsert('test', 'A', [ '1.2.3.4' ], function (error, result) {
expect(error).to.eql(null);
expect(result).to.eql('/change/C2QLKQIWEI0BZF');
expect(awsAnswerQueue.length).to.eql(0);
done();
});
});
it('upsert multiple record succeeds', function (done) {
awsAnswerQueue.push([null, AWS_HOSTED_ZONES]);
awsAnswerQueue.push([null, {
ChangeInfo: {
Id: '/change/C2QLKQIWEI0BZF',
Status: 'PENDING',
SubmittedAt: 'Mon Aug 04 2014 17: 44: 49 GMT - 0700(PDT)'
}
}]);
subdomains.upsert('', 'TXT', [ 'first', 'second', 'third' ], function (error, result) {
expect(error).to.eql(null);
expect(result).to.eql('/change/C2QLKQIWEI0BZF');
expect(awsAnswerQueue.length).to.eql(0);
done();
});
});
it('get succeeds', function (done) {
awsAnswerQueue.push([null, AWS_HOSTED_ZONES]);
awsAnswerQueue.push([null, {
ResourceRecordSets: [{
Name: 'test.localhost.',
Type: 'A',
ResourceRecords: [{
Value: '1.2.3.4'
}]
}]
}]);
subdomains.get('test', 'A', function (error, result) {
expect(error).to.eql(null);
expect(result).to.be.an(Array);
expect(result.length).to.eql(1);
expect(result[0]).to.eql('1.2.3.4');
expect(awsAnswerQueue.length).to.eql(0);
done();
});
});
it('del succeeds', function (done) {
awsAnswerQueue.push([null, AWS_HOSTED_ZONES]);
awsAnswerQueue.push([null, {
ChangeInfo: {
Id: '/change/C2QLKQIWEI0BZF',
Status: 'PENDING',
SubmittedAt: 'Mon Aug 04 2014 17: 44: 49 GMT - 0700(PDT)'
}
}]);
subdomains.remove('test', 'A', ['1.2.3.4'], function (error) {
expect(error).to.eql(null);
expect(awsAnswerQueue.length).to.eql(0);
done();
});
});
it('status succeeds for pending', function (done) {
awsAnswerQueue.push([null, {
ChangeInfo: {
Id: '/change/C2QLKQIWEI0BZF',
Status: 'PENDING',
SubmittedAt: 'Mon Aug 04 2014 17: 44: 49 GMT - 0700(PDT)'
}
}]);
subdomains.status('/change/C2QLKQIWEI0BZF', function (error, result) {
expect(error).to.eql(null);
expect(result).to.eql('pending');
expect(awsAnswerQueue.length).to.eql(0);
done();
});
});
it('status succeeds for done', function (done) {
awsAnswerQueue.push([null, {
ChangeInfo: {
Id: '/change/C2QLKQIWEI0BZF',
Status: 'INSYNC',
SubmittedAt: 'Mon Aug 04 2014 17: 44: 49 GMT - 0700(PDT)'
}
}]);
subdomains.status('/change/C2QLKQIWEI0BZF', function (error, result) {
expect(error).to.eql(null);
expect(result).to.eql('done');
expect(awsAnswerQueue.length).to.eql(0);
done();
});
});
});
});