Skip to content

Commit e7dfaa8

Browse files
authored
Refactor known device check into UserService (#19074)
* Refactor known device check into user service * Update translations * Remove unused imports
1 parent ca0ff00 commit e7dfaa8

File tree

5 files changed

+372
-850
lines changed

5 files changed

+372
-850
lines changed

tests/unit/accounts/test_services.py

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
EmailFactory,
4949
UserFactory,
5050
UserTermsOfServiceEngagementFactory,
51+
UserUniqueLoginFactory,
5152
)
5253
from ...common.db.ip_addresses import IpAddressFactory
5354

@@ -2014,3 +2015,97 @@ def test_factory(self):
20142015

20152016
assert svc._http is request.http
20162017
assert svc.client_id == "some_client_id"
2018+
2019+
2020+
class TestDeviceIsKnown:
2021+
def test_device_is_known(self, user_service):
2022+
user = UserFactory.create()
2023+
UserUniqueLoginFactory.create(
2024+
user=user, ip_address=REMOTE_ADDR, status="confirmed"
2025+
)
2026+
request = pretend.stub(
2027+
db=user_service.db,
2028+
remote_addr=REMOTE_ADDR,
2029+
find_service=lambda *a, **kw: pretend.stub(),
2030+
)
2031+
assert user_service.device_is_known(user.id, request)
2032+
2033+
def test_device_is_not_known(self, user_service, monkeypatch):
2034+
user = UserFactory.create(with_verified_primary_email=True)
2035+
send_email = pretend.call_recorder(lambda *a, **kw: None)
2036+
monkeypatch.setattr(services, "send_unrecognized_login_email", send_email)
2037+
token_service = pretend.stub(dumps=lambda d: "fake_token")
2038+
user_service.request = pretend.stub(
2039+
db=user_service.db,
2040+
remote_addr=REMOTE_ADDR,
2041+
headers={
2042+
"User-Agent": (
2043+
"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:15.0) "
2044+
"Gecko/20100101 Firefox/15.0.1"
2045+
)
2046+
},
2047+
find_service=lambda *a, **kw: token_service,
2048+
)
2049+
2050+
assert not user_service.device_is_known(user.id, user_service.request)
2051+
assert send_email.calls == [
2052+
pretend.call(
2053+
user_service.request,
2054+
user,
2055+
ip_address=REMOTE_ADDR,
2056+
user_agent="Firefox (Ubuntu)",
2057+
token="fake_token",
2058+
)
2059+
]
2060+
2061+
def test_device_is_pending_not_expired(self, user_service, monkeypatch):
2062+
user = UserFactory.create(with_verified_primary_email=True)
2063+
UserUniqueLoginFactory.create(
2064+
user=user, ip_address=REMOTE_ADDR, status="pending"
2065+
)
2066+
send_email = pretend.call_recorder(lambda *a, **kw: None)
2067+
monkeypatch.setattr(services, "send_unrecognized_login_email", send_email)
2068+
token_service = pretend.stub(dumps=lambda d: "fake_token")
2069+
user_service.request = pretend.stub(
2070+
db=user_service.db,
2071+
remote_addr=REMOTE_ADDR,
2072+
headers={
2073+
"User-Agent": (
2074+
"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:15.0) "
2075+
"Gecko/20100101 Firefox/15.0.1"
2076+
)
2077+
},
2078+
find_service=lambda *a, **kw: token_service,
2079+
)
2080+
2081+
assert not user_service.device_is_known(user.id, user_service.request)
2082+
assert send_email.calls == []
2083+
2084+
@pytest.mark.parametrize("ua_string", [None, "no bueno", "Python-urllib/3.7"])
2085+
def test_device_is_not_known_bad_user_agent(
2086+
self, user_service, monkeypatch, ua_string
2087+
):
2088+
user = UserFactory.create(with_verified_primary_email=True)
2089+
send_email = pretend.call_recorder(lambda *a, **kw: None)
2090+
monkeypatch.setattr(services, "send_unrecognized_login_email", send_email)
2091+
token_service = pretend.stub(dumps=lambda d: "fake_token")
2092+
headers = {}
2093+
if ua_string:
2094+
headers["User-Agent"] = ua_string
2095+
user_service.request = pretend.stub(
2096+
db=user_service.db,
2097+
remote_addr=REMOTE_ADDR,
2098+
headers=headers,
2099+
find_service=lambda *a, **kw: token_service,
2100+
)
2101+
2102+
assert not user_service.device_is_known(user.id, user_service.request)
2103+
assert send_email.calls == [
2104+
pretend.call(
2105+
user_service.request,
2106+
user,
2107+
ip_address=REMOTE_ADDR,
2108+
user_agent=ua_string or "Unknown User-Agent",
2109+
token="fake_token",
2110+
)
2111+
]

0 commit comments

Comments
 (0)