Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Der-Henning
GitHub Repository: Der-Henning/tgtg
Path: blob/main/tests/test_tgtg.py
725 views
1
import json
2
import pathlib
3
import re
4
from os import environ
5
from urllib.parse import urljoin
6
7
import pytest
8
import responses
9
from pytest_mock.plugin import MockerFixture
10
11
from tgtg_scanner.models import Config
12
from tgtg_scanner.tgtg.tgtg_client import (
13
API_ITEM_ENDPOINT,
14
AUTH_BY_EMAIL_ENDPOINT,
15
AUTH_POLLING_ENDPOINT,
16
BASE_URL,
17
FAVORITE_ITEM_ENDPOINT,
18
REFRESH_ENDPOINT,
19
USER_AGENTS,
20
TgtgClient,
21
)
22
23
24
def test_get_latest_apk_version():
25
pattern = re.compile("^[0-9]+.[0-9]+.[0-9]+$")
26
apk_version = TgtgClient.get_latest_apk_version()
27
assert pattern.match(apk_version)
28
29
30
def test_get_user_agent(mocker: MockerFixture):
31
apk_version = "22.11.11"
32
mocker.patch(
33
"tgtg_scanner.tgtg.tgtg_client.TgtgClient.get_latest_apk_version",
34
return_value=apk_version,
35
)
36
client = TgtgClient(email="[email protected]")
37
user_agent = client._get_user_agent()
38
assert user_agent in [agent.format(apk_version) for agent in USER_AGENTS]
39
40
41
@responses.activate
42
def test_tgtg_login_with_mail(mocker: MockerFixture):
43
mocker.patch(
44
"tgtg_scanner.tgtg.tgtg_client.TgtgClient.get_latest_apk_version",
45
return_value="22.11.11",
46
)
47
client = TgtgClient(email="[email protected]", polling_wait_time=1)
48
auth_response_data = {
49
"state": "WAIT",
50
"polling_id": "009350f7-650a-43d0-ab2c-2ff0676c9626",
51
}
52
poll_response_data = {
53
"access_token": "new_access_token",
54
"access_token_ttl_seconds": 172800,
55
"refresh_token": "new_refresh_token",
56
}
57
responses.add(
58
responses.POST,
59
urljoin(BASE_URL, AUTH_BY_EMAIL_ENDPOINT),
60
json.dumps(auth_response_data),
61
status=200,
62
)
63
responses.add(
64
responses.POST,
65
urljoin(BASE_URL, AUTH_POLLING_ENDPOINT),
66
status=202,
67
)
68
responses.add(
69
responses.POST,
70
urljoin(BASE_URL, AUTH_POLLING_ENDPOINT),
71
json.dumps(poll_response_data),
72
status=200,
73
)
74
client.login()
75
assert client.access_token == poll_response_data.get("access_token")
76
assert client.refresh_token == poll_response_data.get("refresh_token")
77
assert json.loads(responses.calls[1].request.body) == {
78
"device_type": client.device_type,
79
"email": client.email,
80
"request_polling_id": auth_response_data.get("polling_id"),
81
}
82
83
84
@responses.activate
85
def test_tgtg_login_with_token(mocker: MockerFixture):
86
mocker.patch(
87
"tgtg_scanner.tgtg.tgtg_client.TgtgClient.get_latest_apk_version",
88
return_value="22.11.11",
89
)
90
client = TgtgClient(
91
email="[email protected]",
92
access_token="old_access_token",
93
refresh_token="old_refresh_token",
94
)
95
response_data = {
96
"access_token": "new_access_token",
97
"access_token_ttl_seconds": 172800,
98
"refresh_token": "new_refresh_token",
99
}
100
responses.add(
101
responses.POST,
102
urljoin(BASE_URL, REFRESH_ENDPOINT),
103
json.dumps(response_data),
104
status=200,
105
)
106
client.login()
107
assert client.access_token == response_data.get("access_token")
108
assert client.refresh_token == response_data.get("refresh_token")
109
110
111
@responses.activate
112
def test_tgtg_get_items(mocker: MockerFixture, tgtg_item: dict):
113
mocker.patch(
114
"tgtg_scanner.tgtg.tgtg_client.TgtgClient.get_latest_apk_version",
115
return_value="22.11.11",
116
)
117
mocker.patch("tgtg_scanner.tgtg.tgtg_client.TgtgClient.login", return_value=None)
118
responses.add(
119
responses.POST,
120
urljoin(BASE_URL, API_ITEM_ENDPOINT),
121
json.dumps({"items": [tgtg_item]}),
122
status=200,
123
)
124
client = TgtgClient(
125
email="[email protected]",
126
access_token="access_token",
127
refresh_token="refresh_token",
128
)
129
response = client.get_items(favorites_only=True)
130
assert response == [tgtg_item]
131
132
133
@responses.activate
134
def test_tgtg_get_item(mocker: MockerFixture, tgtg_item: dict):
135
mocker.patch(
136
"tgtg_scanner.tgtg.tgtg_client.TgtgClient.get_latest_apk_version",
137
return_value="22.11.11",
138
)
139
mocker.patch("tgtg_scanner.tgtg.tgtg_client.TgtgClient.login", return_value=None)
140
item_id = tgtg_item.get("item", {}).get("item_id")
141
responses.add(
142
responses.POST,
143
urljoin(BASE_URL, API_ITEM_ENDPOINT + item_id),
144
json.dumps(tgtg_item),
145
status=200,
146
)
147
client = TgtgClient(
148
email="[email protected]",
149
access_token="access_token",
150
refresh_token="refresh_token",
151
)
152
response = client.get_item(item_id)
153
assert response == tgtg_item
154
155
156
@responses.activate
157
def test_tgtg_set_favorite(mocker: MockerFixture):
158
mocker.patch(
159
"tgtg_scanner.tgtg.tgtg_client.TgtgClient.get_latest_apk_version",
160
return_value="22.11.11",
161
)
162
mocker.patch("tgtg_scanner.tgtg.tgtg_client.TgtgClient.login", return_value=None)
163
item_id = "12345"
164
responses.add(
165
responses.POST,
166
urljoin(BASE_URL, FAVORITE_ITEM_ENDPOINT.format(item_id)),
167
json.dumps({"is_favorite": True}),
168
status=200,
169
)
170
client = TgtgClient(
171
email="[email protected]",
172
access_token="access_token",
173
refresh_token="refresh_token",
174
)
175
client.set_favorite(item_id, True)
176
assert json.loads(responses.calls[0].request.body) == {"is_favorite": True}
177
178
179
@pytest.mark.tgtg_api
180
def test_tgtg_api(item_properties: dict):
181
if pathlib.Path("config.ini").is_file():
182
config = Config("config.ini")
183
else:
184
config = Config()
185
186
env_file = environ.get("GITHUB_ENV", None)
187
188
client = TgtgClient(
189
email=config.tgtg.username,
190
timeout=config.tgtg.timeout,
191
access_token_lifetime=config.tgtg.access_token_lifetime,
192
max_polling_tries=config.tgtg.max_polling_tries,
193
polling_wait_time=config.tgtg.polling_wait_time,
194
access_token=config.tgtg.access_token,
195
refresh_token=config.tgtg.refresh_token,
196
datadome_cookie=config.tgtg.datadome,
197
)
198
199
# get credentials and safe tokens to GITHUB_ENV file
200
# this enables github workflow to reuse the access_token on sheduled runs
201
if env_file:
202
credentials = client.get_credentials()
203
with open(env_file, "a", encoding="utf-8") as file:
204
file.write(f"TGTG_ACCESS_TOKEN={credentials['access_token']}\n")
205
file.write(f"TGTG_REFRESH_TOKEN={credentials['refresh_token']}\n")
206
file.write(f"TGTG_COOKIE={credentials['datadome_cookie']}\n")
207
208
# Tests
209
items = client.get_items(favorites_only=True)
210
assert len(items) > 0
211
item = items[0]
212
item_id = item.get("item", {}).get("item_id")
213
for prop in item_properties.get("GLOBAL_PROPERTIES", []):
214
assert prop in item
215
for prop in item_properties.get("ITEM_PROPERTIES", []):
216
assert prop in item.get("item", {})
217
for prop in item_properties.get("PRICE_PROPERTIES", []):
218
assert prop in item.get("item", {}).get("price_including_taxes")
219
220
client.set_favorite(item_id, False)
221
client.set_favorite(item_id, True)
222
223
item = client.get_item(item_id)
224
225
assert item.get("item", {}).get("item_id") == item_id
226
227