forked from apify/crawlee-python
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_cli.py
More file actions
159 lines (126 loc) · 4.79 KB
/
test_cli.py
File metadata and controls
159 lines (126 loc) · 4.79 KB
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
from __future__ import annotations
import os
from unittest.mock import Mock
import pytest
import readchar
from typer.testing import CliRunner
import crawlee._cli
runner = CliRunner()
@pytest.fixture
def mock_cookiecutter(monkeypatch: pytest.MonkeyPatch) -> Mock:
mock_cookiecutter = Mock()
monkeypatch.setattr(target=crawlee._cli, name='cookiecutter', value=mock_cookiecutter)
return mock_cookiecutter
def test_create_interactive(mock_cookiecutter: Mock, monkeypatch: pytest.MonkeyPatch) -> None:
mock_input = iter(
[
*'my_project',
readchar.key.ENTER,
readchar.key.ENTER,
]
)
monkeypatch.setattr(target=readchar, name='readkey', value=lambda: next(mock_input))
result = runner.invoke(crawlee._cli.cli, ['create'])
assert 'Your project "my_project" was created.' in result.output
mock_cookiecutter.assert_called_with(
template='gh:apify/crawlee-python',
directory='templates/beautifulsoup',
no_input=True,
extra_context={'project_name': 'my_project'},
)
def test_create_interactive_non_default_template(mock_cookiecutter: Mock, monkeypatch: pytest.MonkeyPatch) -> None:
mock_input = iter(
[
*'my_project',
readchar.key.ENTER,
readchar.key.DOWN,
readchar.key.ENTER,
]
)
monkeypatch.setattr(target=readchar, name='readkey', value=lambda: next(mock_input))
result = runner.invoke(crawlee._cli.cli, ['create'])
assert 'Your project "my_project" was created.' in result.output
mock_cookiecutter.assert_called_with(
template='gh:apify/crawlee-python',
directory='templates/playwright',
no_input=True,
extra_context={'project_name': 'my_project'},
)
def test_create_non_interactive(mock_cookiecutter: Mock) -> None:
runner.invoke(crawlee._cli.cli, ['create', 'my_project', '--template', 'playwright'])
mock_cookiecutter.assert_called_with(
template='gh:apify/crawlee-python',
directory='templates/playwright',
no_input=True,
extra_context={'project_name': 'my_project'},
)
def test_create_existing_folder(
mock_cookiecutter: Mock, monkeypatch: pytest.MonkeyPatch, tmp_path_factory: pytest.TempPathFactory
) -> None:
mock_input = iter(
[
*'my_project',
readchar.key.ENTER,
]
)
monkeypatch.setattr(target=readchar, name='readkey', value=lambda: next(mock_input))
tmp = tmp_path_factory.mktemp('workdir')
os.chdir(tmp)
(tmp / 'existing_project').mkdir()
result = runner.invoke(crawlee._cli.cli, ['create', 'existing_project', '--template', 'playwright'])
assert 'existing_project already exists' in result.output
mock_cookiecutter.assert_called_with(
template='gh:apify/crawlee-python',
directory='templates/playwright',
no_input=True,
extra_context={'project_name': 'my_project'},
)
def test_create_existing_folder_interactive(
mock_cookiecutter: Mock, monkeypatch: pytest.MonkeyPatch, tmp_path_factory: pytest.TempPathFactory
) -> None:
mock_input = iter(
[
*'existing_project',
readchar.key.ENTER,
*'my_project',
readchar.key.ENTER,
]
)
monkeypatch.setattr(target=readchar, name='readkey', value=lambda: next(mock_input))
tmp = tmp_path_factory.mktemp('workdir')
os.chdir(tmp)
(tmp / 'existing_project').mkdir()
result = runner.invoke(crawlee._cli.cli, ['create', '--template', 'playwright'])
assert 'existing_project already exists' in result.output
mock_cookiecutter.assert_called_with(
template='gh:apify/crawlee-python',
directory='templates/playwright',
no_input=True,
extra_context={'project_name': 'my_project'},
)
def test_create_existing_folder_interactive_multiple_attempts(
mock_cookiecutter: Mock, monkeypatch: pytest.MonkeyPatch, tmp_path_factory: pytest.TempPathFactory
) -> None:
mock_input = iter(
[
*'existing_project',
readchar.key.ENTER,
*'existing_project_2',
readchar.key.ENTER,
*'my_project',
readchar.key.ENTER,
]
)
monkeypatch.setattr(target=readchar, name='readkey', value=lambda: next(mock_input))
tmp = tmp_path_factory.mktemp('workdir')
os.chdir(tmp)
(tmp / 'existing_project').mkdir()
(tmp / 'existing_project_2').mkdir()
result = runner.invoke(crawlee._cli.cli, ['create', '--template', 'playwright'])
assert 'existing_project already exists' in result.output
mock_cookiecutter.assert_called_with(
template='gh:apify/crawlee-python',
directory='templates/playwright',
no_input=True,
extra_context={'project_name': 'my_project'},
)