Skip to content

Commit fc049cc

Browse files
Mike ProsserMike Prosser
authored andcommitted
use FakePanel to fix failing tests
1 parent d0835f1 commit fc049cc

File tree

4 files changed

+114
-37
lines changed

4 files changed

+114
-37
lines changed

tests/unit/test_fake_server.py

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,29 @@
11
from concurrent import futures
2+
from typing import Generator
3+
24
import grpc
35
import pytest
46
from google.protobuf.any_pb2 import Any
5-
from ni.pythonpanel.v1.python_panel_service_pb2_grpc import PythonPanelServiceStub
6-
from tests.utils._fake_python_panel_service import FakePythonPanelService
77
from ni.pythonpanel.v1.python_panel_service_pb2 import (
88
ConnectRequest,
99
DisconnectRequest,
1010
GetValueRequest,
1111
SetValueRequest,
1212
)
13+
from ni.pythonpanel.v1.python_panel_service_pb2_grpc import PythonPanelServiceStub
14+
15+
from tests.utils._fake_python_panel_service import FakePythonPanelService
1316

1417

1518
@pytest.fixture
16-
def grpc_server():
19+
def grpc_server() -> Generator[tuple[grpc.Server, int], Any, None]:
1720
# Create an in-process gRPC server
1821
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
1922
servicer = FakePythonPanelService()
2023
from ni.pythonpanel.v1.python_panel_service_pb2_grpc import (
2124
add_PythonPanelServiceServicer_to_server,
2225
)
26+
2327
add_PythonPanelServiceServicer_to_server(servicer, server)
2428
port = server.add_insecure_port("[::]:0") # Bind to an available port
2529
server.start()
@@ -28,35 +32,37 @@ def grpc_server():
2832

2933

3034
@pytest.fixture
31-
def grpc_client(grpc_server):
35+
def grpc_client(
36+
grpc_server: tuple[grpc.Server, int],
37+
) -> Generator[PythonPanelServiceStub, Any, None]:
3238
_, port = grpc_server
3339
channel = grpc.insecure_channel(f"localhost:{port}")
3440
yield PythonPanelServiceStub(channel)
3541
channel.close()
3642

3743

38-
def test_connect(grpc_client):
44+
def test___connect___gets_response(grpc_client: PythonPanelServiceStub) -> None:
3945
request = ConnectRequest(panel_id="test_panel", panel_uri="path/to/panel")
4046
response = grpc_client.Connect(request)
4147
assert response is not None # Ensure response is returned
4248

4349

44-
def test_disconnect(grpc_client):
50+
def test___disconnect___gets_response(grpc_client: PythonPanelServiceStub) -> None:
4551
request = DisconnectRequest(panel_id="test_panel")
4652
response = grpc_client.Disconnect(request)
4753
assert response is not None # Ensure response is returned
4854

4955

50-
def test_get_value(grpc_client):
56+
def test___get_value___gets_response(grpc_client: PythonPanelServiceStub) -> None:
5157
request = GetValueRequest(panel_id="test_panel", value_id="test_value")
5258
response = grpc_client.GetValue(request)
5359
assert response is not None # Ensure response is returned
5460
assert isinstance(response.value, Any) # Ensure the value is of type `Any`
5561

5662

57-
def test_set_value(grpc_client):
63+
def test___set_value___gets_response(grpc_client: PythonPanelServiceStub) -> None:
5864
value = Any()
5965
value.value = b"test_data"
6066
request = SetValueRequest(panel_id="test_panel", value_id="test_value", value=value)
6167
response = grpc_client.SetValue(request)
62-
assert response is not None # Ensure response is returned
68+
assert response is not None # Ensure response is returned

tests/unit/test_panel.py

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,41 @@
1-
import nipanel
1+
from concurrent import futures
2+
from typing import Generator
23

4+
import grpc
5+
import pytest
6+
from google.protobuf.any_pb2 import Any
37

4-
def test___streamlit_panel___has_panel_id_and_panel_uri() -> None:
5-
panel = nipanel.StreamlitPanel("my_panel", "path/to/script")
8+
from tests.utils._fake_panel import FakePanel
9+
from tests.utils._fake_python_panel_service import FakePythonPanelService
10+
11+
12+
@pytest.fixture
13+
def grpc_server() -> Generator[tuple[grpc.Server, int], Any, None]:
14+
# Create an in-process gRPC server
15+
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
16+
servicer = FakePythonPanelService()
17+
from ni.pythonpanel.v1.python_panel_service_pb2_grpc import (
18+
add_PythonPanelServiceServicer_to_server,
19+
)
20+
21+
add_PythonPanelServiceServicer_to_server(servicer, server)
22+
port = server.add_insecure_port("[::]:0") # Bind to an available port
23+
server.start()
24+
yield server, port
25+
server.stop(None)
26+
27+
28+
def test___panel___has_panel_id_and_panel_uri() -> None:
29+
panel = FakePanel(0, "my_panel", "path/to/script")
630
assert panel.panel_id == "my_panel"
731
assert panel.panel_uri == "path/to/script"
832

933

10-
def test___connected_panel___set_value___gets_same_value() -> None:
11-
panel = nipanel.StreamlitPanel("my_panel", "path/to/script")
34+
def test___connected_panel___set_value___gets_same_value(
35+
grpc_server: tuple[grpc.Server, int],
36+
) -> None:
37+
_, port = grpc_server
38+
panel = FakePanel(port, "my_panel", "path/to/script")
1239
panel.connect()
1340

