Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

test: registry-mock #198

Merged
merged 78 commits into from
Nov 17, 2023
Merged
Show file tree
Hide file tree
Changes from 76 commits
Commits
Show all changes
78 commits
Select commit Hold shift + click to select a range
3d555fe
test: fix snapshot
KSXGitHub Nov 13, 2023
0e8bfe6
test: filter out index files temporarily
KSXGitHub Nov 13, 2023
1166188
chore: install registry-mock
KSXGitHub Nov 14, 2023
d031d26
chore(just): add pnpm to test
KSXGitHub Nov 14, 2023
f670078
feat: create registry-mock crate
KSXGitHub Nov 15, 2023
ad2a666
feat(registry-mock): expose get_or_init instead
KSXGitHub Nov 15, 2023
b1ede19
refactor: local static
KSXGitHub Nov 15, 2023
7582b45
feat(testing-utils): add_mocked_registry
KSXGitHub Nov 15, 2023
893a149
refactor: rename new to init
KSXGitHub Nov 15, 2023
3892ace
fix: enable_all
KSXGitHub Nov 15, 2023
5157827
refactor: use
KSXGitHub Nov 15, 2023
a536f40
feat: add ending /
KSXGitHub Nov 15, 2023
e88806a
fix: must be "localhost"
KSXGitHub Nov 15, 2023
a085cc9
feat(registry-mock): use portpicker
KSXGitHub Nov 15, 2023
8b3e8e9
feat(registry-mock): share a single instance
KSXGitHub Nov 15, 2023
3b2696a
chore(git): merge from main
KSXGitHub Nov 15, 2023
485db26
feat(testing-utils): stop skipping index files
KSXGitHub Nov 15, 2023
433a344
test(cli/install): use registry-mock
KSXGitHub Nov 15, 2023
9315e7f
fix: forgot to save
KSXGitHub Nov 15, 2023
a98efbd
fix: forgot increment
KSXGitHub Nov 16, 2023
e448b74
fix: used to wrong syntax
KSXGitHub Nov 16, 2023
db13b8b
feat(registry-mock): use advisory-lock
KSXGitHub Nov 16, 2023
1839b23
fix: save anchor before early exit
KSXGitHub Nov 16, 2023
2fbe92f
fix: drop before delete
KSXGitHub Nov 16, 2023
4f7bc0f
tmp: stored
KSXGitHub Nov 16, 2023
c2c5629
refactor: remove unused import
KSXGitHub Nov 16, 2023
84febca
fix: truncate the file
KSXGitHub Nov 16, 2023
6245a7a
feat: use try_lock
KSXGitHub Nov 16, 2023
8093ea2
feat(registry-mock): separate lock from anchor
KSXGitHub Nov 16, 2023
a7d1617
refactor: use RAII pattern
KSXGitHub Nov 16, 2023
bfab52b
fix(registry-mock): user_count
KSXGitHub Nov 16, 2023
bdd1ba7
refactor: rename user_count to ref_count
KSXGitHub Nov 16, 2023
8c0ba7b
fix: kill groups
KSXGitHub Nov 16, 2023
5a84abf
fix(registry-mock): ref_count
KSXGitHub Nov 16, 2023
ce54c07
chore(git): revert broken fix
KSXGitHub Nov 16, 2023
8ee89ca
fix(registry-mock): use sysinfo to kill
KSXGitHub Nov 16, 2023
f4067ff
fix(registry-mock): kill algorithm
KSXGitHub Nov 16, 2023
d8f01f2
feat(registry-mock): recurse regardless
KSXGitHub Nov 16, 2023
e93e6e6
feat(registry-mock): use reverse recursion instead
KSXGitHub Nov 16, 2023
7520e24
refactor: reduce complexity
KSXGitHub Nov 16, 2023
c30dec0
refactor: remove unnecessary mod declarations
KSXGitHub Nov 16, 2023
1a73a9a
refactor: marks some struct as must_use
KSXGitHub Nov 16, 2023
b90576c
test(cli/add): use registry-mock
KSXGitHub Nov 16, 2023
e1c3864
test(pnpm-compatibility): use registry-mock
KSXGitHub Nov 16, 2023
f073279
refactor: remove unused items
KSXGitHub Nov 16, 2023
28cf278
docs: correction
KSXGitHub Nov 16, 2023
a1631a7
chore(license): allow MPL-2.0
KSXGitHub Nov 16, 2023
5af04c8
chore(license): allow Unlicense
KSXGitHub Nov 16, 2023
4565f18
fix(registry-mock): failure on few threads
KSXGitHub Nov 16, 2023
5dfcfab
chore: move pnpm install to just
KSXGitHub Nov 16, 2023
5ea61ae
ci: cache pnpm
KSXGitHub Nov 16, 2023
ef78d8c
fix(test): kill leftovers
KSXGitHub Nov 16, 2023
2f6880b
fix(test): allow delete to fail
KSXGitHub Nov 16, 2023
87dd90a
fix(ci): Install just
KSXGitHub Nov 16, 2023
b84e85d
fix(test): don't kill leftovers
KSXGitHub Nov 16, 2023
0e37ffe
refactor: move some types to their own mods
KSXGitHub Nov 17, 2023
4d7f0b9
refactor: move port_to_url
KSXGitHub Nov 17, 2023
9ed6639
refactor: make listen lazy
KSXGitHub Nov 17, 2023
c9b1dc1
refactor: rename `listen` to `url`
KSXGitHub Nov 17, 2023
6e566e6
refactor: use qualified path
KSXGitHub Nov 17, 2023
a5516b9
refactor: store port as u16
KSXGitHub Nov 17, 2023
674025c
feat(registry-mock): PreparedRegistryInfo
KSXGitHub Nov 17, 2023
328b21f
refactor: remove unnecessary async
KSXGitHub Nov 17, 2023
da9f115
refactor: move init code
KSXGitHub Nov 17, 2023
abe00ae
refactor: define lib
KSXGitHub Nov 17, 2023
003ab42
feat(registry-mock): bin
KSXGitHub Nov 17, 2023
24264e2
refactor: call just test
KSXGitHub Nov 17, 2023
0b75c83
ci: prepare a server
KSXGitHub Nov 17, 2023
47eda0c
feat(registry-mock): unique prepared
KSXGitHub Nov 17, 2023
7123367
docs(registry-mock): cli
KSXGitHub Nov 17, 2023
a711637
feat(registry-mock/cli): locations of log files
KSXGitHub Nov 17, 2023
5053445
docs(mocked-registry): important items
KSXGitHub Nov 17, 2023
1641e15
docs(registry-mock): ignore bin
KSXGitHub Nov 17, 2023
5ddedcd
style: taplo fmt
KSXGitHub Nov 17, 2023
d761c18
docs(readme): instruction to run test
KSXGitHub Nov 17, 2023
e19320a
refactor: move registry-mock to tasks
KSXGitHub Nov 17, 2023
45a712b
ci(codecov): fix
KSXGitHub Nov 17, 2023
5add8a1
feat(registry-mock): bump max_retries
KSXGitHub Nov 17, 2023
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
22 changes: 21 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,16 @@ jobs:
run_install: false
standalone: true

