mirror of
https://github.com/Second-Hand-Friends/kleinanzeigen-bot.git
synced 2026-03-13 02:51:49 +01:00
test: reorganized unit/integration tests (#398)
This commit is contained in:
33
tests/unit/test_bot.py
Normal file
33
tests/unit/test_bot.py
Normal file
@@ -0,0 +1,33 @@
|
||||
"""
|
||||
SPDX-FileCopyrightText: © Sebastian Thomschke and contributors
|
||||
SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
SPDX-ArtifactOfProjectHomePage: https://github.com/Second-Hand-Friends/kleinanzeigen-bot/
|
||||
"""
|
||||
import pytest
|
||||
from kleinanzeigen_bot import KleinanzeigenBot
|
||||
|
||||
|
||||
class TestKleinanzeigenBot:
|
||||
@pytest.fixture
|
||||
def bot(self) -> KleinanzeigenBot:
|
||||
return KleinanzeigenBot()
|
||||
|
||||
def test_parse_args_help(self, bot: KleinanzeigenBot) -> None:
|
||||
"""Test parsing of help command"""
|
||||
bot.parse_args(["app", "help"])
|
||||
assert bot.command == "help"
|
||||
assert bot.ads_selector == "due"
|
||||
assert not bot.keep_old_ads
|
||||
|
||||
def test_parse_args_publish(self, bot: KleinanzeigenBot) -> None:
|
||||
"""Test parsing of publish command with options"""
|
||||
bot.parse_args(["app", "publish", "--ads=all", "--keep-old"])
|
||||
assert bot.command == "publish"
|
||||
assert bot.ads_selector == "all"
|
||||
assert bot.keep_old_ads
|
||||
|
||||
def test_get_version(self, bot: KleinanzeigenBot) -> None:
|
||||
"""Test version retrieval"""
|
||||
version = bot.get_version()
|
||||
assert isinstance(version, str)
|
||||
assert len(version) > 0
|
||||
58
tests/unit/test_i18n.py
Normal file
58
tests/unit/test_i18n.py
Normal file
@@ -0,0 +1,58 @@
|
||||
"""
|
||||
SPDX-FileCopyrightText: © Sebastian Thomschke and contributors
|
||||
SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
SPDX-ArtifactOfProjectHomePage: https://github.com/Second-Hand-Friends/kleinanzeigen-bot/
|
||||
"""
|
||||
import pytest
|
||||
from _pytest.monkeypatch import MonkeyPatch # pylint: disable=import-private-name
|
||||
from kleinanzeigen_bot import i18n
|
||||
|
||||
|
||||
@pytest.mark.parametrize("lang, expected", [
|
||||
(None, ("en", "US", "UTF-8")), # Test with no LANG variable (should default to ("en", "US", "UTF-8"))
|
||||
("fr", ("fr", None, "UTF-8")), # Test with just a language code
|
||||
("fr_CA", ("fr", "CA", "UTF-8")), # Test with language + region, no encoding
|
||||
("pt_BR.iso8859-1", ("pt", "BR", "ISO8859-1")), # Test with language + region + encoding
|
||||
])
|
||||
def test_detect_locale(monkeypatch: MonkeyPatch, lang: str | None, expected: i18n.Locale) -> None:
|
||||
"""
|
||||
Pytest test case to verify detect_system_language() behavior under various LANG values.
|
||||
"""
|
||||
# Clear or set the LANG environment variable as needed.
|
||||
if lang is None:
|
||||
monkeypatch.delenv("LANG", raising = False)
|
||||
else:
|
||||
monkeypatch.setenv("LANG", lang)
|
||||
|
||||
# Call the function and compare the result to the expected output.
|
||||
result = i18n._detect_locale() # pylint: disable=protected-access
|
||||
assert result == expected, f"For LANG={lang}, expected {expected} but got {result}"
|
||||
|
||||
|
||||
@pytest.mark.parametrize("lang, noun, count, prefix_with_count, expected", [
|
||||
("en", "field", 1, True, "1 field"),
|
||||
("en", "field", 2, True, "2 fields"),
|
||||
("en", "field", 2, False, "fields"),
|
||||
("en", "attribute", 2, False, "attributes"),
|
||||
("en", "bus", 2, False, "buses"),
|
||||
("en", "city", 2, False, "cities"),
|
||||
("de", "Feld", 1, True, "1 Feld"),
|
||||
("de", "Feld", 2, True, "2 Felder"),
|
||||
("de", "Feld", 2, False, "Felder"),
|
||||
("de", "Anzeige", 2, False, "Anzeigen"),
|
||||
("de", "Attribute", 2, False, "Attribute"),
|
||||
("de", "Bild", 2, False, "Bilder"),
|
||||
("de", "Datei", 2, False, "Dateien"),
|
||||
("de", "Kategorie", 2, False, "Kategorien")
|
||||
])
|
||||
def test_pluralize(
|
||||
lang:str,
|
||||
noun:str,
|
||||
count:int,
|
||||
prefix_with_count:bool,
|
||||
expected: str
|
||||
) -> None:
|
||||
i18n.set_current_locale(i18n.Locale(lang, "US", "UTF_8"))
|
||||
|
||||
result = i18n.pluralize(noun, count, prefix_with_count)
|
||||
assert result == expected, f"For LANG={lang}, expected {expected} but got {result}"
|
||||
53
tests/unit/test_utils.py
Normal file
53
tests/unit/test_utils.py
Normal file
@@ -0,0 +1,53 @@
|
||||
"""
|
||||
SPDX-FileCopyrightText: © Sebastian Thomschke and contributors
|
||||
SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
SPDX-ArtifactOfProjectHomePage: https://github.com/Second-Hand-Friends/kleinanzeigen-bot/
|
||||
"""
|
||||
import pytest
|
||||
from kleinanzeigen_bot import utils
|
||||
|
||||
|
||||
def test_ensure() -> None:
|
||||
utils.ensure(True, "TRUE")
|
||||
utils.ensure("Some Value", "TRUE")
|
||||
utils.ensure(123, "TRUE")
|
||||
utils.ensure(-123, "TRUE")
|
||||
utils.ensure(lambda: True, "TRUE")
|
||||
|
||||
with pytest.raises(AssertionError):
|
||||
utils.ensure(False, "FALSE")
|
||||
|
||||
with pytest.raises(AssertionError):
|
||||
utils.ensure(0, "FALSE")
|
||||
|
||||
with pytest.raises(AssertionError):
|
||||
utils.ensure("", "FALSE")
|
||||
|
||||
with pytest.raises(AssertionError):
|
||||
utils.ensure(None, "FALSE")
|
||||
|
||||
with pytest.raises(AssertionError):
|
||||
utils.ensure(lambda: False, "FALSE", timeout = 2)
|
||||
|
||||
|
||||
def test_calculate_content_hash_with_none_values() -> None:
|
||||
"""Test calculate_content_hash with None values in the ad configuration."""
|
||||
ad_cfg = {
|
||||
# Minimal configuration with None values as described in bug report
|
||||
"id": "123456789",
|
||||
"created_on": "2022-07-19T07:30:20.489289",
|
||||
"updated_on": "2025-01-22T19:46:46.735896",
|
||||
"title": "Test Ad",
|
||||
"description": "Test Description",
|
||||
"images": [None, "/path/to/image.jpg", None], # List containing None values
|
||||
"shipping_options": None, # None instead of list
|
||||
"special_attributes": None, # None instead of dictionary
|
||||
"contact": {
|
||||
"street": None # None value in contact
|
||||
}
|
||||
}
|
||||
|
||||
# Should not raise TypeError
|
||||
hash_value = utils.calculate_content_hash(ad_cfg)
|
||||
assert isinstance(hash_value, str)
|
||||
assert len(hash_value) == 64 # SHA-256 hash is 64 characters long
|
||||
Reference in New Issue
Block a user