@@ -930,6 +930,28 @@ mod tests {
930930 assert_eq ! ( result, Some ( "2.0.0" . to_owned( ) ) ) ;
931931 }
932932
933+ #[ test]
934+ fn test_select_version_minor_skips_prerelease_when_current_stable ( ) {
935+ // Exercises accept_pre_aware: stable current + prerelease candidate in same
936+ // major → prerelease must be rejected (covers the `!current_is_prerelease`
937+ // early-return branch inside accept_pre_aware).
938+ let latest = "18.2.0" . to_owned ( ) ;
939+ let versions = make_versions ( & [ "18.0.0" , "18.1.0" , "18.2.0" , "18.3.0-beta.1" ] ) ;
940+ let result = select_version ( "^18.0.0" , Some ( & latest) , & versions, TargetLevel :: Minor ) ;
941+ // Stable 18.2.0 wins over 18.3.0-beta.1 because current is stable.
942+ assert_eq ! ( result, Some ( "18.2.0" . to_owned( ) ) ) ;
943+ }
944+
945+ #[ test]
946+ fn test_select_version_patch_skips_prerelease_when_current_stable ( ) {
947+ // Same as above, but on the Patch branch, so the iterator walks a
948+ // prerelease candidate on the same major.minor and must reject it.
949+ let latest = "18.0.5" . to_owned ( ) ;
950+ let versions = make_versions ( & [ "18.0.0" , "18.0.1" , "18.0.5" , "18.0.6-rc.1" ] ) ;
951+ let result = select_version ( "=18.0.0" , Some ( & latest) , & versions, TargetLevel :: Patch ) ;
952+ assert_eq ! ( result, Some ( "18.0.5" . to_owned( ) ) ) ;
953+ }
954+
933955 #[ tokio:: test]
934956 async fn test_resolve_version_non_latest_with_tracing ( ) {
935957 use wiremock:: matchers:: { method, path} ;
0 commit comments