test: add cli tests for bags
This commit is contained in:
parent
d708a0e112
commit
5252cacad0
5 changed files with 233 additions and 64 deletions
159
tests/cli/bags_cli.rs
Normal file
159
tests/cli/bags_cli.rs
Normal file
|
|
@ -0,0 +1,159 @@
|
||||||
|
use crate::helpers::{create_roast, create_roaster, create_token, run_brewlog, server_info};
|
||||||
|
use serde_json::Value;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_add_bag_requires_authentication() {
|
||||||
|
let _ = server_info();
|
||||||
|
|
||||||
|
let output = run_brewlog(&["add-bag", "--roast-id", "123", "--amount", "250.0"], &[]);
|
||||||
|
|
||||||
|
assert!(!output.status.success(), "add-bag without auth should fail");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_add_bag_with_authentication() {
|
||||||
|
let token = create_token("test-add-bag");
|
||||||
|
|
||||||
|
// Setup: Create Roaster & Roast
|
||||||
|
let roaster_id = create_roaster("Bag Add Roaster", &token);
|
||||||
|
let roast_id = create_roast(&roaster_id, "Bag Add Roast", &token);
|
||||||
|
|
||||||
|
// Test: Add Bag
|
||||||
|
let output = run_brewlog(
|
||||||
|
&[
|
||||||
|
"add-bag",
|
||||||
|
"--roast-id",
|
||||||
|
&roast_id,
|
||||||
|
"--amount",
|
||||||
|
"250.0",
|
||||||
|
"--roast-date",
|
||||||
|
"2023-01-01",
|
||||||
|
],
|
||||||
|
&[("BREWLOG_TOKEN", &token)],
|
||||||
|
);
|
||||||
|
|
||||||
|
assert!(output.status.success());
|
||||||
|
let bag: Value = serde_json::from_slice(&output.stdout).unwrap();
|
||||||
|
|
||||||
|
assert_eq!(bag["amount"].as_f64(), Some(250.0));
|
||||||
|
assert_eq!(bag["roast_date"], "2023-01-01");
|
||||||
|
assert!(bag["id"].is_i64());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_update_bag_requires_authentication() {
|
||||||
|
let _ = server_info();
|
||||||
|
|
||||||
|
let output = run_brewlog(&["update-bag", "--id", "123", "--remaining", "100.0"], &[]);
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
!output.status.success(),
|
||||||
|
"update-bag without auth should fail"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_update_bag_with_authentication() {
|
||||||
|
let token = create_token("test-update-bag");
|
||||||
|
|
||||||
|
// Setup: Create Roaster & Roast & Bag
|
||||||
|
let roaster_id = create_roaster("Bag Update Roaster", &token);
|
||||||
|
let roast_id = create_roast(&roaster_id, "Bag Update Roast", &token);
|
||||||
|
|
||||||
|
let bag_output = run_brewlog(
|
||||||
|
&["add-bag", "--roast-id", &roast_id, "--amount", "250.0"],
|
||||||
|
&[("BREWLOG_TOKEN", &token)],
|
||||||
|
);
|
||||||
|
let bag: Value = serde_json::from_slice(&bag_output.stdout).unwrap();
|
||||||
|
let bag_id = bag["id"].as_i64().unwrap().to_string();
|
||||||
|
|
||||||
|
// Test: Update Bag
|
||||||
|
let output = run_brewlog(
|
||||||
|
&[
|
||||||
|
"update-bag",
|
||||||
|
"--id",
|
||||||
|
&bag_id,
|
||||||
|
"--remaining",
|
||||||
|
"150.0",
|
||||||
|
"--closed",
|
||||||
|
"true",
|
||||||
|
],
|
||||||
|
&[("BREWLOG_TOKEN", &token)],
|
||||||
|
);
|
||||||
|
|
||||||
|
assert!(output.status.success());
|
||||||
|
let updated_bag: Value = serde_json::from_slice(&output.stdout).unwrap();
|
||||||
|
|
||||||
|
assert_eq!(updated_bag["remaining"].as_f64(), Some(150.0));
|
||||||
|
assert_eq!(updated_bag["closed"].as_bool(), Some(true));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_list_bags_works_without_authentication() {
|
||||||
|
let _ = server_info();
|
||||||
|
// Listing without roast_id might return all or empty, but should succeed (200 OK)
|
||||||
|
let output = run_brewlog(&["list-bags"], &[]);
|
||||||
|
assert!(output.status.success());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_list_bags_shows_added_bag() {
|
||||||
|
let token = create_token("test-list-bags");
|
||||||
|
|
||||||
|
// Setup
|
||||||
|
let roaster_id = create_roaster("Bag List Roaster", &token);
|
||||||
|
let roast_id = create_roast(&roaster_id, "Bag List Roast", &token);
|
||||||
|
|
||||||
|
let bag_output = run_brewlog(
|
||||||
|
&["add-bag", "--roast-id", &roast_id, "--amount", "250.0"],
|
||||||
|
&[("BREWLOG_TOKEN", &token)],
|
||||||
|
);
|
||||||
|
let bag: Value = serde_json::from_slice(&bag_output.stdout).unwrap();
|
||||||
|
let bag_id = bag["id"].as_i64().unwrap();
|
||||||
|
|
||||||
|
// Test: List Bags (Authenticated)
|
||||||
|
let output = run_brewlog(
|
||||||
|
&["list-bags", "--roast-id", &roast_id],
|
||||||
|
&[("BREWLOG_TOKEN", &token)],
|
||||||
|
);
|
||||||
|
|
||||||
|
assert!(output.status.success());
|
||||||
|
let bags: Value = serde_json::from_slice(&output.stdout).unwrap();
|
||||||
|
assert!(bags.is_array());
|
||||||
|
let bags_array = bags.as_array().unwrap();
|
||||||
|
assert!(bags_array.iter().any(|b| b["id"].as_i64() == Some(bag_id)));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_delete_bag_requires_authentication() {
|
||||||
|
let _ = server_info();
|
||||||
|
let output = run_brewlog(&["delete-bag", "--id", "123"], &[]);
|
||||||
|
assert!(!output.status.success());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_delete_bag_with_authentication() {
|
||||||
|
let token = create_token("test-delete-bag");
|
||||||
|
|
||||||
|
// Setup
|
||||||
|
let roaster_id = create_roaster("Bag Delete Roaster", &token);
|
||||||
|
let roast_id = create_roast(&roaster_id, "Bag Delete Roast", &token);
|
||||||
|
|
||||||
|
let bag_output = run_brewlog(
|
||||||
|
&["add-bag", "--roast-id", &roast_id, "--amount", "250.0"],
|
||||||
|
&[("BREWLOG_TOKEN", &token)],
|
||||||
|
);
|
||||||
|
let bag: Value = serde_json::from_slice(&bag_output.stdout).unwrap();
|
||||||
|
let bag_id = bag["id"].as_i64().unwrap().to_string();
|
||||||
|
|
||||||
|
// Test: Delete Bag
|
||||||
|
let output = run_brewlog(
|
||||||
|
&["delete-bag", "--id", &bag_id],
|
||||||
|
&[("BREWLOG_TOKEN", &token)],
|
||||||
|
);
|
||||||
|
assert!(output.status.success());
|
||||||
|
|
||||||
|
// Verify deletion
|
||||||
|
let get_output = run_brewlog(&["get-bag", "--id", &bag_id], &[]);
|
||||||
|
assert!(!get_output.status.success());
|
||||||
|
}
|
||||||
|
|
@ -161,3 +161,64 @@ pub fn run_brewlog(args: &[&str], env: &[(&str, &str)]) -> std::process::Output
|
||||||
|
|
||||||
cmd.output().expect("Failed to run brewlog command")
|
cmd.output().expect("Failed to run brewlog command")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Helper to create a roaster and return its ID
|
||||||
|
pub fn create_roaster(name: &str, token: &str) -> String {
|
||||||
|
let output = run_brewlog(
|
||||||
|
&["add-roaster", "--name", name, "--country", "UK"],
|
||||||
|
&[("BREWLOG_TOKEN", token)],
|
||||||
|
);
|
||||||
|
|
||||||
|
if !output.status.success() {
|
||||||
|
panic!(
|
||||||
|
"Failed to create roaster: {}",
|
||||||
|
String::from_utf8_lossy(&output.stderr)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
let stdout = String::from_utf8_lossy(&output.stdout);
|
||||||
|
let roaster: serde_json::Value =
|
||||||
|
serde_json::from_str(&stdout).expect("Should output valid JSON");
|
||||||
|
roaster["id"]
|
||||||
|
.as_i64()
|
||||||
|
.expect("roaster id should be numeric")
|
||||||
|
.to_string()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Helper to create a roast and return its ID
|
||||||
|
pub fn create_roast(roaster_id: &str, name: &str, token: &str) -> String {
|
||||||
|
let output = run_brewlog(
|
||||||
|
&[
|
||||||
|
"add-roast",
|
||||||
|
"--roaster-id",
|
||||||
|
roaster_id,
|
||||||
|
"--name",
|
||||||
|
name,
|
||||||
|
"--origin",
|
||||||
|
"Kenya",
|
||||||
|
"--region",
|
||||||
|
"Nyeri",
|
||||||
|
"--producer",
|
||||||
|
"Coop",
|
||||||
|
"--process",
|
||||||
|
"Washed",
|
||||||
|
"--tasting-notes",
|
||||||
|
"Blackcurrant",
|
||||||
|
],
|
||||||
|
&[("BREWLOG_TOKEN", token)],
|
||||||
|
);
|
||||||
|
|
||||||
|
if !output.status.success() {
|
||||||
|
panic!(
|
||||||
|
"Failed to create roast: {}",
|
||||||
|
String::from_utf8_lossy(&output.stderr)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
let stdout = String::from_utf8_lossy(&output.stdout);
|
||||||
|
let roast: serde_json::Value = serde_json::from_str(&stdout).expect("Should output valid JSON");
|
||||||
|
roast["id"]
|
||||||
|
.as_i64()
|
||||||
|
.expect("roast id should be numeric")
|
||||||
|
.to_string()
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
|
pub mod bags_cli;
|
||||||
pub mod helpers;
|
pub mod helpers;
|
||||||
pub mod roasters_cli;
|
pub mod roasters_cli;
|
||||||
pub mod roasts_cli;
|
pub mod roasts_cli;
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
use crate::helpers::{create_token, run_brewlog, server_info};
|
use crate::helpers::{create_roaster, create_token, run_brewlog, server_info};
|
||||||
use serde_json::Value;
|
use serde_json::Value;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|
@ -62,28 +62,7 @@ fn test_list_roasters_shows_added_roaster() {
|
||||||
let token = create_token("test-list-roasters");
|
let token = create_token("test-list-roasters");
|
||||||
|
|
||||||
// Add a roaster
|
// Add a roaster
|
||||||
let add_output = run_brewlog(
|
let roaster_id = create_roaster("Example Roasters", &token);
|
||||||
&[
|
|
||||||
"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
|
// List roasters
|
||||||
let list_output = run_brewlog(&["list-roasters"], &[]);
|
let list_output = run_brewlog(&["list-roasters"], &[]);
|
||||||
|
|
@ -100,7 +79,7 @@ fn test_list_roasters_shows_added_roaster() {
|
||||||
// Find our roaster in the list
|
// Find our roaster in the list
|
||||||
let found = roasters_array
|
let found = roasters_array
|
||||||
.iter()
|
.iter()
|
||||||
.any(|r| r["id"].as_i64() == Some(roaster_id));
|
.any(|r| r["id"].as_i64().unwrap().to_string() == roaster_id);
|
||||||
assert!(found, "Should find the added roaster in the list");
|
assert!(found, "Should find the added roaster in the list");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
use crate::helpers::{create_token, run_brewlog, server_info};
|
use crate::helpers::{create_roaster, create_token, run_brewlog, server_info};
|
||||||
use serde_json::Value;
|
use serde_json::Value;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|
@ -35,32 +35,14 @@ fn test_add_roast_with_authentication() {
|
||||||
let token = create_token("test-add-roast");
|
let token = create_token("test-add-roast");
|
||||||
|
|
||||||
// First create a roaster
|
// First create a roaster
|
||||||
let roaster_output = run_brewlog(
|
let roaster_id = create_roaster("Test Roasters Add", &token);
|
||||||
&[
|
|
||||||
"add-roaster",
|
|
||||||
"--name",
|
|
||||||
"Test Roasters Add",
|
|
||||||
"--country",
|
|
||||||
"UK",
|
|
||||||
],
|
|
||||||
&[("BREWLOG_TOKEN", &token)],
|
|
||||||
);
|
|
||||||
|
|
||||||
assert!(roaster_output.status.success());
|
|
||||||
|
|
||||||
let roaster_stdout = String::from_utf8_lossy(&roaster_output.stdout);
|
|
||||||
let roaster: Value = serde_json::from_str(&roaster_stdout).expect("Should output valid JSON");
|
|
||||||
let roaster_id = roaster["id"]
|
|
||||||
.as_i64()
|
|
||||||
.expect("roaster id should be numeric");
|
|
||||||
let roaster_id_arg = roaster_id.to_string();
|
|
||||||
|
|
||||||
// Now add a roast
|
// Now add a roast
|
||||||
let output = run_brewlog(
|
let output = run_brewlog(
|
||||||
&[
|
&[
|
||||||
"add-roast",
|
"add-roast",
|
||||||
"--roaster-id",
|
"--roaster-id",
|
||||||
&roaster_id_arg,
|
&roaster_id,
|
||||||
"--name",
|
"--name",
|
||||||
"Ethiopian Yirgacheffe",
|
"Ethiopian Yirgacheffe",
|
||||||
"--origin",
|
"--origin",
|
||||||
|
|
@ -87,7 +69,10 @@ fn test_add_roast_with_authentication() {
|
||||||
let roast: Value = serde_json::from_str(&stdout).expect("Should output valid JSON");
|
let roast: Value = serde_json::from_str(&stdout).expect("Should output valid JSON");
|
||||||
|
|
||||||
assert_eq!(roast["name"], "Ethiopian Yirgacheffe");
|
assert_eq!(roast["name"], "Ethiopian Yirgacheffe");
|
||||||
assert_eq!(roast["roaster_id"].as_i64(), Some(roaster_id));
|
assert_eq!(
|
||||||
|
roast["roaster_id"].as_i64().unwrap().to_string(),
|
||||||
|
roaster_id
|
||||||
|
);
|
||||||
assert!(roast["id"].is_i64(), "Should have an ID");
|
assert!(roast["id"].is_i64(), "Should have an ID");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -113,30 +98,14 @@ fn test_list_roasts_shows_added_roast() {
|
||||||
let token = create_token("test-list-roasts");
|
let token = create_token("test-list-roasts");
|
||||||
|
|
||||||
// First create a roaster
|
// First create a roaster
|
||||||
let roaster_output = run_brewlog(
|
let roaster_id = create_roaster("Test Roasters List", &token);
|
||||||
&[
|
|
||||||
"add-roaster",
|
|
||||||
"--name",
|
|
||||||
"Test Roasters List",
|
|
||||||
"--country",
|
|
||||||
"UK",
|
|
||||||
],
|
|
||||||
&[("BREWLOG_TOKEN", &token)],
|
|
||||||
);
|
|
||||||
|
|
||||||
let roaster_stdout = String::from_utf8_lossy(&roaster_output.stdout);
|
|
||||||
let roaster: Value = serde_json::from_str(&roaster_stdout).unwrap();
|
|
||||||
let roaster_id = roaster["id"]
|
|
||||||
.as_i64()
|
|
||||||
.expect("roaster id should be numeric");
|
|
||||||
let roaster_id_arg = roaster_id.to_string();
|
|
||||||
|
|
||||||
// Add a roast
|
// Add a roast
|
||||||
let add_output = run_brewlog(
|
let add_output = run_brewlog(
|
||||||
&[
|
&[
|
||||||
"add-roast",
|
"add-roast",
|
||||||
"--roaster-id",
|
"--roaster-id",
|
||||||
&roaster_id_arg,
|
&roaster_id,
|
||||||
"--name",
|
"--name",
|
||||||
"Colombian Supremo",
|
"Colombian Supremo",
|
||||||
"--origin",
|
"--origin",
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue