diff --git a/crates/forge/src/run_tests/package.rs b/crates/forge/src/run_tests/package.rs index bf23495cb0..a205856d07 100644 --- a/crates/forge/src/run_tests/package.rs +++ b/crates/forge/src/run_tests/package.rs @@ -7,9 +7,12 @@ use crate::{ TestArgs, block_number_map::BlockNumberMap, combine_configs::combine_configs, - run_tests::messages::{ - collected_tests_count::CollectedTestsCountMessage, tests_run::TestsRunMessage, - tests_summary::TestsSummaryMessage, + run_tests::{ + messages::{ + collected_tests_count::CollectedTestsCountMessage, tests_run::TestsRunMessage, + tests_summary::TestsSummaryMessage, + }, + workspace::WorkspaceDirs, }, scarb::{ config::{ForgeConfigFromScarb, ForkTarget}, @@ -20,7 +23,6 @@ use crate::{ warn::warn_if_incompatible_rpc_version, }; use anyhow::Result; -use camino::{Utf8Path, Utf8PathBuf}; use cheatnet::runtime_extensions::forge_runtime_extension::contracts_data::ContractsData; use console::Style; use forge_runner::{ @@ -74,14 +76,13 @@ impl RunForPackageArgs { package: PackageMetadata, scarb_metadata: &Metadata, args: &TestArgs, - cache_dir: &Utf8PathBuf, - artifacts_dir: &Utf8Path, + workspace_dirs: &WorkspaceDirs, ui: &UI, ) -> Result { - let raw_test_targets = load_test_artifacts(artifacts_dir, &package)?; + let raw_test_targets = load_test_artifacts(&workspace_dirs.artifacts_dir, &package)?; let contracts = get_contracts_artifacts_and_source_sierra_paths( - artifacts_dir, + &workspace_dirs.artifacts_dir, &package, ui, CompilationOpts { @@ -106,7 +107,7 @@ impl RunForPackageArgs { args.max_n_steps, args.tracked_resource, contracts_data, - cache_dir.clone(), + workspace_dirs.cache_dir.clone(), &forge_config_from_scarb, &args.additional_args, args.trace_args.clone(), @@ -120,7 +121,7 @@ impl RunForPackageArgs { args.only_ignored, args.include_ignored, args.rerun_failed, - FailedTestsCache::new(cache_dir), + FailedTestsCache::new(&workspace_dirs.cache_dir), ); Ok(RunForPackageArgs { diff --git a/crates/forge/src/run_tests/workspace.rs b/crates/forge/src/run_tests/workspace.rs index 858c48c5df..a351887d47 100644 --- a/crates/forge/src/run_tests/workspace.rs +++ b/crates/forge/src/run_tests/workspace.rs @@ -7,6 +7,7 @@ use crate::{ scarb::build_artifacts_with_scarb, shared_cache::FailedTestsCache, }; use anyhow::{Context, Result}; +use camino::Utf8PathBuf; use forge_runner::test_case_summary::AnyTestCaseSummary; use forge_runner::{CACHE_DIR, test_target_summary::TestTargetSummary}; use foundry_ui::UI; @@ -19,14 +20,35 @@ use shared::consts::SNFORGE_TEST_FILTER; use std::env; use std::sync::Arc; +pub struct WorkspaceDirs { + pub artifacts_dir: Utf8PathBuf, + pub cache_dir: Utf8PathBuf, + pub root_dir: Utf8PathBuf, +} + +impl WorkspaceDirs { + #[must_use] + pub fn new(scarb_metadata: &Metadata) -> Self { + let artifacts_dir = + target_dir_for_workspace(scarb_metadata).join(&scarb_metadata.current_profile); + let workspace_root = &scarb_metadata.workspace.root; + let cache_dir = workspace_root.join(CACHE_DIR); + + Self { + artifacts_dir, + cache_dir, + root_dir: workspace_root.clone(), + } + } +} + #[tracing::instrument(skip_all, level = "debug")] pub async fn run_for_workspace( scarb_metadata: &Metadata, args: TestArgs, ui: Arc, ) -> Result { - let artifacts_dir_path = - target_dir_for_workspace(scarb_metadata).join(&scarb_metadata.current_profile); + let workspace_dirs = WorkspaceDirs::new(scarb_metadata); let packages: Vec = args .scarb_args @@ -56,21 +78,12 @@ pub async fn run_for_workspace( let mut all_tests = vec![]; let mut total_filtered_count = Some(0); - let workspace_root = &scarb_metadata.workspace.root; - let cache_dir = workspace_root.join(CACHE_DIR); let packages_len = packages.len(); for package in packages { env::set_current_dir(&package.root)?; - let args = RunForPackageArgs::build( - package, - scarb_metadata, - &args, - &cache_dir, - &artifacts_dir_path, - &ui, - )?; + let args = RunForPackageArgs::build(package, scarb_metadata, &args, &workspace_dirs, &ui)?; let result = run_for_package(args, &mut block_number_map, ui.clone()).await?; @@ -87,7 +100,7 @@ pub async fn run_for_workspace( let overall_summary = OverallSummaryMessage::new(&all_tests, total_filtered_count); let all_failed_tests: Vec = extract_failed_tests(all_tests).collect(); - FailedTestsCache::new(&cache_dir).save_failed_tests(&all_failed_tests)?; + FailedTestsCache::new(&workspace_dirs.cache_dir).save_failed_tests(&all_failed_tests)?; if !block_number_map.get_url_to_latest_block_number().is_empty() { ui.println(&LatestBlocksNumbersMessage::new(