diff --git a/rust/Cargo.lock b/rust/Cargo.lock index ecbeee59..404e97b2 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -579,9 +579,9 @@ checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" [[package]] name = "cli-engine" -version = "0.9.5" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fbcf040ad203e7c5749d2ed6ad979374009759663bd1c444081fc76fd2e20bf" +checksum = "c7775240f99e1f7f533a73f25753362aea7dd9f183e5227bcf13caca0195f22f" dependencies = [ "async-trait", "base64", diff --git a/rust/Cargo.toml b/rust/Cargo.toml index 59a5a19c..3fb3a737 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -20,7 +20,7 @@ async-trait = "0.1" bytes = "1" chrono = { version = "0.4", default-features = false, features = ["clock", "serde"] } clap = { version = "4.5", features = ["std", "string", "derive"] } -cli-engine = { version = "0.9.5", features = ["pkce-auth"] } +cli-engine = { version = "0.10.0", features = ["pkce-auth"] } dirs = "6" domains-client = { path = "domains-client" } hosting-client = { path = "hosting-client" } diff --git a/rust/src/api/graphql/get.rs b/rust/src/api/graphql/get.rs index 368a5e96..7c806de5 100644 --- a/rust/src/api/graphql/get.rs +++ b/rust/src/api/graphql/get.rs @@ -59,19 +59,19 @@ pub(super) fn command() -> RuntimeCommandSpec { TableColumn::new("summary", "Summary"), TableColumn::new("returnType", "Return Type"), TableColumn::new("returnFields", "Return Fields").nested(vec![ - TableColumn::new("name", "Name"), + TableColumn::new("name", "Name").essential(true), TableColumn::new("type", "Type"), TableColumn::new("description", "Description"), ]), TableColumn::new("callRequirements", "Call Requirements").nested(vec![ - TableColumn::new("name", "Name"), + TableColumn::new("name", "Name").essential(true), TableColumn::new("in", "In"), TableColumn::new("required", "Required"), TableColumn::new("type", "Type"), TableColumn::new("description", "Description"), ]), TableColumn::new("arguments", "Arguments").nested(vec![ - TableColumn::new("name", "Name"), + TableColumn::new("name", "Name").essential(true), TableColumn::new("required", "Required"), TableColumn::new("type", "Type"), TableColumn::new("description", "Description"), diff --git a/rust/src/api/graphql/type_cmd.rs b/rust/src/api/graphql/type_cmd.rs index 03ea5be0..1c9952c7 100644 --- a/rust/src/api/graphql/type_cmd.rs +++ b/rust/src/api/graphql/type_cmd.rs @@ -53,7 +53,7 @@ fn get_command() -> RuntimeCommandSpec { TableColumn::new("name", "Name"), TableColumn::new("kind", "Kind"), TableColumn::new("fields", "Fields").nested(vec![ - TableColumn::new("name", "Name"), + TableColumn::new("name", "Name").essential(true), TableColumn::new("type", "Type"), TableColumn::new("description", "Description"), ]), diff --git a/rust/src/api/operation.rs b/rust/src/api/operation.rs index ae20e5a2..5f619591 100644 --- a/rust/src/api/operation.rs +++ b/rust/src/api/operation.rs @@ -173,7 +173,7 @@ pub(super) fn get_command() -> RuntimeCommandSpec { TableColumn::new("path", "Path"), TableColumn::new("summary", "Summary"), TableColumn::new("parameters.items", "Parameters").nested(vec![ - TableColumn::new("name", "Name"), + TableColumn::new("name", "Name").essential(true), TableColumn::new("in", "In"), TableColumn::new("required", "Required"), TableColumn::new("type", "Type"), @@ -181,7 +181,7 @@ pub(super) fn get_command() -> RuntimeCommandSpec { TableColumn::new("description", "Description"), ]), TableColumn::new("responses.items", "Responses").nested(vec![ - TableColumn::new("status", "Status"), + TableColumn::new("status", "Status").essential(true), TableColumn::new("type", "Type"), TableColumn::new("schemaId", "Schema ID"), TableColumn::new("description", "Description"), diff --git a/rust/src/api/parameter.rs b/rust/src/api/parameter.rs index 266611cb..8876583e 100644 --- a/rust/src/api/parameter.rs +++ b/rust/src/api/parameter.rs @@ -32,7 +32,7 @@ pub(super) fn list_command() -> RuntimeCommandSpec { parameter's full details.", ) .with_view(vec![ - TableColumn::new("name", "Name"), + TableColumn::new("name", "Name").essential(true), TableColumn::new("in", "In"), TableColumn::new("required", "Required"), TableColumn::new("type", "Type"), diff --git a/rust/src/api/response.rs b/rust/src/api/response.rs index 4a6fe1d9..88d0b76e 100644 --- a/rust/src/api/response.rs +++ b/rust/src/api/response.rs @@ -29,7 +29,7 @@ pub(super) fn list_command() -> RuntimeCommandSpec { full detail.", ) .with_view(vec![ - TableColumn::new("status", "Status"), + TableColumn::new("status", "Status").essential(true), TableColumn::new("type", "Type"), TableColumn::new("schemaId", "Schema ID"), TableColumn::new("description", "Description"), diff --git a/rust/src/dns/add.rs b/rust/src/dns/add.rs index 7a69d108..de111fdd 100644 --- a/rust/src/dns/add.rs +++ b/rust/src/dns/add.rs @@ -83,14 +83,14 @@ fn summarize_add_outcomes( /// `--fields all`). fn view_columns() -> Vec { vec![ - TableColumn::new("domain", "Domain"), + TableColumn::new("domain", "Domain").essential(true), TableColumn::new("type", "Type"), TableColumn::new("name", "Name"), TableColumn::new("created", "Created").align(Alignment::Right), TableColumn::new("failed", "Failed").align(Alignment::Right), TableColumn::new("results", "Results").nested(vec![ - TableColumn::new("data", "Data"), - TableColumn::new("status", "Status"), + TableColumn::new("data", "Data").essential(true), + TableColumn::new("status", "Status").essential(true), TableColumn::new("error", "Error"), ]), TableColumn::new("action", "Action"), @@ -220,8 +220,7 @@ mod tests { vec![("1.2.3.4".to_string(), Ok(()))], ) .expect("all created -> success payload"); - let envelope = cli_engine::Envelope::success(payload, "domain"); - let rendered = cli_engine::render_human_with_view(&envelope, Some(&view_columns()), ""); + let rendered = cli_engine::preview_human_view(payload, &view_columns()); assert!(rendered.contains("Results:"), "{rendered}"); assert!(rendered.contains("1.2.3.4"), "{rendered}"); assert!(rendered.contains("created"), "{rendered}"); diff --git a/rust/src/dns/delete.rs b/rust/src/dns/delete.rs index 42caee0b..4d4e5ba7 100644 --- a/rust/src/dns/delete.rs +++ b/rust/src/dns/delete.rs @@ -140,8 +140,8 @@ fn view_columns() -> Vec { TableColumn::new("action", "Action"), TableColumn::new("records", "Records").nested(vec![ TableColumn::new("recordId", "Record ID"), - TableColumn::new("data", "Data"), - TableColumn::new("status", "Status"), + TableColumn::new("data", "Data").essential(true), + TableColumn::new("status", "Status").essential(true), ]), ] } @@ -392,8 +392,7 @@ mod tests { fn dry_run_delete_preview_renders_records_as_a_nested_table() { let existing = vec![test_record("r1", "1.2.3.4")]; let preview = dry_run_delete_preview("example.com", "A", "www", &existing); - let envelope = cli_engine::Envelope::success(preview, "domain"); - let rendered = cli_engine::render_human_with_view(&envelope, Some(&view_columns()), ""); + let rendered = cli_engine::preview_human_view(preview, &view_columns()); assert!(rendered.contains("Records:"), "{rendered}"); assert!(rendered.contains("RECORD ID"), "{rendered}"); assert!(rendered.contains("r1"), "{rendered}"); diff --git a/rust/src/dns/list.rs b/rust/src/dns/list.rs index 12271036..0659b7f3 100644 --- a/rust/src/dns/list.rs +++ b/rust/src/dns/list.rs @@ -1,7 +1,8 @@ //! `dns list` — list DNS records for a domain, with optional type/name filters. use cli_engine::{ - CliCoreError, CommandResult, CommandSpec, PaginationConfig, RuntimeCommandSpec, Tier, + Alignment, CliCoreError, CommandResult, CommandSpec, PaginationConfig, RuntimeCommandSpec, + TableColumn, Tier, }; use serde_json::{Value, json}; @@ -28,6 +29,31 @@ struct ListArgs { name: Option, } +/// A record is unreadable without its type/name/data, so those three are +/// `essential` — never hidden or shrunk for width, even on a narrow terminal +/// — while the rest are nice-to-haves that still yield to width pressure. +fn view_columns() -> Vec { + vec![ + TableColumn::new("type", "Type").essential(true), + TableColumn::new("name", "Name").essential(true), + TableColumn::new("data", "Data").essential(true), + TableColumn::new("ttl", "TTL").align(Alignment::Right), + TableColumn::new("priority", "Priority").align(Alignment::Right), + TableColumn::new("recordId", "Record ID"), + TableColumn::new("service", "Service"), + TableColumn::new("protocol", "Protocol"), + TableColumn::new("port", "Port").align(Alignment::Right), + TableColumn::new("weight", "Weight").align(Alignment::Right), + TableColumn::new("tag", "Tag"), + TableColumn::new("flag", "Flag").align(Alignment::Right), + TableColumn::new("usage", "Usage"), + TableColumn::new("selector", "Selector"), + TableColumn::new("matchingType", "Matching Type"), + TableColumn::new("certificateData", "Certificate Data").no_truncate(true), + TableColumn::new("parameters", "Parameters"), + ] +} + pub(super) fn command() -> RuntimeCommandSpec { RuntimeCommandSpec::new_typed_with_context::( CommandSpec::from_args::("list", "List DNS records for a domain") @@ -40,6 +66,7 @@ pub(super) fn command() -> RuntimeCommandSpec { .with_tier(Tier::Read) .with_default_fields("type,name,data,ttl") .with_json_schema::() + .with_view(view_columns()) .with_scopes(&[DOMAINS_READ]) .with_pagination(PaginationConfig { max_limit: 500, @@ -106,6 +133,27 @@ mod tests { ); } + /// `view_columns()` declares 17 columns — far more than fit an + /// 80-column terminal (the fixed width non-TTY test runs get) once + /// their headers are laid out side by side. Type/name/data must survive + /// that squeeze regardless, since a record is unreadable without them; + /// everything else is free to be hidden. + #[test] + fn essential_fields_survive_width_based_hiding() { + let out = build_list_output(&[a_record()]).expect("serializes"); + + let rendered = cli_engine::preview_human_view(out, &view_columns()); + + let header_line = rendered.lines().next().expect("header line"); + assert!(header_line.contains("TYPE"), "{rendered}"); + assert!(header_line.contains("NAME"), "{rendered}"); + assert!(header_line.contains("DATA"), "{rendered}"); + assert!( + rendered.contains("hidden to fit the display width"), + "fixture must actually overflow 80 columns to exercise hiding: {rendered}" + ); + } + fn a_record() -> types::DnsRecord { types::DnsRecord { certificate_data: None, diff --git a/rust/src/dns/set/mod.rs b/rust/src/dns/set/mod.rs index 544d029e..eea7fd5c 100644 --- a/rust/src/dns/set/mod.rs +++ b/rust/src/dns/set/mod.rs @@ -57,9 +57,9 @@ fn view_columns() -> Vec { TableColumn::new("deleted", "Deleted").align(Alignment::Right), TableColumn::new("action", "Action"), TableColumn::new("plan", "Plan").nested(vec![ - TableColumn::new("action", "Action"), + TableColumn::new("action", "Action").essential(true), TableColumn::new("recordId", "Record ID"), - TableColumn::new("data", "Data"), + TableColumn::new("data", "Data").essential(true), ]), ] } diff --git a/rust/src/dns/set/outcome.rs b/rust/src/dns/set/outcome.rs index 31bc99d2..41925e9c 100644 --- a/rust/src/dns/set/outcome.rs +++ b/rust/src/dns/set/outcome.rs @@ -249,9 +249,7 @@ mod tests { &["9.9.9.9".to_string(), "8.8.8.8".to_string()], ); let preview = dry_run_set_preview("example.com", "A", "www", &plan); - let envelope = cli_engine::Envelope::success(preview, "domain"); - let rendered = - cli_engine::render_human_with_view(&envelope, Some(&super::super::view_columns()), ""); + let rendered = cli_engine::preview_human_view(preview, &super::super::view_columns()); assert!(rendered.contains("Plan:"), "{rendered}"); assert!(rendered.contains("RECORD ID"), "{rendered}"); assert!(rendered.contains("replace"), "{rendered}"); diff --git a/rust/src/domain/agreements.rs b/rust/src/domain/agreements.rs index a3097580..d484936c 100644 --- a/rust/src/domain/agreements.rs +++ b/rust/src/domain/agreements.rs @@ -39,7 +39,7 @@ pub(super) fn command() -> RuntimeCommandSpec { .with_view(vec![ TableColumn::new("agreementKey", "Agreement Key"), TableColumn::new("title", "Title"), - TableColumn::new("url", "URL").no_truncate(true), + TableColumn::new("url", "URL").essential(true), ]) .with_json_schema::() .with_scopes(&[DOMAINS_READ]), diff --git a/rust/src/domain/available.rs b/rust/src/domain/available.rs index 8c07d692..60f5123b 100644 --- a/rust/src/domain/available.rs +++ b/rust/src/domain/available.rs @@ -41,11 +41,13 @@ fn view_columns() -> Vec { TableColumn::new("currency", "Currency"), TableColumn::new("inventory", "Inventory"), TableColumn::new("terms", "Terms").nested(vec![ - TableColumn::new("periodLabel", "Period"), - TableColumn::new("price", "Price").align(Alignment::Right), + TableColumn::new("periodLabel", "Period").essential(true), + TableColumn::new("price", "Price") + .align(Alignment::Right) + .essential(true), TableColumn::new("firstTermPrice", "First-Term Price").align(Alignment::Right), TableColumn::new("renewalPrice", "Renewal Price").align(Alignment::Right), - TableColumn::new("fees", "Fees"), + TableColumn::new("fees", "Fees").essential(true), ]), ] } @@ -280,8 +282,7 @@ mod tests { }, ], }); - let envelope = cli_engine::Envelope::success(available, "domain"); - let rendered = cli_engine::render_human_with_view(&envelope, Some(&view_columns()), ""); + let rendered = cli_engine::preview_human_view(available, &view_columns()); assert!(rendered.contains("Terms:"), "{rendered}"); assert!(rendered.contains("1 year"), "{rendered}"); assert!(rendered.contains("2 years"), "{rendered}"); @@ -344,8 +345,7 @@ mod tests { "definitive": true, "inventory": "PREMIUM", }); - let envelope = cli_engine::Envelope::success(available, "domain"); - let rendered = cli_engine::render_human_with_view(&envelope, Some(&view_columns()), ""); + let rendered = cli_engine::preview_human_view(available, &view_columns()); assert!(rendered.contains("Inventory:"), "{rendered}"); assert!(rendered.contains("PREMIUM"), "{rendered}"); } diff --git a/rust/src/domain/quote.rs b/rust/src/domain/quote.rs index e0644385..9dd5735b 100644 --- a/rust/src/domain/quote.rs +++ b/rust/src/domain/quote.rs @@ -259,15 +259,17 @@ fn view_columns() -> Vec { TableColumn::new("irreversible", "Irreversible"), TableColumn::new("inventory", "Inventory"), TableColumn::new("fees", "Fees").nested(vec![ - TableColumn::new("type", "Type"), - TableColumn::new("amount", "Amount").align(Alignment::Right), - TableColumn::new("currency", "Currency"), + TableColumn::new("type", "Type").essential(true), + TableColumn::new("amount", "Amount") + .align(Alignment::Right) + .essential(true), + TableColumn::new("currency", "Currency").essential(true), ]), TableColumn::new("agreements", "Agreements"), TableColumn::new("requiredAgreements", "Required Agreements").nested(vec![ TableColumn::new("agreementType", "Type"), TableColumn::new("title", "Title"), - TableColumn::new("url", "URL").no_truncate(true), + TableColumn::new("url", "URL").essential(true), ]), TableColumn::new("resolved", "Resolved Settings").nested(vec![ TableColumn::new("contactSource", "Contact Source"), @@ -506,8 +508,7 @@ mod tests { "period": 1, "periodLabel": "1 year", }); - let envelope = cli_engine::Envelope::success(quote, "domain"); - let rendered = cli_engine::render_human_with_view(&envelope, Some(&view_columns()), ""); + let rendered = cli_engine::preview_human_view(quote, &view_columns()); assert!(rendered.contains("1 year"), "{rendered}"); } @@ -517,9 +518,10 @@ mod tests { /// `quote_to_json`, and `resolved` is `ResolvedSettings` serialized via /// serde, whose `#[serde(rename = ...)]` attributes were cross-checked /// for the field names used below) as nested blocks — a mismatch would - /// silently drop them from `--fields all` output. Renders a hand-built - /// envelope rather than calling `quote_to_json`, which would need a - /// live `RegistrationQuote` built through its generated builder. + /// silently drop them from `--fields all` output. Renders hand-built + /// fixture data through the view rather than calling `quote_to_json`, + /// which would need a live `RegistrationQuote` built through its + /// generated builder. #[test] fn quote_result_renders_required_agreements_and_resolved_as_nested_blocks() { let quote = json!({ @@ -536,8 +538,7 @@ mod tests { "nameServers": ["ns01.domaincontrol.com", "ns02.domaincontrol.com"], }, }); - let envelope = cli_engine::Envelope::success(quote, "domain"); - let rendered = cli_engine::render_human_with_view(&envelope, Some(&view_columns()), ""); + let rendered = cli_engine::preview_human_view(quote, &view_columns()); assert!(rendered.contains("Required Agreements:"), "{rendered}"); assert!(rendered.contains("Registration Agreement"), "{rendered}"); assert!(rendered.contains("Resolved Settings:"), "{rendered}"); @@ -560,8 +561,7 @@ mod tests { {"type": "ONE_TIME_PREMIUM_DOMAIN_PURCHASE", "amount": "3900.00", "currency": "USD"}, ], }); - let envelope = cli_engine::Envelope::success(quote, "domain"); - let rendered = cli_engine::render_human_with_view(&envelope, Some(&view_columns()), ""); + let rendered = cli_engine::preview_human_view(quote, &view_columns()); assert!(rendered.contains("Inventory:"), "{rendered}"); assert!(rendered.contains("PREMIUM"), "{rendered}"); assert!(rendered.contains("Fees:"), "{rendered}"); @@ -582,8 +582,7 @@ mod tests { "domain": "example.com", "available": true, }); - let envelope = cli_engine::Envelope::success(quote, "domain"); - let rendered = cli_engine::render_human_with_view(&envelope, Some(&view_columns()), ""); + let rendered = cli_engine::preview_human_view(quote, &view_columns()); assert!(!rendered.contains("null"), "{rendered}"); } } diff --git a/rust/src/domain/suggest.rs b/rust/src/domain/suggest.rs index 32692839..96ac6dac 100644 --- a/rust/src/domain/suggest.rs +++ b/rust/src/domain/suggest.rs @@ -57,14 +57,16 @@ fn nonzero(n: i64) -> Option { /// entirely absent from the table, which is the regression this guards. fn view_columns() -> Vec { vec![ - TableColumn::new("domain", "Domain"), - TableColumn::new("price1Year", "1yr Price").align(Alignment::Right), + TableColumn::new("domain", "Domain").essential(true), + TableColumn::new("price1Year", "1yr Price") + .align(Alignment::Right) + .essential(true), TableColumn::new("renewalPrice1Year", "1yr Renewal").align(Alignment::Right), TableColumn::new("fees1Year", "1yr Fees"), TableColumn::new("price2Year", "2yr Price").align(Alignment::Right), TableColumn::new("renewalPrice2Year", "2yr Renewal").align(Alignment::Right), TableColumn::new("fees2Year", "2yr Fees"), - TableColumn::new("currency", "Currency"), + TableColumn::new("currency", "Currency").essential(true), TableColumn::new("inventory", "Inventory"), ] } @@ -428,8 +430,7 @@ mod tests { .into_iter() .filter(|c| c.field == "fees1Year") .collect(); - let envelope = cli_engine::Envelope::success(suggestions, "domain"); - let rendered = cli_engine::render_human_with_view(&envelope, Some(&columns), ""); + let rendered = cli_engine::preview_human_view(suggestions, &columns); assert!(rendered.contains("1YR FEES"), "{rendered}"); assert!( rendered.contains("ONE_TIME_PREMIUM_DOMAIN_PURCHASE"), @@ -437,4 +438,32 @@ mod tests { ); assert!(rendered.contains("3500.00"), "{rendered}"); } + + /// A suggestion is meaningless without its domain, price, and the + /// currency that price is denominated in (prices render as bare numbers), + /// so those survive width-based hiding; the full column set overflows an + /// 80-column terminal, so something else must be hidden instead. + #[test] + fn domain_price_and_currency_survive_width_based_hiding() { + let suggestions = json!([{ + "domain": "example.com", + "price1Year": "11.99", + "renewalPrice1Year": "19.99", + "price2Year": "23.98", + "renewalPrice2Year": "39.98", + "currency": "USD", + "inventory": "PREMIUM", + }]); + + let rendered = cli_engine::preview_human_view(suggestions, &view_columns()); + + let header_line = rendered.lines().next().expect("header line"); + assert!(header_line.contains("DOMAIN"), "{rendered}"); + assert!(header_line.contains("1YR PRICE"), "{rendered}"); + assert!(header_line.contains("CURRENCY"), "{rendered}"); + assert!( + rendered.contains("hidden to fit the display width"), + "fixture must actually overflow 80 columns to exercise hiding: {rendered}" + ); + } } diff --git a/rust/src/platform/app/commands/enablements.rs b/rust/src/platform/app/commands/enablements.rs index e2cd5f57..25f5008d 100644 --- a/rust/src/platform/app/commands/enablements.rs +++ b/rust/src/platform/app/commands/enablements.rs @@ -18,7 +18,7 @@ struct EnablementsArgs { fn view_columns() -> Vec { vec![ - TableColumn::new("name", "Name"), + TableColumn::new("name", "Name").essential(true), TableColumn::new("status", "Status"), TableColumn::new("releaseVersion", "Release"), TableColumn::new("label", "Label"), diff --git a/rust/src/platform/app/commands/import.rs b/rust/src/platform/app/commands/import.rs index 8f59a525..10879103 100644 --- a/rust/src/platform/app/commands/import.rs +++ b/rust/src/platform/app/commands/import.rs @@ -541,8 +541,9 @@ mod tests { /// the `import` handler actually builds (`config` path, confirmed by /// inspection) as a nested property bag — a column/field name mismatch /// would silently drop the write summary from human output and print a - /// raw JSON blob instead. Renders a hand-built envelope rather than - /// calling the handler, which would need a live app-registry API call. + /// raw JSON blob instead. Renders hand-built fixture data through the + /// view rather than calling the handler, which would need a live + /// app-registry API call. #[test] fn import_result_renders_files_written_as_a_nested_property_bag() { let result = json!({ @@ -553,9 +554,7 @@ mod tests { "config": "/home/user/project/godaddy.toml", }, }); - let envelope = cli_engine::Envelope::success(result, "applications"); - let rendered = - cli_engine::render_human_with_view(&envelope, Some(&import_view_columns()), ""); + let rendered = cli_engine::preview_human_view(result, &import_view_columns()); assert!(rendered.contains("Files Written:"), "{rendered}"); assert!(rendered.contains("godaddy.toml"), "{rendered}"); } diff --git a/rust/src/platform/app/commands/init.rs b/rust/src/platform/app/commands/init.rs index 724d939f..7a3e809e 100644 --- a/rust/src/platform/app/commands/init.rs +++ b/rust/src/platform/app/commands/init.rs @@ -400,8 +400,9 @@ mod tests { /// the `init` handler actually builds (`config`/`env` paths, confirmed by /// inspection) as a nested property bag — a column/field name mismatch /// would silently drop the write summary from human output and print a - /// raw JSON blob instead. Renders a hand-built envelope rather than - /// calling the handler, which would need a live app-registry API call. + /// raw JSON blob instead. Renders hand-built fixture data through the + /// view rather than calling the handler, which would need a live + /// app-registry API call. #[test] fn init_result_renders_files_written_as_a_nested_property_bag() { let result = json!({ @@ -413,9 +414,7 @@ mod tests { "env": "/home/user/project/.env", }, }); - let envelope = cli_engine::Envelope::success(result, "applications"); - let rendered = - cli_engine::render_human_with_view(&envelope, Some(&init_view_columns()), ""); + let rendered = cli_engine::preview_human_view(result, &init_view_columns()); assert!(rendered.contains("Files Written:"), "{rendered}"); assert!(rendered.contains("godaddy.toml"), "{rendered}"); assert!(rendered.contains(".env"), "{rendered}");