Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Loopback and mocha: wait for server to finish boot scripts

Hi as of title of question I was wondering how one can check if loopback boot scripts have finished before launching tests. In a example project:

https://github.com/strongloop/loopback-example-relations

there is a file in the test folder that seems to do the job but unfortunately it does not solve it.

start-server.js:

var app = require('../server/server');

module.exports = function(done) {
  if (app.loaded) {
    app.once('started', done);
    app.start();
  } else {
    app.once('loaded', function() {
      app.once('started', done);
      app.start();
    });
  }
};

This script is loaded in the rest test api as follows:

before(function(done) {
    require('./start-server');
    done();
});

but the function is never invoked. Is this the correct way it was meant to use that script?

I ended with the following implementation:

before(function (done) {
    if (app.booting) {
        console.log('Waiting for app boot...');
        app.on('booted', done);
    } else {
        done();
    }
});

which works, but I was puzzled by that start-server script.

EDIT following the @stalin advice I modified the before function as follows:

before(function(done) {
    require('./start-server')(done);
});

and the execution goes in the else branch but done is never called.

like image 539
Sanandrea Avatar asked Jul 11 '16 18:07

Sanandrea


2 Answers

You are never passing the done function to the start-server script. Try to do this:

before(function(done) {
    var server = require('./start-server');
    server(done);
});
like image 199
stalin Avatar answered Oct 05 '22 22:10

stalin


It might not work when your boot scripts are using asynchronous functions (for example to automigrate models schema). Application will set booting = false and not wait for callbacks to finish until you invoke a callback explicitly:

// boot script with extra callback param:
module.exports = function (app, cb) {
  var db = app.dataSources.db;

  // update all database models
  db.autoupdate(function (err) {
    if (err) throw err;
    cb();
  });
};
like image 39
ANTARA Avatar answered Oct 05 '22 22:10

ANTARA