rooster 2.14.1

A simple password manager
mod helpers;

use crate::helpers::prelude::*;
use serde_json::Value;

#[test]
fn test_command_export_json() {
    let rooster_file = tempfile();
    assert_eq!(
        0,
        main_with_args(
            &["rooster", "init", "--force-for-tests"],
            &mut CursorInputOutput::new("", "\nxxxx\n"),
            &rooster_file
        )
    );

    assert_eq!(
        0,
        main_with_args(
            &["rooster", "add", "-s", "Youtube", "yt@example.com"],
            &mut CursorInputOutput::new("", "xxxx\nabcd\n"),
            &rooster_file
        )
    );

    let mut io = CursorInputOutput::new("", "xxxx\n");
    assert_eq!(
        0,
        main_with_args(&["rooster", "export", "json"], &mut io, &rooster_file)
    );
    let output_as_vecu8 = io.stdout_cursor.into_inner();
    let output_as_string = String::from_utf8_lossy(output_as_vecu8.as_slice());
    let output_as_json = serde_json::from_str::<Value>(output_as_string.as_ref()).unwrap();
    let saved_password = output_as_json
        .as_object()
        .unwrap()
        .get("passwords")
        .unwrap()
        .as_array()
        .unwrap()
        .get(0)
        .unwrap()
        .as_object()
        .unwrap();
    assert_eq!(
        saved_password.get("password").unwrap().as_str().unwrap(),
        "abcd"
    );
    assert_eq!(
        saved_password.get("username").unwrap().as_str().unwrap(),
        "yt@example.com"
    );
    assert_eq!(
        saved_password.get("name").unwrap().as_str().unwrap(),
        "Youtube"
    );
}

#[test]
fn test_command_export_csv() {
    let rooster_file = tempfile();
    assert_eq!(
        0,
        main_with_args(
            &["rooster", "init", "--force-for-tests"],
            &mut CursorInputOutput::new("", "\nxxxx\n"),
            &rooster_file
        )
    );

    assert_eq!(
        0,
        main_with_args(
            &["rooster", "add", "-s", "Youtube", "yt@example.com"],
            &mut CursorInputOutput::new("", "xxxx\nabcd\n"),
            &rooster_file
        )
    );

    let mut io = CursorInputOutput::new("", "xxxx\n");
    assert_eq!(
        0,
        main_with_args(&["rooster", "export", "csv"], &mut io, &rooster_file)
    );
    let output_as_vecu8 = io.stdout_cursor.into_inner();
    let output_as_string = String::from_utf8_lossy(output_as_vecu8.as_slice());
    assert_eq!(output_as_string, "Youtube,yt@example.com,abcd\n");
}

#[test]
fn test_command_export_1password() {
    let rooster_file = tempfile();
    assert_eq!(
        0,
        main_with_args(
            &["rooster", "init", "--force-for-tests"],
            &mut CursorInputOutput::new("", "\nxxxx\n"),
            &rooster_file
        )
    );

    assert_eq!(
        0,
        main_with_args(
            &["rooster", "add", "-s", "Youtube", "yt@example.com"],
            &mut CursorInputOutput::new("", "xxxx\nabcd\n"),
            &rooster_file
        )
    );

    let mut io = CursorInputOutput::new("", "xxxx\n");
    assert_eq!(
        0,
        main_with_args(&["rooster", "export", "1password"], &mut io, &rooster_file)
    );
    let output_as_vecu8 = io.stdout_cursor.into_inner();
    let output_as_string = String::from_utf8_lossy(output_as_vecu8.as_slice());
    assert_eq!(output_as_string, "Youtube,yt@example.com,abcd\n");
}