Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
114 changes: 110 additions & 4 deletions crates/pixi/tests/integration_rust/upgrade_tests.rs
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
use indexmap::IndexMap;
use insta::assert_snapshot;
use pixi_cli::upgrade::{Args, parse_specs};
use pixi_cli::upgrade::{Args, parse_specs_for_platform};
use pixi_core::Workspace;
use rattler_conda_types::Platform;
use tempfile::TempDir;
use url::Url;

use crate::common::PixiControl;
use crate::common::package_database::{Package, PackageDatabase};
use crate::setup_tracing;

// This test requires network connection and takes around 40s to
// complete on my machine.
#[cfg_attr(not(feature = "slow_integration_tests"), ignore)]
#[tokio::test]
async fn pypi_dependency_index_preserved_on_upgrade() {
Expand All @@ -32,6 +33,7 @@ async fn pypi_dependency_index_preserved_on_upgrade() {

let mut args = Args::default();
args.workspace_config.manifest_path = Some(pixi.manifest_path());
args.no_install_config.no_install = true;

let workspace = Workspace::from_path(&pixi.manifest_path()).unwrap();

Expand All @@ -40,7 +42,8 @@ async fn pypi_dependency_index_preserved_on_upgrade() {

let mut workspace = workspace.modify().unwrap();

let (match_specs, pypi_deps) = parse_specs(feature, &args, &workspace).unwrap();
let (match_specs, pypi_deps) =
parse_specs_for_platform(feature, &args, &workspace, None).unwrap();

let _ = workspace
.update_dependencies(
Expand All @@ -64,3 +67,106 @@ async fn pypi_dependency_index_preserved_on_upgrade() {
let redacted_content = content.replace(&Platform::current().to_string(), "[PLATFORM]");
assert_snapshot!(redacted_content);
}

#[cfg_attr(not(feature = "slow_integration_tests"), ignore)]
#[tokio::test]
async fn upgrade_command_updates_platform_specific_version() {
setup_tracing();

let platform = Platform::current();
let mut package_database = PackageDatabase::default();
package_database.add_package(Package::build("python", "3.12.0").finish());
let channel_dir = TempDir::new().unwrap();
package_database
.write_repodata(channel_dir.path())
.await
.unwrap();
let channel = Url::from_file_path(channel_dir.path()).unwrap();

let pixi = PixiControl::from_manifest(&format!(
r#"
[workspace]
channels = ["{channel}"]
platforms = ["{platform}"]
exclude-newer = "2025-05-19"

[dependencies]

[target.{platform}.dependencies]
python = "==3.12"
"#,
platform = platform,
channel = channel,
))
.unwrap();

let mut args = Args::default();
args.workspace_config.manifest_path = Some(pixi.manifest_path());
args.no_install_config.no_install = true;

pixi_cli::upgrade::execute(args).await.unwrap();

let content = pixi.manifest_contents().unwrap_or_default();

assert!(
!content.contains("python = \"==3.12\""),
"python pin should be removed from manifest"
);
assert!(
content.contains("python = \">=3."),
"python version should be upgraded to a >=3.x,<3.(x+1) range"
);
}

#[cfg_attr(not(feature = "slow_integration_tests"), ignore)]
#[tokio::test]
async fn upgrade_command_updates_all_platform_specific_targets() {
setup_tracing();

let mut package_database = PackageDatabase::default();
package_database.add_package(Package::build("python", "3.12.0").finish());
let channel_dir = TempDir::new().unwrap();
package_database
.write_repodata(channel_dir.path())
.await
.unwrap();
let channel = Url::from_file_path(channel_dir.path()).unwrap();

let pixi = PixiControl::from_manifest(&format!(
r#"
[workspace]
channels = ["{channel}"]
platforms = ["linux-64", "win-64"]
exclude-newer = "2025-05-19"

[target.linux-64.dependencies]
python = "==3.12"

[target.win-64.dependencies]
python = "==3.12"
"#,
channel = channel,
))
.unwrap();

let mut args = Args::default();
args.workspace_config.manifest_path = Some(pixi.manifest_path());
args.no_install_config.no_install = true;

pixi_cli::upgrade::execute(args).await.unwrap();

let content = pixi.manifest_contents().unwrap_or_default();

assert!(
!content.contains("==3.12"),
"python pins should be removed from all platform-specific targets"
);

let upgraded_occurrences = content.matches("python = \">=3.").count();
assert!(
upgraded_occurrences == 2,
"expected at least two upgraded python entries, found {upgraded_occurrences}:\n{content}"
);
assert!(content.contains("[target.linux-64.dependencies]"));
assert!(content.contains("[target.win-64.dependencies]"));
}
Loading
Loading