1010from click .testing import CliRunner
1111
1212from linear_cli .api .client .client import LinearClient
13- from linear_cli .cli .commands .project import (
14- create_milestone ,
15- create_test_data ,
16- delete_milestone ,
17- list_milestone_issues ,
18- list_milestones ,
19- show_milestone ,
20- update_milestone ,
21- )
13+ from linear_cli .cli .commands .project import project
2214from linear_cli .config .manager import LinearConfig
2315
2416
@@ -44,7 +36,7 @@ def mock_client():
4436 client .get_project = AsyncMock ()
4537
4638 # Mock milestone methods
47- client .get_project_milestones = AsyncMock ()
39+ client .get_milestones = AsyncMock ()
4840 client .get_milestone = AsyncMock ()
4941 client .create_milestone = AsyncMock ()
5042 client .update_milestone = AsyncMock ()
@@ -53,6 +45,7 @@ def mock_client():
5345
5446 # Mock other methods
5547 client .get_teams = AsyncMock ()
48+ client .get_users = AsyncMock ()
5649 client .create_project = AsyncMock ()
5750 client .create_issue = AsyncMock ()
5851
@@ -95,30 +88,25 @@ def test_list_project_milestones(self, runner, mock_cli_context):
9588 }
9689 ]
9790 }
98- mock_cli_context .get_client ().get_project_milestones .return_value = milestones_data
91+ mock_cli_context .get_client ().get_milestones .return_value = milestones_data
9992
10093 result = runner .invoke (
101- list_milestones ,
102- ["Test Project" ],
94+ project ,
95+ ["milestones" , " Test Project" ],
10396 obj = {"cli_context" : mock_cli_context },
10497 )
10598
10699 assert result .exit_code == 0
107100 mock_cli_context .get_client ().get_project .assert_called_once_with ("Test Project" )
108- mock_cli_context .get_client ().get_project_milestones .assert_called_once_with (
109- project_id = "proj_123" ,
110- limit = 50 ,
111- target_date_after = None ,
112- target_date_before = None
113- )
101+ mock_cli_context .get_client ().get_milestones .assert_called_once_with (limit = 50 )
114102
115103 def test_list_milestones_project_not_found (self , runner , mock_cli_context ):
116104 """Test listing milestones for non-existent project."""
117105 mock_cli_context .get_client ().get_project .return_value = None
118106
119107 result = runner .invoke (
120- list_milestones ,
121- ["NonExistent" ],
108+ project ,
109+ ["milestones" , " NonExistent" ],
122110 obj = {"cli_context" : mock_cli_context },
123111 )
124112
@@ -139,36 +127,40 @@ def test_show_project_milestone(self, runner, mock_cli_context):
139127 "project" : {"id" : "proj_123" , "name" : "Test Project" },
140128 }
141129
130+ # Mock milestone resolution first
131+ mock_cli_context .get_client ().resolve_milestone_id .return_value = "milestone_123"
142132 mock_cli_context .get_client ().get_milestone .return_value = milestone_data
143133
144134 result = runner .invoke (
145- show_milestone ,
146- ["Test Project" , "milestone_123" ],
135+ project ,
136+ ["milestone" , " Test Project" , "milestone_123" ],
147137 obj = {"cli_context" : mock_cli_context },
148138 )
149139
150140 assert result .exit_code == 0
141+ mock_cli_context .get_client ().resolve_milestone_id .assert_called_once_with ("milestone_123" , "Test Project" )
151142 mock_cli_context .get_client ().get_milestone .assert_called_once_with ("milestone_123" )
152143
153144 def test_show_milestone_by_name_with_resolution (self , runner , mock_cli_context ):
154145 """Test showing milestone by name with resolution."""
155- # Mock initial lookup failure
156- mock_cli_context .get_client ().get_milestone .side_effect = [None , {
146+ milestone_data = {
157147 "id" : "milestone_123" ,
158148 "name" : "Sprint 1"
159- }]
149+ }
160150
161151 # Mock name resolution
162152 mock_cli_context .get_client ().resolve_milestone_id .return_value = "milestone_123"
153+ mock_cli_context .get_client ().get_milestone .return_value = milestone_data
163154
164155 result = runner .invoke (
165- show_milestone ,
166- ["Test Project" , "Sprint 1" ],
156+ project ,
157+ ["milestone" , " Test Project" , "Sprint 1" ],
167158 obj = {"cli_context" : mock_cli_context },
168159 )
169160
170161 assert result .exit_code == 0
171162 mock_cli_context .get_client ().resolve_milestone_id .assert_called_once_with ("Sprint 1" , "Test Project" )
163+ mock_cli_context .get_client ().get_milestone .assert_called_once_with ("milestone_123" )
172164
173165
174166class TestCreateMilestone :
@@ -192,8 +184,8 @@ def test_create_project_milestone(self, runner, mock_cli_context):
192184 mock_cli_context .get_client ().create_milestone .return_value = create_result
193185
194186 result = runner .invoke (
195- create_milestone ,
196- ["Test Project" , "Sprint 1" ],
187+ project ,
188+ ["create-milestone" , " Test Project" , "Sprint 1" ],
197189 obj = {"cli_context" : mock_cli_context },
198190 )
199191
@@ -225,8 +217,9 @@ def test_create_milestone_with_options(self, runner, mock_cli_context):
225217 mock_cli_context .get_client ().create_milestone .return_value = create_result
226218
227219 result = runner .invoke (
228- create_milestone ,
220+ project ,
229221 [
222+ "create-milestone" ,
230223 "Test Project" ,
231224 "Sprint 1" ,
232225 "--description" ,
@@ -251,8 +244,8 @@ def test_create_milestone_project_not_found(self, runner, mock_cli_context):
251244 mock_cli_context .get_client ().get_project .return_value = None
252245
253246 result = runner .invoke (
254- create_milestone ,
255- ["NonExistent" , "Sprint 1" ],
247+ project ,
248+ ["create-milestone" , " NonExistent" , "Sprint 1" ],
256249 obj = {"cli_context" : mock_cli_context },
257250 )
258251
@@ -279,8 +272,8 @@ def test_update_project_milestone(self, runner, mock_cli_context):
279272 mock_cli_context .get_client ().update_milestone .return_value = update_result
280273
281274 result = runner .invoke (
282- update_milestone ,
283- ["Test Project" , "Sprint 1" , "--name" , "Sprint 1 Updated" ],
275+ project ,
276+ ["update-milestone" , " Test Project" , "Sprint 1" , "--name" , "Sprint 1 Updated" ],
284277 obj = {"cli_context" : mock_cli_context },
285278 )
286279
@@ -305,8 +298,8 @@ def test_delete_project_milestone(self, runner, mock_cli_context):
305298 mock_cli_context .get_client ().delete_milestone .return_value = True
306299
307300 result = runner .invoke (
308- delete_milestone ,
309- ["Test Project" , "Sprint 1" ],
301+ project ,
302+ ["delete-milestone" , " Test Project" , "Sprint 1" ],
310303 obj = {"cli_context" : mock_cli_context },
311304 input = "y\n " ,
312305 )
@@ -322,8 +315,8 @@ def test_delete_milestone_with_yes_flag(self, runner, mock_cli_context):
322315 mock_cli_context .get_client ().delete_milestone .return_value = True
323316
324317 result = runner .invoke (
325- delete_milestone ,
326- ["Test Project" , "Sprint 1" , "--yes" ],
318+ project ,
319+ ["delete-milestone" , " Test Project" , "Sprint 1" , "--yes" ],
327320 obj = {"cli_context" : mock_cli_context },
328321 )
329322
@@ -357,8 +350,8 @@ def test_list_milestone_issues(self, runner, mock_cli_context):
357350 mock_cli_context .get_client ().get_milestone .return_value = milestone_data
358351
359352 result = runner .invoke (
360- list_milestone_issues ,
361- ["Test Project" , "Sprint 1" ],
353+ project ,
354+ ["milestone-issues" , " Test Project" , "Sprint 1" ],
362355 obj = {"cli_context" : mock_cli_context },
363356 )
364357
@@ -397,8 +390,8 @@ def test_create_test_data_for_project(self, runner, mock_cli_context):
397390 mock_cli_context .get_client ().create_issue .return_value = issue_result
398391
399392 result = runner .invoke (
400- create_test_data ,
401- ["--team" , "ENG" ],
393+ project ,
394+ ["create-test-data" , " --team" , "ENG" ],
402395 obj = {"cli_context" : mock_cli_context },
403396 )
404397
@@ -413,8 +406,8 @@ def test_create_test_data_team_not_found(self, runner, mock_cli_context):
413406 mock_cli_context .get_client ().get_teams .return_value = []
414407
415408 result = runner .invoke (
416- create_test_data ,
417- ["--team" , "NONEXISTENT" ],
409+ project ,
410+ ["create-test-data" , " --team" , "NONEXISTENT" ],
418411 obj = {"cli_context" : mock_cli_context },
419412 )
420413
0 commit comments