1441
panel.set_value("test_id", "test_value")
@@ -18,8 +45,9 @@ def test___connected_panel___set_value___gets_same_value() -> None:
1845
panel.disconnect()
1946

2047

21-
def test___with_panel___set_value___gets_same_value() -> None:
22-
with nipanel.StreamlitPanel("my_panel", "path/to/script") as panel:
48+
def test___with_panel___set_value___gets_same_value(grpc_server: tuple[grpc.Server, int]) -> None:
49+
_, port = grpc_server
50+
with FakePanel(port, "my_panel", "path/to/script") as panel:
2351
panel.set_value("test_id", "test_value")
2452

2553
# TODO: AB#3095681 - change asserted value to test_value

tests/utils/_fake_panel.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
from nipanel._panel import Panel
2+
3+
4+
class FakePanel(Panel):
5+
"""This class allows you to connect to the FakePythonPanelService, for testing."""
6+
7+
def __init__(self, port: int, panel_id: str, panel_uri: str) -> None:
8+
"""Create a fake panel, for testing.
9+
10+
Args:
11+
port: The port number for the gRPC server.
12+
panel_id: A unique identifier for the panel.
13+
panel_uri: The file path of the panel script.
14+
15+
Returns:
16+
A new FakePanel instance.
17+
"""
18+
super().__init__(panel_id, panel_uri)
19+
self.port = port
20+
21+
def _get_channel_url(self) -> str:
22+
return f"localhost:{self.port}"
Lines changed: 42 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,56 @@
1-
from concurrent import futures
2-
import grpc
31
import time
2+
from concurrent import futures
3+
from typing import Any
4+
45
import google.protobuf.any_pb2 as any_pb2
5-
from ni.pythonpanel.v1.python_panel_service_pb2 import ConnectRequest, ConnectResponse, DisconnectRequest, DisconnectResponse, GetValueRequest, GetValueResponse, SetValueRequest, SetValueResponse
6-
from ni.pythonpanel.v1.python_panel_service_pb2_grpc import PythonPanelServiceServicer, add_PythonPanelServiceServicer_to_server
6+
import grpc
7+
from ni.pythonpanel.v1.python_panel_service_pb2 import (
8+
ConnectRequest,
9+
ConnectResponse,
10+
DisconnectRequest,
11+
DisconnectResponse,
12+
GetValueRequest,
13+
GetValueResponse,
14+
SetValueRequest,
15+
SetValueResponse,
16+
)
17+
from ni.pythonpanel.v1.python_panel_service_pb2_grpc import (
18+
PythonPanelServiceServicer,
19+
add_PythonPanelServiceServicer_to_server,
20+
)
21+
722

823
class FakePythonPanelService(PythonPanelServiceServicer):
9-
def Connect(self, request, context):
10-
# Basic implementation for testing
11-
print(f"Connecting to panel: {request.panel_id} at {request.panel_uri}")
24+
"""Fake implementation of the PythonPanelService for testing."""
25+
26+
_values = {"test_value": any_pb2.Any()}
27+
28+
def Connect(self, request: ConnectRequest, context: Any) -> ConnectResponse: # noqa: N802
29+
"""Just a trivial implementation for testing."""
1230
return ConnectResponse()
1331

14-
def Disconnect(self, request, context):
15-
# Basic implementation for testing
16-
print(f"Disconnecting from panel: {request.panel_id}")
32+
def Disconnect( # noqa: N802
33+
self, request: DisconnectRequest, context: Any
34+
) -> DisconnectResponse:
35+
"""Just a trivial implementation for testing."""
1736
return DisconnectResponse()
1837

19-
def GetValue(self, request, context):
20-
# Basic implementation for testing
21-
print(f"Getting value for panel: {request.panel_id}, value_id: {request.value_id}")
22-
value = any_pb2.Any() # Placeholder for actual value
38+
def GetValue(self, request: GetValueRequest, context: Any) -> GetValueResponse: # noqa: N802
39+
"""Just a trivial implementation for testing."""
40+
value = self._values[request.value_id]
2341
return GetValueResponse(value=value)
2442

25-
def SetValue(self, request, context):
26-
# Basic implementation for testing
27-
print(f"Setting value for panel: {request.panel_id}, value_id: {request.value_id}, value: {request.value}")
43+
def SetValue(self, request: SetValueRequest, context: Any) -> SetValueResponse: # noqa: N802
44+
"""Just a trivial implementation for testing."""
45+
self._values[request.value_id] = request.value
2846
return SetValueResponse()
2947

30-
def serve():
48+
49+
def serve() -> None:
50+
"""Run the gRPC server."""
3151
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
3252
add_PythonPanelServiceServicer_to_server(FakePythonPanelService(), server)
33-
server.add_insecure_port('[::]:50051') # TODO: do we need to find a free port?
53+
server.add_insecure_port("[::]:50051") # TODO: do we need to find a free port?
3454
server.start()
3555
print("Server is running on port 50051...")
3656
try:
@@ -39,5 +59,6 @@ def serve():
3959
except KeyboardInterrupt:
4060
server.stop(0)
4161

42-
if __name__ == '__main__':
43-
serve()
62+
63+
if __name__ == "__main__":
64+
serve()

0 commit comments

Comments
 (0)