2
2
3
3
from typing import TYPE_CHECKING
4
4
from typing import Any
5
+ from typing import Callable
5
6
from typing import cast
6
7
7
8
import pytest
31
32
@pytest .fixture
32
33
def poetry_with_up_to_date_lockfile (
33
34
project_factory : ProjectFactory , fixture_dir : FixtureDirGetter
34
- ) -> Poetry :
35
- source = fixture_dir ("up_to_date_lock" )
35
+ ) -> Callable [[str ], Poetry ]:
36
+ def get_poetry (fixture_name : str ) -> Poetry :
37
+ source = fixture_dir (fixture_name )
36
38
37
- poetry = project_factory (
38
- name = "foobar" ,
39
- pyproject_content = (source / "pyproject.toml" ).read_text (encoding = "utf-8" ),
40
- poetry_lock_content = (source / "poetry.lock" ).read_text (encoding = "utf-8" ),
41
- )
39
+ poetry = project_factory (
40
+ name = "foobar" ,
41
+ pyproject_content = (source / "pyproject.toml" ).read_text (encoding = "utf-8" ),
42
+ poetry_lock_content = (source / "poetry.lock" ).read_text (encoding = "utf-8" ),
43
+ )
44
+
45
+ assert isinstance (poetry .locker , TestLocker )
46
+ poetry .locker .locked (True )
47
+ return poetry
42
48
43
- assert isinstance (poetry .locker , TestLocker )
44
- poetry .locker .locked (True )
45
- return poetry
49
+ return get_poetry
46
50
47
51
48
52
@pytest .fixture ()
49
53
def tester (command_tester_factory : CommandTesterFactory ) -> CommandTester :
50
54
return command_tester_factory ("remove" )
51
55
52
56
57
+ def test_remove_from_project_and_poetry (
58
+ tester : CommandTester ,
59
+ app : PoetryTestApplication ,
60
+ repo : TestRepository ,
61
+ installed : Repository ,
62
+ ) -> None :
63
+ repo .add_package (Package ("foo" , "2.0.0" ))
64
+ repo .add_package (Package ("bar" , "1.0.0" ))
65
+
66
+ pyproject : dict [str , Any ] = app .poetry .file .read ()
67
+
68
+ project_dependencies : dict [str , Any ] = tomlkit .parse (
69
+ """\
70
+ [project]
71
+ dependencies = [
72
+ "foo>=2.0",
73
+ "bar>=1.0",
74
+ ]
75
+ """
76
+ )
77
+
78
+ poetry_dependencies : dict [str , Any ] = tomlkit .parse (
79
+ """\
80
+ [tool.poetry.dependencies]
81
+ foo = "^2.0.0"
82
+ bar = "^1.0.0"
83
+
84
+ """
85
+ )
86
+
87
+ pyproject ["project" ]["dependencies" ] = project_dependencies ["project" ][
88
+ "dependencies"
89
+ ]
90
+ pyproject ["tool" ]["poetry" ]["dependencies" ] = poetry_dependencies ["tool" ]["poetry" ][
91
+ "dependencies"
92
+ ]
93
+ pyproject = cast ("TOMLDocument" , pyproject )
94
+ app .poetry .file .write (pyproject )
95
+
96
+ app .poetry .package .add_dependency (Factory .create_dependency ("foo" , "^2.0.0" ))
97
+ app .poetry .package .add_dependency (Factory .create_dependency ("bar" , "^1.0.0" ))
98
+
99
+ tester .execute ("foo" )
100
+
101
+ pyproject = app .poetry .file .read ()
102
+ pyproject = cast ("dict[str, Any]" , pyproject )
103
+ project_dependencies = pyproject ["project" ]["dependencies" ]
104
+ assert "foo>=2.0" not in project_dependencies
105
+ assert "bar>=1.0" in project_dependencies
106
+ poetry_dependencies = pyproject ["tool" ]["poetry" ]["dependencies" ]
107
+ assert "foo" not in poetry_dependencies
108
+ assert "bar" in poetry_dependencies
109
+
110
+ expected_project_string = """\
111
+ dependencies = [
112
+ "bar>=1.0",
113
+ ]
114
+ """
115
+ expected_poetry_string = """\
116
+
117
+ [tool.poetry.dependencies]
118
+ bar = "^1.0.0"
119
+
120
+ """
121
+ pyproject = cast ("TOMLDocument" , pyproject )
122
+ string_content = pyproject .as_string ()
123
+ if "\r \n " in string_content :
124
+ # consistent line endings
125
+ expected_project_string = expected_project_string .replace ("\n " , "\r \n " )
126
+ expected_poetry_string = expected_poetry_string .replace ("\n " , "\r \n " )
127
+
128
+ assert expected_project_string in string_content
129
+ assert expected_poetry_string in string_content
130
+
131
+
53
132
def test_remove_without_specific_group_removes_from_all_groups (
54
133
tester : CommandTester ,
55
134
app : PoetryTestApplication ,
@@ -110,7 +189,7 @@ def test_remove_without_specific_group_removes_from_all_groups(
110
189
assert expected in string_content
111
190
112
191
113
- def test_remove_without_specific_group_removes_from_specific_groups (
192
+ def test_remove_with_specific_group_removes_from_specific_groups (
114
193
tester : CommandTester ,
115
194
app : PoetryTestApplication ,
116
195
repo : TestRepository ,
@@ -169,7 +248,7 @@ def test_remove_without_specific_group_removes_from_specific_groups(
169
248
assert expected in string_content
170
249
171
250
172
- def test_remove_does_not_live_empty_groups (
251
+ def test_remove_does_not_keep_empty_groups (
173
252
tester : CommandTester ,
174
253
app : PoetryTestApplication ,
175
254
repo : TestRepository ,
@@ -299,33 +378,41 @@ def test_remove_command_should_not_write_changes_upon_installer_errors(
299
378
assert app .poetry .file .read ().as_string () == original_content
300
379
301
380
381
+ @pytest .mark .parametrize (
382
+ "fixture_name" , ["up_to_date_lock" , "up_to_date_lock_non_package" ]
383
+ )
302
384
def test_remove_with_dry_run_keep_files_intact (
303
- poetry_with_up_to_date_lockfile : Poetry ,
385
+ fixture_name : str ,
386
+ poetry_with_up_to_date_lockfile : Callable [[str ], Poetry ],
304
387
repo : TestRepository ,
305
388
command_tester_factory : CommandTesterFactory ,
306
389
) -> None :
307
- tester = command_tester_factory ("remove" , poetry = poetry_with_up_to_date_lockfile )
390
+ poetry = poetry_with_up_to_date_lockfile (fixture_name )
391
+ tester = command_tester_factory ("remove" , poetry = poetry )
308
392
309
- original_pyproject_content = poetry_with_up_to_date_lockfile .file .read ()
310
- original_lockfile_content = poetry_with_up_to_date_lockfile ._locker .lock_data
393
+ original_pyproject_content = poetry .file .read ()
394
+ original_lockfile_content = poetry ._locker .lock_data
311
395
312
396
repo .add_package (get_package ("docker" , "4.3.1" ))
313
397
314
398
tester .execute ("docker --dry-run" )
315
399
316
- assert poetry_with_up_to_date_lockfile .file .read () == original_pyproject_content
317
- assert (
318
- poetry_with_up_to_date_lockfile ._locker .lock_data == original_lockfile_content
319
- )
400
+ assert poetry .file .read () == original_pyproject_content
401
+ assert poetry ._locker .lock_data == original_lockfile_content
320
402
321
403
404
+ @pytest .mark .parametrize (
405
+ "fixture_name" , ["up_to_date_lock" , "up_to_date_lock_non_package" ]
406
+ )
322
407
def test_remove_performs_uninstall_op (
323
- poetry_with_up_to_date_lockfile : Poetry ,
408
+ fixture_name : str ,
409
+ poetry_with_up_to_date_lockfile : Callable [[str ], Poetry ],
324
410
command_tester_factory : CommandTesterFactory ,
325
411
installed : Repository ,
326
412
) -> None :
327
413
installed .add_package (get_package ("docker" , "4.3.1" ))
328
- tester = command_tester_factory ("remove" , poetry = poetry_with_up_to_date_lockfile )
414
+ poetry = poetry_with_up_to_date_lockfile (fixture_name )
415
+ tester = command_tester_factory ("remove" , poetry = poetry )
329
416
330
417
tester .execute ("docker" )
331
418
@@ -343,13 +430,18 @@ def test_remove_performs_uninstall_op(
343
430
assert tester .io .fetch_output () == expected
344
431
345
432
433
+ @pytest .mark .parametrize (
434
+ "fixture_name" , ["up_to_date_lock" , "up_to_date_lock_non_package" ]
435
+ )
346
436
def test_remove_with_lock_does_not_perform_uninstall_op (
347
- poetry_with_up_to_date_lockfile : Poetry ,
437
+ fixture_name : str ,
438
+ poetry_with_up_to_date_lockfile : Callable [[str ], Poetry ],
348
439
command_tester_factory : CommandTesterFactory ,
349
440
installed : Repository ,
350
441
) -> None :
351
442
installed .add_package (get_package ("docker" , "4.3.1" ))
352
- tester = command_tester_factory ("remove" , poetry = poetry_with_up_to_date_lockfile )
443
+ poetry = poetry_with_up_to_date_lockfile (fixture_name )
444
+ tester = command_tester_factory ("remove" , poetry = poetry )
353
445
354
446
tester .execute ("docker --lock" )
355
447
0 commit comments