File: test_credential_store.py

package info (click to toggle)
python-renault-api 0.5.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,696 kB
  • sloc: python: 7,804; makefile: 2
file content (235 lines) | stat: -rw-r--r-- 8,699 bytes parent folder | download | duplicates (2)
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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
"""Test cases for the Gigya client."""

import tempfile
import time
from datetime import timedelta
from shutil import copyfile
from unittest import mock

import pytest
from typeguard import suppress_type_checks

from tests.const import TEST_LOGIN_TOKEN
from tests.const import TEST_PERSON_ID
from tests.fixtures import get_jwt

from renault_api.credential import Credential
from renault_api.credential import JWTCredential
from renault_api.credential_store import CredentialStore
from renault_api.credential_store import FileCredentialStore
from renault_api.gigya import GIGYA_JWT
from renault_api.gigya import GIGYA_LOGIN_TOKEN
from renault_api.gigya import GIGYA_PERSON_ID


def get_logged_in_credential_store() -> CredentialStore:
    """Get credential store initialised with Gigya credentials."""
    credential_store = CredentialStore()
    credential_store[GIGYA_LOGIN_TOKEN] = Credential(TEST_LOGIN_TOKEN)
    credential_store[GIGYA_PERSON_ID] = Credential(TEST_PERSON_ID)
    credential_store[GIGYA_JWT] = JWTCredential(get_jwt())
    return credential_store


def test_invalid_credential() -> None:
    """Test set with invalid types."""
    credential_store = CredentialStore()

    test_key = "test"
    with suppress_type_checks(), pytest.raises(TypeError):
        credential_store[test_key] = test_key  # type:ignore

    test_value = Credential("test_value")
    with suppress_type_checks(), pytest.raises(TypeError):
        credential_store[test_value] = test_value  # type:ignore


def test_simple_credential() -> None:
    """Test get/set with simple credential."""
    credential_store = CredentialStore()
    test_key = "test"

    # Try to get value from empty store
    assert test_key not in credential_store
    assert not credential_store.get(test_key)
    with pytest.raises(KeyError):
        credential_store[test_key]

    # Set value
    test_value = Credential("test_value")
    credential_store[test_key] = test_value

    # Try to get values from filled store
    assert test_key in credential_store
    assert credential_store.get(test_key) == test_value
    assert credential_store[test_key] == test_value

    # Delete value
    del credential_store[test_key]

    # Try to get values from filled store
    assert test_key not in credential_store
    assert credential_store.get(test_key) is None
    assert credential_store.get_value(test_key) is None


def test_jwt_credential() -> None:
    """Test get/set with jwt credential."""
    credential_store = CredentialStore()
    test_key = "test"

    # Try to get value from empty store
    assert test_key not in credential_store
    assert not credential_store.get(test_key)
    with pytest.raises(KeyError):
        credential_store[test_key]

    # Set value
    test_value = JWTCredential(get_jwt())
    credential_store[test_key] = test_value

    # Try to get values from filled store
    assert test_key in credential_store
    assert credential_store.get(test_key) == test_value
    assert credential_store.get_value(test_key) == test_value.value
    assert credential_store[test_key] == test_value

    # Try again with expired
    expired_time = time.time() + 3600
    with mock.patch("time.time", mock.MagicMock(return_value=expired_time)):
        assert test_key not in credential_store
        assert credential_store.get_value(test_key) is None
        assert not credential_store.get(test_key)
        with pytest.raises(KeyError):
            credential_store[test_key]


def test_clear() -> None:
    """Test clearance of credential store."""
    credential_store = CredentialStore()
    test_key = "test"
    test_permanent_key = "locale"

    # Try to get value from empty store
    assert test_key not in credential_store
    assert test_permanent_key not in credential_store

    # Set value
    test_value = Credential("test_value")
    test_pemanent_value = Credential("test_locale")
    credential_store[test_key] = test_value
    credential_store[test_permanent_key] = test_pemanent_value

    # Try to get values from filled store
    assert test_key in credential_store
    assert credential_store[test_key] == test_value
    assert test_permanent_key in credential_store
    assert credential_store[test_permanent_key] == test_pemanent_value

    # Clear the store
    credential_store.clear()

    # Try to get values from filled store
    assert test_key not in credential_store
    assert test_permanent_key in credential_store
    assert credential_store[test_permanent_key] == test_pemanent_value


