+
Skip to content
This repository was archived by the owner on Aug 31, 2023. It is now read-only.

test(rome_cli): add snapshots for file system and console session #3035

Merged
merged 3 commits into from
Aug 9, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,5 @@ crates/rome_js_formatter/tests/**/*.ts.prettier-snap linguist-language=TypeScrip
crates/rome_js_formatter/tests/**/*.js.prettier-snap linguist-language=JavaScript
crates/rome_js_formatter/tests/**/*.ts.snap linguist-language=Markdown
crates/rome_js_formatter/tests/**/*.js.snap linguist-language=Markdown
crates/rome_cli/tests/**/*.snap linguist-language=Markdown

13 changes: 7 additions & 6 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions crates/rome_cli/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -24,5 +24,8 @@ crossbeam = "0.8.1"
thiserror = "1.0.30"
rayon = "1.5.1"

[dev-dependencies]
insta = "1.17.1"

[target.'cfg(target_os = "windows")'.dependencies]
mimalloc = "0.1.29"
46 changes: 38 additions & 8 deletions crates/rome_cli/tests/main.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
mod configs;
#[cfg(test)]
mod snap_test;

#[cfg(test)]
use snap_test::assert_cli_snapshot;

use std::{ffi::OsString, path::Path};

Expand Down Expand Up @@ -163,7 +168,7 @@ mod check {

assert!(result.is_err());

let messages = console.buffer;
let messages = &console.buffer;

assert_eq!(
messages
Expand All @@ -182,6 +187,8 @@ mod check {
&& content.contains("Diagnostics not shown")
&& content.contains("76")
}));

assert_cli_snapshot("maximum_diagnostics", fs, console);
}

#[test]
Expand Down Expand Up @@ -213,6 +220,8 @@ mod check {
.unwrap();

assert_eq!(buffer, FIX_AFTER);

assert_cli_snapshot("apply_ok", fs, console);
}

#[test]
Expand All @@ -238,6 +247,8 @@ mod check {
println!("{console:#?}");

assert!(result.is_ok(), "run_cli returned {result:?}");

assert_cli_snapshot("apply_noop", fs, console);
}

#[test]
Expand Down Expand Up @@ -271,6 +282,8 @@ mod check {
}
_ => panic!("expected an error, but found none"),
}

assert_cli_snapshot("apply_suggested_error", fs, console);
}

#[test]
Expand Down Expand Up @@ -302,6 +315,8 @@ mod check {
.unwrap();

assert_eq!(buffer, APPLY_SUGGESTED_AFTER);

assert_cli_snapshot("apply_suggested", fs, console);
}

#[test]
Expand Down Expand Up @@ -336,6 +351,8 @@ mod check {
.unwrap();

assert_eq!(buffer, FIX_BEFORE);

assert_cli_snapshot("no_lint_if_linter_is_disabled_when_run_apply", fs, console);
}

#[test]
Expand Down Expand Up @@ -366,6 +383,8 @@ mod check {
.unwrap();

assert_eq!(buffer, FIX_BEFORE);

assert_cli_snapshot("no_lint_if_linter_is_disabled", fs, console);
}

#[test]
Expand Down Expand Up @@ -400,6 +419,8 @@ mod check {
.unwrap();

assert_eq!(buffer, NO_DEBUGGER_AFTER);

assert_cli_snapshot("should_disable_a_rule", fs, console);
}

#[test]
Expand Down Expand Up @@ -437,6 +458,8 @@ mod check {
.unwrap();

assert_eq!(buffer, JS_ERRORS_AFTER);

assert_cli_snapshot("should_disable_a_rule_group", fs, console);
}
}

