brewlog/tests/cli/roasters_cli.rs

138 lines
3.6 KiB
Rust

use crate::helpers::{create_token, run_brewlog, server_info};
use serde_json::Value;
#[test]
fn test_add_roaster_requires_authentication() {
let _ = server_info(); // Ensure server is started
let output = run_brewlog(
&["add-roaster", "--name", "Test Roasters", "--country", "UK"],
&[],
);
assert!(
!output.status.success(),
"add-roaster without auth should fail"
);
}
#[test]
fn test_add_roaster_with_authentication() {
let token = create_token("test-add-roaster");
let output = run_brewlog(
&["add-roaster", "--name", "Test Roasters", "--country", "UK"],
&[("BREWLOG_TOKEN", &token)],
);
assert!(
output.status.success(),
"add-roaster with auth should succeed: {}",
String::from_utf8_lossy(&output.stderr)
);
let stdout = String::from_utf8_lossy(&output.stdout);
let roaster: Value = serde_json::from_str(&stdout)
.unwrap_or_else(|_| panic!("Should output valid JSON, got: {}", stdout));
assert_eq!(roaster["name"], "Test Roasters");
assert_eq!(roaster["country"], "UK");
assert!(roaster["id"].is_i64(), "Should have an ID");
}
#[test]
fn test_list_roasters_works_without_authentication() {
let _ = server_info();
let output = run_brewlog(&["list-roasters"], &[]);
assert!(
output.status.success(),
"list-roasters should work without auth"
);
let stdout = String::from_utf8_lossy(&output.stdout);
let roasters: Value = serde_json::from_str(&stdout).expect("Should output valid JSON array");
assert!(roasters.is_array(), "Should return an array");
}
#[test]
fn test_list_roasters_shows_added_roaster() {
let token = create_token("test-list-roasters");
// Add a roaster
let add_output = run_brewlog(
&[
"add-roaster",
"--name",
"Example Roasters",
"--country",
"USA",
],
&[("BREWLOG_TOKEN", &token)],
);
assert!(
add_output.status.success(),
"Failed to add roaster: {}",
String::from_utf8_lossy(&add_output.stderr)
);
let stdout = String::from_utf8_lossy(&add_output.stdout);
let added_roaster: Value = serde_json::from_str(&stdout).expect("Should output valid JSON");
let roaster_id = added_roaster["id"]
.as_i64()
.expect("roaster id should be numeric");
// List roasters
let list_output = run_brewlog(&["list-roasters"], &[]);
assert!(list_output.status.success());
let list_stdout = String::from_utf8_lossy(&list_output.stdout);
let roasters: Value =
serde_json::from_str(&list_stdout).expect("Should output valid JSON array");
assert!(roasters.is_array(), "Should return an array");
let roasters_array = roasters.as_array().unwrap();
// Find our roaster in the list
let found = roasters_array
.iter()
.any(|r| r["id"].as_i64() == Some(roaster_id));
assert!(found, "Should find the added roaster in the list");
}
#[test]
fn test_delete_roaster_requires_authentication() {
let _ = server_info();
let output = run_brewlog(&["delete-roaster", "--id", "some-id"], &[]);
assert!(
!output.status.success(),
"delete-roaster without auth should fail"
);
}
#[test]
fn test_update_roaster_requires_authentication() {
let _ = server_info();
let output = run_brewlog(
&[
"update-roaster",
"--id",
"some-id",
"--name",
"Updated Name",
],
&[],
);
assert!(
!output.status.success(),
"update-roaster without auth should fail"
);
}