def test_clear_keys() -> None:
    """Test clearance of specified keys from credential store."""
    credential_store = CredentialStore()
    test_key = "test"
    test_permanent_key = "locale"

    # Try to get value from empty store
    assert test_key not in credential_store
    assert test_permanent_key not in credential_store

    # Set value
    test_value = Credential("test_value")
    test_pemanent_value = Credential("test_locale")
    credential_store[test_key] = test_value
    credential_store[test_permanent_key] = test_pemanent_value

    # Try to get values from filled store
    assert test_key in credential_store
    assert credential_store[test_key] == test_value
    assert test_permanent_key in credential_store
    assert credential_store[test_permanent_key] == test_pemanent_value

    # Clear the store
    credential_store.clear_keys([test_permanent_key])

    # Try to get values from filled store
    assert test_key in credential_store
    assert test_permanent_key not in credential_store


def test_file_store() -> None:
    """Test file credential store."""
    with tempfile.TemporaryDirectory() as tmpdirname:
        # Prepare initial store
        old_filename = f"{tmpdirname}/.credentials/renault-api.json"
        old_credential_store = FileCredentialStore(old_filename)
        test_key = "key"
        test_value = Credential("value")
        test_jwt_key = "gigya_jwt"
        test_jwt_value = JWTCredential(get_jwt())
        old_credential_store[test_key] = test_value
        old_credential_store[test_jwt_key] = test_jwt_value

        assert test_key in old_credential_store
        assert old_credential_store.get(test_key) == test_value
        assert old_credential_store[test_key] == test_value
        assert test_jwt_key in old_credential_store
        assert old_credential_store.get(test_jwt_key) == test_jwt_value
        assert old_credential_store[test_jwt_key] == test_jwt_value

        # Copy the data into new file
        new_filename = f"{tmpdirname}/.credentials/renault-api-copy.json"
        copyfile(old_filename, new_filename)
        new_credential_store = FileCredentialStore(new_filename)

        # Check that the data is in the new store
        assert test_key in new_credential_store
        assert new_credential_store.get(test_key) == test_value
        assert new_credential_store[test_key] == test_value
        assert test_jwt_key in new_credential_store
        assert new_credential_store.get(test_jwt_key) == test_jwt_value
        assert new_credential_store[test_jwt_key] == test_jwt_value


def test_file_store_expired_token() -> None:
    """Test loading expired token from credential store."""
    with tempfile.TemporaryDirectory() as tmpdirname:
        # Prepare initial store
        expired_token = get_jwt(timedelta(seconds=-900))

        old_filename = f"{tmpdirname}/.credentials/renault-api.json"
        old_credential_store = FileCredentialStore(old_filename)
        test_key = "key"
        test_value = Credential("value")
        test_jwt_key = "gigya_jwt"
        test_jwt_value = Credential(expired_token)  # bypass JWTCredential
        old_credential_store[test_key] = test_value
        old_credential_store[test_jwt_key] = test_jwt_value

        assert test_key in old_credential_store
        assert old_credential_store.get(test_key) == test_value
        assert old_credential_store[test_key] == test_value
        assert test_jwt_key in old_credential_store
        assert old_credential_store.get(test_jwt_key) == test_jwt_value
        assert old_credential_store[test_jwt_key] == test_jwt_value

        # Copy the data into new file
        new_filename = f"{tmpdirname}/.credentials/renault-api-copy.json"
        copyfile(old_filename, new_filename)
        new_credential_store = FileCredentialStore(new_filename)

        # Check that the data is in the new store
        assert test_key in new_credential_store
        assert new_credential_store.get(test_key) == test_value
        assert new_credential_store[test_key] == test_value

        # Except the JWT token which was rejected on load
        assert test_jwt_key not in new_credential_store