- name: Cache pnpm
uses: actions/cache@v3
with:
key: ci-pnpm-${{ matrix.os }}
path: |
${{ env.PNPM_HOME }}/store/v3
${{ env.HOME }}/.local/share/pnpm/store/v3
timeout-minutes: 1
continue-on-error: true

- name: Clippy
run: cargo clippy --locked -- -D warnings

Expand All @@ -52,18 +62,28 @@ jobs:
RUSTDOCFLAGS: '-D warnings'
run: cargo doc

- name: Install just
uses: taiki-e/install-action@just

- name: Install dependencies
run: just install

- name: Install cargo-nextest
uses: taiki-e/install-action@cargo-nextest

- name: Test
shell: bash
run: |
just registry-mock launch

# removing env vars is a temporary workaround for unit tests in pacquet relying on external environment
# this should be removed in the future
unset PNPM_HOME
unset XDG_DATA_HOME

cargo nextest run
just test

just registry-mock end

typos:
name: Spell Check
Expand Down
61 changes: 61 additions & 0 deletions Cargo.lock

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

6 changes: 6 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,11 @@ pacquet-executor = { path = "crates/executor" }
pacquet-diagnostics = { path = "crates/diagnostics" }
pacquet-store-dir = { path = "crates/store-dir" }

# Tasks
pacquet-registry-mock = { path = "tasks/registry-mock" }

