Skip to content

Commit d3df4b8

Browse files
authored
Merge pull request #158 from Kashoo/issue157-chai-upgrade
Issue #157 chai upgrade
2 parents d8f0990 + 52940fe commit d3df4b8

10 files changed

Lines changed: 181 additions & 106 deletions

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@
22
All notable changes to this project will be documented in this file.
33
This project adheres to [Semantic Versioning](http://semver.org/).
44

5+
## [Unreleased]
6+
7+
### Changed
8+
- [#157](https://github.com/Kashoo/synctos/issues/157): Swap in Chai as the assertion library used in specs throughout the project
9+
510
## [1.9.3] - 2017-10-23
611
### Fixed
712
- [#152](https://github.com/Kashoo/synctos/issues/152): Cannot append a new object with immutable properties to an array

etc/test-helper.js

Lines changed: 47 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -233,8 +233,7 @@ exports.verifyAccessDenied = verifyAccessDenied;
233233
*/
234234
exports.verifyUnknownDocumentType = verifyUnknownDocumentType;
235235

236-
237-
var expect = require('expect.js');
236+
var assert = require('assert');
238237
var simple = require('simple-mock');
239238
var fs = require('fs');
240239
var syncFunctionLoader = require('./sync-function-loader.js');
@@ -291,25 +290,25 @@ function init() {
291290
}
292291

293292
function verifyRequireAccess(expectedChannels) {
294-
expect(requireAccess.callCount).to.be.greaterThan(0);
293+
assert.ok(requireAccess.callCount > 0, 'Require access not called when expected');
295294

296295
checkAuthorizations(expectedChannels, requireAccess.calls[0].arg, 'channel');
297296
}
298297

299298
function verifyRequireRole(expectedRoles) {
300-
expect(requireRole.callCount).to.be.greaterThan(0);
299+
assert.ok(requireRole.callCount > 0, 'Require role not called when expected');
301300

302301
checkAuthorizations(expectedRoles, requireRole.calls[0].arg, 'role');
303302
}
304303

305304
function verifyRequireUser(expectedUsers) {
306-
expect(requireUser.callCount).to.be.greaterThan(0);
305+
assert.ok(requireUser.callCount > 0, 'Require user not called when expected');
307306

308307
checkAuthorizations(expectedUsers, requireUser.calls[0].arg, 'user');
309308
}
310309

311310
function verifyChannelAssignment(expectedChannels) {
312-
expect(channel.callCount).to.be(1);
311+
assert.equal(channel.callCount, 1, 'Expected channel assignment was not made');
313312

314313
checkAuthorizations(expectedChannels, channel.calls[0].arg, 'channel');
315314
}
@@ -328,14 +327,14 @@ function checkAuthorizations(expectedAuthorizations, actualAuthorizations, autho
328327
for (var expectedAuthIndex = 0; expectedAuthIndex < expectedAuthorizations.length; expectedAuthIndex++) {
329328
var expectedAuth = expectedAuthorizations[expectedAuthIndex];
330329
if (actualAuthorizations.indexOf(expectedAuth) < 0) {
331-
expect().fail('Expected ' + authorizationType + ' was not encountered: ' + expectedAuth);
330+
assert.fail('Expected ' + authorizationType + ' was not encountered: ' + expectedAuth);
332331
}
333332
}
334333

335334
for (var actualAuthIndex = 0; actualAuthIndex < actualAuthorizations.length; actualAuthIndex++) {
336335
var actualAuth = actualAuthorizations[actualAuthIndex];
337336
if (expectedAuthorizations.indexOf(actualAuth) < 0) {
338-
expect().fail('Unexpected ' + authorizationType + ' encountered: ' + actualAuth);
337+
assert.fail('Unexpected ' + authorizationType + ' encountered: ' + actualAuth);
339338
}
340339
}
341340
}
@@ -409,7 +408,7 @@ function verifyChannelAccessAssignment(expectedAssignment) {
409408
}
410409

411410
if (!accessAssignmentCallExists(access, expectedUsersAndRoles, expectedChannels)) {
412-
expect().fail(
411+
assert.fail(
413412
'Missing expected call to assign channel access (' +
414413
JSON.stringify(expectedChannels) +
415414
') to users and roles (' +
@@ -442,7 +441,7 @@ function verifyRoleAccessAssignment(expectedAssignment) {
442441
}
443442

444443
if (!accessAssignmentCallExists(role, expectedUsers, expectedRoles)) {
445-
expect().fail(
444+
assert.fail(
446445
'Missing expected call to assign role access (' +
447446
JSON.stringify(expectedRoles) +
448447
') to users (' +
@@ -467,26 +466,26 @@ function verifyAccessAssignments(expectedAccessAssignments) {
467466
}
468467

469468
if (access.callCount !== expectedAccessCalls) {
470-
expect().fail('Number of calls to assign channel access (' + access.callCount + ') does not match expected (' + expectedAccessCalls + ')');
469+
assert.fail('Number of calls to assign channel access (' + access.callCount + ') does not match expected (' + expectedAccessCalls + ')');
471470
}
472471

473472
if (role.callCount !== expectedRoleCalls) {
474-
expect().fail('Number of calls to assign role access (' + role.callCount + ') does not match expected (' + expectedRoleCalls + ')');
473+
assert.fail('Number of calls to assign role access (' + role.callCount + ') does not match expected (' + expectedRoleCalls + ')');
475474
}
476475
}
477476

478477
function verifyOperationChannelsAssigned(doc, oldDoc, expectedChannels) {
479478
if (channel.callCount !== 1) {
480-
expect().fail('Document failed authorization and/or validation');
479+
assert.fail('Document failed authorization and/or validation');
481480
}
482481

483482
var actualChannels = channel.calls[0].arg;
484483
if (expectedChannels instanceof Array) {
485484
for (var channelIndex = 0; channelIndex < expectedChannels.length; channelIndex++) {
486-
expect(actualChannels).to.contain(expectedChannels[channelIndex]);
485+
assert.ok(actualChannels.indexOf(expectedChannels[channelIndex]) >= 0, 'Expected channel "' + expectedChannels[channelIndex] + '" was not authorized');
487486
}
488487
} else {
489-
expect(actualChannels).to.contain(expectedChannels);
488+
assert.ok(actualChannels.indexOf(expectedChannels) >= 0, 'Expected assignment channel not found: "' + expectedChannels + '" actual: "' + actualChannels + '"');
490489
}
491490
}
492491

@@ -497,8 +496,8 @@ function verifyAuthorization(expectedAuthorization) {
497496
// for authorization
498497
expectedOperationChannels = expectedAuthorization;
499498
verifyRequireAccess(expectedAuthorization);
500-
expect(requireRole.callCount).to.be(0);
501-
expect(requireUser.callCount).to.be(0);
499+
assert.equal(requireRole.callCount, 0, 'Require role called unexpectedly: ' + requireRole.calls);
500+
assert.equal(requireUser.callCount, 0, 'Require user called unexpectedly: ' + requireUser.calls);
502501
} else {
503502
if (expectedAuthorization.expectedChannels) {
504503
expectedOperationChannels = expectedAuthorization.expectedChannels;
@@ -508,13 +507,13 @@ function verifyAuthorization(expectedAuthorization) {
508507
if (expectedAuthorization.expectedRoles) {
509508
verifyRequireRole(expectedAuthorization.expectedRoles);
510509
} else {
511-
expect(requireRole.callCount).to.be(0);
510+
assert.equal(requireRole.callCount, 0, 'Require role called unexpectedly: ' + requireRole.calls);
512511
}
513512

514513
if (expectedAuthorization.expectedUsers) {
515514
verifyRequireUser(expectedAuthorization.expectedUsers);
516515
} else {
517-
expect(requireUser.callCount).to.be(0);
516+
assert.equal(requireUser.callCount, 0, 'Require user called unexpectedly: ' + requireUser.calls);
518517
}
519518

520519
if (!(expectedAuthorization.expectedChannels) && !(expectedAuthorization.expectedRoles) && !(expectedAuthorization.expectedUsers)) {
@@ -550,13 +549,16 @@ function verifyDocumentDeleted(oldDoc, expectedAuthorization, expectedAccessAssi
550549
}
551550

552551
function verifyDocumentRejected(doc, oldDoc, docType, expectedErrorMessages, expectedAuthorization) {
553-
expect(syncFunction).withArgs(doc, oldDoc).to.throwException(function(ex) {
552+
try {
553+
syncFunction(doc, oldDoc);
554+
assert.fail('No errors thrown when some expected');
555+
} catch (ex) {
554556
verifyValidationErrors(docType, expectedErrorMessages, ex);
555-
});
557+
}
556558

557559
verifyAuthorization(expectedAuthorization);
558560

559-
expect(channel.callCount).to.equal(0);
561+
assert.equal(channel.callCount, 0, 'Channel assignment made unexpectedly: ' + channel.calls);
560562
}
561563

562564
function verifyDocumentNotCreated(doc, docType, expectedErrorMessages, expectedAuthorization) {
@@ -582,26 +584,27 @@ function verifyValidationErrors(docType, expectedErrorMessages, exception) {
582584
var exceptionMessageMatches = validationErrorRegex.exec(exception.forbidden);
583585
var actualErrorMessages;
584586
if (exceptionMessageMatches) {
585-
expect(exceptionMessageMatches.length).to.be(3);
587+
assert.equal(exceptionMessageMatches.length, 3);
586588

587589
var invalidDocMessage = exceptionMessageMatches[1].trim();
588-
expect(invalidDocMessage).to.equal('Invalid ' + docType + ' document');
590+
assert.equal(invalidDocMessage, 'Invalid ' + docType + ' document', 'Expected invalid document type message not reported');
589591

590592
actualErrorMessages = exceptionMessageMatches[2].trim().split(/;\s*/);
591593
} else {
592594
actualErrorMessages = [ exception.forbidden ];
593595
}
594596

595597
for (var expectedErrorIndex = 0; expectedErrorIndex < expectedErrorMessages.length; expectedErrorIndex++) {
596-
expect(actualErrorMessages).to.contain(expectedErrorMessages[expectedErrorIndex]);
598+
var expectedErrorMsg = expectedErrorMessages[expectedErrorIndex];
599+
assert.ok(actualErrorMessages.indexOf(expectedErrorMsg) >= 0, 'Expected error message "' + expectedErrorMsg +'" not reported');
597600
}
598601

599602
// Rather than compare the sizes of the two lists, which leads to an obtuse error message on failure (e.g. "expected 2 to be 3"), ensure
600603
// that neither list of validation errors contains an element that does not exist in the other
601604
for (var actualErrorIndex = 0; actualErrorIndex < actualErrorMessages.length; actualErrorIndex++) {
602605
var errorMessage = actualErrorMessages[actualErrorIndex];
603606
if (expectedErrorMessages.indexOf(errorMessage) < 0) {
604-
expect().fail('Unexpected validation error: ' + errorMessage);
607+
assert.fail('Unexpected validation error: ' + errorMessage);
605608
}
606609
}
607610
}
@@ -631,32 +634,38 @@ function verifyAccessDenied(doc, oldDoc, expectedAuthorization) {
631634
requireRole = simple.stub().throwWith(roleAccessDenied);
632635
requireUser = simple.stub().throwWith(userAccessDenied);
633636

634-
expect(syncFunction).withArgs(doc, oldDoc).to.throwException(function(ex) {
637+
try {
638+
syncFunction(doc, oldDoc);
639+
assert.fail('No errors thrown when some expected');
640+
} catch (ex) {
635641
if (typeof(expectedAuthorization) === 'string' || expectedAuthorization instanceof Array) {
636-
expect(ex).to.eql(channelAccessDenied);
642+
assert.equal(ex, channelAccessDenied);
637643
} else if (countAuthorizationTypes(expectedAuthorization) === 0) {
638644
verifyRequireAccess([ ]);
639645
} else if (countAuthorizationTypes(expectedAuthorization) > 1) {
640-
expect(ex.forbidden).to.equal(generalAuthFailedMessage);
646+
assert.equal(ex.forbidden, generalAuthFailedMessage, 'Expected authorization exception not met: ' + ex.forbidden);
641647
} else if (expectedAuthorization.expectedChannels) {
642-
expect(ex).to.eql(channelAccessDenied);
648+
assert.ok(ex instanceof Error && ex.message === channelAccessDenied.message, 'Expected channel authorization error not triggered');
643649
} else if (expectedAuthorization.expectedRoles) {
644-
expect(ex).to.eql(roleAccessDenied);
650+
assert.ok(ex instanceof Error && ex.message === roleAccessDenied.message, 'Expected role authorization error not triggered');
645651
} else if (expectedAuthorization.expectedUsers) {
646-
expect(ex).to.eql(userAccessDenied);
652+
assert.ok(ex instanceof Error && ex.message === userAccessDenied.message, 'Expected user authorization error not triggered');
647653
}
648-
});
654+
}
649655

650656
verifyAuthorization(expectedAuthorization);
651657
}
652658

653659
function verifyUnknownDocumentType(doc, oldDoc) {
654-
expect(syncFunction).withArgs(doc, oldDoc).to.throwException(function(ex) {
655-
expect(ex.forbidden).to.equal('Unknown document type');
656-
});
660+
try {
661+
syncFunction(doc, oldDoc);
662+
assert.fail('Expected unknown document type error not thrown');
663+
} catch (ex) {
664+
assert.equal(ex.forbidden, 'Unknown document type');
665+
}
657666

658-
expect(requireAccess.callCount).to.be(0);
659-
expect(channel.callCount).to.be(0);
667+
assert.equal(requireAccess.callCount, 0, 'Unexpected require access call');
668+
assert.equal(channel.callCount, 0, 'Unexpected channel assignment call');
660669
}
661670

662671
// Sync Gateway configuration files use the backtick character to denote the beginning and end of a multiline string. The sync function

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
"indent.js": "^0.1.4"
66
},
77
"devDependencies": {
8-
"expect.js": "^0.3.1",
8+
"chai": "^4.1.2",
99
"jshint": "^2.9.4",
1010
"mocha": "^3.3.0",
1111
"simple-mock": "^0.7.3"

test/access-assignment-spec.js

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
var expect = require('expect.js');
1+
var expect = require('chai').expect;
22
var testHelper = require('../etc/test-helper.js');
33

44
describe('User and role access assignment:', function() {
@@ -56,9 +56,10 @@ describe('User and role access assignment:', function() {
5656
invalidProperty: 'foobar'
5757
};
5858

59-
expect(testHelper.syncFunction).withArgs(doc).to.throwException(function(ex) {
60-
expect(testHelper.access.callCount).to.be(0);
61-
});
59+
expect(function() {
60+
testHelper.syncFunction(doc);
61+
}).to.throw();
62+
expect(testHelper.access.callCount).to.equal(0);
6263
});
6364

6465
it('is NOT applied when replacing an invalid document', function() {
@@ -68,9 +69,10 @@ describe('User and role access assignment:', function() {
6869
};
6970
var oldDoc = { _id: 'staticAccessDoc' };
7071

71-
expect(testHelper.syncFunction).withArgs(doc, oldDoc).to.throwException(function(ex) {
72-
expect(testHelper.access.callCount).to.be(0);
73-
});
72+
expect(function() {
73+
testHelper.syncFunction(doc, oldDoc);
74+
}).to.throw();
75+
expect(testHelper.access.callCount).to.equal(0);
7476
});
7577
});
7678

@@ -164,9 +166,10 @@ describe('User and role access assignment:', function() {
164166
invalidProperty: 'foobar'
165167
};
166168

167-
expect(testHelper.syncFunction).withArgs(doc).to.throwException(function(ex) {
168-
expect(testHelper.access.callCount).to.be(0);
169-
});
169+
expect(function() {
170+
testHelper.syncFunction(doc);
171+
}).to.throw();
172+
expect(testHelper.access.callCount).to.equal(0);
170173
});
171174

172175
it('is NOT applied when replacing an invalid document', function() {
@@ -178,9 +181,10 @@ describe('User and role access assignment:', function() {
178181
};
179182
var oldDoc = { _id: 'dynamicAccessDoc' };
180183

181-
expect(testHelper.syncFunction).withArgs(doc, oldDoc).to.throwException(function(ex) {
182-
expect(testHelper.access.callCount).to.be(0);
183-
});
184+
expect(function() {
185+
testHelper.syncFunction(doc, oldDoc);
186+
}).to.throw();
187+
expect(testHelper.access.callCount).to.equal(0);
184188
});
185189
});
186190
});

0 commit comments

Comments
 (0)