1 changed files with 125 additions and 0 deletions
@ -0,0 +1,125 @@ |
|||
#!/usr/bin/env python3 |
|||
# -*- coding: utf-8 -*- |
|||
|
|||
from src import boot |
|||
from types import GenericAlias |
|||
from typing import NotRequired |
|||
from src.boot import SyncplayOptions |
|||
|
|||
|
|||
def test_options(): |
|||
""" |
|||
Verify types and structure of SyncplayOptions and DESC. |
|||
""" |
|||
assert len(SyncplayOptions.__annotations__) == len(boot.DESC) |
|||
assert set(SyncplayOptions.__annotations__) == set(boot.DESC) |
|||
|
|||
for tag, desc in boot.DESC.values(): |
|||
assert tag is None or type(tag) is str |
|||
assert type(desc) is str |
|||
|
|||
for field in SyncplayOptions.__annotations__.values(): |
|||
assert field.__origin__ is NotRequired |
|||
assert len(field.__args__) == 1 |
|||
|
|||
if type(field_t := field.__args__[0]) is GenericAlias: |
|||
assert field_t.__origin__ is list |
|||
assert len(field_t.__args__) == 1 |
|||
field_t = field_t.__args__[0] |
|||
|
|||
assert field_t in (int, str, bool) |
|||
|
|||
|
|||
def verify_env_opts(): |
|||
""" |
|||
Verify the ENV_OPTS with expected environment variable options. |
|||
""" |
|||
expected_opts = { |
|||
'config': str, # only non-list options |
|||
'port': int, |
|||
'password': str, |
|||
'motd': str, |
|||
'salt': str, |
|||
'random_salt': bool, |
|||
'isolate_rooms': bool, |
|||
'disable_chat': bool, |
|||
'disable_ready': bool, |
|||
'enable_stats': bool, |
|||
'enable_tls': bool, |
|||
'persistent': bool, |
|||
'max_username': int, |
|||
'max_chat_message': int, |
|||
'listen_ipv4': str, |
|||
'listen_ipv6': str, |
|||
} |
|||
assert boot.ENV_OPTS == expected_opts |
|||
|
|||
|
|||
def verify_cfg_opts(): |
|||
""" |
|||
Verify the CFG_OPTS with expected configure file options. |
|||
""" |
|||
expected_opts = { |
|||
'config': (str, False), # (type, is_list) |
|||
'port': (int, False), |
|||
'password': (str, False), |
|||
'motd': (str, False), |
|||
'salt': (str, False), |
|||
'random_salt': (bool, False), |
|||
'isolate_rooms': (bool, False), |
|||
'disable_chat': (bool, False), |
|||
'disable_ready': (bool, False), |
|||
'enable_stats': (bool, False), |
|||
'enable_tls': (bool, False), |
|||
'persistent': (bool, False), |
|||
'max_username': (int, False), |
|||
'max_chat_message': (int, False), |
|||
'permanent_rooms': (str, True), |
|||
'listen_ipv4': (str, False), |
|||
'listen_ipv6': (str, False), |
|||
} |
|||
assert boot.CFG_OPTS == expected_opts |
|||
|
|||
|
|||
def verify_arg_opts(): |
|||
""" |
|||
Verify the ARG_OPTS with expected command line options. |
|||
""" |
|||
expected_opts = { |
|||
'config': {'type': str, 'metavar': 'FILE'}, # argparse options |
|||
'port': {'type': int, 'metavar': 'PORT'}, |
|||
'password': {'type': str, 'metavar': 'PASSWD'}, |
|||
'motd': {'type': str, 'metavar': 'MESSAGE'}, |
|||
'salt': {'type': str, 'metavar': 'TEXT'}, |
|||
'random_salt': {'action': 'store_true'}, |
|||
'isolate_rooms': {'action': 'store_true'}, |
|||
'disable_chat': {'action': 'store_true'}, |
|||
'disable_ready': {'action': 'store_true'}, |
|||
'enable_stats': {'action': 'store_true'}, |
|||
'enable_tls': {'action': 'store_true'}, |
|||
'persistent': {'action': 'store_true'}, |
|||
'max_username': {'type': int, 'metavar': 'NUM'}, |
|||
'max_chat_message': {'type': int, 'metavar': 'NUM'}, |
|||
'permanent_rooms': {'type': str, 'metavar': 'ROOM', 'nargs': '*'}, |
|||
'listen_ipv4': {'type': str, 'metavar': 'ADDR'}, |
|||
'listen_ipv6': {'type': str, 'metavar': 'ADDR'}, |
|||
} |
|||
for tag, opts in expected_opts.items(): |
|||
_, opts['help'] = boot.DESC[tag] # help message from DESC |
|||
|
|||
assert boot.ARG_OPTS == expected_opts |
|||
|
|||
|
|||
def test_init_opts(): |
|||
""" |
|||
Test initialization and idempotency of the init_opts function. |
|||
""" |
|||
assert not boot.ARG_OPTS |
|||
assert not boot.ENV_OPTS |
|||
assert not boot.CFG_OPTS |
|||
|
|||
for _ in range(2): |
|||
boot.init_opts() # run twice to verify idempotency |
|||
verify_arg_opts() |
|||
verify_env_opts() |
|||
verify_cfg_opts() |
Loading…
Reference in new issue