Skip to content

Commit ba83028

Browse files
committed
src/services: Init unit-tests for kill & suite service
Signed-off-by: Kamoltat Sirivadhna <[email protected]>
1 parent 573fa93 commit ba83028

File tree

5 files changed

+199
-1
lines changed

5 files changed

+199
-1
lines changed

Diff for: pytest.ini

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
[pytest]
2+
pythonpath = src
3+
log_cli = 1
4+
log_cli_level = INFO
5+
log_cli_format = %(asctime)s [%(levelname)8s] %(message)s (%(filename)s:%(lineno)s)
6+
log_cli_date_format=%Y-%m-%d %H:%M:%S

Diff for: src/teuthology_api/services/suite.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ def make_run_name(run_dic):
6868
str(run_dic["timestamp"]),
6969
run_dic["suite"],
7070
run_dic["ceph_branch"],
71-
run_dic["kernel_branch"] or "-",
71+
run_dic["kernel_branch"] or "distro",
7272
run_dic["flavor"],
7373
worker,
7474
]

Diff for: src/teuthology_api/services/test_helpers.py

+56
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
from fastapi.testclient import TestClient
2+
from fastapi import HTTPException
3+
import pytest
4+
from main import app
5+
from mock import patch
6+
from services.helpers import Request, get_token, get_username
7+
8+
client = TestClient(app)
9+
10+
class MockRequest():
11+
def __init__(self, access_token="testToken123", bad=False):
12+
if bad:
13+
self.session = {}
14+
else:
15+
self.session = {
16+
"user": {
17+
"username": "user1",
18+
"access_token": access_token,
19+
}
20+
}
21+
22+
# get_token
23+
@patch('services.helpers.Request')
24+
def test_get_token_success(m_request):
25+
m_request = MockRequest()
26+
expected = {
27+
"access_token": "testToken123",
28+
"token_type": "bearer"
29+
}
30+
actual = get_token(m_request)
31+
assert expected == actual
32+
33+
@patch('services.helpers.Request')
34+
def test_get_token_fail(m_request):
35+
with pytest.raises(HTTPException) as err:
36+
m_request = MockRequest(bad=True)
37+
get_token(m_request)
38+
assert err.value.status_code == 401
39+
assert err.value.detail == 'You need to be logged in'
40+
41+
# get username
42+
@patch('services.helpers.Request')
43+
def test_get_username_success(m_request):
44+
m_request = MockRequest()
45+
expected = "user1"
46+
actual = get_username(m_request)
47+
assert expected == actual
48+
49+
@patch('services.helpers.Request')
50+
def test_get_username_fail(m_request):
51+
with pytest.raises(HTTPException) as err:
52+
m_request = MockRequest(bad=True)
53+
get_username(m_request)
54+
assert err.value.status_code == 401
55+
assert err.value.detail == 'You need to be logged in'
56+

Diff for: src/teuthology_api/services/test_kill.py

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
from fastapi.testclient import TestClient
2+
from main import app
3+
from mock import patch
4+
from services.helpers import get_token
5+
from services.kill import get_username, get_run_details
6+
import json
7+
from schemas.kill import KillArgs
8+
9+
client = TestClient(app)
10+
11+
async def override_get_token():
12+
return {"access_token": "token_123", "token_type": "bearer"}
13+
14+
app.dependency_overrides[get_token] = override_get_token
15+
16+
mock_kill_args = {
17+
"--dry-run": False,
18+
"--non-interactive": False,
19+
"--verbose": 1,
20+
"--help": False,
21+
"--user": "mock_user",
22+
"--owner": "user1",
23+
"--run": "mock_run",
24+
"--preserve-queue": None,
25+
"--job": None,
26+
"--jobspec": None,
27+
"--machine-type": "testnode",
28+
"--archive": None,
29+
}
30+
31+
@patch('services.kill.teuthology.kill.main')
32+
@patch('services.kill.get_run_details')
33+
@patch('services.kill.get_username')
34+
def test_kill_run_success(m_get_username, m_get_run_details, m_teuth_kill_main):
35+
m_get_username.return_value = "user1"
36+
m_get_run_details.return_value = {'id': "7451978", 'user': "user1"}
37+
m_teuth_kill_main.return_value = None
38+
response = client.post("/kill", data=json.dumps(mock_kill_args))
39+
assert response.status_code == 200
40+
assert response.json() == {"kill": "success"}
41+
42+
def test_kill_run_fail():
43+
response = client.post("/kill", data=json.dumps(mock_kill_args))
44+
assert response.status_code == 401
45+
assert response.json() == {"detail": "You need to be logged in"}

