Skip to content

Commit 25b4eb6

Browse files
Add missing unit tests
1 parent 2995cc6 commit 25b4eb6

3 files changed

Lines changed: 197 additions & 1 deletion

File tree

test/simplejustwatchapi/test_graphql.py

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
graphql_details_query,
55
graphql_episodes_query,
66
graphql_offers_for_countries_query,
7+
graphql_popular_query,
8+
graphql_providers_query,
79
graphql_search_query,
810
graphql_seasons_query,
911
)
@@ -41,6 +43,39 @@
4143
}
4244
"""
4345

46+
GRAPHQL_POPULAR_QUERY = """
47+
query GetPopularTitles(
48+
$popularTitlesFilter: TitleFilter
49+
$country: Country!
50+
$language: Language!
51+
$first: Int! = 70
52+
$formatPoster: ImageFormat,
53+
$formatOfferIcon: ImageFormat,
54+
$profile: PosterProfile
55+
$backdropProfile: BackdropProfile,
56+
$filter: OfferFilter!,
57+
$offset: Int = 0
58+
) {
59+
popularTitles(
60+
country: $country
61+
filter: $popularTitlesFilter
62+
first: $first
63+
sortBy: POPULAR
64+
sortRandomSeed: 0
65+
offset: $offset
66+
) {
67+
__typename
68+
edges {
69+
node {
70+
...TitleDetails
71+
__typename
72+
}
73+
__typename
74+
}
75+
}
76+
}
77+
"""
78+
4479
GRAPHQL_DETAILS_QUERY = """
4580
query GetTitleNode(
4681
$nodeId: ID!,
@@ -106,6 +141,22 @@
106141
}
107142
"""
108143

144+
GRAPHQL_PROVIDERS_QUERY = """
145+
query GetProviders(
146+
$country: Country!,
147+
$formatOfferIcon: ImageFormat
148+
) {
149+
packages(
150+
country: $country
151+
platform: WEB
152+
includeAddons: true
153+
) {
154+
... PackageDetails
155+
}
156+
__typename
157+
}
158+
"""
159+
109160
GRAPHQL_OFFERS_BY_COUNTRY_QUERY = """
110161
query GetTitleOffers(
111162
$nodeId: ID!,
@@ -277,6 +328,23 @@ def test_graphql_search_query():
277328
assert expected_query == query
278329

279330

331+
def test_graphql_popular_query():
332+
expected_query = (
333+
GRAPHQL_POPULAR_QUERY
334+
+ GRAPHQL_DETAILS_FRAGMENT
335+
+ GRAPHQL_OFFER_FRAGMENT
336+
+ GRAPHQL_PACKAGE_FRAGMENT
337+
)
338+
query = graphql_popular_query()
339+
assert expected_query == query
340+
341+
342+
def test_graphql_providers_query():
343+
expected_query = GRAPHQL_PROVIDERS_QUERY + GRAPHQL_PACKAGE_FRAGMENT
344+
query = graphql_providers_query()
345+
assert expected_query == query
346+
347+
280348
def test_graphql_details_query():
281349
expected_query = (
282350
GRAPHQL_DETAILS_QUERY

test/simplejustwatchapi/test_justwatch.py

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,24 @@
22

33
from pytest import fixture, mark
44

5-
from simplejustwatchapi.justwatch import details, episodes, offers_for_countries, search, seasons
5+
from simplejustwatchapi.justwatch import (
6+
details,
7+
episodes,
8+
offers_for_countries,
9+
popular,
10+
providers,
11+
search,
12+
seasons,
13+
)
614

715
JUSTWATCH_GRAPHQL_URL = "https://apis.justwatch.com/graphql"
816

917
SEARCH_INPUT = ("TITLE", "COUNTRY", "LANGUAGE", 5, True, 10, ["prov1", "prov2"])
18+
POPULAR_INPUT = ("COUNTRY", "LANGUAGE", 5, True, 10, ["prov1", "prov2"])
1019
DETAILS_INPUT = ("NODE ID", "COUNTRY", "LANGUAGE", False)
1120
OFFERS_COUNTRIES_INPUT = {"COUNTRY1", "COUNTRY2", "COUNTRY3"}
1221
OFFERS_INPUT = ("NODE ID", OFFERS_COUNTRIES_INPUT, "LANGUAGE", True)
22+
PROVIDERS_INPUT = "US"
1323

1424
DUMMY_REQUEST = {"dummy": "request"}
1525
DUMMY_RESPONSE = {"dummy": "response"}
@@ -34,6 +44,15 @@ def test_search(requests_mock, parser_mock, httpx_post_mock):
3444
assert results == DUMMY_ENTRIES
3545

3646

47+
@patch("simplejustwatchapi.justwatch.parse_popular_response", return_value=DUMMY_ENTRIES)
48+
@patch("simplejustwatchapi.justwatch.prepare_popular_request", return_value=DUMMY_REQUEST)
49+
def test_popular(requests_mock, parser_mock, httpx_post_mock):
50+
results = popular(*POPULAR_INPUT)
51+
requests_mock.assert_called_with(*POPULAR_INPUT)
52+
parser_mock.assert_called_with(DUMMY_RESPONSE)
53+
assert results == DUMMY_ENTRIES
54+
55+
3756
@patch("simplejustwatchapi.justwatch.parse_details_response")
3857
@patch("simplejustwatchapi.justwatch.prepare_details_request", return_value=DUMMY_REQUEST)
3958
@mark.parametrize("parse_results", [DUMMY_ENTRIES, None])
@@ -91,3 +110,12 @@ def test_offers_for_countries_returns_empty_dict_for_empty_countries_set(
91110
requests_mock.assert_not_called()
92111
parser_mock.assert_not_called()
93112
httpx_post_mock.assert_not_called()
113+
114+
115+
@patch("simplejustwatchapi.justwatch.parse_providers_response", return_value=DUMMY_ENTRIES)
116+
@patch("simplejustwatchapi.justwatch.prepare_providers_request", return_value=DUMMY_REQUEST)
117+
def test_providers(requests_mock, parser_mock, httpx_post_mock):
118+
results = providers(PROVIDERS_INPUT)
119+
requests_mock.assert_called_with(PROVIDERS_INPUT)
120+
parser_mock.assert_called_with(DUMMY_RESPONSE)
121+
assert results == DUMMY_ENTRIES

test/simplejustwatchapi/test_request.py

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,19 @@
77
prepare_details_request,
88
prepare_episodes_request,
99
prepare_offers_for_countries_request,
10+
prepare_popular_request,
11+
prepare_providers_request,
1012
prepare_search_request,
1113
prepare_seasons_request,
1214
)
1315

1416
DUMMY_SEARCH_QUERY = "A DUMMY SEARCH QUERY"
17+
DUMMY_POPULAR_QUERY = "A DUMMY POPULAR QUERY"
1518
DUMMY_DETAILS_QUERY = "A DUMMY DETAILS QUERY"
1619
DUMMY_SEASONS_QUERY = "A DUMMY SEASONS QUERY"
1720
DUMMY_EPISODES_QUERY = "A DUMMY EPISODES QUERY"
1821
DUMMY_OFFERS_FOR_COUNTRIES_QUERY = "A DUMMY OFFERS FOR COUNTRIES QUERY"
22+
DUMMY_PROVIDERS_QUERY = "A DUMMY PROVIDERS QUERY"
1923

2024

2125
@patch("simplejustwatchapi.query.graphql_search_query", return_value=DUMMY_SEARCH_QUERY)
@@ -78,6 +82,65 @@ def test_prepare_search_request_asserts_on_invalid_country_code(
7882
query_mock.assert_not_called()
7983

8084

85+
@patch("simplejustwatchapi.query.graphql_popular_query", return_value=DUMMY_POPULAR_QUERY)
86+
@mark.parametrize(
87+
argnames=("country", "language", "count", "best_only", "offset", "providers"),
88+
argvalues=[
89+
("US", "language 1", 5, True, 0, ""),
90+
("gb", "language 2", 10, False, 20, ["provider1", "provider2"]),
91+
("fr", "language 3", 20, True, 20, "provider3"),
92+
("it", "language 4", 30, True, 30, []),
93+
("dk", "language 5", 40, True, 40, None),
94+
],
95+
)
96+
def test_prepare_popular_request(
97+
_,
98+
country: str,
99+
language: str,
100+
count: int,
101+
best_only: bool,
102+
offset: int,
103+
providers: list[str] | str | None,
104+
):
105+
expected_request = {
106+
"operationName": "GetPopularTitles",
107+
"variables": {
108+
"first": count,
109+
"popularTitlesFilter": {"packages": providers},
110+
"language": language,
111+
"country": country.upper(),
112+
"formatPoster": "JPG",
113+
"formatOfferIcon": "PNG",
114+
"profile": "S718",
115+
"backdropProfile": "S1920",
116+
"filter": {"bestOnly": best_only},
117+
"offset": offset or None,
118+
},
119+
"query": DUMMY_POPULAR_QUERY,
120+
}
121+
request = prepare_popular_request(country, language, count, best_only, offset, providers)
122+
assert expected_request == request
123+
124+
125+
@patch("simplejustwatchapi.query.graphql_search_query")
126+
@mark.parametrize(
127+
argnames="invalid_code",
128+
argvalues=[
129+
"United Stated of America", # too long
130+
"usa", # too long
131+
"u", # too short
132+
],
133+
)
134+
def test_prepare_popular_request_asserts_on_invalid_country_code(
135+
query_mock: MagicMock, invalid_code: str
136+
):
137+
expected_error_message = f"Invalid country code: {invalid_code}, code must be 2 characters long"
138+
with raises(AssertionError) as error:
139+
prepare_popular_request(invalid_code, "", 1, True, 2, None)
140+
assert str(error.value) == expected_error_message
141+
query_mock.assert_not_called()
142+
143+
81144
@patch("simplejustwatchapi.query.graphql_details_query", return_value=DUMMY_DETAILS_QUERY)
82145
@mark.parametrize(
83146
argnames=("node_id", "country", "language", "best_only"),
@@ -282,3 +345,40 @@ def test_prepare_offers_for_countries_request_asserts_on_empty_countries_set(que
282345
prepare_offers_for_countries_request("", set(), "", True)
283346
assert str(error.value) == expected_error_message
284347
query_mock.assert_not_called()
348+
349+
350+
@patch("simplejustwatchapi.query.graphql_providers_query", return_value=DUMMY_PROVIDERS_QUERY)
351+
@mark.parametrize(
352+
argnames=("country"),
353+
argvalues=["US", "gb", "fR", "It"],
354+
)
355+
def test_prepare_providers_request(_, country: str):
356+
expected_request = {
357+
"operationName": "GetProviders",
358+
"variables": {
359+
"country": country.upper(),
360+
"formatOfferIcon": "PNG",
361+
},
362+
"query": DUMMY_PROVIDERS_QUERY,
363+
}
364+
request = prepare_providers_request(country)
365+
assert expected_request == request
366+
367+
368+
@patch("simplejustwatchapi.query.graphql_search_query")
369+
@mark.parametrize(
370+
argnames="invalid_code",
371+
argvalues=[
372+
"United Stated of America", # too long
373+
"usa", # too long
374+
"u", # too short
375+
],
376+
)
377+
def test_prepare_providers_request_asserts_on_invalid_country_code(
378+
query_mock: MagicMock, invalid_code: str
379+
):
380+
expected_error_message = f"Invalid country code: {invalid_code}, code must be 2 characters long"
381+
with raises(AssertionError) as error:
382+
prepare_providers_request(invalid_code)
383+
assert str(error.value) == expected_error_message
384+
query_mock.assert_not_called()

0 commit comments

Comments
 (0)