Skip to content

Commit 1ad8a1f

Browse files
Group ExecuteOptions unit tests into a TestExecuteOptions class
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 parent a39cb92 commit 1ad8a1f

1 file changed

Lines changed: 95 additions & 103 deletions

File tree

tests/pyathena/test_options.py

Lines changed: 95 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -5,107 +5,99 @@
55
from pyathena.options import ExecuteOptions
66

77

8-
def test_execute_options_defaults():
9-
options = ExecuteOptions()
10-
assert options.work_group is None
11-
assert options.s3_staging_dir is None
12-
assert options.cache_size == 0
13-
assert options.cache_expiration_time == 0
14-
assert options.result_reuse_enable is None
15-
assert options.result_reuse_minutes is None
16-
assert options.paramstyle is None
17-
assert options.on_start_query_execution is None
18-
assert options.result_set_type_hints is None
19-
20-
21-
def test_execute_options_is_frozen():
22-
options = ExecuteOptions()
23-
with pytest.raises(dataclasses.FrozenInstanceError):
24-
options.work_group = "primary" # type: ignore[misc]
25-
26-
27-
def test_merge_ignores_none_overrides():
28-
options = ExecuteOptions(work_group="primary", cache_size=100)
29-
merged = options.merge(work_group=None, cache_size=None, s3_staging_dir=None)
30-
assert merged.work_group == "primary"
31-
assert merged.cache_size == 100
32-
assert merged.s3_staging_dir is None
33-
34-
35-
def test_merge_overrides_take_precedence():
36-
options = ExecuteOptions(
37-
work_group="primary",
38-
cache_size=100,
39-
result_reuse_enable=True,
40-
paramstyle="pyformat",
41-
)
42-
merged = options.merge(
43-
work_group="adhoc",
44-
cache_size=0,
45-
result_reuse_enable=False,
46-
paramstyle="qmark",
8+
class TestExecuteOptions:
9+
def test_defaults(self):
10+
options = ExecuteOptions()
11+
assert options.work_group is None
12+
assert options.s3_staging_dir is None
13+
assert options.cache_size == 0
14+
assert options.cache_expiration_time == 0
15+
assert options.result_reuse_enable is None
16+
assert options.result_reuse_minutes is None
17+
assert options.paramstyle is None
18+
assert options.on_start_query_execution is None
19+
assert options.result_set_type_hints is None
20+
21+
def test_is_frozen(self):
22+
options = ExecuteOptions()
23+
with pytest.raises(dataclasses.FrozenInstanceError):
24+
options.work_group = "primary" # type: ignore[misc]
25+
26+
def test_merge_ignores_none_overrides(self):
27+
options = ExecuteOptions(work_group="primary", cache_size=100)
28+
merged = options.merge(work_group=None, cache_size=None, s3_staging_dir=None)
29+
assert merged.work_group == "primary"
30+
assert merged.cache_size == 100
31+
assert merged.s3_staging_dir is None
32+
33+
def test_merge_overrides_take_precedence(self):
34+
options = ExecuteOptions(
35+
work_group="primary",
36+
cache_size=100,
37+
result_reuse_enable=True,
38+
paramstyle="pyformat",
39+
)
40+
merged = options.merge(
41+
work_group="adhoc",
42+
cache_size=0,
43+
result_reuse_enable=False,
44+
paramstyle="qmark",
45+
)
46+
assert merged.work_group == "adhoc"
47+
assert merged.cache_size == 0
48+
assert merged.result_reuse_enable is False
49+
assert merged.paramstyle == "qmark"
50+
51+
def test_merge_does_not_mutate_original(self):
52+
options = ExecuteOptions(work_group="primary")
53+
merged = options.merge(work_group="adhoc")
54+
assert options.work_group == "primary"
55+
assert merged is not options
56+
57+
def test_merge_without_applied_overrides_is_equal(self):
58+
options = ExecuteOptions(work_group="primary")
59+
assert options.merge() == options
60+
assert options.merge(work_group=None) == options
61+
62+
def test_merge_raises_on_unknown_field(self):
63+
with pytest.raises(TypeError, match="unknown_field"):
64+
ExecuteOptions().merge(unknown_field="value")
65+
66+
@pytest.mark.parametrize(
67+
("base", "overrides", "expected"),
68+
[
69+
# Overrides fill in unset fields
70+
(
71+
{},
72+
{"work_group": "wg", "result_reuse_minutes": 5},
73+
{"work_group": "wg", "result_reuse_minutes": 5},
74+
),
75+
# False is a real value and must override
76+
(
77+
{"result_reuse_enable": True},
78+
{"result_reuse_enable": False},
79+
{"result_reuse_enable": False},
80+
),
81+
# 0 is a real value and must override
82+
({"cache_size": 100}, {"cache_size": 0}, {"cache_size": 0}),
83+
# Callbacks and hints pass through
84+
(
85+
{"result_set_type_hints": {"tags": "array(varchar)"}},
86+
{"result_set_type_hints": {"tags": "map(varchar, integer)"}},
87+
{"result_set_type_hints": {"tags": "map(varchar, integer)"}},
88+
),
89+
],
4790
)
48-
assert merged.work_group == "adhoc"
49-
assert merged.cache_size == 0
50-
assert merged.result_reuse_enable is False
51-
assert merged.paramstyle == "qmark"
52-
53-
54-
def test_merge_does_not_mutate_original():
55-
options = ExecuteOptions(work_group="primary")
56-
merged = options.merge(work_group="adhoc")
57-
assert options.work_group == "primary"
58-
assert merged is not options
59-
60-
61-
def test_merge_without_applied_overrides_is_equal():
62-
options = ExecuteOptions(work_group="primary")
63-
assert options.merge() == options
64-
assert options.merge(work_group=None) == options
65-
66-
67-
def test_resolve_with_none_returns_defaults_with_overrides():
68-
resolved = ExecuteOptions.resolve(None, work_group="wg")
69-
assert resolved == ExecuteOptions(work_group="wg")
70-
71-
72-
def test_resolve_applies_overrides_to_given_options():
73-
options = ExecuteOptions(work_group="primary", cache_size=100)
74-
resolved = ExecuteOptions.resolve(options, work_group="adhoc", cache_size=None)
75-
assert resolved == ExecuteOptions(work_group="adhoc", cache_size=100)
76-
77-
78-
def test_merge_raises_on_unknown_field():
79-
with pytest.raises(TypeError, match="unknown_field"):
80-
ExecuteOptions().merge(unknown_field="value")
81-
82-
83-
@pytest.mark.parametrize(
84-
("base", "overrides", "expected"),
85-
[
86-
# Overrides fill in unset fields
87-
(
88-
{},
89-
{"work_group": "wg", "result_reuse_minutes": 5},
90-
{"work_group": "wg", "result_reuse_minutes": 5},
91-
),
92-
# False is a real value and must override
93-
(
94-
{"result_reuse_enable": True},
95-
{"result_reuse_enable": False},
96-
{"result_reuse_enable": False},
97-
),
98-
# 0 is a real value and must override
99-
({"cache_size": 100}, {"cache_size": 0}, {"cache_size": 0}),
100-
# Callbacks and hints pass through
101-
(
102-
{"result_set_type_hints": {"tags": "array(varchar)"}},
103-
{"result_set_type_hints": {"tags": "map(varchar, integer)"}},
104-
{"result_set_type_hints": {"tags": "map(varchar, integer)"}},
105-
),
106-
],
107-
)
108-
def test_merge_precedence(base, overrides, expected):
109-
merged = ExecuteOptions(**base).merge(**overrides)
110-
for name, value in expected.items():
111-
assert getattr(merged, name) == value
91+
def test_merge_precedence(self, base, overrides, expected):
92+
merged = ExecuteOptions(**base).merge(**overrides)
93+
for name, value in expected.items():
94+
assert getattr(merged, name) == value
95+
96+
def test_resolve_with_none_returns_defaults_with_overrides(self):
97+
resolved = ExecuteOptions.resolve(None, work_group="wg")
98+
assert resolved == ExecuteOptions(work_group="wg")
99+
100+
def test_resolve_applies_overrides_to_given_options(self):
101+
options = ExecuteOptions(work_group="primary", cache_size=100)
102+
resolved = ExecuteOptions.resolve(options, work_group="adhoc", cache_size=None)
103+
assert resolved == ExecuteOptions(work_group="adhoc", cache_size=100)

0 commit comments

Comments
 (0)