@@ -203,6 +203,21 @@ mod tests {
203203 assert_eq ! ( parse_semver_value( "v" ) , None ) ;
204204 }
205205
206+ #[ test]
207+ fn parse_semver_trims_whitespace ( ) {
208+ assert_eq ! ( parse_semver_value( " v2.3.4 " ) , Some ( ( 2 , 3 , 4 ) ) ) ;
209+ }
210+
211+ #[ test]
212+ fn parse_semver_ignores_extra_segments_after_patch ( ) {
213+ assert_eq ! ( parse_semver_value( "1.2.3.99" ) , Some ( ( 1 , 2 , 3 ) ) ) ;
214+ }
215+
216+ #[ test]
217+ fn parse_semver_rejects_missing_major_component ( ) {
218+ assert_eq ! ( parse_semver_value( ".2.3" ) , None ) ;
219+ }
220+
206221 #[ test]
207222 fn pick_download_url_prefers_installer ( ) {
208223 let assets = vec ! [
@@ -228,4 +243,30 @@ mod tests {
228243 let url = pick_download_url ( false , & assets) ;
229244 assert_eq ! ( url. as_deref( ) , Some ( "https://example.com/PAPERBACK.ZIP" ) ) ;
230245 }
246+
247+ #[ test]
248+ fn pick_download_url_returns_none_when_preferred_asset_missing ( ) {
249+ let assets = vec ! [ ReleaseAsset {
250+ name: "notes.txt" . to_string( ) ,
251+ browser_download_url: "https://example.com/notes.txt" . to_string( ) ,
252+ } ] ;
253+ assert ! ( pick_download_url( true , & assets) . is_none( ) ) ;
254+ assert ! ( pick_download_url( false , & assets) . is_none( ) ) ;
255+ }
256+
257+ #[ test]
258+ fn pick_download_url_uses_flag_to_choose_between_exe_and_zip ( ) {
259+ let assets = vec ! [
260+ ReleaseAsset {
261+ name: "paperback.zip" . to_string( ) ,
262+ browser_download_url: "https://example.com/paperback.zip" . to_string( ) ,
263+ } ,
264+ ReleaseAsset {
265+ name: "paperback_setup.exe" . to_string( ) ,
266+ browser_download_url: "https://example.com/paperback_setup.exe" . to_string( ) ,
267+ } ,
268+ ] ;
269+ assert_eq ! ( pick_download_url( false , & assets) . as_deref( ) , Some ( "https://example.com/paperback.zip" ) ) ;
270+ assert_eq ! ( pick_download_url( true , & assets) . as_deref( ) , Some ( "https://example.com/paperback_setup.exe" ) ) ;
271+ }
231272}
0 commit comments