From a82546b70303000b4fc053a1ee21d3d8c7d6ad66 Mon Sep 17 00:00:00 2001 From: DanConwayDev Date: Fri, 28 Jun 2024 15:16:43 +0100 Subject: feat(login): login with nip46 remote signer and save details in git config --- tests/login.rs | 314 +++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 204 insertions(+), 110 deletions(-) (limited to 'tests') diff --git a/tests/login.rs b/tests/login.rs index 03fc2a9..166941e 100644 --- a/tests/login.rs +++ b/tests/login.rs @@ -1,15 +1,17 @@ use anyhow::Result; +use git::GitTestRepo; use serial_test::serial; use test_utils::*; -static EXPECTED_NSEC_PROMPT: &str = "login with nsec"; +static EXPECTED_NSEC_PROMPT: &str = "login with bunker uri / nsec"; static EXPECTED_LOCAL_REPOSITORY_PROMPT: &str = "just for this repository?"; static EXPECTED_REQUIRE_PASSWORD_PROMPT: &str = "require password?"; static EXPECTED_SET_PASSWORD_PROMPT: &str = "encrypt with password"; static EXPECTED_SET_PASSWORD_CONFIRM_PROMPT: &str = "confirm password"; fn standard_first_time_login_encrypting_nsec() -> Result { - let mut p = CliTester::new(["login", "--offline"]); + let test_repo = GitTestRepo::default(); + let mut p = CliTester::new_from_dir(&test_repo.dir, ["login", "--offline"]); p.expect_input_eventually(EXPECTED_NSEC_PROMPT)? .succeeds_with(TEST_KEY_1_NSEC)?; @@ -57,7 +59,8 @@ mod with_relays { ); let cli_tester_handle = std::thread::spawn(move || -> Result<()> { - let mut p = CliTester::new(["login"]); + let test_repo = GitTestRepo::default(); + let mut p = CliTester::new_from_dir(&test_repo.dir, ["login"]); p.expect_input(EXPECTED_NSEC_PROMPT)? .succeeds_with(TEST_KEY_1_NSEC)?; @@ -68,6 +71,8 @@ mod with_relays { p.expect_confirm(EXPECTED_REQUIRE_PASSWORD_PROMPT, Some(false))? .succeeds_with(Some(false))?; + p.expect("saved login details to local git config\r\n")?; + p.expect("searching for profile and relay updates...\r\n")?; p.expect_end_with("logged in as fred\r\n")?; @@ -94,7 +99,8 @@ mod with_relays { ); let cli_tester_handle = std::thread::spawn(move || -> Result<()> { - let mut p = CliTester::new(["login"]); + let test_repo = GitTestRepo::default(); + let mut p = CliTester::new_from_dir(&test_repo.dir, ["login"]); p.expect_input(EXPECTED_NSEC_PROMPT)? .succeeds_with(TEST_KEY_1_NSEC)?; @@ -105,6 +111,8 @@ mod with_relays { p.expect_confirm(EXPECTED_REQUIRE_PASSWORD_PROMPT, Some(false))? .succeeds_with(Some(false))?; + p.expect("saved login details to local git config\r\n")?; + p.expect("searching for profile and relay updates...\r\n")?; p.expect("cannot extract account name from account metadata...\r\n")?; @@ -406,7 +414,13 @@ mod with_relays { ); let cli_tester_handle = std::thread::spawn(move || -> Result<()> { - let mut p = CliTester::new(["login", "--nsec", TEST_KEY_1_NSEC]); + let test_repo = GitTestRepo::default(); + let mut p = CliTester::new_from_dir( + &test_repo.dir, + ["login", "--nsec", TEST_KEY_1_NSEC], + ); + + p.expect("saved login details to local git config\r\n")?; p.expect("searching for profile and relay updates...\r\n")?; @@ -456,17 +470,24 @@ mod with_relays { ); let cli_tester_handle = std::thread::spawn(move || -> Result<()> { - CliTester::new([ - "login", - "--offline", - "--nsec", - TEST_KEY_1_NSEC, - "--password", - TEST_PASSWORD, - ]) + let test_repo = GitTestRepo::default(); + CliTester::new_from_dir( + &test_repo.dir, + [ + "login", + "--offline", + "--nsec", + TEST_KEY_1_NSEC, + "--password", + TEST_PASSWORD, + ], + ) .expect_end_eventually()?; - let mut p = CliTester::new(["login", "--password", TEST_PASSWORD]); + let mut p = CliTester::new_from_dir( + &test_repo.dir, + ["login", "--password", TEST_PASSWORD], + ); p.expect("searching for profile and relay updates...\r\n")?; @@ -516,13 +537,19 @@ mod with_relays { ); let cli_tester_handle = std::thread::spawn(move || -> Result<()> { - let mut p = CliTester::new([ - "login", - "--nsec", - TEST_KEY_1_NSEC, - "--password", - TEST_PASSWORD, - ]); + let test_repo = GitTestRepo::default(); + let mut p = CliTester::new_from_dir( + &test_repo.dir, + [ + "login", + "--nsec", + TEST_KEY_1_NSEC, + "--password", + TEST_PASSWORD, + ], + ); + + p.expect("saved login details to local git config\r\n")?; p.expect("searching for profile and relay updates...\r\n")?; @@ -561,7 +588,8 @@ mod with_relays { ); let cli_tester_handle = std::thread::spawn(move || -> Result<()> { - let mut p = CliTester::new(["login"]); + let test_repo = GitTestRepo::default(); + let mut p = CliTester::new_from_dir(&test_repo.dir, ["login"]); p.expect_input(EXPECTED_NSEC_PROMPT)? .succeeds_with(TEST_KEY_1_NSEC)?; @@ -572,6 +600,8 @@ mod with_relays { p.expect_confirm(EXPECTED_REQUIRE_PASSWORD_PROMPT, Some(false))? .succeeds_with(Some(false))?; + p.expect("saved login details to local git config\r\n")?; + p.expect("searching for profile and relay updates...\r\n")?; p.expect("cannot find your account metadata (name, etc) on relays\r\n")?; @@ -621,7 +651,8 @@ mod with_relays { ); let cli_tester_handle = std::thread::spawn(move || -> Result<()> { - let mut p = CliTester::new(["login"]); + let test_repo = GitTestRepo::default(); + let mut p = CliTester::new_from_dir(&test_repo.dir, ["login"]); p.expect_input(EXPECTED_NSEC_PROMPT)? .succeeds_with(TEST_KEY_1_NSEC)?; @@ -632,6 +663,8 @@ mod with_relays { p.expect_confirm(EXPECTED_REQUIRE_PASSWORD_PROMPT, Some(false))? .succeeds_with(Some(false))?; + p.expect("saved login details to local git config\r\n")?; + p.expect("searching for profile and relay updates...\r\n")?; p.expect("cannot find your relay list. consider using another nostr client to create one to enhance your nostr experience.\r\n")?; @@ -655,7 +688,7 @@ mod with_relays { mod when_second_time_login_and_details_already_fetched { use super::*; - mod uses_cache { + mod uses_cache_and_stores_and_retrieves_ncryptsec_from_local_git_config { use super::*; #[tokio::test] @@ -685,13 +718,19 @@ mod with_relays { ); let cli_tester_handle = std::thread::spawn(move || -> Result<()> { - let mut p = CliTester::new([ - "login", - "--nsec", - TEST_KEY_1_NSEC, - "--password", - TEST_PASSWORD, - ]); + let test_repo = GitTestRepo::default(); + let mut p = CliTester::new_from_dir( + &test_repo.dir, + [ + "login", + "--nsec", + TEST_KEY_1_NSEC, + "--password", + TEST_PASSWORD, + ], + ); + + p.expect("saved login details to local git config\r\n")?; p.expect_end_eventually_with("logged in as fred\r\n")?; @@ -699,7 +738,10 @@ mod with_relays { shutdown_relay(8000 + p)?; } - let mut p = CliTester::new(["login", "--password", TEST_PASSWORD]); + let mut p = CliTester::new_from_dir( + &test_repo.dir, + ["login", "--password", TEST_PASSWORD], + ); p.expect("searching for profile and relay updates...\r\n")?; @@ -734,7 +776,8 @@ mod with_relays { ); let cli_tester_handle = std::thread::spawn(move || -> Result<()> { - let mut p = CliTester::new(["login"]); + let test_repo = GitTestRepo::default(); + let mut p = CliTester::new_from_dir(&test_repo.dir, ["login"]); p.expect_input(EXPECTED_NSEC_PROMPT)? .succeeds_with(TEST_KEY_1_NSEC)?; @@ -745,6 +788,8 @@ mod with_relays { p.expect_confirm(EXPECTED_REQUIRE_PASSWORD_PROMPT, Some(false))? .succeeds_with(Some(false))?; + p.expect("saved login details to local git config\r\n")?; + p.expect("searching for profile and relay updates...\r\n")?; p.expect_end_with("logged in as fred\r\n")?; @@ -808,16 +853,15 @@ mod with_offline_flag { use super::*; #[test] - #[serial] fn prompts_for_nsec_and_password() -> Result<()> { standard_first_time_login_encrypting_nsec()?; Ok(()) } #[test] - #[serial] fn succeeds_with_text_logged_in_as_npub() -> Result<()> { - let mut p = CliTester::new(["login", "--offline"]); + let test_repo = GitTestRepo::default(); + let mut p = CliTester::new_from_dir(&test_repo.dir, ["login", "--offline"]); p.expect_input(EXPECTED_NSEC_PROMPT)? .succeeds_with(TEST_KEY_1_NSEC)?; @@ -832,13 +876,15 @@ mod with_offline_flag { .with_confirmation(EXPECTED_SET_PASSWORD_CONFIRM_PROMPT)? .succeeds_with(TEST_PASSWORD)?; + p.expect("saved login details to local git config\r\n")?; + p.expect_end_with(format!("logged in as {}\r\n", TEST_KEY_1_NPUB).as_str()) } #[test] - #[serial] fn succeeds_with_hex_secret_key_in_place_of_nsec() -> Result<()> { - let mut p = CliTester::new(["login", "--offline"]); + let test_repo = GitTestRepo::default(); + let mut p = CliTester::new_from_dir(&test_repo.dir, ["login", "--offline"]); p.expect_input(EXPECTED_NSEC_PROMPT)? .succeeds_with(TEST_KEY_1_SK_HEX)?; @@ -853,6 +899,8 @@ mod with_offline_flag { .with_confirmation(EXPECTED_SET_PASSWORD_CONFIRM_PROMPT)? .succeeds_with(TEST_PASSWORD)?; + p.expect("saved login details to local git config\r\n")?; + p.expect_end_with(format!("logged in as {}\r\n", TEST_KEY_1_NPUB).as_str()) } @@ -860,12 +908,11 @@ mod with_offline_flag { use super::*; #[test] - #[serial] fn prompts_for_nsec_until_valid() -> Result<()> { - let invalid_nsec_response = - "invalid nsec. try again with nsec (or hex private key)"; + let invalid_nsec_response = "invalid. try again with nostr address / nsec"; - let mut p = CliTester::new(["login", "--offline"]); + let test_repo = GitTestRepo::default(); + let mut p = CliTester::new_from_dir(&test_repo.dir, ["login", "--offline"]); p.expect_input(EXPECTED_NSEC_PROMPT)? // this behaviour is intentional. rejecting the response with dialoguer @@ -889,6 +936,8 @@ mod with_offline_flag { .with_confirmation(EXPECTED_SET_PASSWORD_CONFIRM_PROMPT)? .succeeds_with(TEST_PASSWORD)?; + p.expect("saved login details to local git config\r\n")?; + p.expect_end_with(format!("logged in as {}\r\n", TEST_KEY_1_NPUB).as_str()) } } @@ -898,19 +947,31 @@ mod with_offline_flag { use super::*; #[test] - #[serial] fn valid_nsec_param_succeeds_without_prompts() -> Result<()> { - CliTester::new(["login", "--offline", "--nsec", TEST_KEY_1_NSEC]) - .expect_end_with(format!("logged in as {}\r\n", TEST_KEY_1_NPUB).as_str()) + let test_repo = GitTestRepo::default(); + let mut p = CliTester::new_from_dir( + &test_repo.dir, + ["login", "--offline", "--nsec", TEST_KEY_1_NSEC], + ); + + p.expect("saved login details to local git config\r\n")?; + + p.expect_end_with(format!("logged in as {}\r\n", TEST_KEY_1_NPUB).as_str()) } #[test] - #[serial] fn forgets_identity() -> Result<()> { - CliTester::new(["login", "--offline", "--nsec", TEST_KEY_1_NSEC]) - .expect_end_with(format!("logged in as {}\r\n", TEST_KEY_1_NPUB).as_str())?; + let test_repo = GitTestRepo::default(); + let mut p = CliTester::new_from_dir( + &test_repo.dir, + ["login", "--offline", "--nsec", TEST_KEY_1_NSEC], + ); + + p.expect("saved login details to local git config\r\n")?; + + p.expect_end_with(format!("logged in as {}\r\n", TEST_KEY_1_NPUB).as_str())?; - let mut p = CliTester::new(["login", "--offline"]); + p = CliTester::new_from_dir(&test_repo.dir, ["login", "--offline"]); p.expect_input(EXPECTED_NSEC_PROMPT)? .succeeds_with(TEST_KEY_1_NSEC)?; @@ -922,18 +983,28 @@ mod with_offline_flag { use super::*; #[test] - #[serial] fn valid_nsec_param_succeeds_without_prompts_and_logs_in() -> Result<()> { standard_first_time_login_encrypting_nsec()?.exit()?; + let test_repo = GitTestRepo::default(); + let mut p = CliTester::new_from_dir( + &test_repo.dir, + ["login", "--offline", "--nsec", TEST_KEY_2_NSEC], + ); - CliTester::new(["login", "--offline", "--nsec", TEST_KEY_2_NSEC]) - .expect_end_with(format!("logged in as {}\r\n", TEST_KEY_2_NPUB).as_str()) + p.expect("saved login details to local git config\r\n")?; + + p.expect_end_with(format!("logged in as {}\r\n", TEST_KEY_2_NPUB).as_str()) } } #[test] - #[serial] fn invalid_nsec_param_fails_without_prompts() -> Result<()> { - CliTester::new(["login", "--offline", "--nsec", TEST_INVALID_NSEC]).expect_end_with( + let test_repo = GitTestRepo::default(); + let mut p = CliTester::new_from_dir( + &test_repo.dir, + ["login", "--offline", "--nsec", TEST_INVALID_NSEC], + ); + + p.expect_end_with( "Error: invalid nsec parameter\r\n\r\nCaused by:\r\n Invalid secret key\r\n", ) } @@ -943,50 +1014,61 @@ mod with_offline_flag { use super::*; #[test] - #[serial] fn valid_nsec_param_succeeds_without_prompts() -> Result<()> { - CliTester::new([ - "login", - "--offline", - "--nsec", - TEST_KEY_1_NSEC, - "--password", - TEST_PASSWORD, - ]) - .expect_end_with(format!("logged in as {}\r\n", TEST_KEY_1_NPUB).as_str()) + let test_repo = GitTestRepo::default(); + let mut p = CliTester::new_from_dir( + &test_repo.dir, + [ + "login", + "--offline", + "--nsec", + TEST_KEY_1_NSEC, + "--password", + TEST_PASSWORD, + ], + ); + p.expect("saved login details to local git config\r\n")?; + p.expect_end_with(format!("logged in as {}\r\n", TEST_KEY_1_NPUB).as_str()) } #[test] - #[serial] fn parameters_can_be_called_globally() -> Result<()> { - CliTester::new([ - "--nsec", - TEST_KEY_1_NSEC, - "--password", - TEST_PASSWORD, - "login", - "--offline", - ]) - .expect_end_with(format!("logged in as {}\r\n", TEST_KEY_1_NPUB).as_str()) + let test_repo = GitTestRepo::default(); + let mut p = CliTester::new_from_dir( + &test_repo.dir, + [ + "--nsec", + TEST_KEY_1_NSEC, + "--password", + TEST_PASSWORD, + "login", + "--offline", + ], + ); + p.expect("saved login details to local git config\r\n")?; + p.expect_end_with(format!("logged in as {}\r\n", TEST_KEY_1_NPUB).as_str()) } mod when_logging_in_as_different_nsec { use super::*; #[test] - #[serial] fn valid_nsec_param_succeeds_without_prompts_and_logs_in() -> Result<()> { standard_first_time_login_encrypting_nsec()?.exit()?; - - CliTester::new([ - "login", - "--offline", - "--nsec", - TEST_KEY_2_NSEC, - "--password", - TEST_PASSWORD, - ]) - .expect_end_with(format!("logged in as {}\r\n", TEST_KEY_2_NPUB).as_str()) + let test_repo = GitTestRepo::default(); + let mut p = CliTester::new_from_dir( + &test_repo.dir, + [ + "login", + "--offline", + "--nsec", + TEST_KEY_2_NSEC, + "--password", + TEST_PASSWORD, + ], + ); + p.expect("saved login details to local git config\r\n")?; + p.expect_end_with(format!("logged in as {}\r\n", TEST_KEY_2_NPUB).as_str()) } } @@ -994,37 +1076,46 @@ mod with_offline_flag { use super::*; #[test] - #[serial] fn password_changes() -> Result<()> { standard_first_time_login_encrypting_nsec()?.exit()?; + let test_repo = GitTestRepo::default(); + let mut p = CliTester::new_from_dir( + &test_repo.dir, + [ + "login", + "--offline", + "--nsec", + TEST_KEY_1_NSEC, + "--password", + TEST_INVALID_PASSWORD, + ], + ); + p.expect("saved login details to local git config\r\n")?; + p.expect_end_with(format!("logged in as {}\r\n", TEST_KEY_1_NPUB).as_str())?; - CliTester::new([ - "login", - "--offline", - "--nsec", - TEST_KEY_1_NSEC, - "--password", - TEST_INVALID_PASSWORD, - ]) - .expect_end_with(format!("logged in as {}\r\n", TEST_KEY_1_NPUB).as_str())?; - - CliTester::new(["--password", TEST_INVALID_PASSWORD, "login", "--offline"]) - .expect_end_with(format!("logged in as {}\r\n", TEST_KEY_1_NPUB).as_str()) + CliTester::new_from_dir( + &test_repo.dir, + ["--password", TEST_INVALID_PASSWORD, "login", "--offline"], + ) + .expect_end_with(format!("logged in as {}\r\n", TEST_KEY_1_NPUB).as_str()) } } #[test] - #[serial] fn invalid_nsec_param_fails_without_prompts() -> Result<()> { - CliTester::new([ - "login", - "--offline", - "--nsec", - TEST_INVALID_NSEC, - "--password", - TEST_PASSWORD, - ]) - .expect_end_with( + let test_repo = GitTestRepo::default(); + let mut p = CliTester::new_from_dir( + &test_repo.dir, + [ + "login", + "--offline", + "--nsec", + TEST_INVALID_NSEC, + "--password", + TEST_PASSWORD, + ], + ); + p.expect_end_with( "Error: invalid nsec parameter\r\n\r\nCaused by:\r\n Invalid secret key\r\n", ) } @@ -1034,11 +1125,12 @@ mod with_offline_flag { use super::*; #[test] - #[serial] // combined into a single test as it is computationally expensive to run fn warns_it_might_take_a_few_seconds_then_succeeds_then_second_login_prompts_for_password_then_warns_again_then_succeeds() -> Result<()> { - let mut p = CliTester::new_with_timeout(10000, ["login", "--offline"]); + let test_repo = GitTestRepo::default(); + let mut p = + CliTester::new_with_timeout_from_dir(10000, &test_repo.dir, ["login", "--offline"]); p.expect_input(EXPECTED_NSEC_PROMPT)? .succeeds_with(TEST_KEY_1_NSEC)?; @@ -1054,6 +1146,8 @@ mod with_offline_flag { p.expect("this may take a few seconds...\r\n")?; + p.expect("saved login details to local git config\r\n")?; + p.expect_end_with(format!("logged in as {}\r\n", TEST_KEY_1_NPUB).as_str()) // commented out as 'login' command now assumes you want to -- cgit v1.2.3