1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-12-23 23:59:59 -05:00
denoland-deno/cli/tests/integration/lint_tests.rs
Bartek Iwańczuk 5874fc3d0a
feat: add support for globs in the config file and CLI arguments for files (#19102)
Follow up to https://github.com/denoland/deno/pull/19084.

This commit adds support for globs in the configuration file as well 
as CLI arguments for files. 

With this change users can now use glob syntax for "include" and 
"exclude" fields, like so:

```json
{
  "lint": {
    "include": [
      "directory/test*.ts",
      "other_dir/"
    ],
    "exclude": [
      "other_dir/foo*.ts",
      "nested/nested2/*"
    ]
  },
  "test": {
    "include": [
      "data/test*.ts",
      "nested/",
      "tests/test[1-9].ts"
    ],
    "exclude": [
      "nested/foo?.ts",
      "nested/nested2/*"
    ]
  }
}
```

Or in CLI args like so:
```
// notice quotes here; these values will be passed to Deno verbatim
// and deno will perform glob expansion

$ deno fmt --ignore="data/*.ts"
$ deno lint "data/**/*.ts"
```

Closes https://github.com/denoland/deno/issues/17971
Closes https://github.com/denoland/deno/issues/6365
2023-05-23 03:39:59 +02:00

211 lines
6.6 KiB
Rust

// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
use test_util::assert_contains;
use test_util::TestContextBuilder;
itest!(ignore_unexplicit_files {
args: "lint --unstable --ignore=./",
output_str: Some("error: No target files found.\n"),
exit_code: 1,
});
itest!(all {
args: "lint lint/without_config/file1.js lint/without_config/file2.ts lint/without_config/ignored_file.ts",
output: "lint/expected.out",
exit_code: 1,
});
itest!(quiet {
args: "lint --quiet lint/without_config/file1.js",
output: "lint/expected_quiet.out",
exit_code: 1,
});
itest!(json {
args:
"lint --json lint/without_config/file1.js lint/without_config/file2.ts lint/without_config/ignored_file.ts lint/without_config/malformed.js",
output: "lint/expected_json.out",
exit_code: 1,
});
itest!(compact {
args:
"lint --compact lint/without_config/file1.js lint/without_config/ignored_file.tss",
output: "lint/expected_compact.out",
exit_code: 1,
});
itest!(ignore {
args:
"lint --ignore=lint/without_config/file1.js,lint/without_config/malformed.js,lint/without_config/lint_with_config/ lint/without_config/",
output: "lint/expected_ignore.out",
exit_code: 1,
});
itest!(glob {
args: "lint --ignore=lint/without_config/malformed.js,lint/with_config/ lint/without_config/",
output: "lint/expected_glob.out",
exit_code: 1,
});
itest!(stdin {
args: "lint -",
input: Some("let _a: any;"),
output: "lint/expected_from_stdin.out",
exit_code: 1,
});
itest!(stdin_json {
args: "lint --json -",
input: Some("let _a: any;"),
output: "lint/expected_from_stdin_json.out",
exit_code: 1,
});
itest!(rules {
args: "lint --rules",
output: "lint/expected_rules.out",
exit_code: 0,
});
// Make sure that the rules are printed if quiet option is enabled.
itest!(rules_quiet {
args: "lint --rules -q",
output: "lint/expected_rules.out",
exit_code: 0,
});
itest!(lint_with_config {
args: "lint --config lint/Deno.jsonc lint/with_config/",
output: "lint/with_config.out",
exit_code: 1,
});
itest!(lint_with_report_config {
args: "lint --config lint/Deno.compact.format.jsonc lint/with_config/",
output: "lint/with_report_config_compact.out",
exit_code: 1,
});
// Check if CLI flags take precedence
itest!(lint_with_report_config_override {
args: "lint --config lint/Deno.compact.format.jsonc lint/with_config/ --json",
output: "lint/with_report_config_override.out",
exit_code: 1,
});
itest!(lint_with_config_and_flags {
args: "lint --config lint/Deno.jsonc --ignore=lint/with_config/a.ts",
output: "lint/with_config_and_flags.out",
exit_code: 1,
});
itest!(lint_with_config_without_tags {
args: "lint --config lint/Deno.no_tags.jsonc lint/with_config/",
output: "lint/with_config_without_tags.out",
exit_code: 1,
});
itest!(lint_with_malformed_config {
args: "lint --config lint/Deno.malformed.jsonc",
output: "lint/with_malformed_config.out",
exit_code: 1,
});
itest!(lint_with_malformed_config2 {
args: "lint --config lint/Deno.malformed2.jsonc",
output: "lint/with_malformed_config2.out",
exit_code: 1,
});
#[test]
fn lint_with_glob_config() {
let context = TestContextBuilder::new().cwd("lint").build();
let cmd_output = context
.new_command()
.args("lint --config deno.glob.json")
.run();
cmd_output.assert_exit_code(1);
let output = cmd_output.combined_output();
if cfg!(windows) {
assert_contains!(output, r#"glob\nested\fizz\fizz.ts:1:10"#);
assert_contains!(output, r#"glob\pages\[id].ts:1:10"#);
assert_contains!(output, r#"glob\nested\fizz\bar.ts:1:10"#);
assert_contains!(output, r#"glob\nested\foo\foo.ts:1:10"#);
assert_contains!(output, r#"glob\data\test1.js:1:10"#);
assert_contains!(output, r#"glob\nested\foo\bar.ts:1:10"#);
assert_contains!(output, r#"glob\nested\foo\fizz.ts:1:10"#);
assert_contains!(output, r#"glob\nested\fizz\foo.ts:1:10"#);
assert_contains!(output, r#"glob\data\test1.ts:1:10"#);
} else {
assert_contains!(output, "glob/nested/fizz/fizz.ts:1:10");
assert_contains!(output, "glob/pages/[id].ts:1:10");
assert_contains!(output, "glob/nested/fizz/bar.ts:1:10");
assert_contains!(output, "glob/nested/foo/foo.ts:1:10");
assert_contains!(output, "glob/data/test1.js:1:10");
assert_contains!(output, "glob/nested/foo/bar.ts:1:10");
assert_contains!(output, "glob/nested/foo/fizz.ts:1:10");
assert_contains!(output, "glob/nested/fizz/foo.ts:1:10");
assert_contains!(output, "glob/data/test1.ts:1:10");
}
assert_contains!(output, "Found 9 problems");
assert_contains!(output, "Checked 9 files");
}
#[test]
fn lint_with_glob_config_and_flags() {
let context = TestContextBuilder::new().cwd("lint").build();
let cmd_output = context
.new_command()
.args("lint --config deno.glob.json --ignore=glob/nested/**/bar.ts")
.run();
cmd_output.assert_exit_code(1);
let output = cmd_output.combined_output();
if cfg!(windows) {
assert_contains!(output, r#"glob\nested\fizz\fizz.ts:1:10"#);
assert_contains!(output, r#"glob\pages\[id].ts:1:10"#);
assert_contains!(output, r#"glob\nested\fizz\bazz.ts:1:10"#);
assert_contains!(output, r#"glob\nested\foo\foo.ts:1:10"#);
assert_contains!(output, r#"glob\data\test1.js:1:10"#);
assert_contains!(output, r#"glob\nested\foo\bazz.ts:1:10"#);
assert_contains!(output, r#"glob\nested\foo\fizz.ts:1:10"#);
assert_contains!(output, r#"glob\nested\fizz\foo.ts:1:10"#);
assert_contains!(output, r#"glob\data\test1.ts:1:10"#);
} else {
assert_contains!(output, "glob/nested/fizz/fizz.ts:1:10");
assert_contains!(output, "glob/pages/[id].ts:1:10");
assert_contains!(output, "glob/nested/fizz/bazz.ts:1:10");
assert_contains!(output, "glob/nested/foo/foo.ts:1:10");
assert_contains!(output, "glob/data/test1.js:1:10");
assert_contains!(output, "glob/nested/foo/bazz.ts:1:10");
assert_contains!(output, "glob/nested/foo/fizz.ts:1:10");
assert_contains!(output, "glob/nested/fizz/foo.ts:1:10");
assert_contains!(output, "glob/data/test1.ts:1:10");
}
assert_contains!(output, "Found 9 problems");
assert_contains!(output, "Checked 9 files");
let cmd_output = context
.new_command()
.args("lint --config deno.glob.json glob/data/test1.?s")
.run();
cmd_output.assert_exit_code(1);
let output = cmd_output.combined_output();
if cfg!(windows) {
assert_contains!(output, r#"glob\data\test1.js:1:10"#);
assert_contains!(output, r#"glob\data\test1.ts:1:10"#);
} else {
assert_contains!(output, "glob/data/test1.js:1:10");
assert_contains!(output, "glob/data/test1.ts:1:10");
}
assert_contains!(output, "Found 2 problems");
assert_contains!(output, "Checked 2 files");
}