Loopback and mocha: wait for server to finish boot scripts

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);
});

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();
  });
};

I just want to point out the way Loopback team did it

https://github.com/strongloop/loopback/blob/44951a1032d2115a20a098fbeea767e0a5cd72c1/test/helpers/loopback-testing-helper.js#L39

beforeEach(function(done) {
    this.app = app;
    var _request = this.request = request(app);
    this.post = _request.post;
    this.get = _request.get;
    this.put = _request.put;
    this.del = _request.del;
    this.patch = _request.patch;

    if (app.booting) {
      return app.once('booted', done);
    }
done();

Then you'd find that they're calling it pretty much within every integration test

https://github.com/strongloop/loopback/blob/b77907ffa59c7031fcb3bb6dbff96894bc597ba4/test/user.integration.js#L16

describe('access control - integration', function() {
  lt.beforeEach.withApp(app);