@@ -112,6 +112,49 @@ def test_submissions_human_no_open_prs_message(cli_root, runner, sample_issue):
112112 assert 'No open submissions available' in result .output
113113
114114
115+ def test_submissions_json_lookup_failure_returns_structured_error (cli_root , runner , sample_issue ):
116+ """A GitHub lookup failure (find_prs_for_issue -> None, propagated as None by
117+ fetch_open_issue_pull_requests) must surface as `success: false` with a
118+ `github_lookup_failed` type — not a false-negative `submission_count: 0`."""
119+ with (
120+ patch ('gittensor.cli.issue_commands.submissions.get_contract_address' , return_value = '0xabc' ),
121+ patch ('gittensor.cli.issue_commands.submissions.resolve_network' , return_value = ('ws://x' , 'test' )),
122+ patch ('gittensor.cli.issue_commands.submissions.fetch_issue_from_contract' , return_value = sample_issue ),
123+ patch ('gittensor.cli.issue_commands.submissions.fetch_open_issue_pull_requests' , return_value = None ),
124+ ):
125+ result = runner .invoke (
126+ cli_root ,
127+ ['issues' , 'submissions' , '--id' , '42' , '--json' ],
128+ catch_exceptions = False ,
129+ )
130+
131+ assert result .exit_code != 0
132+ payload = json .loads (result .stdout )
133+ assert payload ['success' ] is False
134+ assert payload ['error' ]['type' ] == 'github_lookup_failed'
135+ assert 'submission_count' not in payload
136+
137+
138+ def test_submissions_human_lookup_failure_errors_instead_of_no_submissions (cli_root , runner , sample_issue ):
139+ """In human mode a lookup failure must error out, not print the misleading
140+ 'No open submissions available' message used for a genuinely empty list."""
141+ with (
142+ patch ('gittensor.cli.issue_commands.submissions.get_contract_address' , return_value = '0xabc' ),
143+ patch ('gittensor.cli.issue_commands.submissions.resolve_network' , return_value = ('ws://x' , 'test' )),
144+ patch ('gittensor.cli.issue_commands.submissions.fetch_issue_from_contract' , return_value = sample_issue ),
145+ patch ('gittensor.cli.issue_commands.submissions.fetch_open_issue_pull_requests' , return_value = None ),
146+ ):
147+ result = runner .invoke (
148+ cli_root ,
149+ ['issues' , 'submissions' , '--id' , '42' ],
150+ catch_exceptions = False ,
151+ )
152+
153+ assert result .exit_code != 0
154+ assert 'No open submissions available' not in result .output
155+ assert 'GitHub lookup failed' in result .output
156+
157+
115158def test_submissions_json_contract_read_failure_returns_structured_error (cli_root , runner ):
116159 """`fetch_issue_from_contract` now converts contract-read failures to a
117160 `ClickException`, which `submissions` routes through `handle_exception` —
0 commit comments