Skip to content

Commit 96b29a0

Browse files
committed
Fix arrow v2 unit testing
* remove usage of unittest * avoid skipping too many tests
1 parent 29dd84e commit 96b29a0

File tree

5 files changed

+104
-102
lines changed

5 files changed

+104
-102
lines changed

graphdatascience/tests/integrationV2/conftest.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ def pytest_collection_modifyitems(config: Any, items: Any) -> None:
99
if not config.getoption("--include-integration-v2"):
1010
skip_v2 = pytest.mark.skip(reason="need --include-integration-v2 option to run")
1111
for item in items:
12-
item.add_marker(skip_v2)
12+
# otherwise would also skip lots of other test
13+
if "integrationV2" in str(item.fspath):
14+
item.add_marker(skip_v2)
1315

1416

1517
# best used with pytest --basetemp=tmp/pytest for easy access to logs
Lines changed: 80 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -1,109 +1,112 @@
11
import json
2-
import unittest
3-
from unittest.mock import MagicMock
2+
3+
from pytest_mock import MockerFixture
44

55
from graphdatascience.arrow_client.v2.api_types import JobIdConfig, JobStatus
66
from graphdatascience.arrow_client.v2.job_client import JobClient
77
from graphdatascience.tests.unit.arrow_client.arrow_test_utils import ArrowTestResult
88

99

10-
class TestJobClient(unittest.TestCase):
11-
def setUp(self) -> None:
12-
self.mock_client = MagicMock()
10+
def test_run_job(mocker: MockerFixture) -> None:
11+
mock_client = mocker.Mock()
12+
job_id = "test-job-123"
13+
endpoint = "v2/test.endpoint"
14+
config = {"param1": "value1", "param2": 42}
15+
16+
mock_client.do_action_with_retry.return_value = iter([ArrowTestResult({"jobId": job_id})])
17+
18+
result = JobClient.run_job(mock_client, endpoint, config)
19+
20+
expected_config = json.dumps(config).encode("utf-8")
21+
mock_client.do_action_with_retry.assert_called_once_with(endpoint, expected_config)
22+
assert result == job_id
1323

14-
def test_run_job(self) -> None:
15-
job_id = "test-job-123"
16-
endpoint = "v2/test.endpoint"
17-
config = {"param1": "value1", "param2": 42}
1824

19-
self.mock_client.do_action_with_retry.return_value = iter([ArrowTestResult({"jobId": job_id})])
25+
def test_run_job_and_wait(mocker: MockerFixture) -> None:
26+
mock_client = mocker.Mock()
27+
job_id = "test-job-456"
28+
endpoint = "v2/test.endpoint"
29+
config = {"param": "value"}
2030

21-
result = JobClient.run_job(self.mock_client, endpoint, config)
31+
job_id_config = JobIdConfig(jobId=job_id)
2232

23-
expected_config = json.dumps(config).encode("utf-8")
24-
self.mock_client.do_action_with_retry.assert_called_once_with(endpoint, expected_config)
25-
self.assertEqual(result, job_id)
33+
status = JobStatus(
34+
jobId=job_id,
35+
progress=1.0,
36+
status="Done",
37+
)
2638

27-
def test_run_job_and_wait(
28-
self,
29-
) -> None:
30-
job_id = "test-job-456"
31-
endpoint = "v2/test.endpoint"
32-
config = {"param": "value"}
39+
do_action_with_retry = mocker.Mock()
40+
do_action_with_retry.side_effect = [
41+
iter([ArrowTestResult(job_id_config.dump_camel())]),
42+
iter([ArrowTestResult(status.dump_camel())]),
43+
]
3344

34-
job_id_config = JobIdConfig(jobId=job_id)
45+
mock_client.do_action_with_retry = do_action_with_retry
3546

36-
status = JobStatus(
37-
jobId=job_id,
38-
progress=1.0,
39-
status="Done",
40-
)
47+
result = JobClient.run_job_and_wait(mock_client, endpoint, config)
4148

42-
do_action_with_retry = MagicMock()
43-
do_action_with_retry.side_effect = [
44-
iter([ArrowTestResult(job_id_config.dump_camel())]),
45-
iter([ArrowTestResult(status.dump_camel())]),
46-
]
49+
do_action_with_retry.assert_called_with("v2/jobs.status", job_id_config.dump_json().encode("utf-8"))
50+
assert result == job_id
4751

48-
self.mock_client.do_action_with_retry = do_action_with_retry
4952

