feat(shared): create stream config models
This commit is contained in:
parent
12d2d4b15a
commit
d9920a1196
4 changed files with 287 additions and 4 deletions
|
@ -1,18 +1,25 @@
|
|||
from os import environ
|
||||
from pathlib import Path
|
||||
from typing import List
|
||||
from typing import List, Union
|
||||
from unittest import mock
|
||||
|
||||
from pydantic import AnyHttpUrl, BaseModel
|
||||
from pydantic import AnyHttpUrl, BaseModel, Field
|
||||
from pytest import mark, raises
|
||||
from typing_extensions import Annotated
|
||||
|
||||
from libretime_shared.config import (
|
||||
BaseConfig,
|
||||
DatabaseConfig,
|
||||
IcecastOutput,
|
||||
RabbitMQConfig,
|
||||
ShoutcastOutput,
|
||||
no_trailing_slash_validator,
|
||||
)
|
||||
|
||||
AnyOutput = Annotated[
|
||||
Union[IcecastOutput, ShoutcastOutput],
|
||||
Field(discriminator="kind"),
|
||||
]
|
||||
|
||||
# pylint: disable=too-few-public-methods
|
||||
class FixtureConfig(BaseConfig):
|
||||
|
@ -21,6 +28,7 @@ class FixtureConfig(BaseConfig):
|
|||
allowed_hosts: List[str] = []
|
||||
database: DatabaseConfig
|
||||
rabbitmq: RabbitMQConfig = RabbitMQConfig()
|
||||
outputs: List[AnyOutput]
|
||||
|
||||
# Validators
|
||||
_public_url_no_trailing_slash = no_trailing_slash_validator("public_url")
|
||||
|
@ -39,6 +47,17 @@ database:
|
|||
port: 5432
|
||||
|
||||
ignored: "ignored"
|
||||
|
||||
outputs:
|
||||
- enabled: true
|
||||
kind: icecast
|
||||
host: localhost
|
||||
port: 8000
|
||||
mount: main.ogg
|
||||
source_password: hackme
|
||||
audio:
|
||||
format: ogg
|
||||
bitrate: 256
|
||||
"""
|
||||
|
||||
|
||||
|
@ -54,6 +73,8 @@ def test_base_config(tmp_path: Path):
|
|||
"LIBRETIME_DATABASE": "invalid",
|
||||
"LIBRETIME_RABBITMQ": "invalid",
|
||||
"LIBRETIME_RABBITMQ_HOST": "changed",
|
||||
"LIBRETIME_OUTPUTS_0_ENABLED": "false",
|
||||
"LIBRETIME_OUTPUTS_0_HOST": "changed",
|
||||
"WRONGPREFIX_API_KEY": "invalid",
|
||||
},
|
||||
):
|
||||
|
@ -66,6 +87,10 @@ def test_base_config(tmp_path: Path):
|
|||
assert config.database.port == 8888
|
||||
assert config.rabbitmq.host == "changed"
|
||||
assert config.rabbitmq.port == 5672
|
||||
assert config.outputs[0].enabled is False
|
||||
assert config.outputs[0].kind == "icecast"
|
||||
assert config.outputs[0].host == "changed"
|
||||
assert config.outputs[0].audio.format == "ogg"
|
||||
|
||||
# Optional model: loading default values (rabbitmq)
|
||||
with mock.patch.dict(environ, {}):
|
||||
|
|
65
shared/tests/config/models_test.py
Normal file
65
shared/tests/config/models_test.py
Normal file
|
@ -0,0 +1,65 @@
|
|||
import pytest
|
||||
from pydantic import ValidationError
|
||||
|
||||
from libretime_shared.config._models import (
|
||||
AudioAAC,
|
||||
AudioMP3,
|
||||
AudioOGG,
|
||||
AudioOpus,
|
||||
StreamConfig,
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"audio",
|
||||
[
|
||||
(AudioAAC),
|
||||
(AudioMP3),
|
||||
(AudioOGG),
|
||||
(AudioOpus),
|
||||
],
|
||||
)
|
||||
def test_audio(audio):
|
||||
audio(bitrate=32)
|
||||
audio(bitrate=320)
|
||||
with pytest.raises(ValidationError):
|
||||
audio(bitrate=11)
|
||||
with pytest.raises(ValidationError):
|
||||
audio(bitrate=321)
|
||||
|
||||
|
||||
def test_stream_config():
|
||||
icecast_output = {
|
||||
"mount": "mount",
|
||||
"source_password": "hackme",
|
||||
"audio": {"format": "ogg", "bitrate": 256},
|
||||
}
|
||||
assert StreamConfig(outputs={"icecast": [icecast_output] * 3})
|
||||
with pytest.raises(ValidationError):
|
||||
StreamConfig(outputs={"icecast": [icecast_output] * 4})
|
||||
|
||||
shoutcast_output = {
|
||||
"source_password": "hackme",
|
||||
"audio": {"format": "mp3", "bitrate": 256},
|
||||
}
|
||||
assert StreamConfig(outputs={"shoutcast": [shoutcast_output]})
|
||||
with pytest.raises(ValidationError):
|
||||
StreamConfig(outputs={"shoutcast": [shoutcast_output] * 2})
|
||||
|
||||
system_output = {
|
||||
"kind": "alsa",
|
||||
}
|
||||
assert StreamConfig(outputs={"system": [system_output]})
|
||||
with pytest.raises(ValidationError):
|
||||
StreamConfig(outputs={"system": [system_output] * 2})
|
||||
|
||||
config = StreamConfig(
|
||||
outputs={
|
||||
"icecast": [icecast_output],
|
||||
"shoutcast": [shoutcast_output],
|
||||
"system": [system_output],
|
||||
}
|
||||
)
|
||||
assert len(config.outputs.icecast) == 1
|
||||
assert len(config.outputs.shoutcast) == 1
|
||||
assert len(config.outputs.system) == 1
|
Loading…
Add table
Add a link
Reference in a new issue