# Dependencies
advisory-lock = { version = "0.3.0" }
async-recursion = { version = "1.0.5" }
clap = { version = "4", features = ["derive", "string"] }
command-extra = { version = "1.0.0" }
Expand All @@ -45,6 +49,7 @@ junction = { version = "1.0.0" }
reqwest = { version = "0.11", default-features = false, features = ["json", "native-tls-vendored"] }
node-semver = { version = "2.1.0" }
pipe-trait = { version = "0.4.0" }
portpicker = { version = "0.1.1" }
rayon = { version = "1.8.0" }
serde = { version = "1.0.188", features = ["derive"] }
serde_ini = { version = "0.2.0" }
Expand All @@ -54,6 +59,7 @@ sha2 = { version = "0.10.8" }
split-first-char = { version = "0.0.0" }
ssri = { version = "9.0.0" }
strum = { version = "0.25.0", features = ["derive"] }
sysinfo = { version = "0.29.10" }
tar = { version = "0.4.40" }
text-block-macros = { version = "0.1.1" }
tracing = { version = "0.1.37" }
Expand Down
13 changes: 13 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,19 @@ Experimental package manager for node.js written in rust.
TRACE=pacquet_tarball just cli add fastify
```

## Testing

```sh
# Install necessary dependencies
just install

# Start a mocked registry server (optional)
just registry-mock launch

