2022-01-10 20:35:00 +00:00
|
|
|
# pylint: disable=redefined-outer-name
|
|
|
|
# pylint: disable=unused-argument
|
2022-04-03 19:04:49 +00:00
|
|
|
# pylint: disable=missing-function-docstring
|
|
|
|
|
2022-01-10 20:35:00 +00:00
|
|
|
import json
|
2022-04-03 19:04:49 +00:00
|
|
|
import os
|
2022-01-10 20:35:00 +00:00
|
|
|
import pytest
|
|
|
|
from selfprivacy_api.utils import get_domain
|
|
|
|
|
|
|
|
|
|
|
|
def read_json(file_path):
|
|
|
|
with open(file_path, "r", encoding="utf-8") as file:
|
|
|
|
return json.load(file)
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture
|
|
|
|
def domain_file(mocker, datadir):
|
|
|
|
mocker.patch("selfprivacy_api.utils.DOMAIN_FILE", datadir / "domain")
|
|
|
|
return datadir
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture
|
|
|
|
def turned_on(mocker, datadir):
|
|
|
|
mocker.patch("selfprivacy_api.utils.USERDATA_FILE", new=datadir / "turned_on.json")
|
|
|
|
assert read_json(datadir / "turned_on.json")["autoUpgrade"]["enable"] == True
|
|
|
|
assert read_json(datadir / "turned_on.json")["autoUpgrade"]["allowReboot"] == True
|
|
|
|
assert read_json(datadir / "turned_on.json")["timezone"] == "Europe/Moscow"
|
|
|
|
return datadir
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture
|
|
|
|
def turned_off(mocker, datadir):
|
|
|
|
mocker.patch("selfprivacy_api.utils.USERDATA_FILE", new=datadir / "turned_off.json")
|
|
|
|
assert read_json(datadir / "turned_off.json")["autoUpgrade"]["enable"] == False
|
|
|
|
assert read_json(datadir / "turned_off.json")["autoUpgrade"]["allowReboot"] == False
|
|
|
|
assert read_json(datadir / "turned_off.json")["timezone"] == "Europe/Moscow"
|
|
|
|
return datadir
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture
|
|
|
|
def undefined_config(mocker, datadir):
|
|
|
|
mocker.patch("selfprivacy_api.utils.USERDATA_FILE", new=datadir / "undefined.json")
|
|
|
|
assert "autoUpgrade" not in read_json(datadir / "undefined.json")
|
|
|
|
assert "timezone" not in read_json(datadir / "undefined.json")
|
|
|
|
return datadir
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture
|
|
|
|
def no_values(mocker, datadir):
|
|
|
|
mocker.patch("selfprivacy_api.utils.USERDATA_FILE", new=datadir / "no_values.json")
|
|
|
|
assert "enable" not in read_json(datadir / "no_values.json")["autoUpgrade"]
|
|
|
|
assert "allowReboot" not in read_json(datadir / "no_values.json")["autoUpgrade"]
|
|
|
|
return datadir
|
|
|
|
|
|
|
|
|
|
|
|
class ProcessMock:
|
|
|
|
"""Mock subprocess.Popen"""
|
|
|
|
|
|
|
|
def __init__(self, args, **kwargs):
|
|
|
|
self.args = args
|
|
|
|
self.kwargs = kwargs
|
|
|
|
|
2022-07-07 13:53:19 +00:00
|
|
|
def communicate():
|
2022-01-10 20:35:00 +00:00
|
|
|
return (b"", None)
|
|
|
|
|
|
|
|
returncode = 0
|
|
|
|
|
|
|
|
|
|
|
|
class BrokenServiceMock(ProcessMock):
|
2022-07-07 11:49:04 +00:00
|
|
|
"""Mock subprocess.Popen"""
|
2022-07-07 13:53:19 +00:00
|
|
|
|
|
|
|
def communicate():
|
2022-01-10 20:35:00 +00:00
|
|
|
return (b"Testing error", None)
|
|
|
|
|
|
|
|
returncode = 3
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture
|
|
|
|
def mock_subprocess_popen(mocker):
|
|
|
|
mock = mocker.patch("subprocess.Popen", autospec=True, return_value=ProcessMock)
|
|
|
|
return mock
|
|
|
|
|
|
|
|
|
2022-04-03 19:04:49 +00:00
|
|
|
@pytest.fixture
|
|
|
|
def mock_os_chdir(mocker):
|
|
|
|
mock = mocker.patch("os.chdir", autospec=True)
|
|
|
|
return mock
|
|
|
|
|
|
|
|
|
2022-01-10 20:35:00 +00:00
|
|
|
@pytest.fixture
|
|
|
|
def mock_broken_service(mocker):
|
|
|
|
mock = mocker.patch(
|
|
|
|
"subprocess.Popen", autospec=True, return_value=BrokenServiceMock
|
|
|
|
)
|
|
|
|
return mock
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture
|
|
|
|
def mock_subprocess_check_output(mocker):
|
|
|
|
mock = mocker.patch(
|
|
|
|
"subprocess.check_output", autospec=True, return_value=b"Testing Linux"
|
|
|
|
)
|
|
|
|
return mock
|
|
|
|
|
|
|
|
|
|
|
|
def test_system_rebuild_unauthorized(client, mock_subprocess_popen):
|
|
|
|
response = client.get("/system/configuration/apply")
|
|
|
|
assert response.status_code == 401
|
|
|
|
assert mock_subprocess_popen.call_count == 0
|
|
|
|
|
|
|
|
|
|
|
|
def test_system_rebuild(authorized_client, mock_subprocess_popen):
|
|
|
|
response = authorized_client.get("/system/configuration/apply")
|
|
|
|
assert response.status_code == 200
|
|
|
|
assert mock_subprocess_popen.call_count == 1
|
|
|
|
assert mock_subprocess_popen.call_args[0][0] == [
|
|
|
|
"systemctl",
|
|
|
|
"start",
|
|
|
|
"sp-nixos-rebuild.service",
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
def test_system_upgrade_unauthorized(client, mock_subprocess_popen):
|
|
|
|
response = client.get("/system/configuration/upgrade")
|
|
|
|
assert response.status_code == 401
|
|
|
|
assert mock_subprocess_popen.call_count == 0
|
|
|
|
|
|
|
|
|
|
|
|
def test_system_upgrade(authorized_client, mock_subprocess_popen):
|
|
|
|
response = authorized_client.get("/system/configuration/upgrade")
|
|
|
|
assert response.status_code == 200
|
|
|
|
assert mock_subprocess_popen.call_count == 1
|
|
|
|
assert mock_subprocess_popen.call_args[0][0] == [
|
|
|
|
"systemctl",
|
|
|
|
"start",
|
|
|
|
"sp-nixos-upgrade.service",
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
def test_system_rollback_unauthorized(client, mock_subprocess_popen):
|
|
|
|
response = client.get("/system/configuration/rollback")
|
|
|
|
assert response.status_code == 401
|
|
|
|
assert mock_subprocess_popen.call_count == 0
|
|
|
|
|
|
|
|
|
|
|
|
def test_system_rollback(authorized_client, mock_subprocess_popen):
|
|
|
|
response = authorized_client.get("/system/configuration/rollback")
|
|
|
|
assert response.status_code == 200
|
|
|
|
assert mock_subprocess_popen.call_count == 1
|
|
|
|
assert mock_subprocess_popen.call_args[0][0] == [
|
|
|
|
"systemctl",
|
|
|
|
"start",
|
|
|
|
"sp-nixos-rollback.service",
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
def test_reboot_system_unauthorized(client, mock_subprocess_popen):
|
|
|
|
response = client.get("/system/reboot")
|
|
|
|
assert response.status_code == 401
|
|
|
|
assert mock_subprocess_popen.call_count == 0
|
|
|
|
|
|
|
|
|
|
|
|
def test_reboot_system(authorized_client, mock_subprocess_popen):
|
|
|
|
response = authorized_client.get("/system/reboot")
|
|
|
|
assert response.status_code == 200
|
|
|
|
assert mock_subprocess_popen.call_count == 1
|
|
|
|
assert mock_subprocess_popen.call_args[0][0] == ["reboot"]
|