Expand Down Expand Up @@ -531,7 +554,7 @@ mod ci {
let mut console = BufferConsole::default();
let result = run_cli(CliSession {
app: App::with_filesystem_and_console(
DynRef::Owned(Box::new(fs)),
DynRef::Borrowed(&mut fs),
DynRef::Borrowed(&mut console),
),
args: Arguments::from_vec(vec![OsString::from("ci"), file_path.as_os_str().into()]),
Expand All @@ -543,6 +566,8 @@ mod ci {
Err(Termination::CheckError) => {}
_ => panic!("run_cli returned {result:?} for a failed CI check, expected an error"),
}

assert_cli_snapshot("lint_error", fs, console);
}
}

Expand Down Expand Up @@ -586,11 +611,11 @@ mod format {
#[test]
fn write() {
let mut fs = MemoryFileSystem::default();
let mut console = BufferConsole::default();

let file_path = Path::new("format.js");
fs.insert(file_path.into(), UNFORMATTED.as_bytes());

let mut console = BufferConsole::default();
let app = App::with_filesystem_and_console(
DynRef::Borrowed(&mut fs),
DynRef::Borrowed(&mut console),
Expand Down Expand Up @@ -855,30 +880,33 @@ mod format {

let result = run_cli(CliSession {
app: App::with_filesystem_and_console(
DynRef::Owned(Box::new(fs)),
DynRef::Borrowed(&mut fs),
DynRef::Borrowed(&mut console),
),
args: Arguments::from_vec(vec![OsString::from("check"), file_path.as_os_str().into()]),
});

assert!(result.is_ok(), "run_cli returned {result:?}");

let messages = console.buffer;
let messages = &console.buffer;

assert_eq!(
messages
.iter()
.filter(|m| m.level == LogLevel::Error)
.filter(|m| {
let content = format!("{:?}", m.content);
let content = format!("{:#?}", m.content);
content.contains("js/noDebugger")
})
.count(),
1
);

assert_cli_snapshot("downgrade_severity", fs, console);
}

#[test]
#[ignore]
fn upgrade_severity() {
let mut fs = MemoryFileSystem::default();
let mut console = BufferConsole::default();
Expand All @@ -893,15 +921,15 @@ mod format {

let result = run_cli(CliSession {
app: App::with_filesystem_and_console(
DynRef::Owned(Box::new(fs)),
DynRef::Borrowed(&mut fs),
DynRef::Borrowed(&mut console),
),
args: Arguments::from_vec(vec![OsString::from("check"), file_path.as_os_str().into()]),
});

assert!(result.is_err(), "run_cli returned {result:?}");

let messages = console.buffer;
let messages = &console.buffer;

assert_eq!(
messages
Expand All @@ -914,6 +942,8 @@ mod format {
.count(),
1
);

assert_cli_snapshot("upgrade_severity", fs, console);
}
}

Expand Down
115 changes: 115 additions & 0 deletions crates/rome_cli/tests/snap_test.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
use rome_console::fmt::{Formatter, Termcolor};
use rome_console::{markup, BufferConsole, Markup};
use rome_diagnostics::termcolor::NoColor;
use rome_fs::{FileSystemExt, MemoryFileSystem};
use std::collections::HashMap;
use std::fmt::Write as _;
use std::path::PathBuf;

#[derive(Default)]
struct CliSnapshot {
/// the configuration, if set
pub configuration: Option<String>,
/// file name -> content
pub files: HashMap<String, String>,
/// messages written in console
pub messages: Vec<String>,
}

impl CliSnapshot {
fn emit_content_snapshot(&self) -> String {
let mut content = String::new();

if let Some(configuration) = &self.configuration {
content.push_str("## `rome.json`\n\n");
content.push_str("```json");
content.push('\n');
content.push_str(configuration);
content.push('\n');
content.push_str("```");
content.push_str("\n\n")
}

for (name, file_content) in &self.files {
if !name.starts_with("rome.json") {
let extension = name.split('.').last().unwrap();

let _ = write!(content, "## `{name}`\n\n");
let _ = write!(content, "```{extension}");
content.push('\n');
content.push_str(&*file_content);
content.push('\n');
content.push_str("```");
content.push_str("\n\n")
}
}

if !self.messages.is_empty() {
content.push_str("## Messages\n\n");

for message in &self.messages {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: wrap the messages in a code block to have them rendered in a <pre> block in markdown previews and respect the line breaks

let message_content = &*message;
// There are some logs that print the timing, and we can't snapshot that message
// otherwise at each run we invalid the previous snapshot.
//
// This is a workaround, and it might not work for all cases.
if !message_content.contains("files") {
content.push_str("```block");
content.push('\n');
content.push_str(message_content);
content.push('\n');
content.push_str("```");
content.push_str("\n\n")
}
}
}

content
}
}

fn markup_to_string(markup: Markup) -> String {
let mut buffer = Vec::new();
let mut write = Termcolor(NoColor::new(&mut buffer));
let mut fmt = Formatter::new(&mut write);
fmt.write_markup(markup).unwrap();

String::from_utf8(buffer).unwrap()
}

/// Function used to snapshot a session test of the a CLI run.
pub fn assert_cli_snapshot(test_name: &str, fs: MemoryFileSystem, console: BufferConsole) {
let mut cli_snapshot = CliSnapshot::default();
let config_path = PathBuf::from("rome.json");
let configuration = fs.read(&config_path).ok();
if let Some(mut configuration) = configuration {
let mut buffer = String::new();
if configuration.read_to_string(&mut buffer).is_ok() {
cli_snapshot.configuration = Some(buffer);
}
}

for (file, entry) in fs.files() {
let content = entry.lock();
let content = std::str::from_utf8(content.as_slice()).unwrap();

cli_snapshot
.files
.insert(file.to_str().unwrap().to_string(), String::from(content));
}

for message in console.buffer {
let content = markup_to_string(markup! {
{message.content}
});
cli_snapshot.messages.push(content)
}

let content = cli_snapshot.emit_content_snapshot();

insta::with_settings!({
prepend_module_to_snapshot => false,
}, {
insta::assert_snapshot!(test_name, content);
});
}
22 changes: 22 additions & 0 deletions crates/rome_cli/tests/snapshots/apply_noop.snap
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
---
source: crates/rome_cli/tests/snap_test.rs
assertion_line: 113
expression: content
---
## `fix.js`

```js

if(a != 0) {}

```

## Messages

```block
Skipped 1 suggested fixes.
If you wish to apply the suggested fixes, use the command rome check --apply-suggested

```


Loading
点击 这是indexloc提供的php浏览器服务,不要输入任何密码和下载