mirror of
https://github.com/dw-0/kiauh.git
synced 2025-12-26 09:13:35 +05:00
Squashed 'kiauh/core/submodules/simple_config_parser/' content from commit 90081a6
git-subtree-dir: kiauh/core/submodules/simple_config_parser git-subtree-split: 90081a6539ec38adf6a1a5bb707a0e9934567c7f
This commit is contained in:
0
tests/public_api/__init__.py
Normal file
0
tests/public_api/__init__.py
Normal file
26
tests/public_api/conftest.py
Normal file
26
tests/public_api/conftest.py
Normal file
@@ -0,0 +1,26 @@
|
||||
# ======================================================================= #
|
||||
# Copyright (C) 2024 Dominik Willner <th33xitus@gmail.com> #
|
||||
# #
|
||||
# https://github.com/dw-0/simple-config-parser #
|
||||
# #
|
||||
# This file may be distributed under the terms of the GNU GPLv3 license #
|
||||
# ======================================================================= #
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
|
||||
from src.simple_config_parser.simple_config_parser import SimpleConfigParser
|
||||
from tests.utils import load_testdata_from_file
|
||||
|
||||
BASE_DIR = Path(__file__).parent.parent.joinpath("assets")
|
||||
CONFIG_FILES = ["test_config_1.cfg", "test_config_2.cfg", "test_config_3.cfg"]
|
||||
|
||||
|
||||
@pytest.fixture(params=CONFIG_FILES)
|
||||
def parser(request):
|
||||
parser = SimpleConfigParser()
|
||||
file_path = BASE_DIR.joinpath(request.param)
|
||||
for line in load_testdata_from_file(file_path):
|
||||
parser._parse_line(line) # noqa
|
||||
|
||||
return parser
|
||||
174
tests/public_api/test_options_api.py
Normal file
174
tests/public_api/test_options_api.py
Normal file
@@ -0,0 +1,174 @@
|
||||
# ======================================================================= #
|
||||
# Copyright (C) 2024 Dominik Willner <th33xitus@gmail.com> #
|
||||
# #
|
||||
# https://github.com/dw-0/simple-config-parser #
|
||||
# #
|
||||
# This file may be distributed under the terms of the GNU GPLv3 license #
|
||||
# ======================================================================= #
|
||||
|
||||
import pytest
|
||||
|
||||
from src.simple_config_parser.simple_config_parser import (
|
||||
NoOptionError,
|
||||
NoSectionError,
|
||||
)
|
||||
|
||||
|
||||
def test_get_options(parser):
|
||||
expected_options = {
|
||||
"section_1": {"option_1"},
|
||||
"section_2": {"option_2"},
|
||||
"section_3": {"option_3"},
|
||||
"section_4": {"option_4"},
|
||||
"section number 5": {"option_5", "multi_option", "option_5_1"},
|
||||
}
|
||||
|
||||
for section, options in expected_options.items():
|
||||
assert options.issubset(
|
||||
parser.get_options(section)
|
||||
), f"Expected options: {options} in section: {section}, got: {parser.get_options(section)}"
|
||||
assert "_raw" not in parser.get_options(section)
|
||||
assert all(
|
||||
not option.startswith("#_") for option in parser.get_options(section)
|
||||
)
|
||||
|
||||
|
||||
def test_has_option(parser):
|
||||
assert parser.has_option("section_1", "option_1") is True
|
||||
assert parser.has_option("section_1", "option_128") is False
|
||||
# section does not exist:
|
||||
assert parser.has_option("section_128", "option_1") is False
|
||||
|
||||
|
||||
def test_getval(parser):
|
||||
# test regular option values
|
||||
assert parser.getval("section_1", "option_1") == "value_1"
|
||||
assert parser.getval("section_3", "option_3") == "value_3"
|
||||
assert parser.getval("section_4", "option_4") == "value_4"
|
||||
assert parser.getval("section number 5", "option_5") == "this.is.value-5"
|
||||
assert parser.getval("section number 5", "option_5_1") == "value_5_1"
|
||||
assert parser.getval("section_2", "option_2") == "value_2"
|
||||
|
||||
# test multiline option values
|
||||
ml_val = parser.getval("section number 5", "multi_option")
|
||||
assert isinstance(ml_val, list)
|
||||
assert len(ml_val) > 0
|
||||
|
||||
|
||||
def test_getval_fallback(parser):
|
||||
assert parser.getval("section_1", "option_128", "fallback") == "fallback"
|
||||
|
||||
|
||||
def test_getval_exceptions(parser):
|
||||
with pytest.raises(NoSectionError):
|
||||
parser.getval("section_128", "option_1")
|
||||
|
||||
with pytest.raises(NoOptionError):
|
||||
parser.getval("section_1", "option_128")
|
||||
|
||||
|
||||
def test_getint(parser):
|
||||
value = parser.getint("section_1", "option_1_2")
|
||||
assert isinstance(value, int)
|
||||
|
||||
|
||||
def test_getint_from_val(parser):
|
||||
with pytest.raises(ValueError):
|
||||
parser.getint("section_1", "option_1")
|
||||
|
||||
|
||||
def test_getint_from_float(parser):
|
||||
with pytest.raises(ValueError):
|
||||
parser.getint("section_1", "option_1_3")
|
||||
|
||||
|
||||
def test_getint_from_boolean(parser):
|
||||
with pytest.raises(ValueError):
|
||||
parser.getint("section_1", "option_1_1")
|
||||
|
||||
|
||||
def test_getint_fallback(parser):
|
||||
assert parser.getint("section_1", "option_128", 128) == 128
|
||||
|
||||
|
||||
def test_getboolean(parser):
|
||||
value = parser.getboolean("section_1", "option_1_1")
|
||||
assert isinstance(value, bool)
|
||||
assert value is True or value is False
|
||||
|
||||
|
||||
def test_getboolean_from_val(parser):
|
||||
with pytest.raises(ValueError):
|
||||
parser.getboolean("section_1", "option_1")
|
||||
|
||||
|
||||
def test_getboolean_from_int(parser):
|
||||
with pytest.raises(ValueError):
|
||||
parser.getboolean("section_1", "option_1_2")
|
||||
|
||||
|
||||
def test_getboolean_from_float(parser):
|
||||
with pytest.raises(ValueError):
|
||||
parser.getboolean("section_1", "option_1_3")
|
||||
|
||||
|
||||
def test_getboolean_fallback(parser):
|
||||
assert parser.getboolean("section_1", "option_128", True) is True
|
||||
assert parser.getboolean("section_1", "option_128", False) is False
|
||||
|
||||
|
||||
def test_getfloat(parser):
|
||||
value = parser.getfloat("section_1", "option_1_3")
|
||||
assert isinstance(value, float)
|
||||
|
||||
|
||||
def test_getfloat_from_val(parser):
|
||||
with pytest.raises(ValueError):
|
||||
parser.getfloat("section_1", "option_1")
|
||||
|
||||
|
||||
def test_getfloat_from_int(parser):
|
||||
value = parser.getfloat("section_1", "option_1_2")
|
||||
assert isinstance(value, float)
|
||||
|
||||
|
||||
def test_getfloat_from_boolean(parser):
|
||||
with pytest.raises(ValueError):
|
||||
parser.getfloat("section_1", "option_1_1")
|
||||
|
||||
|
||||
def test_getfloat_fallback(parser):
|
||||
assert parser.getfloat("section_1", "option_128", 1.234) == 1.234
|
||||
|
||||
|
||||
def test_set_existing_option(parser):
|
||||
parser.set_option("section_1", "new_option", "new_value")
|
||||
assert parser.getval("section_1", "new_option") == "new_value"
|
||||
assert parser.config["section_1"]["new_option"]["_raw"] == "new_option: new_value\n"
|
||||
|
||||
parser.set_option("section_1", "new_option", "new_value_2")
|
||||
assert parser.getval("section_1", "new_option") == "new_value_2"
|
||||
assert (
|
||||
parser.config["section_1"]["new_option"]["_raw"] == "new_option: new_value_2\n"
|
||||
)
|
||||
|
||||
|
||||
def test_set_new_option(parser):
|
||||
parser.set_option("new_section", "very_new_option", "very_new_value")
|
||||
assert (
|
||||
parser.has_section("new_section") is True
|
||||
), f"Expected 'new_section' in {parser.get_sections()}"
|
||||
assert parser.getval("new_section", "very_new_option") == "very_new_value"
|
||||
|
||||
parser.set_option("section_2", "array_option", ["value_1", "value_2", "value_3"])
|
||||
assert parser.getval("section_2", "array_option") == [
|
||||
"value_1",
|
||||
"value_2",
|
||||
"value_3",
|
||||
]
|
||||
assert parser.config["section_2"]["array_option"]["_raw"] == "array_option:\n"
|
||||
|
||||
|
||||
def test_remove_option(parser):
|
||||
parser.remove_option("section_1", "option_1")
|
||||
assert parser.has_option("section_1", "option_1") is False
|
||||
22
tests/public_api/test_read_file.py
Normal file
22
tests/public_api/test_read_file.py
Normal file
@@ -0,0 +1,22 @@
|
||||
# ======================================================================= #
|
||||
# Copyright (C) 2024 Dominik Willner <th33xitus@gmail.com> #
|
||||
# #
|
||||
# https://github.com/dw-0/simple-config-parser #
|
||||
# #
|
||||
# This file may be distributed under the terms of the GNU GPLv3 license #
|
||||
# ======================================================================= #
|
||||
from pathlib import Path
|
||||
|
||||
from src.simple_config_parser.simple_config_parser import (
|
||||
SimpleConfigParser,
|
||||
)
|
||||
|
||||
BASE_DIR = Path(__file__).parent.parent.joinpath("assets")
|
||||
TEST_DATA_PATH = BASE_DIR.joinpath("test_config_1.cfg")
|
||||
|
||||
|
||||
def test_read_file():
|
||||
parser = SimpleConfigParser()
|
||||
parser.read_file(TEST_DATA_PATH)
|
||||
assert parser.config is not None
|
||||
assert parser.config.keys() is not None
|
||||
66
tests/public_api/test_sections_api.py
Normal file
66
tests/public_api/test_sections_api.py
Normal file
@@ -0,0 +1,66 @@
|
||||
# ======================================================================= #
|
||||
# Copyright (C) 2024 Dominik Willner <th33xitus@gmail.com> #
|
||||
# #
|
||||
# https://github.com/dw-0/simple-config-parser #
|
||||
# #
|
||||
# This file may be distributed under the terms of the GNU GPLv3 license #
|
||||
# ======================================================================= #
|
||||
|
||||
import pytest
|
||||
|
||||
from src.simple_config_parser.simple_config_parser import (
|
||||
DuplicateSectionError,
|
||||
)
|
||||
|
||||
|
||||
def test_get_sections(parser):
|
||||
expected_keys = {
|
||||
"section_1",
|
||||
"section_2",
|
||||
"section_3",
|
||||
"section_4",
|
||||
"section number 5",
|
||||
}
|
||||
assert expected_keys.issubset(
|
||||
parser.get_sections()
|
||||
), f"Expected keys: {expected_keys}, got: {parser.get_sections()}"
|
||||
|
||||
|
||||
def test_has_section(parser):
|
||||
assert parser.has_section("section_1") is True
|
||||
assert parser.has_section("not_available") is False
|
||||
|
||||
|
||||
def test_add_section(parser):
|
||||
pre_add_count = len(parser.get_sections())
|
||||
parser.add_section("new_section")
|
||||
parser.add_section("new_section2")
|
||||
assert parser.has_section("new_section") is True
|
||||
assert parser.has_section("new_section2") is True
|
||||
assert len(parser.get_sections()) == pre_add_count + 2
|
||||
|
||||
new_section = parser.config["new_section"]
|
||||
assert isinstance(new_section, dict)
|
||||
assert new_section["_raw"] == "[new_section]\n"
|
||||
|
||||
# this should be the collector, added by the parser before
|
||||
# then second section was added
|
||||
assert list(new_section.keys())[-1].startswith("#_")
|
||||
assert "\n" in new_section[list(new_section.keys())[-1]]
|
||||
|
||||
new_section2 = parser.config["new_section2"]
|
||||
assert isinstance(new_section2, dict)
|
||||
assert new_section2["_raw"] == "[new_section2]\n"
|
||||
|
||||
|
||||
def test_add_section_duplicate(parser):
|
||||
with pytest.raises(DuplicateSectionError):
|
||||
parser.add_section("section_1")
|
||||
|
||||
|
||||
def test_remove_section(parser):
|
||||
pre_remove_count = len(parser.get_sections())
|
||||
parser.remove_section("section_1")
|
||||
assert parser.has_section("section_1") is False
|
||||
assert len(parser.get_sections()) == pre_remove_count - 1
|
||||
assert "section_1" not in parser.config
|
||||
41
tests/public_api/test_write_file.py
Normal file
41
tests/public_api/test_write_file.py
Normal file
@@ -0,0 +1,41 @@
|
||||
# ======================================================================= #
|
||||
# Copyright (C) 2024 Dominik Willner <th33xitus@gmail.com> #
|
||||
# #
|
||||
# https://github.com/dw-0/simple-config-parser #
|
||||
# #
|
||||
# This file may be distributed under the terms of the GNU GPLv3 license #
|
||||
# ======================================================================= #
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
|
||||
from src.simple_config_parser.simple_config_parser import (
|
||||
SimpleConfigParser,
|
||||
)
|
||||
|
||||
BASE_DIR = Path(__file__).parent.parent.joinpath("assets")
|
||||
TEST_DATA_PATH = BASE_DIR.joinpath("test_config_1.cfg")
|
||||
# TEST_DATA_PATH_2 = BASE_DIR.joinpath("test_config_1_write.cfg")
|
||||
|
||||
|
||||
def test_write_file_exception():
|
||||
parser = SimpleConfigParser()
|
||||
with pytest.raises(ValueError):
|
||||
parser.write_file(None) # noqa
|
||||
|
||||
|
||||
def test_write_to_file(tmp_path):
|
||||
tmp_file = Path(tmp_path).joinpath("tmp_config.cfg")
|
||||
parser1 = SimpleConfigParser()
|
||||
parser1.read_file(TEST_DATA_PATH)
|
||||
# parser1.write_file(TEST_DATA_PATH_2)
|
||||
parser1.write_file(tmp_file)
|
||||
|
||||
parser2 = SimpleConfigParser()
|
||||
parser2.read_file(tmp_file)
|
||||
|
||||
assert tmp_file.exists()
|
||||
assert parser2.config is not None
|
||||
|
||||
with open(TEST_DATA_PATH, "r") as original, open(tmp_file, "r") as written:
|
||||
assert original.read() == written.read()
|
||||
Reference in New Issue
Block a user