Как автоматически войти на сервер для тестирования интеграции Meteor с пользовательским обработчиком входа - PullRequest
0 голосов
/ 08 апреля 2019

Я пишу интеграционные тесты для моего приложения Meteor, используя Mocha и Chai.Эти тесты предназначены только для функциональности сервера.

Я мог бы подделать пользователя Meteor с помощью Sinon, но в идеале я хотел бы начать с реального входа пользователя.Однако я не могу понять, как это сделать на сервере.

Я аутентифицируюсь на удаленном сервере;

Код сервера:

Accounts.registerLoginHandler((loginRequest) => {
    if ((remoteAuthenticate(loginRequest.username, loginRequest.password)) === true) {
        // remoteAuthenticate is a function that handles login against the remote server
        ...
        // handle login success and failure
    }
});

Этовызывается на клиенте так:

Accounts.callLoginMethod({
    'methodArguments': [{
        'username': username,
        'password': password,
    }],
    'userCallback': function (err) {
        if (err) {
            Session.set('invalidCredentials', true);
        }
    },
});

Вход в систему с клиента работает нормально, но я не могу понять, как вызвать методы входа в систему непосредственно на сервере в моих тестах.Кажется, что ни один из методов Метеор или Аккаунты не делает этого.Спасибо за любые предложения!

1 Ответ

0 голосов
/ 14 апреля 2019

Предполагая, что пользователь уже создан, вы можете использовать соединение DDP и пакет с именем ongoworks:ddp-login для аутентификации с удаленного компьютера.Он предназначен для работы как на сервере, так и на клиенте.

Сначала добавьте пакет в свой проект:

meteor add ongoworks:ddp-login

Затем создайте соединение в своих тестах и ​​передайте его вызову входа в систему:

const url = https://your.server.tld
const connection = DDP.connect(url);

// describe login

it('logs in to the remote if the user exists', function (done) {
  DDP.loginWithPassword(conn, {username: 'admin'}, 'admin', function (error) {
    if (error) {
      done(error)
    } else {
      done() 
    }
  })
})

Экземпляр connection ведет себя подобно вашему глобальному Meteor, который всегда имеет настроенное по умолчанию соединение по умолчанию.

Например: если вам нужно вызывать методы изудаленный с зарегистрированным пользователем вы можете использовать экземпляр connection для вызова методов:

// describe method x
it('returns some value', function (done) {
  DDP.loginWithPassword(conn, {username: 'admin'}, 'admin', function (error) {
    // handle error...
    connection.call('method x', (err, res) => { /* handle err / res */ })
  })
})

Ресурсы:

https://atmospherejs.com/ongoworks/ddp-login

https://docs.meteor.com/api/connections.html#DDP-connect

...