summaryrefslogtreecommitdiff
path: root/tests/test_subscleaner.py
blob: 73e7453ea44b673cd771608ac6d58c161c9ce590 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
"""Unit tests for the subscleaner module."""

from io import StringIO
from unittest.mock import patch

import pytest

from src.subscleaner.subscleaner import ads_in_line, main, process_file


@pytest.fixture
def sample_srt_content():
    """Return a sample SRT content."""
    return """1
00:00:01,000 --> 00:00:03,000
This is a sample subtitle.

2
00:00:04,000 --> 00:00:06,000
OpenSubtitles

3
00:00:07,000 --> 00:00:09,000
Another sample subtitle.
"""


def create_sample_srt_file(tmpdir, content):
    """Create a sample SRT file with the given content."""
    file_path = tmpdir.join("sample.srt")
    file_path.write(content)
    return str(file_path)


@pytest.mark.parametrize(
    "line, expected",
    [
        ("This is a normal line", False),
        ("This line contains OpenSubtitles", True),
        ("Subtitles by XYZ", True),
    ],
)
def test_ads_in_line(line, expected):
    """
    Test the ads_in_line function with different input lines and expected results.

    Args:
        line (str): The input line to be tested.
        expected (bool): The expected result (True if the line contains an ad, False otherwise).
    """
    assert ads_in_line(line) is expected


def test_process_file_no_modification(tmpdir, sample_srt_content):
    """
    Test the process_file function when the file does not require modification.

    Args:
        tmpdir (pytest.fixture): A temporary directory for creating the sample SRT file.
        sample_srt_content (str): The sample SRT content.
    """
    file_path = create_sample_srt_file(tmpdir, sample_srt_content)
    with patch("src.subscleaner.subscleaner.os.path.getctime", return_value=0):
        assert process_file(file_path) is False


def test_process_file_with_modification(tmpdir, sample_srt_content):
    """
    Test the process_file function when the file requires modification.

    Args:
        tmpdir (pytest.fixture): A temporary directory for creating the sample SRT file.
        sample_srt_content (str): The sample SRT content.
    """
    file_path = create_sample_srt_file(tmpdir, sample_srt_content)
    with patch("src.subscleaner.subscleaner.os.path.getctime", return_value=9999999999):
        assert process_file(file_path) is True


def test_process_file_error(tmpdir):
    """
    Test the process_file function when an error occurs (e.g., file not found).

    Args:
        tmpdir (pytest.fixture): A temporary directory.
    """
    file_path = tmpdir.join("nonexistent.srt")
    assert process_file(str(file_path)) is False


def test_main_no_modification(tmpdir, sample_srt_content):
    """
    Test the main function when no files require modification.

    Args:
        tmpdir (pytest.fixture): A temporary directory for creating the sample SRT file.
        sample_srt_content (str): The sample SRT content.
    """
    file_path = create_sample_srt_file(tmpdir, sample_srt_content)
    with (
        patch("sys.stdin", StringIO(file_path)),
        patch("src.subscleaner.subscleaner.process_file", return_value=False) as mock_process_file,
    ):
        main()
        mock_process_file.assert_called_once_with(file_path)


def test_main_with_modification(tmpdir, sample_srt_content):
    """
    Test the main function when files require modification.

    Args:
        tmpdir (pytest.fixture): A temporary directory for creating the sample SRT file.
        sample_srt_content (str): The sample SRT content.
    """
    file_path = create_sample_srt_file(tmpdir, sample_srt_content)
    with (
        patch("sys.stdin", StringIO(file_path)),
        patch("src.subscleaner.subscleaner.process_file", return_value=True) as mock_process_file,
    ):
        main()
        mock_process_file.assert_called_once_with(file_path)