1010# Ensure project root is on path
1111sys .path .insert (0 , str (Path (__file__ ).parent .parent ))
1212
13- from lap .cli .main import _sanitize , _validate_search_response , _format_search_results , cmd_search
13+ from lap .cli .main import _sanitize , _validate_search_response , _format_search_results , cmd_search , cmd_get
1414
1515
1616# ── _sanitize ────────────────────────────────────────────────────────
@@ -166,6 +166,7 @@ def _make_result(self, **overrides):
166166 "size" : 1000 ,
167167 "lean_size" : 250 ,
168168 "has_skill" : True ,
169+ "provider" : {"slug" : "stripe" , "display_name" : "Stripe" , "domain" : "stripe.com" },
169170 }
170171 base .update (overrides )
171172 return base
@@ -175,11 +176,30 @@ def test_basic_output(self, capsys):
175176 _format_search_results (results , total = 1 , offset = 0 )
176177 out = capsys .readouterr ().out
177178 assert "stripe" in out
179+ assert "stripe.com" in out
178180 assert "42 endpoints" in out
179181 assert "4.0x compressed" in out
180182 assert "Payment processing" in out
181183 assert "[skill]" in out
182184
185+ def test_provider_domain_shown (self , capsys ):
186+ results = [self ._make_result (provider = {"slug" : "twilio" , "display_name" : "Twilio" , "domain" : "twilio.com" })]
187+ _format_search_results (results , total = 1 , offset = 0 )
188+ out = capsys .readouterr ().out
189+ assert "twilio.com" in out
190+
191+ def test_provider_fallback_to_display_name (self , capsys ):
192+ results = [self ._make_result (provider = {"slug" : "x" , "display_name" : "MyAPI" , "domain" : "" })]
193+ _format_search_results (results , total = 1 , offset = 0 )
194+ out = capsys .readouterr ().out
195+ assert "MyAPI" in out
196+
197+ def test_provider_missing_graceful (self , capsys ):
198+ results = [self ._make_result (provider = None )]
199+ _format_search_results (results , total = 1 , offset = 0 )
200+ out = capsys .readouterr ().out
201+ assert "stripe" in out # name still shows
202+
183203 def test_no_skill_marker (self , capsys ):
184204 results = [self ._make_result (has_skill = False )]
185205 _format_search_results (results , total = 1 , offset = 0 )
@@ -423,3 +443,53 @@ def test_results_with_skill_shown(self, capsys):
423443 out = capsys .readouterr ().out
424444 assert "twilio" in out
425445 assert "[skill]" in out
446+
447+
448+ # ── cmd_get ──────────────────────────────────────────────────────────
449+
450+
451+ def _make_get_args (** overrides ):
452+ args = MagicMock ()
453+ args .name = "stripe"
454+ args .output = None
455+ args .lean = False
456+ for k , v in overrides .items ():
457+ setattr (args , k , v )
458+ return args
459+
460+
461+ class TestCmdGet :
462+ def test_get_prints_to_stdout (self , capsys ):
463+ mock_resp = MagicMock ()
464+ mock_resp .read .return_value = b"@api Stripe\n @base https://api.stripe.com"
465+ mock_resp .__enter__ = lambda s : s
466+ mock_resp .__exit__ = MagicMock (return_value = False )
467+ with patch ("lap.cli.main.urlopen" , return_value = mock_resp ):
468+ cmd_get (_make_get_args ())
469+ out = capsys .readouterr ().out
470+ assert "@api Stripe" in out
471+
472+ def test_get_writes_to_file (self , tmp_path ):
473+ out_file = str (tmp_path / "stripe.lap" )
474+ mock_resp = MagicMock ()
475+ mock_resp .read .return_value = b"@api Stripe"
476+ mock_resp .__enter__ = lambda s : s
477+ mock_resp .__exit__ = MagicMock (return_value = False )
478+ with patch ("lap.cli.main.urlopen" , return_value = mock_resp ):
479+ cmd_get (_make_get_args (output = out_file ))
480+ assert Path (out_file ).read_text (encoding = "utf-8" ) == "@api Stripe"
481+
482+ def test_get_lean_flag_adds_query_param (self ):
483+ mock_resp = MagicMock ()
484+ mock_resp .read .return_value = b"@api Stripe"
485+ mock_resp .__enter__ = lambda s : s
486+ mock_resp .__exit__ = MagicMock (return_value = False )
487+ with patch ("lap.cli.main.urlopen" , return_value = mock_resp ) as mock_open :
488+ cmd_get (_make_get_args (lean = True ))
489+ call_arg = mock_open .call_args [0 ][0 ]
490+ assert "format=lean" in call_arg .full_url
491+
492+ def test_get_network_error_exits (self ):
493+ with patch ("lap.cli.main.urlopen" , side_effect = Exception ("Connection refused" )):
494+ with pytest .raises (SystemExit ):
495+ cmd_get (_make_get_args ())
0 commit comments