@parse/node-apn
Version:
An interface to the Apple Push Notification service for Node.js
145 lines (118 loc) • 4.63 kB
JavaScript
const sinon = require('sinon');
describe('perpareCertificate', function () {
let fakes, prepareCertificate;
beforeEach(function () {
fakes = {
load: sinon.stub(),
parse: sinon.stub(),
validate: sinon.stub(),
logger: sinon.stub(),
};
prepareCertificate = require('../../../lib/credentials/certificate/prepare')(fakes);
});
describe('with valid credentials', function () {
let credentials;
const testOptions = {
pfx: 'myCredentials.pfx',
cert: 'myCert.pem',
key: 'myKey.pem',
ca: 'myCa.pem',
passphrase: 'apntest',
production: true,
};
beforeEach(function () {
fakes.load.withArgs(sinon.match(testOptions)).returns({
pfx: 'myPfxData',
cert: 'myCertData',
key: 'myKeyData',
ca: ['myCaData'],
passphrase: 'apntest',
});
fakes.parse.returnsArg(0);
credentials = prepareCertificate(testOptions);
});
describe('the validation stage', function () {
it('is called once', function () {
expect(fakes.validate).to.be.calledOnce;
});
it('is passed the production flag', function () {
expect(fakes.validate.getCall(0).args[0]).to.have.property('production', true);
});
describe('passed credentials', function () {
it('contains the PFX data', function () {
expect(fakes.validate.getCall(0).args[0]).to.have.property('pfx', 'myPfxData');
});
it('contains the key data', function () {
expect(fakes.validate.getCall(0).args[0]).to.have.property('key', 'myKeyData');
});
it('contains the certificate data', function () {
expect(fakes.validate.getCall(0).args[0]).to.have.property('cert', 'myCertData');
});
it('includes passphrase', function () {
expect(fakes.validate.getCall(0).args[0]).to.have.property('passphrase', 'apntest');
});
});
});
describe('resolution value', function () {
it('contains the PFX data', function () {
return expect(credentials).to.have.property('pfx', 'myPfxData');
});
it('contains the key data', function () {
return expect(credentials).to.have.property('key', 'myKeyData');
});
it('contains the certificate data', function () {
return expect(credentials).to.have.property('cert', 'myCertData');
});
it('contains the CA data', function () {
return expect(credentials).to.have.nested.deep.property('ca[0]', 'myCaData');
});
it('includes passphrase', function () {
return expect(credentials).to.have.property('passphrase', 'apntest');
});
});
});
describe('credential file cannot be parsed', function () {
beforeEach(function () {
fakes.load.returns({ cert: 'myCertData', key: 'myKeyData' });
fakes.parse.throws(new Error('unable to parse key'));
});
it('should resolve with the credentials', function () {
const credentials = prepareCertificate({
cert: 'myUnparseableCert.pem',
key: 'myUnparseableKey.pem',
production: true,
});
return expect(credentials).to.deep.equal({ cert: 'myCertData', key: 'myKeyData' });
});
it('should log an error', function () {
prepareCertificate({ cert: 'myUnparseableCert.pem', key: 'myUnparseableKey.pem' });
expect(fakes.logger).to.be.calledWith(
sinon.match(function (err) {
return err.message ? err.message.match(/unable to parse key/) : false;
}, '"unable to parse key"')
);
});
it('should not attempt to validate', function () {
prepareCertificate({ cert: 'myUnparseableCert.pem', key: 'myUnparseableKey.pem' });
expect(fakes.validate).to.not.be.called;
});
});
describe('credential validation fails', function () {
it('should throw', function () {
fakes.load.returns(Promise.resolve({ cert: 'myCertData', key: 'myMismatchedKeyData' }));
fakes.parse.returnsArg(0);
fakes.validate.throws(new Error('certificate and key do not match'));
return expect(() =>
prepareCertificate({ cert: 'myCert.pem', key: 'myMistmatchedKey.pem' })
).to.throw(/certificate and key do not match/);
});
});
describe('credential file cannot be loaded', function () {
it('should throw', function () {
fakes.load.throws(new Error('ENOENT, no such file or directory'));
return expect(() =>
prepareCertificate({ cert: 'noSuchFile.pem', key: 'myKey.pem' })
).to.throw('ENOENT, no such file or directory');
});
});
});