Diff for: src/teuthology_api/services/test_suite.py

+91
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
from fastapi.testclient import TestClient
2+
from main import app
3+
from mock import patch
4+
from services.helpers import get_token
5+
from services.suite import make_run_name, get_run_details
6+
import json
7+
8+
client = TestClient(app)
9+
10+
async def override_get_token():
11+
return {"access_token": "token_123", "token_type": "bearer"}
12+
13+
app.dependency_overrides[get_token] = override_get_token
14+
15+
mock_suite_args = {
16+
"--dry-run": False,
17+
"--non-interactive": False,
18+
"--verbose": 1,
19+
"--help": False,
20+
"--user": "mock_user",
21+
"--timestamp": "2023-10-21_14:30:00",
22+
"--owner": "user1",
23+
"--suite": "rados",
24+
"--ceph": "ceph1",
25+
"--kernel": "kernel1",
26+
"--flavor": "test-flavor",
27+
"--machine-type": "testnode",
28+
}
29+
30+
# suite
31+
@patch('services.suite.teuthology.suite.main')
32+
@patch('services.suite.get_run_details')
33+
def test_suite_run_success(m_get_run_details, m_teuth_suite_main):
34+
m_get_run_details.return_value = {'id': "7451978", 'user': "user1"}
35+
response = client.post("/suite", data=json.dumps(mock_suite_args))
36+
assert response.status_code == 200
37+
assert response.json() == {'run': {'id': '7451978', 'user': 'user1'}, 'logs': []}
38+
39+
# make_run_name
40+
41+
def test_make_run_name():
42+
m_run_dic = {
43+
"user": "testuser",
44+
"timestamp": "2022-03-21_14:30:00",
45+
"suite": "rados",
46+
"ceph_branch": "ceph1",
47+
"kernel_branch": "kernel1",
48+
"flavor": "test-flavor",
49+
"machine_type": "test-machine"
50+
}
51+
expected = "testuser-2022-03-21_14:30:00-rados-ceph1-kernel1-test-flavor-test-machine"
52+
assert make_run_name(m_run_dic) == expected
53+
54+
def test_make_run_name_with_single_worker():
55+
m_run_dic = {
56+
"user": "test_user",
57+
"timestamp": "2022-03-21_14:30:00",
58+
"suite": "rados",
59+
"ceph_branch": "ceph1",
60+
"kernel_branch": "kernel1",
61+
"flavor": "test-flavor",
62+
"machine_type": "worker1"
63+
}
64+
expected = "test_user-2022-03-21_14:30:00-rados-ceph1-kernel1-test-flavor-worker1"
65+
assert make_run_name(m_run_dic) == expected
66+
67+
def test_make_run_name_with_multi_worker():
68+
m_run_dic = {
69+
"user": "test_user",
70+
"timestamp": "2022-03-21_14:30:00",
71+
"suite": "rados",
72+
"ceph_branch": "ceph1",
73+
"kernel_branch": "kernel1",
74+
"flavor": "test-flavor",
75+
"machine_type": "worker1,worker2,worker3"
76+
}
77+
expected = "test_user-2022-03-21_14:30:00-rados-ceph1-kernel1-test-flavor-multi"
78+
assert make_run_name(m_run_dic) == expected
79+
80+
def test_make_run_name_with_no_kernel_branch():
81+
m_run_dic = {
82+
"user": "teuthology",
83+
"timestamp": "2022-03-21_14:30:00",
84+
"suite": "rados",
85+
"ceph_branch": "ceph1",
86+
"kernel_branch": None,
87+
"flavor": "test-flavor",
88+
"machine_type": "test-machine"
89+
}
90+
expected = "teuthology-2022-03-21_14:30:00-rados-ceph1-distro-test-flavor-test-machine"
91+
assert make_run_name(m_run_dic) == expected

0 commit comments

Comments
 (0)