50-
result = JobClient.run_job_and_wait(self.mock_client, endpoint, config)
53+
def test_wait_for_job_completes_immediately(mocker: MockerFixture) -> None:
54+
mock_client = mocker.Mock()
55+
job_id = "test-job-789"
5156

52-
do_action_with_retry.assert_called_with("v2/jobs.status", job_id_config.dump_json().encode("utf-8"))
53-
self.assertEqual(result, job_id)
57+
status = JobStatus(
58+
jobId=job_id,
59+
progress=1.0,
60+
status="Done",
61+
)
5462

55-
def test_wait_for_job_completes_immediately(self) -> None:
56-
job_id = "test-job-789"
63+
mock_client.do_action_with_retry.return_value = iter([ArrowTestResult(status.dump_camel())])
5764

58-
status = JobStatus(
59-
jobId=job_id,
60-
progress=1.0,
61-
status="Done",
62-
)
65+
JobClient.wait_for_job(mock_client, job_id)
6366

64-
self.mock_client.do_action_with_retry.return_value = iter([ArrowTestResult(status.dump_camel())])
67+
mock_client.do_action_with_retry.assert_called_once_with(
68+
"v2/jobs.status", JobIdConfig(jobId=job_id).dump_json().encode("utf-8")
69+
)
6570

66-
JobClient.wait_for_job(self.mock_client, job_id)
6771

68-
self.mock_client.do_action_with_retry.assert_called_once_with(
69-
"v2/jobs.status", JobIdConfig(jobId=job_id).dump_json().encode("utf-8")
70-
)
72+
def test_wait_for_job_waits_for_completion(mocker: MockerFixture) -> None:
73+
mock_client = mocker.Mock()
74+
job_id = "test-job-waiting"
75+
status_running = JobStatus(
76+
jobId=job_id,
77+
progress=0.5,
78+
status="RUNNING",
79+
)
80+
status_done = JobStatus(
81+
jobId=job_id,
82+
progress=1.0,
83+
status="Done",
84+
)
7185

72-
def test_wait_for_job_waits_for_completion(self) -> None:
73-
job_id = "test-job-waiting"
74-
status_running = JobStatus(
75-
jobId=job_id,
76-
progress=0.5,
77-
status="RUNNING",
78-
)
79-
status_done = JobStatus(
80-
jobId=job_id,
81-
progress=1.0,
82-
status="Done",
83-
)
86+
do_action_with_retry = mocker.Mock()
87+
do_action_with_retry.side_effect = [
88+
iter([ArrowTestResult(status_running.dump_camel())]),
89+
iter([ArrowTestResult(status_done.dump_camel())]),
90+
]
8491

85-
do_action_with_retry = MagicMock()
86-
do_action_with_retry.side_effect = [
87-
iter([ArrowTestResult(status_running.dump_camel())]),
88-
iter([ArrowTestResult(status_done.dump_camel())]),
89-
]
92+
mock_client.do_action_with_retry = do_action_with_retry
9093

91-
self.mock_client.do_action_with_retry = do_action_with_retry
94+
JobClient.wait_for_job(mock_client, job_id)
9295

93-
JobClient.wait_for_job(self.mock_client, job_id)
96+
assert mock_client.do_action_with_retry.call_count == 2
9497

95-
self.assertEqual(self.mock_client.do_action_with_retry.call_count, 2)
9698

97-
def test_get_summary(self) -> None:
98-
# Setup
99-
job_id = "summary-job-123"
100-
expected_summary = {"nodeCount": 100, "relationshipCount": 200, "requiredMemory": "1GB"}
99+
def test_get_summary(mocker: MockerFixture) -> None:
100+
mock_client = mocker.Mock()
101+
# Setup
102+
job_id = "summary-job-123"
103+
expected_summary = {"nodeCount": 100, "relationshipCount": 200, "requiredMemory": "1GB"}
101104

102-
self.mock_client.do_action_with_retry.return_value = iter([ArrowTestResult(expected_summary)])
105+
mock_client.do_action_with_retry.return_value = iter([ArrowTestResult(expected_summary)])
103106

104-
result = JobClient.get_summary(self.mock_client, job_id)
107+
result = JobClient.get_summary(mock_client, job_id)
105108

106-
self.mock_client.do_action_with_retry.assert_called_once_with(
107-
"v2/results.summary", JobIdConfig(jobId=job_id).dump_json().encode("utf-8")
108-
)
109-
self.assertEqual(result, expected_summary)
109+
mock_client.do_action_with_retry.assert_called_once_with(
110+
"v2/results.summary", JobIdConfig(jobId=job_id).dump_json().encode("utf-8")
111+
)
112+
assert result == expected_summary
Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,25 @@
1-
import unittest
2-
from unittest.mock import MagicMock
1+
import json
2+
3+
from pytest_mock import MockerFixture
34

