Files
tryton/modules/authentication_sms/tests/test_module.py
T
Cédric Krier 74ee169c54 Refactor of trytond.config to add cache
This removes the need to store configuration in global variable and so make it
easier to update for example for testing.

Closes #14249
2025-10-07 08:19:57 +02:00

118 lines
3.5 KiB
Python

# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
import datetime
import trytond.config as config
from trytond.exceptions import LoginException
from trytond.pool import Pool
from trytond.tests.test_tryton import ModuleTestCase, with_transaction
def send_sms(text, to, from_):
sms_queue.append({
'text': text,
'to': to,
'from': from_,
})
sms_queue = []
class AuthenticationSMSTestCase(ModuleTestCase):
'Test Authentication SMS module'
module = 'authentication_sms'
def setUp(self):
super().setUp()
methods = config.get('session', 'authentications', default='')
config.set('session', 'authentications', 'sms')
self.addCleanup(config.set, 'session', 'authentications', methods)
config.add_section('authentication_sms')
config.set(
'authentication_sms', 'function',
'.'.join([send_sms.__module__, send_sms.__qualname__]))
self.addCleanup(config.remove_section, 'authentication_sms')
del sms_queue[:]
@with_transaction()
def test_sms_code_default_code(self):
pool = Pool()
SMSCode = pool.get('res.user.login.sms_code')
code = SMSCode.default_code()
self.assertEqual(len(code), 6)
@with_transaction()
def test_sms_code_get(self):
pool = Pool()
SMSCode = pool.get('res.user.login.sms_code')
record, = SMSCode.create([{'user_id': 1}])
records = list(SMSCode.get(1))
self.assertEqual(records, [record])
future = datetime.datetime.now() + datetime.timedelta(10 * 60)
records = list(SMSCode.get(1, _now=future))
self.assertFalse(records)
self.assertFalse(SMSCode.search([]))
@with_transaction()
def test_sms_code_send(self):
pool = Pool()
User = pool.get('res.user')
SMSCode = pool.get('res.user.login.sms_code')
user = User(name='sms', login='sms', mobile='+123456789')
user.save()
SMSCode.send(user.id)
record, = SMSCode.search([])
self.assertEqual(len(sms_queue), 1)
sms, = sms_queue
self.assertEqual(record.user_id, user.id)
self.assertIn(record.code, sms['text'])
self.assertEqual(user.mobile, sms['to'])
# Don't send a second SMS as long as the first is valid
SMSCode.send(user.id)
self.assertEqual(len(sms_queue), 1)
@with_transaction()
def test_sms_code_check(self):
pool = Pool()
SMSCode = pool.get('res.user.login.sms_code')
record, = SMSCode.create([{'user_id': 1}])
sms_code = record.code
self.assertFalse(SMSCode.check(1, 'foo'))
self.assertTrue(SMSCode.check(1, sms_code))
# Second check should fail
self.assertFalse(SMSCode.check(1, sms_code))
@with_transaction()
def test_user_get_login(self):
pool = Pool()
User = pool.get('res.user')
SMSCode = pool.get('res.user.login.sms_code')
user = User(name='sms', login='sms', mobile='+123456789')
user.save()
with self.assertRaises(LoginException) as cm:
User.get_login('sms', {})
self.assertEqual(cm.exception.name, 'sms_code')
self.assertEqual(cm.exception.type, 'char')
record, = SMSCode.search([])
sms_code = record.code
user_id = User.get_login('sms', {
'sms_code': sms_code,
})
self.assertEqual(user_id, user.id)
del ModuleTestCase