# Run test
just test
```

## Benchmarking

### Install between multiple revisions
Expand Down
27 changes: 1 addition & 26 deletions crates/cli/tests/_utils.rs
Original file line number Diff line number Diff line change
@@ -1,33 +1,8 @@
use assert_cmd::prelude::*;
use command_extra::CommandExtra;
use pacquet_store_dir::{PackageFileInfo, PackageFilesIndex};
use pacquet_testing_utils::bin::CommandTempCwd;
use pipe_trait::Pipe;
use std::{
collections::BTreeMap,
ffi::OsStr,
fs::File,
path::{Path, PathBuf},
};
use tempfile::TempDir;
use std::{collections::BTreeMap, fs::File, path::Path};
use walkdir::{DirEntry, WalkDir};

pub fn exec_pacquet_in_temp_cwd<Args>(create_npmrc: bool, args: Args) -> (TempDir, PathBuf)
where
Args: IntoIterator,
Args::Item: AsRef<OsStr>,
{
let env = CommandTempCwd::init();
let (command, root, workspace) = if create_npmrc {
let env = env.add_default_npmrc();
(env.pacquet, env.root, env.workspace)
} else {
(env.pacquet, env.root, env.workspace)
};
command.with_args(args).assert().success();
(root, workspace)
}

pub fn index_file_contents(
store_dir: &Path,
) -> BTreeMap<String, BTreeMap<String, PackageFileInfo>> {
Expand Down
111 changes: 76 additions & 35 deletions crates/cli/tests/add.rs
Original file line number Diff line number Diff line change
@@ -1,14 +1,29 @@
pub mod _utils;
pub use _utils::*;

use assert_cmd::prelude::*;
use command_extra::CommandExtra;
use pacquet_package_manifest::{DependencyGroup, PackageManifest};
use pacquet_testing_utils::fs::{get_all_folders, get_filenames_in_folder};
use pacquet_testing_utils::{
bin::{AddMockedRegistry, CommandTempCwd},
fs::{get_all_folders, get_filenames_in_folder},
};
use pretty_assertions::assert_eq;
use std::{env, fs};
use std::{env, ffi::OsStr, fs, path::PathBuf};
use tempfile::TempDir;

fn exec_pacquet_in_temp_cwd<Args>(args: Args) -> (TempDir, PathBuf, AddMockedRegistry)
where
Args: IntoIterator,
Args::Item: AsRef<OsStr>,
{
let CommandTempCwd { pacquet, root, workspace, npmrc_info, .. } =
CommandTempCwd::init().add_mocked_registry();
pacquet.with_args(args).assert().success();
(root, workspace, npmrc_info)
}

#[test]
fn should_install_all_dependencies() {
let (root, workspace) = exec_pacquet_in_temp_cwd(true, ["add", "is-even"]);
let (root, workspace, anchor) =
exec_pacquet_in_temp_cwd(["add", "@pnpm.e2e/hello-world-js-bin-parent"]);

eprintln!("Directory list");
insta::assert_debug_snapshot!(get_all_folders(&workspace));
Expand All @@ -23,25 +38,29 @@ fn should_install_all_dependencies() {
eprintln!("Ensure virtual store dir ({virtual_store_dir:?}) exists");
assert!(virtual_store_dir.exists());

eprintln!("Ensure that is-buffer does not have any dependencies");
let is_buffer_path = virtual_store_dir.join("is-buffer@1.1.6/node_modules");
assert_eq!(get_filenames_in_folder(&is_buffer_path), vec!["is-buffer"]);

eprintln!("Ensure that is-even have correct dependencies");
let is_even_path = virtual_store_dir.join("is-even@1.0.0/node_modules");
assert_eq!(get_filenames_in_folder(&is_even_path), vec!["is-even", "is-odd"]);
eprintln!("Ensure that @pnpm.e2e/hello-world-js-bin has no other dependencies than itself");
let path = virtual_store_dir.join("@pnpm.e2e+hello-world-js-bin@1.0.0/node_modules");
assert_eq!(get_filenames_in_folder(&path), ["@pnpm.e2e"]);
assert_eq!(get_filenames_in_folder(&path.join("@pnpm.e2e")), ["hello-world-js-bin"]);

eprintln!("Ensure that is-number does not have any dependencies");
let is_number_path = virtual_store_dir.join("is-number@3.0.0/node_modules");
assert_eq!(get_filenames_in_folder(&is_number_path), vec!["is-number", "kind-of"]);
eprintln!("Ensure that @pnpm.e2e/hello-world-js-bin-parent has correct dependencies");
let path = virtual_store_dir.join("@pnpm.e2e+hello-world-js-bin-parent@1.0.0/node_modules");
assert_eq!(get_filenames_in_folder(&path), ["@pnpm.e2e"]);
assert_eq!(
get_filenames_in_folder(&path.join("@pnpm.e2e")),
["hello-world-js-bin", "hello-world-js-bin-parent"],
);

drop(root); // cleanup
drop((root, anchor)); // cleanup
}

#[test]
#[cfg(unix)]
pub fn should_symlink_correctly() {
let (root, workspace) = exec_pacquet_in_temp_cwd(true, ["add", "is-odd"]);
use pipe_trait::Pipe;

let (root, workspace, anchor) =
exec_pacquet_in_temp_cwd(["add", "@pnpm.e2e/hello-world-js-bin-parent"]);

eprintln!("Directory list");
insta::assert_debug_snapshot!(get_all_folders(&workspace));
Expand All @@ -58,38 +77,60 @@ pub fn should_symlink_correctly() {

eprintln!("Make sure the symlinks are correct");
assert_eq!(
fs::read_link(virtual_store_dir.join("is-odd@3.0.1/node_modules/is-number")).unwrap(),
fs::canonicalize(virtual_store_dir.join("is-number@6.0.0/node_modules/is-number")).unwrap(),
virtual_store_dir
.join("@pnpm.e2e+hello-world-js-bin-parent@1.0.0")
.join("node_modules")
.join("@pnpm.e2e")
.join("hello-world-js-bin")
.pipe(fs::read_link)
.expect("read link"),
virtual_store_dir
.join("@pnpm.e2e+hello-world-js-bin@1.0.0")
.join("node_modules")
.join("@pnpm.e2e")
.join("hello-world-js-bin")
.pipe(fs::canonicalize)
.expect("canonicalize link target"),
);

drop(root); // cleanup
drop((root, anchor)); // cleanup
}

#[test]
fn should_add_to_package_json() {
let (root, dir) = exec_pacquet_in_temp_cwd(true, ["add", "is-odd"]);
let (root, dir, anchor) = exec_pacquet_in_temp_cwd(["add", "@pnpm.e2e/hello-world-js-bin"]);
let file = PackageManifest::from_path(dir.join("package.json")).unwrap();
eprintln!("Ensure is-odd is added to package.json#dependencies");
assert!(file.dependencies([DependencyGroup::Prod]).any(|(k, _)| k == "is-odd"));
drop(root); // cleanup
eprintln!("Ensure @pnpm.e2e/hello-world-js-bin is added to package.json#dependencies");
assert!(file
.dependencies([DependencyGroup::Prod])
.any(|(k, _)| k == "@pnpm.e2e/hello-world-js-bin"));
drop((root, anchor)); // cleanup
}

#[test]
fn should_add_dev_dependency() {
let (root, dir) = exec_pacquet_in_temp_cwd(true, ["add", "is-odd", "--save-dev"]);
let (root, dir, anchor) =
exec_pacquet_in_temp_cwd(["add", "@pnpm.e2e/hello-world-js-bin", "--save-dev"]);
let file = PackageManifest::from_path(dir.join("package.json")).unwrap();
eprintln!("Ensure is-odd is added to package.json#devDependencies");
assert!(file.dependencies([DependencyGroup::Dev]).any(|(k, _)| k == "is-odd"));
drop(root); // cleanup
eprintln!("Ensure @pnpm.e2e/hello-world-js-bin is added to package.json#devDependencies");
assert!(file
.dependencies([DependencyGroup::Dev])
.any(|(k, _)| k == "@pnpm.e2e/hello-world-js-bin"));
drop((root, anchor)); // cleanup
}

#[test]
fn should_add_peer_dependency() {
let (root, dir) = exec_pacquet_in_temp_cwd(true, ["add", "is-odd", "--save-peer"]);
let (root, dir, anchor) =
exec_pacquet_in_temp_cwd(["add", "@pnpm.e2e/hello-world-js-bin", "--save-peer"]);
let file = PackageManifest::from_path(dir.join("package.json")).unwrap();
eprintln!("Ensure is-odd is added to package.json#devDependencies");
assert!(file.dependencies([DependencyGroup::Dev]).any(|(k, _)| k == "is-odd"));
eprintln!("Ensure is-odd is added to package.json#peerDependencies");
assert!(file.dependencies([DependencyGroup::Peer]).any(|(k, _)| k == "is-odd"));
drop(root); // cleanup
eprintln!("Ensure @pnpm.e2e/hello-world-js-bin is added to package.json#devDependencies");
assert!(file
.dependencies([DependencyGroup::Dev])
.any(|(k, _)| k == "@pnpm.e2e/hello-world-js-bin"));
eprintln!("Ensure @pnpm.e2e/hello-world-js-bin is added to package.json#peerDependencies");
assert!(file
.dependencies([DependencyGroup::Peer])
.any(|(k, _)| k == "@pnpm.e2e/hello-world-js-bin"));
drop((root, anchor)); // cleanup
}
Loading
Loading