Я работаю над добавлением модульного тестирования в рамки приложения, и все идет хорошо. Однако я столкнулся с проблемой тестирования, если токен истек или все еще активен.Идентификатор входа в систему
Я смог проверить, был ли пользовательский токен создан, издеваясь над ответом на мой/логин-вызов с токеном, который я сохранил для тестового пользователя, однако это работает только до истечения срока действия токена. У меня нет возможности вручную истечь токен или сбросить время истечения срока действия в будущем.
Мой Auth завод:
auth.isLoggedIn = function(){
var token = SS.getObj('appToken');
if(token){
var payload = JSON.parse($window.atob(token.split('.')[1]));
return payload.exp > Date.now()/1000;
} else {
return false;
}
};
И мой юнит-тесты:
describe('auth.isLoggedIn()', function() {
it('should return false if a user is not logged in', function() {
expect(auth.isLoggedIn()).toEqual(false); // This test passes 100%
});
it('should return true if a user is logged in', function() {
user = {
email: '[email protected]',
password: 'password123'
};
$httpBackend.expectPOST('/login').respond({ token: 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6NywiZW1haWwiOiJid2F5bmVAd2F5bmVlbnRlcnByaXNlLmNvbSIsIm5hbWUiOiJCcnVjZSBXYXluZSIsImV4cCI6MTQzODI4NDYwNywiaWF0IjoxNDM4MjgxMDA3fQ.2rpGJ1c5dVi1EiPo0C5JIdva7MonutCYmotP5-pB_N4' }); // I copied a valid token from a test user, but I can't change it since I'm just copying an old token.
auth.login(user);
$httpBackend.flush();
expect(auth.isLoggedIn()).toEqual(true); // This test passes if the above token has a valid time/date, however I can't set the time/date so it usually fails
});
it('should return false if a users token has expired', function() {
user = {
email: '[email protected]',
password: 'password123'
};
$httpBackend.expectPOST('/login').respond({ token: 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6NywiZW1haWwiOiJid2F5bmVAd2F5bmVlbnRlcnByaXNlLmNvbSIsIm5hbWUiOiJCcnVjZSBXYXluZSIsImV4cCI6MTQzODI4NDYwNywiaWF0IjoxNDM4MjgxMDA3fQ.2rpGJ1c5dVi1EiPo0C5JIdva7MonutCYmotP5-pB_N4' });
auth.login(user);
$httpBackend.flush();
expect(auth.isLoggedIn()).toEqual(false); // This test fails if the date/time has expired, again I can't set that so it's usually passing, as the token has expired.
});
});
Я подозреваю, что правильный способ сделать это на самом деле создать действительный маркер во время теста, но я не уверен, как это сделать, поскольку он обрабатывается сервером узлов, ответы которого я макет, чтобы не полагаться на ответ сервера в моих тестах.
ли контролирует ваше приложение истечение токена? Разве это не ответственность сервера? –
Сервер создает токен и истекает срок действия 30 минут в будущем, а затем возвращает токен в приложение. Если токен не обновляется в течение 30 минут, он истек и больше не действует. Мое приложение просто проверяет, истек ли токен перед отправкой запроса на сервер, если оно истекло, приложение направляет пользователя к логину, так как запрос, который пытается сделать, будет отклонен сервером. Как только они войдут в систему и имеют действительный токен, их первоначальный запрос будет завершен. Это предотвращает бомбардировку моего сервера запросами от недопустимых пользователей. – efarley