From 41b8119711f686c92ea0d55855b95d1861ddccac Mon Sep 17 00:00:00 2001 From: Kamoltat Sirivadhna Date: Wed, 1 Nov 2023 11:53:40 -0400 Subject: [PATCH] src/services: Init unit-tests for kill & suite service Signed-off-by: Kamoltat Sirivadhna --- pytest.ini | 6 +++ src/services/suite.py | 2 +- src/services/test_helpers.py | 56 ++++++++++++++++++++++ src/services/test_kill.py | 45 ++++++++++++++++++ src/services/test_suite.py | 91 ++++++++++++++++++++++++++++++++++++ 5 files changed, 199 insertions(+), 1 deletion(-) create mode 100644 pytest.ini create mode 100644 src/services/test_helpers.py create mode 100644 src/services/test_kill.py create mode 100644 src/services/test_suite.py diff --git a/pytest.ini b/pytest.ini new file mode 100644 index 0000000..b478d07 --- /dev/null +++ b/pytest.ini @@ -0,0 +1,6 @@ +[pytest] +pythonpath = src +log_cli = 1 +log_cli_level = INFO +log_cli_format = %(asctime)s [%(levelname)8s] %(message)s (%(filename)s:%(lineno)s) +log_cli_date_format=%Y-%m-%d %H:%M:%S \ No newline at end of file diff --git a/src/services/suite.py b/src/services/suite.py index bfe09c1..595b093 100644 --- a/src/services/suite.py +++ b/src/services/suite.py @@ -66,7 +66,7 @@ def make_run_name(run_dic): str(run_dic["timestamp"]), run_dic["suite"], run_dic["ceph_branch"], - run_dic["kernel_branch"] or "-", + run_dic["kernel_branch"] or "distro", run_dic["flavor"], worker, ] diff --git a/src/services/test_helpers.py b/src/services/test_helpers.py new file mode 100644 index 0000000..110ff73 --- /dev/null +++ b/src/services/test_helpers.py @@ -0,0 +1,56 @@ +from fastapi.testclient import TestClient +from fastapi import HTTPException +import pytest +from main import app +from mock import patch +from services.helpers import Request, get_token, get_username + +client = TestClient(app) + +class MockRequest(): + def __init__(self, access_token="testToken123", bad=False): + if bad: + self.session = {} + else: + self.session = { + "user": { + "username": "user1", + "access_token": access_token, + } + } + +# get_token +@patch('services.helpers.Request') +def test_get_token_success(m_request): + m_request = MockRequest() + expected = { + "access_token": "testToken123", + "token_type": "bearer" + } + actual = get_token(m_request) + assert expected == actual + +@patch('services.helpers.Request') +def test_get_token_fail(m_request): + with pytest.raises(HTTPException) as err: + m_request = MockRequest(bad=True) + get_token(m_request) + assert err.value.status_code == 401 + assert err.value.detail == 'You need to be logged in' + +# get username +@patch('services.helpers.Request') +def test_get_username_success(m_request): + m_request = MockRequest() + expected = "user1" + actual = get_username(m_request) + assert expected == actual + +@patch('services.helpers.Request') +def test_get_username_fail(m_request): + with pytest.raises(HTTPException) as err: + m_request = MockRequest(bad=True) + get_username(m_request) + assert err.value.status_code == 401 + assert err.value.detail == 'You need to be logged in' + diff --git a/src/services/test_kill.py b/src/services/test_kill.py new file mode 100644 index 0000000..447de5d --- /dev/null +++ b/src/services/test_kill.py @@ -0,0 +1,45 @@ +from fastapi.testclient import TestClient +from main import app +from mock import patch +from services.helpers import get_token +from services.kill import get_username, get_run_details +import json +from schemas.kill import KillArgs + +client = TestClient(app) + +async def override_get_token(): + return {"access_token": "token_123", "token_type": "bearer"} + +app.dependency_overrides[get_token] = override_get_token + +mock_kill_args = { + "--dry-run": False, + "--non-interactive": False, + "--verbose": 1, + "--help": False, + "--user": "mock_user", + "--owner": "user1", + "--run": "mock_run", + "--preserve-queue": None, + "--job": None, + "--jobspec": None, + "--machine-type": "testnode", + "--archive": None, +} + +@patch('services.kill.teuthology.kill.main') +@patch('services.kill.get_run_details') +@patch('services.kill.get_username') +def test_kill_run_success(m_get_username, m_get_run_details, m_teuth_kill_main): + m_get_username.return_value = "user1" + m_get_run_details.return_value = {'id': "7451978", 'user': "user1"} + m_teuth_kill_main.return_value = None + response = client.post("/kill", data=json.dumps(mock_kill_args)) + assert response.status_code == 200 + assert response.json() == {"kill": "success"} + +def test_kill_run_fail(): + response = client.post("/kill", data=json.dumps(mock_kill_args)) + assert response.status_code == 401 + assert response.json() == {"detail": "You need to be logged in"} \ No newline at end of file diff --git a/src/services/test_suite.py b/src/services/test_suite.py new file mode 100644 index 0000000..79a8a67 --- /dev/null +++ b/src/services/test_suite.py @@ -0,0 +1,91 @@ +from fastapi.testclient import TestClient +from main import app +from mock import patch +from services.helpers import get_token +from services.suite import make_run_name, get_run_details +import json + +client = TestClient(app) + +async def override_get_token(): + return {"access_token": "token_123", "token_type": "bearer"} + +app.dependency_overrides[get_token] = override_get_token + +mock_suite_args = { + "--dry-run": False, + "--non-interactive": False, + "--verbose": 1, + "--help": False, + "--user": "mock_user", + "--timestamp": "2023-10-21_14:30:00", + "--owner": "user1", + "--suite": "rados", + "--ceph": "ceph1", + "--kernel": "kernel1", + "--flavor": "test-flavor", + "--machine-type": "testnode", +} + +# suite +@patch('services.suite.teuthology.suite.main') +@patch('services.suite.get_run_details') +def test_suite_run_success(m_get_run_details, m_teuth_suite_main): + m_get_run_details.return_value = {'id': "7451978", 'user': "user1"} + response = client.post("/suite", data=json.dumps(mock_suite_args)) + assert response.status_code == 200 + assert response.json() == {'run': {'id': '7451978', 'user': 'user1'}, 'logs': []} + +# make_run_name + +def test_make_run_name(): + m_run_dic = { + "user": "testuser", + "timestamp": "2022-03-21_14:30:00", + "suite": "rados", + "ceph_branch": "ceph1", + "kernel_branch": "kernel1", + "flavor": "test-flavor", + "machine_type": "test-machine" + } + expected = "testuser-2022-03-21_14:30:00-rados-ceph1-kernel1-test-flavor-test-machine" + assert make_run_name(m_run_dic) == expected + +def test_make_run_name_with_single_worker(): + m_run_dic = { + "user": "test_user", + "timestamp": "2022-03-21_14:30:00", + "suite": "rados", + "ceph_branch": "ceph1", + "kernel_branch": "kernel1", + "flavor": "test-flavor", + "machine_type": "worker1" + } + expected = "test_user-2022-03-21_14:30:00-rados-ceph1-kernel1-test-flavor-worker1" + assert make_run_name(m_run_dic) == expected + +def test_make_run_name_with_multi_worker(): + m_run_dic = { + "user": "test_user", + "timestamp": "2022-03-21_14:30:00", + "suite": "rados", + "ceph_branch": "ceph1", + "kernel_branch": "kernel1", + "flavor": "test-flavor", + "machine_type": "worker1,worker2,worker3" + } + expected = "test_user-2022-03-21_14:30:00-rados-ceph1-kernel1-test-flavor-multi" + assert make_run_name(m_run_dic) == expected + +def test_make_run_name_with_no_kernel_branch(): + m_run_dic = { + "user": "teuthology", + "timestamp": "2022-03-21_14:30:00", + "suite": "rados", + "ceph_branch": "ceph1", + "kernel_branch": None, + "flavor": "test-flavor", + "machine_type": "test-machine" + } + expected = "teuthology-2022-03-21_14:30:00-rados-ceph1-distro-test-flavor-test-machine" + assert make_run_name(m_run_dic) == expected