@@ -26,11 +26,14 @@ def no_sleep(mocker):
2626def test_polls_until_diff_scan_ready (core , diff_scan_get_response , no_sleep ):
2727 """202 processing responses are polled through until the 200 result arrives."""
2828 processing = {"status" : "processing" , "id" : "diff-scan-123" }
29- core .sdk .diffscans .get .side_effect = [processing , processing , diff_scan_get_response ]
29+ # Final cached poll + lean omit_license_details re-fetch.
30+ core .sdk .diffscans .get .side_effect = [
31+ processing , processing , diff_scan_get_response , diff_scan_get_response
32+ ]
3033
3134 artifacts = core .get_diff_scan_artifacts ("head" , "new" )
3235
33- assert core .sdk .diffscans .get .call_count == 3
36+ assert core .sdk .diffscans .get .call_count == 4
3437 assert no_sleep .call_count == 2 # slept between polls, never during them
3538 assert len (artifacts .added ) > 0
3639
@@ -40,7 +43,9 @@ def test_poll_interval_backs_off(core, diff_scan_get_response, no_sleep, monkeyp
4043 monkeypatch .setattr (core_module , "DIFF_SCAN_POLL_INITIAL_INTERVAL_SECONDS" , 4.0 )
4144 monkeypatch .setattr (core_module , "DIFF_SCAN_POLL_MAX_INTERVAL_SECONDS" , 10.0 )
4245 processing = {"status" : "processing" , "id" : "diff-scan-123" }
43- core .sdk .diffscans .get .side_effect = [processing ] * 4 + [diff_scan_get_response ]
46+ core .sdk .diffscans .get .side_effect = (
47+ [processing ] * 4 + [diff_scan_get_response , diff_scan_get_response ]
48+ )
4449
4550 core .get_diff_scan_artifacts ("head" , "new" )
4651
@@ -50,11 +55,13 @@ def test_poll_interval_backs_off(core, diff_scan_get_response, no_sleep, monkeyp
5055
5156def test_transient_poll_error_is_retried (core , diff_scan_get_response , no_sleep ):
5257 """A dropped poll doesn't abandon the flow - the diff keeps computing server-side."""
53- core .sdk .diffscans .get .side_effect = [APIConnectionError ("reset" ), diff_scan_get_response ]
58+ core .sdk .diffscans .get .side_effect = [
59+ APIConnectionError ("reset" ), diff_scan_get_response , diff_scan_get_response
60+ ]
5461
5562 artifacts = core .get_diff_scan_artifacts ("head" , "new" )
5663
57- assert core .sdk .diffscans .get .call_count == 2
64+ assert core .sdk .diffscans .get .call_count == 3
5865 assert len (artifacts .added ) > 0
5966
6067
@@ -76,15 +83,45 @@ def test_poll_timeout_raises(core, no_sleep, monkeypatch):
7683
7784
7885def test_duplicate_redirect_uses_embedded_artifacts (core , diff_scan_get_response ):
79- """An on_duplicate redirect can return the computed diff scan straight away ."""
86+ """An on_duplicate redirect skips readiness polling; lean re-fetch still runs ."""
8087 core .sdk .diffscans .create_from_ids .return_value = diff_scan_get_response
8188
8289 artifacts = core .get_diff_scan_artifacts ("head" , "new" )
8390
84- core .sdk .diffscans .get .assert_not_called ()
91+ # Create already carried artifacts, so cached readiness polling is skipped,
92+ # but omit_license_details still needs a non-cached get (cached ignores it).
93+ core .sdk .diffscans .get .assert_called_once_with (
94+ core .config .org_slug ,
95+ "diff-scan-123" ,
96+ params = {"omit_license_details" : "true" },
97+ )
8598 assert len (artifacts .added ) > 0
8699
87100
101+ def test_lean_refetch_omits_license_details_without_cached (
102+ core , diff_scan_get_response , no_sleep
103+ ):
104+ """omit_license_details is fetched without cached=true (API ignores it otherwise)."""
105+ processing = {"status" : "processing" , "id" : "diff-scan-123" }
106+ core .sdk .diffscans .get .side_effect = [
107+ processing , diff_scan_get_response , diff_scan_get_response
108+ ]
109+
110+ core .get_diff_scan_artifacts ("head" , "new" )
111+
112+ assert core .sdk .diffscans .get .call_args_list [0 ].kwargs ["params" ] == {
113+ "cached" : "true" ,
114+ "omit_unchanged" : "true" ,
115+ }
116+ assert core .sdk .diffscans .get .call_args_list [1 ].kwargs ["params" ] == {
117+ "cached" : "true" ,
118+ "omit_unchanged" : "true" ,
119+ }
120+ assert core .sdk .diffscans .get .call_args_list [2 ].kwargs ["params" ] == {
121+ "omit_license_details" : "true" ,
122+ }
123+
124+
88125def test_fallback_to_streaming_diff_on_failure (core ):
89126 """If the diff-scans flow fails (e.g. token missing the diff-scans scopes),
90127 the comparison falls back to the legacy streaming diff transparently."""
0 commit comments