Salman
Salman

Reputation: 494

How to update user.services for Jasmine testing in Meteor

I am trying to mock out a user for testing out my application, and I have gotten to the point where I can create a test user and log them into the mirror instance of my app.

I need to compare the gmail addresses for peoples accounts, and to test this functionality, I want to add a test email address under user.services.google.email within the Meteor users account database (which is where the accounts-google package stores it, I don't need to mock out an entire user account yet).

What I can't figure out is how to append this information, instead of just overwriting what is already there, this is what my code looks like:

if (Meteor.users.find().count() === 0) {
    var testUserDetails = {
        email: '[email protected]',
        password: 'testPassword'
    };
    console.log("Creating the Test User");
    var newUserId = Accounts.createUser(testUserDetails);

    Meteor.users.update({
        _id: newUserId
    }, {
        $set: {
            services: {
                google: {
                    email: "[email protected]"
                }
            }
        }
    });

} else {
    console.log("There are already users in the Test database");
}

console.log('***** Finished loading default fixtures *****');
},

And this is what a user looks like:

{
    "_id" : "Dw2xQPDwKp58RozC4",
    "createdAt" : ISODate("2015-07-30T04:02:03.261Z"),
    "services" : {
        "password" : {
            "bcrypt" : "asdfasdfasdfdsafsadfasdsdsawf"
        },
        "resume" : {
            "loginTokens" : [ ]
        }
    },
    "emails" : [
        {
            "address" : "[email protected]",
            "verified" : false
        }
    ]
}

Now $set just rewrites everything within services, and there is no $push operation for mongo or for js, so how should I go about doing this? Should I consume the object and parse it manually?

*Note I have also tried using Meteor's Accounts.onCreateUser(function(options, user) but facing the same issue.

Upvotes: 0

Views: 43

Answers (1)

Matthias A. Eckhart
Matthias A. Eckhart

Reputation: 5156

[...] there is no $push operation for mongo [...]

Sure, there is a $push operator, which appends a specified value to an array.

However, I think what you are trying to do is to update a document and keep all values which are already set.

Here is how you can do that:

  1. Query the document first to get the object you want to set.
  2. Update the respective object.
  3. Run the MongoDB update operation to set the new object.

For instance:

var user = Meteor.users.findOne({
    _id: newUserId
});
var servicesUserData = user.services;
servicesUserData.google.email = "[email protected]";
Meteor.users.update({
    _id: newUserId
}, {
    $set: {
        "services": {
            servicesUserData
        }
    }
});

Upvotes: 0

Related Questions