Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

test: Add unit tests to artifacts.rs module #2680

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
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
4 changes: 3 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ jobs:
needs: build-test-forge-e2e-nextest-archive
strategy:
matrix:
partition: [ 1, 2, 3, 4, 5, 6, 7, 8 ]
partition: [1, 2, 3, 4, 5, 6, 7, 8]
steps:
- name: Extract branch name
if: github.event_name != 'pull_request'
Expand Down Expand Up @@ -142,6 +142,8 @@ jobs:
cargo test --package forge --features scarb_2_8_3 e2e::features
- run: |
cargo test --package scarb-api --features scarb_2_8_3 get_starknet_artifacts_path
- run: |
cargo test --package scarb-api --features scarb_2_8_3 test_load_contracts_artifacts

test-forge-runner:
name: Test Forge Runner
Expand Down
120 changes: 119 additions & 1 deletion crates/scarb-api/src/artifacts.rs
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please remove the line // TODO(#2625) add unit tests from this file

Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,6 @@ impl StarknetArtifactsFiles {
}
}

// TODO(#2625) add unit tests
fn unique_artifacts(
artifact_representations: Vec<StarknetArtifactsRepresentation>,
current_artifacts: &HashMap<String, (StarknetContractArtifacts, Utf8PathBuf)>,
Expand Down Expand Up @@ -92,3 +91,122 @@ fn compile_artifact_at_path(path: &Utf8Path) -> Result<StarknetContractArtifacts

Ok(StarknetContractArtifacts { sierra, casm })
}

#[cfg(test)]
mod tests {
use super::*;
use crate::ScarbCommand;
use assert_fs::fixture::{FileWriteStr, PathChild};
use camino::Utf8PathBuf;
use deserialized::{StarknetArtifacts, StarknetContract, StarknetContractArtifactPaths};
use indoc::indoc;

#[test]
fn test_unique_artifacts() {
// Mock StarknetArtifactsRepresentation
let mock_base_artifacts = HashMap::from([(
"contract1".to_string(),
(
StarknetContractArtifacts {
sierra: "sierra1".to_string(),
casm: "casm1".to_string(),
},
Utf8PathBuf::from("path1"),
),
)]);

let mock_representation_1 = StarknetArtifactsRepresentation {
base_path: Utf8PathBuf::from("mock/path1"),
artifacts: StarknetArtifacts {
version: 1,
contracts: vec![StarknetContract {
id: "1".to_string(),
package_name: "package1".to_string(),
contract_name: "contract1".to_string(),
artifacts: StarknetContractArtifactPaths {
sierra: Utf8PathBuf::from("mock/path1/contract1.sierra"),
},
}],
},
};

let mock_representation_2 = StarknetArtifactsRepresentation {
base_path: Utf8PathBuf::from("mock/path2"),
artifacts: StarknetArtifacts {
version: 1,
contracts: vec![StarknetContract {
id: "2".to_string(),
package_name: "package2".to_string(),
contract_name: "contract2".to_string(),
artifacts: StarknetContractArtifactPaths {
sierra: Utf8PathBuf::from("mock/path2/contract2.sierra"),
},
}],
},
};

let representations = vec![mock_representation_1, mock_representation_2];

let result = unique_artifacts(representations, &mock_base_artifacts);

assert_eq!(result.len(), 1);
assert_eq!(result[0].0, "contract2");
}

#[test]
#[cfg_attr(not(feature = "scarb_2_8_3"), ignore)]
fn test_load_contracts_artifacts() {
let temp = crate::tests::setup_package("basic_package");
let tests_dir = temp.join("tests");
fs::create_dir(&tests_dir).unwrap();

temp.child(tests_dir.join("test.cairo"))
.write_str(indoc!(
r"
#[test]
fn mock_test() {
assert!(true);
}
"
))
.unwrap();

ScarbCommand::new_with_stdio()
.current_dir(temp.path())
.arg("build")
.arg("--test")
.run()
.unwrap();

// Define path to the generated artifacts
let base_artifacts_path = temp.to_path_buf().join("target").join("dev");

// Get the base artifact
let base_file = Utf8PathBuf::from_path_buf(
base_artifacts_path.join("basic_package_integrationtest.test.starknet_artifacts.json"),
)
.unwrap();
Comment on lines +174 to +188
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is missing the logic that creates the test file in basic_package that was added at some point.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done @cptartur


// Load other artifact files and add them to the temporary directory
let other_files = vec![Utf8PathBuf::from_path_buf(
base_artifacts_path.join("basic_package_unittest.test.starknet_artifacts.json"),
)
.unwrap()];

// Create `StarknetArtifactsFiles`
let artifacts_files = StarknetArtifactsFiles::new(base_file, other_files);

// Load the contracts
let result = artifacts_files.load_contracts_artifacts();
println!("{result:?}");

// Ensure no errors and non-empty result
assert!(result.is_ok());

// Assert the Contract Artifacts are loaded.
let artifacts_map = result.unwrap();
assert!(!artifacts_map.is_empty());
assert!(artifacts_map.contains_key("ERC20"));
assert!(artifacts_map.contains_key("HelloStarknet"));
}
}
4 changes: 2 additions & 2 deletions crates/scarb-api/src/artifacts/representation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ use anyhow::anyhow;
use camino::{Utf8Path, Utf8PathBuf};

pub struct StarknetArtifactsRepresentation {
base_path: Utf8PathBuf,
artifacts: StarknetArtifacts,
pub(crate) base_path: Utf8PathBuf,
pub(crate) artifacts: StarknetArtifacts,
}

impl StarknetArtifactsRepresentation {
Expand Down