//! ref: composer/tests/Composer/Test/Command/SearchCommandTest.php use crate::test_case::{RunOptions, get_application_tester, init_temp_composer}; use serial_test::serial; use shirabe_symfony_console::input::InputValue; use shirabe_symfony_console::input::ParameterName; fn repositories_json() -> serde_json::Value { serde_json::json!({ "repositories": [ { "packagist.org": false }, { "type": "package", "package": [ { "name": "vendor-1/package-1", "description": "generic description", "version": "1.0.0" }, { "name": "foo/bar", "description": "generic description", "version": "1.0.0" }, { "name": "bar/baz", "description": "fancy baz", "version": "1.0.0", "abandoned": true }, { "name": "vendor-2/fancy-package", "fancy description": null, "version": "1.0.0", "type": "foo" }, ], }, ], }) } /// ref: SearchCommandTest::testSearch (data provider rolled into one body). fn run_search_case(command: Vec<(ParameterName, InputValue)>, expected: &str) { let _tear_down = init_temp_composer(Some(&repositories_json()), None, None, true); let mut input: Vec<(ParameterName, InputValue)> = vec![(ParameterName::of("command"), InputValue::from("search"))]; input.extend(command); let mut app_tester = get_application_tester(); app_tester.run(input, RunOptions::default()).unwrap(); assert_eq!(expected.trim(), app_tester.get_display().trim()); } #[test] #[serial] fn test_search() { // 'by name and description' run_search_case( vec![( ParameterName::of("tokens"), InputValue::Array(vec!["fancy".to_string()]), )], "bar/baz ! Abandoned ! fancy baz\nvendor-2/fancy-package", ); // 'by name and description with multiple tokens' run_search_case( vec![( ParameterName::of("tokens"), InputValue::Array(vec!["fancy".to_string(), "vendor".to_string()]), )], "vendor-1/package-1 generic description\nbar/baz ! Abandoned ! fancy baz\nvendor-2/fancy-package", ); // 'by name only' run_search_case( vec![ ( ParameterName::of("tokens"), InputValue::Array(vec!["fancy".to_string()]), ), (ParameterName::of("--only-name"), InputValue::from(true)), ], "vendor-2/fancy-package", ); // 'by vendor only' run_search_case( vec![ ( ParameterName::of("tokens"), InputValue::Array(vec!["bar".to_string()]), ), (ParameterName::of("--only-vendor"), InputValue::from(true)), ], "bar", ); // 'by type' run_search_case( vec![ ( ParameterName::of("tokens"), InputValue::Array(vec!["vendor".to_string()]), ), (ParameterName::of("--type"), InputValue::from("foo")), ], "vendor-2/fancy-package", ); // 'json format' run_search_case( vec![ ( ParameterName::of("tokens"), InputValue::Array(vec!["vendor-2/fancy".to_string()]), ), (ParameterName::of("--format"), InputValue::from("json")), ], "[\n {\n \"name\": \"vendor-2/fancy-package\",\n \"description\": null\n }\n]", ); // 'no results' run_search_case( vec![( ParameterName::of("tokens"), InputValue::Array(vec!["invalid-package-name".to_string()]), )], "", ); } #[test] #[serial] fn test_invalid_format() { let _tear_down = init_temp_composer( Some(&serde_json::json!({ "repositories": { "packagist.org": false } })), None, None, true, ); let mut app_tester = get_application_tester(); let result = app_tester .run( vec![ (ParameterName::of("command"), InputValue::from("search")), ( ParameterName::of("--format"), InputValue::from("test-format"), ), ( ParameterName::of("tokens"), InputValue::Array(vec!["test".to_string()]), ), ], RunOptions::default(), ) .unwrap(); assert_eq!(1, result); assert_eq!( "Unsupported format \"test-format\". See help for supported formats.", app_tester.get_display().trim() ); } #[test] #[serial] fn test_invalid_flags() { let _tear_down = init_temp_composer( Some(&serde_json::json!({ "repositories": { "packagist.org": false } })), None, None, true, ); let mut app_tester = get_application_tester(); let err = app_tester .run( vec![ (ParameterName::of("command"), InputValue::from("search")), (ParameterName::of("--only-vendor"), InputValue::from(true)), (ParameterName::of("--only-name"), InputValue::from(true)), ( ParameterName::of("tokens"), InputValue::Array(vec!["test".to_string()]), ), ], RunOptions::default(), ) .expect_err("expected InvalidArgumentException"); assert!( err.to_string() .contains("--only-name and --only-vendor cannot be used together"), "got: {:?}", err ); }