95 lines
2.6 KiB
Python
95 lines
2.6 KiB
Python
# pylint: disable=redefined-outer-name
|
|
import urllib.error
|
|
from io import BytesIO
|
|
from pathlib import Path
|
|
from unittest.mock import MagicMock, patch
|
|
|
|
import pytest
|
|
|
|
from archinstall.lib.output import share_install_log
|
|
|
|
|
|
@pytest.fixture()
|
|
def log_file(tmp_path: Path) -> Path:
|
|
log_dir = tmp_path / 'archinstall'
|
|
log_dir.mkdir()
|
|
return log_dir / 'install.log'
|
|
|
|
|
|
def _fake_logger(log_file: Path) -> MagicMock:
|
|
mock = MagicMock()
|
|
mock.path = log_file
|
|
return mock
|
|
|
|
|
|
def test_file_not_found(tmp_path: Path) -> None:
|
|
missing = tmp_path / 'no-such' / 'install.log'
|
|
with patch('archinstall.lib.output.logger', _fake_logger(missing)):
|
|
assert share_install_log() == 1
|
|
|
|
|
|
def test_empty_file(log_file: Path) -> None:
|
|
log_file.write_bytes(b'')
|
|
with patch('archinstall.lib.output.logger', _fake_logger(log_file)):
|
|
assert share_install_log() == 1
|
|
|
|
|
|
def test_user_cancels(log_file: Path) -> None:
|
|
log_file.write_text('some log content')
|
|
with patch('archinstall.lib.output.logger', _fake_logger(log_file)):
|
|
assert share_install_log(confirm=lambda _: False) == 1
|
|
|
|
|
|
def test_successful_upload(log_file: Path) -> None:
|
|
log_file.write_text('some log content')
|
|
fake_response = BytesIO(b'https://paste.rs/abc.def')
|
|
|
|
with (
|
|
patch('archinstall.lib.output.logger', _fake_logger(log_file)),
|
|
patch('urllib.request.urlopen', return_value=fake_response) as mock_open,
|
|
):
|
|
result = share_install_log()
|
|
|
|
assert result == 0
|
|
req = mock_open.call_args[0][0]
|
|
assert req.data == b'some log content'
|
|
|
|
|
|
def test_truncation(log_file: Path) -> None:
|
|
max_size = 100
|
|
content = b'A' * 50 + b'B' * 80
|
|
log_file.write_bytes(content)
|
|
fake_response = BytesIO(b'https://paste.rs/abc.def')
|
|
|
|
with (
|
|
patch('archinstall.lib.output.logger', _fake_logger(log_file)),
|
|
patch('urllib.request.urlopen', return_value=fake_response) as mock_open,
|
|
):
|
|
result = share_install_log(max_size=max_size)
|
|
|
|
assert result == 0
|
|
req = mock_open.call_args[0][0]
|
|
assert len(req.data) == max_size
|
|
assert req.data == content[-max_size:]
|
|
|
|
|
|
def test_network_error(log_file: Path) -> None:
|
|
log_file.write_text('some log content')
|
|
|
|
with (
|
|
patch('archinstall.lib.output.logger', _fake_logger(log_file)),
|
|
patch('urllib.request.urlopen', side_effect=urllib.error.URLError('no network')),
|
|
):
|
|
assert share_install_log() == 1
|
|
|
|
|
|
def test_unexpected_response(log_file: Path) -> None:
|
|
log_file.write_text('some log content')
|
|
fake_response = BytesIO(b'ERROR: something went wrong')
|
|
|
|
with (
|
|
patch('archinstall.lib.output.logger', _fake_logger(log_file)),
|
|
patch('urllib.request.urlopen', return_value=fake_response),
|
|
):
|
|
assert share_install_log() == 1
|