Skip to content

Commit a31e418

Browse files
authored
PyTests for Device API Endpoints (#150)
1 parent 0ab3a33 commit a31e418

File tree

1 file changed

+103
-0
lines changed

1 file changed

+103
-0
lines changed

tests/api_tests/test_device_api.py

+103
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
import pytest
2+
from unittest.mock import patch, MagicMock
3+
from flask import Flask
4+
from api.device import device_api
5+
from submodule.rs_device_resources import DeviceNotFoundException
6+
7+
@pytest.fixture
8+
def client():
9+
app = Flask(__name__)
10+
app.register_blueprint(device_api)
11+
client = app.test_client()
12+
yield client
13+
14+
def mock_device_manager(devices=None, device=None):
15+
mock_device_mgr = MagicMock()
16+
if devices is not None:
17+
mock_device_mgr.get_device_all.return_value = devices
18+
if device is not None:
19+
mock_device_mgr.get_device.return_value = device
20+
return mock_device_mgr
21+
22+
def test_get_devices(client):
23+
devices = [
24+
{"id": "device_1", "series": "series_1"},
25+
{"id": "device_2", "series": "series_2"}
26+
]
27+
mock_device_mgr = mock_device_manager(devices=devices)
28+
29+
with patch('api.device.RsDeviceManager.get_instance', return_value=mock_device_mgr):
30+
response = client.get('/devices')
31+
assert response.status_code == 200
32+
assert response.json == devices
33+
34+
def test_get_device_details(client):
35+
device = {
36+
"id": "device_1",
37+
"series": "series_1",
38+
"logic_density": "low",
39+
"package": "pkg_1",
40+
"speedgrade": "sg_1",
41+
"temperature_grade": "temp_1",
42+
"specification": {
43+
"thermal": {"theta_ja": 0.9, "ambient": {"typical": 20, "worsecase": 30}},
44+
"power": {"budget": 10, "typical_dynamic_scaling": {"fpga_complex": 2, "processing_complex": 3}}
45+
}
46+
}
47+
mock_device_mgr = mock_device_manager(device=device)
48+
49+
with patch('api.device.RsDeviceManager.get_instance', return_value=mock_device_mgr):
50+
response = client.get('/devices/device_1')
51+
assert response.status_code == 200
52+
assert response.json["id"] == "device_1"
53+
assert response.json["series"] == "series_1"
54+
55+
def test_get_device_not_found(client):
56+
mock_device_mgr = MagicMock()
57+
mock_device_mgr.get_device.side_effect = DeviceNotFoundException
58+
59+
with patch('api.device.RsDeviceManager.get_instance', return_value=mock_device_mgr):
60+
response = client.get('/devices/unknown_device')
61+
assert response.status_code == 400
62+
assert "Device with given id doesn't exists" in response.json['message']
63+
64+
def test_update_device_spec(client):
65+
mock_device = MagicMock()
66+
mock_device.update_spec.return_value = None
67+
mock_device_mgr = mock_device_manager(device=mock_device)
68+
69+
with patch('api.device.RsDeviceManager.get_instance', return_value=mock_device_mgr):
70+
response = client.patch('/devices/device_1', json={
71+
"specification": {
72+
"thermal": {"theta_ja": 1.0, "ambient": {"typical": 25, "worsecase": 35}},
73+
"power": {"budget": 15, "typical_dynamic_scaling": {"fpga_complex": 5, "processing_complex": 6}}
74+
}
75+
})
76+
assert response.status_code == 200
77+
78+
def test_get_device_consumption(client):
79+
mock_device = MagicMock()
80+
mock_device.get_power_consumption.return_value = {
81+
"total_power_temperature": [
82+
{"type": "core", "power": 10, "temperature": 50},
83+
{"type": "peripheral", "power": 5, "temperature": 40}
84+
],
85+
"processing_complex": {
86+
"dynamic": {"components": [{"type": "core", "power": 10, "percentage": 70}], "power": 10, "percentage": 70},
87+
"static": {"power": 2, "percentage": 30},
88+
"total_power": 12,
89+
"total_percentage": 100
90+
},
91+
"fpga_complex": {
92+
"dynamic": {"components": [{"type": "fpga", "power": 8, "percentage": 80}], "power": 8, "percentage": 80},
93+
"static": {"power": 2, "percentage": 20},
94+
"total_power": 10,
95+
"total_percentage": 100
96+
}
97+
}
98+
mock_device_mgr = mock_device_manager(device=mock_device)
99+
100+
with patch('api.device.RsDeviceManager.get_instance', return_value=mock_device_mgr):
101+
response = client.get('/devices/device_1/consumption')
102+
assert response.status_code == 200
103+
assert len(response.json['total_power_temperature']) == 2

0 commit comments

Comments
 (0)