deno/tests/integration/pm_tests.rs

154 lines
4.2 KiB
Rust

// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
use deno_core::serde_json::json;
use test_util::assert_contains;
use test_util::env_vars_for_jsr_npm_tests;
use test_util::TestContextBuilder;
#[test]
fn add_basic() {
let starting_deno_json = json!({
"name": "@foo/bar",
"version": "1.0.0",
"exports": "./mod.ts",
});
let context = pm_context_builder().build();
let temp_dir = context.temp_dir().path();
temp_dir.join("deno.json").write_json(&starting_deno_json);
let output = context.new_command().args("add @denotest/add").run();
output.assert_exit_code(0);
let output = output.combined_output();
assert_contains!(output, "Add @denotest/add");
temp_dir.join("deno.json").assert_matches_json(json!({
"name": "@foo/bar",
"version": "1.0.0",
"exports": "./mod.ts",
"imports": {
"@denotest/add": "jsr:@denotest/add@^1.0.0"
}
}));
}
#[test]
fn add_basic_no_deno_json() {
let context = pm_context_builder().build();
let temp_dir = context.temp_dir().path();
let output = context.new_command().args("add @denotest/add").run();
output.assert_exit_code(0);
let output = output.combined_output();
assert_contains!(output, "Add @denotest/add");
// Don't use `assert_matches_json` to ensure the file is properly formatted.
let expected = r#"{
"imports": {
"@denotest/add": "jsr:@denotest/add@^1.0.0"
}
}
"#;
temp_dir.join("deno.json").assert_matches_text(expected);
}
#[test]
fn add_basic_with_empty_deno_json() {
let context = pm_context_builder().build();
let temp_dir = context.temp_dir();
temp_dir.write("deno.json", "");
let output = context.new_command().args("add @denotest/add").run();
output.assert_exit_code(0);
let output = output.combined_output();
assert_contains!(output, "Add @denotest/add");
temp_dir
.path()
.join("deno.json")
.assert_matches_json(json!({
"imports": {
"@denotest/add": "jsr:@denotest/add@^1.0.0"
}
}));
}
#[test]
fn add_version_contraint() {
let context = pm_context_builder().build();
let temp_dir = context.temp_dir().path();
let output = context.new_command().args("add @denotest/add@1").run();
output.assert_exit_code(0);
let output = output.combined_output();
assert_contains!(output, "Add @denotest/add");
temp_dir.join("deno.json").assert_matches_json(json!({
"imports": {
"@denotest/add": "jsr:@denotest/add@^1.0.0"
}
}));
}
#[test]
fn add_tilde() {
let context = pm_context_builder().build();
let temp_dir = context.temp_dir().path();
let output = context.new_command().args("add @denotest/add@~1").run();
output.assert_exit_code(0);
let output = output.combined_output();
assert_contains!(output, "Add @denotest/add");
temp_dir.join("deno.json").assert_matches_json(json!({
"imports": {
"@denotest/add": "jsr:@denotest/add@~1.0.0"
}
}));
}
#[test]
fn add_multiple() {
let starting_deno_json = json!({
"name": "@foo/bar",
"version": "1.0.0",
"exports": "./mod.ts",
});
let context = pm_context_builder().build();
let temp_dir = context.temp_dir().path();
temp_dir.join("deno.json").write_json(&starting_deno_json);
let output = context
.new_command()
.args("add @denotest/add @denotest/subset-type-graph")
.run();
output.assert_exit_code(0);
let output = output.combined_output();
assert_contains!(output, "Add @denotest/add");
temp_dir.join("deno.json").assert_matches_json(json!({
"name": "@foo/bar",
"version": "1.0.0",
"exports": "./mod.ts",
"imports": {
"@denotest/add": "jsr:@denotest/add@^1.0.0",
"@denotest/subset-type-graph": "jsr:@denotest/subset-type-graph@^0.1.0"
}
}));
}
#[test]
fn add_npm() {
let context = pm_context_builder().build();
let temp_dir = context.temp_dir().path();
let output = context.new_command().args("add npm:chalk@4.1").run();
output.assert_exit_code(0);
let output = output.combined_output();
assert_contains!(output, "Add chalk");
temp_dir.join("deno.json").assert_matches_json(json!({
"imports": {
"chalk": "npm:chalk@^4.1.2"
}
}));
}
fn pm_context_builder() -> TestContextBuilder {
TestContextBuilder::new()
.use_http_server()
.envs(env_vars_for_jsr_npm_tests())
.use_temp_cwd()
}