Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to test controller using mocha in Sails?

I have the following Controller for my login page:

// Authentication Controller
// the basics of Passport.js to work.
var AuthController = {

    // localhost:1337/login  Render the login page
    // <form role="form" action="/auth/local" method="post">
    //     <input type="text" name="identifier" placeholder="Username or Email">
    //     <input type="password" name="password" placeholder="Password">
    //     <button type="submit">Sign in</button>
    // </form>

    login: function(req, res) {
        var strategies = sails.config.passport,
            providers = {};

        // Get a list of available providers for use in templates.
        Object.keys(strategies).forEach(function(key) {
            if (key === 'local') return;
            providers[key] = {
                name: strategies[key].name,
                slug: key
            };
        });

        // Render the `auth/login.ext` view
        res.view({
            providers: providers,
            errors: req.flash('error')
        });

    },

    // Log out a user and return them to the homepage
    // Passport exposes a logout() function on req (also aliased as logOut()) that
    // can be called from any route handler which needs to terminate a login
    // session. Invoking logout() will remove the req.user property and clear the
    // login session (if any).
    logout: function(req, res) {
        req.logout();
        res.redirect('/login');
    },

    // The registration form is Just like the login form
    register: function(req, res) {
        res.view({
            errors: req.flash('error')
        });
    },

    // Create a third-party authentication endpoint
    provider: function(req, res) {
        passport.endpoint(req, res);
    },

    // Create a authentication callback endpoint
    // This endpoint handles everything related to creating and verifying Pass-
    // ports and users, both locally and from third-aprty providers.
    // Passport exposes a login() function on req (also aliased as logIn()) that
    // can be used to establish a login session. When the login operation
    // completes, user will be assigned to req.user.
    callback: function(req, res) {
        passport.callback(req, res, function(err, user) {
            req.login(user, function(err) {
                // If an error was thrown, redirect the user to the login which should
                // take care of rendering the error messages.
                if (err) {
                    res.redirect('/login');
                }
                // Upon successful login, send the user to the homepage were req.user
                // will available.
                else {
                    res.redirect('/');
                }
            });
        });
    }
};

module.exports = AuthController;

I am using Mocha as my test framework. The application is based on Sails. How would I write Mocha test cases and run them on the provided Controller?

like image 239
tajuddin Avatar asked Oct 21 '22 14:10

tajuddin


1 Answers

I'm using supertest to call controllers as a user, to do so, first lift the sails in the before function so it can be used as the server by supertest.

before(function (done) {
 Sails.lift({
        // configuration for testing purposes
        log: {
            //level: 'silly'
            level: 'silent'
        },
        hooks: {
            grunt: false,
        },
    }, function (err, sails) {
done(err, sails);
        });
}

Then initialize supertest with the url of your sails app

request = require('supertest');
agent = request.agent(appurl);

You can now write test to post / get data to test your controller from frontend as would a client.



it('should do the post and return whatever', function (done) {
    agent.post('/controller/function')
    .send(the_post_object_with_params)
    .end(function (err, res) {
        if (err) {
            console.log(err);
        }
        console.log(res.body); // the content 
        done();
    });
}
like image 152
arkoak Avatar answered Oct 27 '22 10:10

arkoak