import pytest
from qslib import AccessLevel, Machine
from qslib.machine import _gen_auth_response
def test_machine_default_params():
m = Machine("example.com")
assert m.host == "example.com"
assert m.port == 7443 assert m.ssl is None
assert m.automatic is True
def test_machine_ssl_false_defaults_port_7000():
m = Machine("example.com", ssl=False)
assert m.port == 7000
assert m.ssl is False
def test_machine_custom_port_overrides():
m = Machine("example.com", port=9999, ssl=False)
assert m.port == 9999
def test_machine_ssl_true_default_port():
m = Machine("example.com", ssl=True)
assert m.port == 7443
def test_set_access_level_above_max_raises():
m = Machine("example.com", max_access_level="Observer")
with pytest.raises(ValueError, match="above maximum"):
m.set_access_level(AccessLevel.Controller)
def test_max_access_level_property():
m = Machine("example.com", max_access_level="Controller")
assert m.max_access_level == AccessLevel.Controller
m.max_access_level = "Observer"
assert m.max_access_level == AccessLevel.Observer
def test_gen_auth_response():
result = _gen_auth_response("testpassword", "123456")
assert isinstance(result, str)
assert len(result) == 32 assert result == _gen_auth_response("testpassword", "123456")
assert result != _gen_auth_response("otherpassword", "123456")
def test_asdict_without_password():
m = Machine("example.com", password="secret")
d = m.asdict()
assert d["host"] == "example.com"
assert "password" not in d
def test_asdict_with_password():
m = Machine("example.com", password="secret")
d = m.asdict(password=True)
assert d["password"] == "secret"
def test_asdict_minimal():
m = Machine("example.com")
d = m.asdict()
assert d["host"] == "example.com"
assert "password" not in d
def test_connection_property_raises():
m = Machine("example.com")
with pytest.raises(ConnectionError):
_ = m.connection
def test_connected_false_initially():
m = Machine("example.com")
assert m.connected is False
def test_disconnect_noop():
m = Machine("example.com")
m.disconnect()
assert m.connected is False
def test_set_access_level_at_max():
m = Machine("example.com", max_access_level="Observer")
try:
m.set_access_level(AccessLevel.Observer)
except ConnectionError:
pass except Exception:
pass
def test_block_setter_invalid():
m = Machine("example.com")
with pytest.raises((ValueError, ConnectionError)):
m.block = "invalid"
def test_filter_data_filename_roundtrip():
from qslib.machine import FilterDataFilename
fn = FilterDataFilename.fromstring("S01_C003_T02_P0001_M4_X1_filterdata.xml")
assert fn.stage == 1
assert fn.cycle == 3
assert fn.step == 2
assert fn.point == 1
assert fn.tostring() == "S01_C003_T02_P0001_M4_X1_filterdata.xml"
def test_filter_data_filename_is_same_point():
from qslib.machine import FilterDataFilename
fn1 = FilterDataFilename.fromstring("S01_C003_T02_P0001_M4_X1_filterdata.xml")
fn2 = FilterDataFilename.fromstring("S01_C003_T02_P0001_M3_X2_filterdata.xml")
fn3 = FilterDataFilename.fromstring("S01_C003_T02_P0002_M4_X1_filterdata.xml")
assert fn1.is_same_point(fn2) assert not fn1.is_same_point(fn3)
def test_asdict_all_fields():
m = Machine(
"example.com",
port=9000,
password="secret",
ssl=True,
max_access_level="Administrator",
automatic=False,
)
d = m.asdict(password=True)
assert d["host"] == "example.com"
assert d["port"] == 9000
assert d["password"] == "secret"
assert d["ssl"] is True
assert d["max_access_level"] == "Administrator"
assert d["automatic"] is False
def test_repr():
m = Machine("example.com")
r = repr(m)
assert "Machine" in r
assert "example.com" in r