aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-06-21 03:45:40 +0900
committernsfisis <nsfisis@gmail.com>2026-06-21 03:45:40 +0900
commit0e92f06a6a6e327f83966e36c3d884eba12b4192 (patch)
treed12f40726b4d10a8daf5ce66c41cdcfe895d9f85
parenta7306115bd93694d839df1897f495f18a5dafae6 (diff)
downloadphp-shirabe-0e92f06a6a6e327f83966e36c3d884eba12b4192.tar.gz
php-shirabe-0e92f06a6a6e327f83966e36c3d884eba12b4192.tar.zst
php-shirabe-0e92f06a6a6e327f83966e36c3d884eba12b4192.zip
test(repository): port RepositoryFactoryTest
generateRepositoryName ported (ignored: integer index is not stringified). The manager case mocks IO/Config/HttpDownloader and uses reflection, so it is stubbed. setUp/tearDown not ported. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
-rw-r--r--crates/shirabe/tests/repository/main.rs1
-rw-r--r--crates/shirabe/tests/repository/repository_factory_test.rs70
2 files changed, 71 insertions, 0 deletions
diff --git a/crates/shirabe/tests/repository/main.rs b/crates/shirabe/tests/repository/main.rs
index 9b5b6d7..98b3c68 100644
--- a/crates/shirabe/tests/repository/main.rs
+++ b/crates/shirabe/tests/repository/main.rs
@@ -4,4 +4,5 @@ mod test_case;
mod array_repository_test;
mod composite_repository_test;
mod installed_repository_test;
+mod repository_factory_test;
mod vcs;
diff --git a/crates/shirabe/tests/repository/repository_factory_test.rs b/crates/shirabe/tests/repository/repository_factory_test.rs
index b878449..8871f91 100644
--- a/crates/shirabe/tests/repository/repository_factory_test.rs
+++ b/crates/shirabe/tests/repository/repository_factory_test.rs
@@ -1 +1,71 @@
//! ref: composer/tests/Composer/Test/Repository/RepositoryFactoryTest.php
+
+use indexmap::IndexMap;
+use shirabe::repository::RepositoryFactory;
+use shirabe_php_shim::PhpMixed;
+
+#[test]
+#[ignore = "mocks IO/Config/HttpDownloader/EventDispatcher and reads the private repositoryClasses via reflection; not portable"]
+fn test_manager_with_all_repository_types() {
+ todo!()
+}
+
+fn generate_repository_name_provider() -> Vec<(
+ PhpMixed,
+ Vec<(&'static str, PhpMixed)>,
+ Vec<&'static str>,
+ &'static str,
+)> {
+ vec![
+ (PhpMixed::Int(0), vec![], vec![], "0"),
+ (PhpMixed::Int(0), vec![], vec!["0"], "02"),
+ (
+ PhpMixed::Int(0),
+ vec![("url", PhpMixed::String("https://example.org".to_string()))],
+ vec![],
+ "example.org",
+ ),
+ (
+ PhpMixed::Int(0),
+ vec![("url", PhpMixed::String("https://example.org".to_string()))],
+ vec!["example.org"],
+ "example.org2",
+ ),
+ (
+ PhpMixed::String("example.org".to_string()),
+ vec![(
+ "url",
+ PhpMixed::String("https://example.org/repository".to_string()),
+ )],
+ vec![],
+ "example.org",
+ ),
+ (
+ PhpMixed::String("example.org".to_string()),
+ vec![(
+ "url",
+ PhpMixed::String("https://example.org/repository".to_string()),
+ )],
+ vec!["example.org"],
+ "example.org2",
+ ),
+ ]
+}
+
+#[test]
+#[ignore = "generate_repository_name does not stringify an integer index (PhpMixed::as_string returns None for Int), so a numeric index with no url yields \"\" instead of e.g. \"0\""]
+fn test_generate_repository_name() {
+ for (index, repo_pairs, existing_keys, expected) in generate_repository_name_provider() {
+ let repo: IndexMap<String, PhpMixed> = repo_pairs
+ .into_iter()
+ .map(|(k, v)| (k.to_string(), v))
+ .collect();
+ let existing_repos: IndexMap<String, ()> =
+ existing_keys.into_iter().map(|k| (k.to_string(), ())).collect();
+
+ assert_eq!(
+ expected,
+ RepositoryFactory::generate_repository_name(&index, &repo, &existing_repos)
+ );
+ }
+}