SIENTIAPDE-2202-escrita-opc-timestamp-qualidade: Enable granular control over OPC UA SourceTimestamp and StatusCode in write commands. This implements write_timestamp and write_quality flags (command > env > default true) for DataValue construction. Upgraded asyncua to 2.0+ to fix StatusCode field naming. Enhanced README.md with new gateway environment variables and detailed write command behavior. Added comprehensive unit and E2E tests for this feature, and removed obsolete planning documents.
86 lines
2.2 KiB
Python
86 lines
2.2 KiB
Python
import pytest
|
|
|
|
from ingestor.config import GatewayConfig
|
|
|
|
_ENV_VARS = (
|
|
'NATS_URL',
|
|
'NATS_WRITE_SUBJECT',
|
|
'NATS_QUEUE',
|
|
'GRPC_ENABLED',
|
|
'GRPC_PORT',
|
|
'CERT_CACHE_DIR',
|
|
'WRITE_TIMESTAMP',
|
|
'WRITE_QUALITY',
|
|
'WRITE_MIN_PAUSE_S',
|
|
'IDLE_CONN_MAX_S',
|
|
)
|
|
|
|
|
|
@pytest.fixture(autouse=True)
|
|
def clean_env(monkeypatch):
|
|
for var in _ENV_VARS:
|
|
monkeypatch.delenv(var, raising=False)
|
|
|
|
|
|
def test_from_env_defaults():
|
|
cfg = GatewayConfig.from_env()
|
|
|
|
assert cfg.nats_url == 'nats://localhost:4222'
|
|
assert cfg.nats_write_subject == 'opc.write'
|
|
assert cfg.nats_queue == 'gateway-writers'
|
|
assert cfg.grpc_enabled is False
|
|
assert cfg.grpc_port == 50051
|
|
assert cfg.cert_cache_dir == '/tmp/opc-certs' # noqa: S108
|
|
assert cfg.write_timestamp is True
|
|
assert cfg.write_quality is True
|
|
assert cfg.write_min_pause_s == 0.0
|
|
assert cfg.idle_conn_max_s == 300.0
|
|
|
|
|
|
def test_from_env_overrides(monkeypatch):
|
|
monkeypatch.setenv('GRPC_ENABLED', 'true')
|
|
monkeypatch.setenv('GRPC_PORT', '6000')
|
|
monkeypatch.setenv('WRITE_MIN_PAUSE_S', '0.5')
|
|
monkeypatch.setenv('WRITE_TIMESTAMP', 'false')
|
|
monkeypatch.setenv('WRITE_QUALITY', 'false')
|
|
|
|
cfg = GatewayConfig.from_env()
|
|
|
|
assert cfg.grpc_enabled is True
|
|
assert cfg.grpc_port == 6000
|
|
assert cfg.write_min_pause_s == 0.5
|
|
assert cfg.write_timestamp is False
|
|
assert cfg.write_quality is False
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
'value,expected',
|
|
[
|
|
('0', False),
|
|
('no', False),
|
|
('FALSE', False),
|
|
('1', True),
|
|
('YES', True),
|
|
],
|
|
)
|
|
def test_bool_parsing_edge_cases(monkeypatch, value, expected):
|
|
monkeypatch.setenv('GRPC_ENABLED', value)
|
|
|
|
cfg = GatewayConfig.from_env()
|
|
|
|
assert cfg.grpc_enabled is expected
|
|
|
|
|
|
def test_certs_from_env_ignores_malformed_numeric_vars(monkeypatch):
|
|
import pytest
|
|
|
|
monkeypatch.setenv('GRPC_PORT', '')
|
|
monkeypatch.setenv('IDLE_CONN_MAX_S', 'abc')
|
|
monkeypatch.setenv('CERT_CACHE_DIR', 'certs-cache')
|
|
|
|
cfg = GatewayConfig.certs_from_env()
|
|
|
|
assert cfg.cert_cache_dir == 'certs-cache'
|
|
with pytest.raises(ValueError):
|
|
GatewayConfig.from_env() # the full config still fails, only the runtime uses it
|