4-
from graphdatascience.arrow_client.v2.api_types import MutateResult
55
from graphdatascience.arrow_client.v2.mutation_client import MutationClient
66
from graphdatascience.tests.unit.arrow_client.arrow_test_utils import ArrowTestResult
77

88

9-
class TestMutationClient(unittest.TestCase):
10-
def setUp(self) -> None:
11-
self.mock_client = MagicMock()
9+
def test_mutate_node_property_success(mocker: MockerFixture) -> None:
10+
job_id = "test-job-123"
11+
arrow_mutation_result = {"nodePropertiesWritten": 42, "relationshipsWritten": 1337}
1212

13-
def test_mutate_node_property_success(self) -> None:
14-
job_id = "test-job-123"
15-
expected_mutation_result = MutateResult(nodePropertiesWritten=42, relationshipsWritten=1337)
13+
mock_client = mocker.Mock()
14+
mock_client.do_action_with_retry.return_value = iter([ArrowTestResult(arrow_mutation_result)])
1615

17-
self.mock_client.do_action_with_retry.return_value = iter(
18-
[ArrowTestResult(expected_mutation_result.dump_camel())]
19-
)
16+
result = MutationClient.mutate_node_property(mock_client, job_id, "propertyName")
2017

21-
result = MutationClient.mutate_node_property(self.mock_client, job_id, "propertyName")
18+
assert result.node_properties_written == 42
19+
assert result.relationships_written == 1337
20+
assert result.mutate_millis > 0
2221

23-
assert result == expected_mutation_result
22+
args, _ = mock_client.do_action_with_retry.call_args
2423

25-
self.mock_client.do_action_with_retry.assert_called_once_with(
26-
MutationClient.MUTATE_ENDPOINT, b'{"jobId": "test-job-123", "mutateProperty": "propertyName"}'
27-
)
24+
assert args[0] == MutationClient.MUTATE_ENDPOINT
25+
assert json.loads(args[1]) == {"jobId": "test-job-123", "mutateProperty": "propertyName"}

graphdatascience/tests/unit/arrow_client/V2/test_write_back_client.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
from typing import Optional
2-
from unittest.mock import Mock
32

43
import pytest
54
from pandas import DataFrame
5+
from pytest_mock import MockerFixture
66

77
from graphdatascience.arrow_client.authenticated_flight_client import AuthenticatedArrowClient
88
from graphdatascience.arrow_client.v2.write_back_client import WriteBackClient
99
from graphdatascience.tests.unit.conftest import DEFAULT_SERVER_VERSION, CollectingQueryRunner
1010

1111

1212
@pytest.fixture
13-
def mock_arrow_client() -> AuthenticatedArrowClient:
14-
client = Mock(spec=AuthenticatedArrowClient)
15-
client.connection_info.return_value = Mock(host="localhost", port=8080, encrypted=False)
13+
def mock_arrow_client(mocker: MockerFixture) -> AuthenticatedArrowClient:
14+
client = mocker.Mock(spec=AuthenticatedArrowClient)
15+
client.connection_info.return_value = mocker.Mock(host="localhost", port=8080, encrypted=False)
1616
client.request_token.return_value = "test_token"
1717
return client
1818

@@ -44,12 +44,12 @@ def test_arrow_configuration(write_back_client: WriteBackClient, mock_arrow_clie
4444
assert config == expected_config
4545

4646

47-
def test_write_calls_run_write_back(write_back_client: WriteBackClient) -> None:
47+
def test_write_calls_run_write_back(write_back_client: WriteBackClient, mocker: MockerFixture) -> None:
4848
graph_name = "test_graph"
4949
job_id = "123"
5050
concurrency: Optional[int] = 4
5151

52-
write_back_client._write_protocol.run_write_back = Mock() # type: ignore
52+
write_back_client._write_protocol.run_write_back = mocker.Mock() # type: ignore
5353

5454
duration = write_back_client.write(graph_name, job_id, concurrency)
5555

tox.ini

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,4 +114,3 @@ passenv =
114114
BUILD_NUMBER
115115
commands =
116116
pytest graphdatascience/tests/integrationV2 --include-integration-v2
117-
pytest graphdatascience/tests/unit/procedure_surface

0 commit comments

Comments
 (0)