I have Schema defined as:
````
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
var UsersAndRolesSchema = new Schema({
roleName: {type:String, unique:true},
userEmail: [{type:String}],
children: [{type:Schema.Types.ObjectId, ref:'UsersAndRolesSchema'}]
});
module.exports = mongoose.model('UsersAndRoles', UsersAndRolesSchema);
````
and my tests are:
let globalBefore = async function () {
mongoose.set('useCreateIndex', true);
await mongoose.connect('mongodb://localhost:27017/Tests', {useNewUrlParser: true});
};
let globalAfter = function () {
mongoose.connection.close();
};
let globalAfterEach = function () {
mongoose.connection.db.dropDatabase();
};
describe('1. addUsersAndRole', function () {
before(globalBefore);
afterEach(globalAfterEach);
after(globalAfter);
it('1.1 adds 1 valid role', function (done) {
usersAndRolesController.addUsersAndRole('role1', ['[email protected]'], (err, userAndRole) => {
if (err) done(err);
else {
assert.deepEqual(userAndRole.userEmail, ['[email protected]']);
assert.deepEqual(userAndRole.children, []);
assert.deepEqual(userAndRole.roleName, 'role1');
done();
}
});
});
it('1.2 adds the same role', function (done) {
usersAndRolesController.addUsersAndRole('role1', ['[email protected]'], (err, userAndRole) => {
if (err) done(err);
else usersAndRolesController.addUsersAndRole('role1', ['[email protected]'], (err, userAndRole2) => {
if (err) done();
else {
console.log(userAndRole);
console.log(userAndRole2);
done(new Error("should have failed"));
}
});
});
});
});
when I run all of test 1 I get:
1.1 pass
1.2
{ userEmail: [ '[email protected]' ],
children: [],
_id: 5c7a417949ad9e2588e220d0,
roleName: 'role1',
__v: 0 }
{ userEmail: [ '[email protected]' ],
children: [],
_id: 5c7a417949ad9e2588e220d1,
roleName: 'role1',
__v: 0 }
Error: should have failed
but when I run 1.2 alone its all good.
I cant find the reason for that.
Any help?
When you drop and recreate your database, the indexes specified in your schema need to be explicitly recreated with Model.ensureIndexes()
. Since you are dropping your DB after each test, run the function before each test.
@chidiwilliams worked. Thank you!
By the way, isn't ensureIndexes
deprecated?
@omriattiya use Model.createIndexes() instead, essentially equivalent: https://mongoosejs.com/docs/api.html#model_Model.createIndexes .
Also, remember that unique is not a validator: https://mongoosejs.com/docs/validation.html#the-unique-option-is-not-a-validator
I'm not sure but I may be seeing the same issue? I erased the season collection before deploying code with unique: true
as instructed and the first deploy seemed ok. The 2nd test I ended up with duplicate rows!
// make sure each user only gets one entry per season
seasonSchema.index({ owner: 1, template: 1 }, { unique: true })
The saving code, if relevant, is pretty simple:
playerSeason = await new Season({
owner: data.player,
template: currentSeason._id
})
await playerSeason.save()
Any advice is appreciated. I thought I was following the docs pretty accurately here.
@framerate please open up a new issue and follow the issue template
Most helpful comment
When you drop and recreate your database, the indexes specified in your schema need to be explicitly recreated with
Model.ensureIndexes()
. Since you are dropping your DB after each test, run the function before each test.