Compare commits

...

2 Commits

Author SHA1 Message Date
hasslesstech 6ab2b4e46b [P] Add general smoke test and Store incremental test
Component testing / Hub testing (push) Successful in 23s
Component testing / Store testing (push) Successful in 19s
Component testing / Integration smoke testing (push) Has been cancelled
2026-03-23 17:03:17 +02:00
hasslesstech 60a846d8b8 [P] Refactor testing code 2026-03-23 16:10:09 +02:00
8 changed files with 139 additions and 32 deletions
-21
View File
@@ -1,21 +0,0 @@
name: Hub component testing
on: [push, workflow_dispatch]
jobs:
hub-test:
runs-on: host-arch-x86_64
steps:
- name: Clone repository
run: git clone --revision ${{ gitea.sha }} --depth 1 ${{ gitea.server_url }}/${{ gitea.repository }}
- name: Build Hub testing container
working-directory: IoT-Systems
run: docker build -t local/hub/${{gitea.sha}} -f hub/Dockerfile-test .
- name: Run Hub tests
working-directory: IoT-Systems
run: docker run --rm -it local/hub/${{gitea.sha}}
- name: Clean up containers
if: ${{always()}}
run: docker image rm local/hub/${{gitea.sha}}
+70
View File
@@ -0,0 +1,70 @@
name: Component testing
on: [push, workflow_dispatch]
jobs:
hub-test:
name: Hub testing
runs-on: host-arch-x86_64
steps:
- name: Clone repository
run: git clone --revision ${{ gitea.sha }} --depth 1 ${{ gitea.server_url }}/${{ gitea.repository }}
- name: Build Hub testing container
working-directory: IoT-Systems
run: docker build -t local/hub/${{gitea.sha}} -f hub/Dockerfile-test .
- name: Run Hub tests
working-directory: IoT-Systems
run: docker run --rm -it local/hub/${{gitea.sha}}
- name: Clean up containers
if: ${{always()}}
run: docker image rm local/hub/${{gitea.sha}}
store-test:
name: Store testing
runs-on: host-arch-x86_64
steps:
- name: Clone repository
run: git clone --revision ${{ gitea.sha }} --depth 1 ${{ gitea.server_url }}/${{ gitea.repository }}
- name: Build Store testing container
working-directory: IoT-Systems
run: docker build -t local/hub/${{gitea.sha}} -f hub/Dockerfile-test .
- name: Run Store tests
working-directory: IoT-Systems
run: docker run --rm -it local/hub/${{gitea.sha}}
- name: Clean up containers
if: ${{always()}}
run: docker image rm local/hub/${{gitea.sha}}
integration-smoke-test:
name: Integration smoke testing
runs-on: host-arch-x86_64
depends:
- hub-test
- store-test
steps:
- name: Clone repository
run: git clone --revision ${{ gitea.sha }} --depth 1 ${{ gitea.server_url }}/${{ gitea.repository }}
- name: Build all production containers
working-directory: IoT-Systems
run: docker-compose build
- name: Start all production containers
working-directory: IoT-Systems
run: docker-compose up -d
- name: Wait for crashes to happen
run: sleep 30
- name: Check for dead containers
working-directory: IoT-Systems
run: docker ps -a | python3 utils/check-up.py
- name: Clean up
if: ${{always()}}
run: docker image rm local/hub/${{gitea.sha}}
+2 -2
View File
@@ -13,7 +13,7 @@ class StoreApiAdapter(StoreGateway):
def __init__(self, api_base_url): def __init__(self, api_base_url):
self.api_base_url = api_base_url self.api_base_url = api_base_url
def processed_agent_data_batch_to_json(self, processed_agent_data_batch: List[ProcessedAgentData]): def processed_agent_data_batch_to_payload(self, processed_agent_data_batch: List[ProcessedAgentData]):
if not processed_agent_data_batch: if not processed_agent_data_batch:
return False return False
@@ -28,7 +28,7 @@ class StoreApiAdapter(StoreGateway):
return payload return payload
def save_data(self, processed_agent_data_batch: List[ProcessedAgentData]): def save_data(self, processed_agent_data_batch: List[ProcessedAgentData]):
payload = self.processed_agent_data_batch_to_json(processed_agent_data_batch) payload = self.processed_agent_data_batch_to_payload(processed_agent_data_batch)
if payload == False: if payload == False:
return False return False
+4 -2
View File
@@ -2,7 +2,7 @@ from app.adapters.store_api_adapter import StoreApiAdapter
from app.entities.agent_data import AccelerometerData, AgentData, GpsData from app.entities.agent_data import AccelerometerData, AgentData, GpsData
from app.entities.processed_agent_data import ProcessedAgentData from app.entities.processed_agent_data import ProcessedAgentData
def _test_processed_agent_data_batch_to_json(): def _test_processed_agent_data_batch_to_payload():
processed_data_batch = [ processed_data_batch = [
ProcessedAgentData(road_state = "normal", ProcessedAgentData(road_state = "normal",
agent_data = AgentData(user_id = 1, agent_data = AgentData(user_id = 1,
@@ -24,12 +24,14 @@ def _test_processed_agent_data_batch_to_json():
), ),
] ]
res = StoreApiAdapter(None).processed_agent_data_batch_to_json(processed_data_batch) res = StoreApiAdapter(None).processed_agent_data_batch_to_payload(processed_data_batch)
assert res["data"][0]["agent_data"]["user_id"] == 1 assert res["data"][0]["agent_data"]["user_id"] == 1
assert res["data"][1]["agent_data"]["user_id"] == 2 assert res["data"][1]["agent_data"]["user_id"] == 2
assert res["data"][2]["agent_data"]["user_id"] == 3 assert res["data"][2]["agent_data"]["user_id"] == 3
assert StoreApiAdapter(None).processed_agent_data_batch_to_payload([]) == False
if __name__ == "__main__": if __name__ == "__main__":
test_functions = [i for i in dir() if i.startswith('_test_')] test_functions = [i for i in dir() if i.startswith('_test_')]
+13
View File
@@ -0,0 +1,13 @@
# Use the official Python image as the base image
FROM python:latest
# Set the working directory inside the container
WORKDIR /app
# Copy the requirements.txt file and install dependencies
COPY store/requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Copy the entire application into the container
COPY store/. .
# Run the main.py script inside the container when it starts
#CMD ["uvicorn", "main:app", "--host", "0.0.0.0"]
CMD ["./test-entry.sh"]
+10 -7
View File
@@ -73,15 +73,11 @@ async def send_data_to_subscribers(user_id: int, data):
# FastAPI CRUDL endpoints # FastAPI CRUDL endpoints
def ProcessedAgentData_to_td(data: List[ProcessedAgentData]):
@app.post("/processed_agent_data/") return [
async def create_processed_agent_data(data: List[ProcessedAgentData], user_id: int = Body(..., embed=True)):
session = SessionLocal()
try:
created_data = [
{ {
"road_state": item.road_state, "road_state": item.road_state,
"user_id": user_id, "user_id": item.agent_data.user_id,
"x": item.agent_data.accelerometer.x, "x": item.agent_data.accelerometer.x,
"y": item.agent_data.accelerometer.y, "y": item.agent_data.accelerometer.y,
"z": item.agent_data.accelerometer.z, "z": item.agent_data.accelerometer.z,
@@ -91,6 +87,13 @@ async def create_processed_agent_data(data: List[ProcessedAgentData], user_id: i
} }
for item in data for item in data
] ]
@app.post("/processed_agent_data/")
async def create_processed_agent_data(data: List[ProcessedAgentData], user_id: int = Body(..., embed=True)):
session = SessionLocal()
try:
created_data = ProcessedAgentData_to_td(data)
stmt = processed_agent_data.insert().values(created_data).returning(processed_agent_data) stmt = processed_agent_data.insert().values(created_data).returning(processed_agent_data)
result = session.execute(stmt) result = session.execute(stmt)
created_records = [dict(row._mapping) for row in result.fetchall()] created_records = [dict(row._mapping) for row in result.fetchall()]
+3
View File
@@ -0,0 +1,3 @@
#!/bin/sh
python3 test/main_test.py
+37
View File
@@ -0,0 +1,37 @@
import ..main
def _test_ProcessedAgentData_to_td():
processed_data_batch = [
ProcessedAgentData(road_state = "normal",
agent_data = AgentData(user_id = 1,
accelerometer = AccelerometerData(x = 0.1, y = 0.2, z = 0.3),
gps = GpsData(latitude = 10.123, longitude = 20.456),
timestamp = "2023-07-21T12:34:56Z")
),
ProcessedAgentData(road_state = "normal",
agent_data = AgentData(user_id = 2,
accelerometer = AccelerometerData(x = 0.1, y = 0.2, z = 0.3),
gps = GpsData(latitude = 10.123, longitude = 20.456),
timestamp = "2023-07-21T12:34:56Z")
),
ProcessedAgentData(road_state = "normal",
agent_data = AgentData(user_id = 3,
accelerometer = AccelerometerData(x = 0.1, y = 0.2, z = 0.3),
gps = GpsData(latitude = 10.123, longitude = 20.456),
timestamp = "2023-07-21T12:34:56Z")
),
]
res = main.ProcessedAgentData_to_td(processed_data_batch)
assert res[0]["user_id"] == 1
assert res[1]["user_id"] == 2
assert res[2]["user_id"] == 3
if __name__ == "__main__":
test_functions = [i for i in dir() if i.startswith('_test_')]
for i in test_functions:
print(i)
eval(i)()