-
-
Notifications
You must be signed in to change notification settings - Fork 454
/
test_token_manager.py
142 lines (109 loc) · 4.73 KB
/
test_token_manager.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
"""Test praw.util.refresh_token_manager."""
import sys
from pathlib import Path
from tempfile import NamedTemporaryFile
from unittest import mock
import pytest
from praw.util.token_manager import (
BaseTokenManager,
FileTokenManager,
SQLiteTokenManager,
)
from .. import UnitTest
from ..test_reddit import DummyTokenManager
def mock_path(read_data=None):
if read_data is not None:
mock_open = mock.mock_open(read_data=read_data)
else:
mock_open = mock.mock_open()
def mocked_open(self, *args, **kwargs):
return mock_open(self, *args, **kwargs)
return mock.patch.object(Path, "open", mocked_open), mock_open
class DummyAuthorizer:
def __init__(self, refresh_token):
self.refresh_token = refresh_token
class TestBaseTokenManager(UnitTest):
def test_init_base_fail(self):
with pytest.raises(TypeError):
BaseTokenManager()
def test_reddit(self):
manager = DummyTokenManager()
manager.reddit = "dummy"
assert manager.reddit == "dummy"
def test_reddit__must_only_be_set_once(self):
manager = DummyTokenManager()
manager.reddit = "dummy"
with pytest.raises(RuntimeError) as excinfo:
manager.reddit = None
assert (
str(excinfo.value)
== "'reddit' can only be set once and is done automatically"
)
class TestFileTokenManager(UnitTest):
def test_post_refresh_token_callback__writes_to_file(self):
authorizer = DummyAuthorizer("token_value")
manager = FileTokenManager("mock/dummy_path")
mock_patch, mock_open = mock_path()
with mock_patch:
manager.post_refresh_callback(authorizer)
assert authorizer.refresh_token == "token_value"
call = mock_open.mock_calls[0]
path, mode, *_ = call.args
assert path.match("mock/dummy_path")
assert mode == "w"
mock_open().write.assert_called_once_with("token_value")
def test_pre_refresh_token_callback__reads_from_file(self):
authorizer = DummyAuthorizer(None)
manager = FileTokenManager("mock/dummy_path")
mock_patch, mock_open = mock_path(read_data="token_value")
with mock_patch:
manager.pre_refresh_callback(authorizer)
assert authorizer.refresh_token == "token_value"
call = mock_open.mock_calls[0]
path, *_ = call.args
assert path.match("mock/dummy_path")
class TestSQLiteTokenManager(UnitTest):
def test_is_registered(self):
manager = SQLiteTokenManager(database=":memory:", key="dummy_key")
assert not manager.is_registered()
@pytest.mark.skipif(
sys.platform.startswith("win"), reason="this test fails on windows"
)
def test_multiple_instances(self):
with NamedTemporaryFile() as fp:
manager1 = SQLiteTokenManager(database=fp.name, key="dummy_key1")
manager2 = SQLiteTokenManager(database=fp.name, key="dummy_key1")
manager3 = SQLiteTokenManager(database=fp.name, key="dummy_key2")
manager1.register("dummy_value1")
assert manager2.is_registered()
assert not manager3.is_registered()
def test_post_refresh_token_callback__sets_value(self):
authorizer = DummyAuthorizer("dummy_value")
manager = SQLiteTokenManager(database=":memory:", key="dummy_key")
manager.post_refresh_callback(authorizer)
assert authorizer.refresh_token is None
assert manager._get() == "dummy_value"
def test_post_refresh_token_callback__updates_value(self):
authorizer = DummyAuthorizer("dummy_value_updated")
manager = SQLiteTokenManager(database=":memory:", key="dummy_key")
manager.register("dummy_value")
manager.post_refresh_callback(authorizer)
assert authorizer.refresh_token is None
assert manager._get() == "dummy_value_updated"
def test_pre_refresh_token_callback(self):
authorizer = DummyAuthorizer(None)
manager = SQLiteTokenManager(database=":memory:", key="dummy_key")
manager.register("dummy_value")
manager.pre_refresh_callback(authorizer)
assert authorizer.refresh_token == "dummy_value"
def test_pre_refresh_token_callback__raises_key_error(self):
authorizer = DummyAuthorizer(None)
manager = SQLiteTokenManager(database=":memory:", key="dummy_key")
with pytest.raises(KeyError):
manager.pre_refresh_callback(authorizer)
def test_register(self):
manager = SQLiteTokenManager(database=":memory:", key="dummy_key")
assert manager.register("dummy_value")
assert manager.is_registered()
assert not manager.register("dummy_value2")
assert manager._get() == "dummy_value"