@verdaccio/e2e-cli 3.0.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/e2e-cli.js +6 -26
- package/build/adapters/adapter.d.ts +1 -0
- package/build/adapters/bun.d.ts +2 -0
- package/build/adapters/deno.d.ts +2 -0
- package/build/adapters/index.d.ts +5 -0
- package/build/adapters/npm.d.ts +2 -0
- package/build/adapters/pnpm.d.ts +2 -0
- package/build/adapters/yarn-modern.d.ts +2 -0
- package/build/cjs/_virtual/_rolldown/runtime.cjs +23 -0
- package/build/cjs/adapters/bun.cjs +64 -0
- package/build/cjs/adapters/bun.cjs.map +1 -0
- package/build/cjs/adapters/deno.cjs +61 -0
- package/build/cjs/adapters/deno.cjs.map +1 -0
- package/build/cjs/adapters/index.cjs +10 -0
- package/build/cjs/adapters/npm.cjs +85 -0
- package/build/cjs/adapters/npm.cjs.map +1 -0
- package/build/cjs/adapters/pnpm.cjs +114 -0
- package/build/cjs/adapters/pnpm.cjs.map +1 -0
- package/build/cjs/adapters/yarn-modern.cjs +207 -0
- package/build/cjs/adapters/yarn-modern.cjs.map +1 -0
- package/build/cjs/index.cjs +186 -11
- package/build/cjs/index.cjs.map +1 -0
- package/build/cjs/reporter.cjs +113 -0
- package/build/cjs/reporter.cjs.map +1 -0
- package/build/cjs/runner.cjs +141 -0
- package/build/cjs/runner.cjs.map +1 -0
- package/build/cjs/scenarios/index.cjs +25 -0
- package/build/cjs/scenarios/index.cjs.map +1 -0
- package/build/cjs/scenarios/install-multiple-deps.cjs +119 -0
- package/build/cjs/scenarios/install-multiple-deps.cjs.map +1 -0
- package/build/cjs/scenarios/metadata.cjs +121 -0
- package/build/cjs/scenarios/metadata.cjs.map +1 -0
- package/build/cjs/scenarios/minimum-release-age.cjs +111 -0
- package/build/cjs/scenarios/minimum-release-age.cjs.map +1 -0
- package/build/cjs/scenarios/search.cjs +200 -0
- package/build/cjs/scenarios/search.cjs.map +1 -0
- package/build/cjs/scenarios/tarballs.cjs +170 -0
- package/build/cjs/scenarios/tarballs.cjs.map +1 -0
- package/build/cjs/scenarios/uplink-failure.cjs +141 -0
- package/build/cjs/scenarios/uplink-failure.cjs.map +1 -0
- package/build/cjs/tests/audit.cjs +60 -0
- package/build/cjs/tests/audit.cjs.map +1 -0
- package/build/cjs/tests/ci.cjs +83 -0
- package/build/cjs/tests/ci.cjs.map +1 -0
- package/build/cjs/tests/deprecate.cjs +108 -0
- package/build/cjs/tests/deprecate.cjs.map +1 -0
- package/build/cjs/tests/dist-tags.cjs +43 -0
- package/build/cjs/tests/dist-tags.cjs.map +1 -0
- package/build/cjs/tests/index.cjs +49 -0
- package/build/cjs/tests/index.cjs.map +1 -0
- package/build/cjs/tests/info.cjs +31 -0
- package/build/cjs/tests/info.cjs.map +1 -0
- package/build/cjs/tests/install.cjs +30 -0
- package/build/cjs/tests/install.cjs.map +1 -0
- package/build/cjs/tests/login.cjs +126 -0
- package/build/cjs/tests/login.cjs.map +1 -0
- package/build/cjs/tests/ping.cjs +26 -0
- package/build/cjs/tests/ping.cjs.map +1 -0
- package/build/cjs/tests/publish.cjs +36 -0
- package/build/cjs/tests/publish.cjs.map +1 -0
- package/build/cjs/tests/search.cjs +23 -0
- package/build/cjs/tests/search.cjs.map +1 -0
- package/build/cjs/tests/unpublish.cjs +40 -0
- package/build/cjs/tests/unpublish.cjs.map +1 -0
- package/build/cjs/utils/e2e-config.cjs +59 -0
- package/build/cjs/utils/e2e-config.cjs.map +1 -0
- package/build/cjs/utils/http-client.cjs +111 -0
- package/build/cjs/utils/http-client.cjs.map +1 -0
- package/build/cjs/utils/info.cjs +25 -0
- package/build/cjs/utils/info.cjs.map +1 -0
- package/build/cjs/utils/mock-uplink.cjs +196 -0
- package/build/cjs/utils/mock-uplink.cjs.map +1 -0
- package/build/cjs/utils/pending-checks.cjs +21 -0
- package/build/cjs/utils/pending-checks.cjs.map +1 -0
- package/build/cjs/utils/process.cjs +96 -0
- package/build/cjs/utils/process.cjs.map +1 -0
- package/build/cjs/utils/project.cjs +55 -0
- package/build/cjs/utils/project.cjs.map +1 -0
- package/build/cjs/utils/publish.cjs +117 -0
- package/build/cjs/utils/publish.cjs.map +1 -0
- package/build/cjs/utils/registry-client.cjs +56 -0
- package/build/cjs/utils/registry-client.cjs.map +1 -0
- package/build/esm/adapters/bun.js +62 -0
- package/build/esm/adapters/bun.js.map +1 -0
- package/build/esm/adapters/deno.js +59 -0
- package/build/esm/adapters/deno.js.map +1 -0
- package/build/esm/adapters/index.js +6 -0
- package/build/esm/adapters/npm.js +83 -0
- package/build/esm/adapters/npm.js.map +1 -0
- package/build/esm/adapters/pnpm.js +112 -0
- package/build/esm/adapters/pnpm.js.map +1 -0
- package/build/esm/adapters/yarn-modern.js +204 -0
- package/build/esm/adapters/yarn-modern.js.map +1 -0
- package/build/esm/index.js +174 -10
- package/build/esm/index.js.map +1 -0
- package/build/esm/reporter.js +108 -0
- package/build/esm/reporter.js.map +1 -0
- package/build/esm/runner.js +138 -0
- package/build/esm/runner.js.map +1 -0
- package/build/esm/scenarios/index.js +19 -0
- package/build/esm/scenarios/index.js.map +1 -0
- package/build/esm/scenarios/install-multiple-deps.js +117 -0
- package/build/esm/scenarios/install-multiple-deps.js.map +1 -0
- package/build/esm/scenarios/metadata.js +119 -0
- package/build/esm/scenarios/metadata.js.map +1 -0
- package/build/esm/scenarios/minimum-release-age.js +108 -0
- package/build/esm/scenarios/minimum-release-age.js.map +1 -0
- package/build/esm/scenarios/search.js +198 -0
- package/build/esm/scenarios/search.js.map +1 -0
- package/build/esm/scenarios/tarballs.js +168 -0
- package/build/esm/scenarios/tarballs.js.map +1 -0
- package/build/esm/scenarios/uplink-failure.js +139 -0
- package/build/esm/scenarios/uplink-failure.js.map +1 -0
- package/build/esm/tests/audit.js +57 -0
- package/build/esm/tests/audit.js.map +1 -0
- package/build/esm/tests/ci.js +80 -0
- package/build/esm/tests/ci.js.map +1 -0
- package/build/esm/tests/deprecate.js +105 -0
- package/build/esm/tests/deprecate.js.map +1 -0
- package/build/esm/tests/dist-tags.js +41 -0
- package/build/esm/tests/dist-tags.js.map +1 -0
- package/build/esm/tests/index.js +37 -0
- package/build/esm/tests/index.js.map +1 -0
- package/build/esm/tests/info.js +29 -0
- package/build/esm/tests/info.js.map +1 -0
- package/build/esm/tests/install.js +28 -0
- package/build/esm/tests/install.js.map +1 -0
- package/build/esm/tests/login.js +122 -0
- package/build/esm/tests/login.js.map +1 -0
- package/build/esm/tests/ping.js +24 -0
- package/build/esm/tests/ping.js.map +1 -0
- package/build/esm/tests/publish.js +34 -0
- package/build/esm/tests/publish.js.map +1 -0
- package/build/esm/tests/search.js +21 -0
- package/build/esm/tests/search.js.map +1 -0
- package/build/esm/tests/unpublish.js +38 -0
- package/build/esm/tests/unpublish.js.map +1 -0
- package/build/esm/utils/e2e-config.js +58 -0
- package/build/esm/utils/e2e-config.js.map +1 -0
- package/build/esm/utils/http-client.js +105 -0
- package/build/esm/utils/http-client.js.map +1 -0
- package/build/esm/utils/info.js +24 -0
- package/build/esm/utils/info.js.map +1 -0
- package/build/esm/utils/mock-uplink.js +194 -0
- package/build/esm/utils/mock-uplink.js.map +1 -0
- package/build/esm/utils/pending-checks.js +21 -0
- package/build/esm/utils/pending-checks.js.map +1 -0
- package/build/esm/utils/process.js +92 -0
- package/build/esm/utils/process.js.map +1 -0
- package/build/esm/utils/project.js +50 -0
- package/build/esm/utils/project.js.map +1 -0
- package/build/esm/utils/publish.js +113 -0
- package/build/esm/utils/publish.js.map +1 -0
- package/build/esm/utils/registry-client.js +53 -0
- package/build/esm/utils/registry-client.js.map +1 -0
- package/build/index.d.ts +6 -15
- package/build/reporter.d.ts +7 -0
- package/build/runner.d.ts +13 -0
- package/build/scenarios/index.d.ts +9 -0
- package/build/scenarios/install-multiple-deps.d.ts +2 -0
- package/build/scenarios/metadata.d.ts +2 -0
- package/build/scenarios/minimum-release-age.d.ts +11 -0
- package/build/scenarios/search.d.ts +2 -0
- package/build/scenarios/tarballs.d.ts +2 -0
- package/build/scenarios/uplink-failure.d.ts +2 -0
- package/build/tests/audit.d.ts +2 -0
- package/build/tests/ci.d.ts +2 -0
- package/build/tests/deprecate.d.ts +2 -0
- package/build/tests/dist-tags.d.ts +2 -0
- package/build/tests/index.d.ts +15 -0
- package/build/tests/info.d.ts +2 -0
- package/build/tests/install.d.ts +2 -0
- package/build/tests/login.d.ts +2 -0
- package/build/tests/ping.d.ts +2 -0
- package/build/tests/publish.d.ts +2 -0
- package/build/tests/search.d.ts +2 -0
- package/build/tests/unpublish.d.ts +2 -0
- package/build/types.d.ts +91 -0
- package/build/utils/e2e-config.d.ts +21 -0
- package/build/utils/http-client.d.ts +49 -0
- package/build/utils/index.d.ts +4 -0
- package/build/utils/info.d.ts +14 -0
- package/build/utils/mock-uplink.d.ts +47 -0
- package/build/utils/pending-checks.d.ts +12 -0
- package/build/utils/process.d.ts +11 -0
- package/build/utils/project.d.ts +6 -0
- package/build/utils/publish.d.ts +17 -0
- package/build/utils/registry-client.d.ts +15 -0
- package/package.json +16 -14
- package/Cargo.lock +0 -1591
- package/Cargo.toml +0 -19
- package/build/bin/verdaccio-e2e +0 -0
- package/scripts/build-js-package.mjs +0 -25
- package/src/e2e_tests/audit.rs +0 -51
- package/src/e2e_tests/ci.rs +0 -32
- package/src/e2e_tests/deprecate.rs +0 -64
- package/src/e2e_tests/dist_tags.rs +0 -56
- package/src/e2e_tests/info.rs +0 -43
- package/src/e2e_tests/install.rs +0 -27
- package/src/e2e_tests/login.rs +0 -64
- package/src/e2e_tests/mod.rs +0 -104
- package/src/e2e_tests/ping.rs +0 -33
- package/src/e2e_tests/publish.rs +0 -68
- package/src/e2e_tests/search.rs +0 -14
- package/src/e2e_tests/unpublish.rs +0 -37
- package/src/main.rs +0 -1411
- package/src/scenarios/install_multiple_deps.rs +0 -99
- package/src/scenarios/minimum_release_age.rs +0 -45
- package/src/scenarios/mod.rs +0 -11
package/Cargo.toml
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
[package]
|
|
2
|
-
name = "verdaccio-e2e-cli"
|
|
3
|
-
version = "2.10.2"
|
|
4
|
-
edition = "2021"
|
|
5
|
-
license = "MIT"
|
|
6
|
-
|
|
7
|
-
[[bin]]
|
|
8
|
-
name = "verdaccio-e2e"
|
|
9
|
-
path = "src/main.rs"
|
|
10
|
-
|
|
11
|
-
[dependencies]
|
|
12
|
-
anyhow = "1.0.100"
|
|
13
|
-
clap = { version = "4.5.53", features = ["derive"] }
|
|
14
|
-
reqwest = { version = "0.12.26", features = ["blocking", "json"] }
|
|
15
|
-
serde = { version = "1.0.228", features = ["derive"] }
|
|
16
|
-
serde_json = "1.0.147"
|
|
17
|
-
serde_yaml = "0.9.34"
|
|
18
|
-
tempfile = "3.23.0"
|
|
19
|
-
url = "2.5.8"
|
package/build/bin/verdaccio-e2e
DELETED
|
Binary file
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { chmodSync, copyFileSync, mkdirSync, rmSync, writeFileSync } from 'node:fs';
|
|
2
|
-
import { dirname, resolve } from 'node:path';
|
|
3
|
-
import { fileURLToPath } from 'node:url';
|
|
4
|
-
|
|
5
|
-
const root = resolve(dirname(fileURLToPath(import.meta.url)), '..');
|
|
6
|
-
const binaryName = process.platform === 'win32' ? 'verdaccio-e2e.exe' : 'verdaccio-e2e';
|
|
7
|
-
const binarySource = resolve(root, 'target', 'release', binaryName);
|
|
8
|
-
const binaryDest = resolve(root, 'build', 'bin', binaryName);
|
|
9
|
-
|
|
10
|
-
rmSync(resolve(root, 'build'), { recursive: true, force: true });
|
|
11
|
-
mkdirSync(dirname(binaryDest), { recursive: true });
|
|
12
|
-
copyFileSync(binarySource, binaryDest);
|
|
13
|
-
if (process.platform !== 'win32') {
|
|
14
|
-
chmodSync(binaryDest, 0o755);
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
const esm = `export const allTests = [];\nexport const allScenarios = [];\nexport function runAll() { throw new Error('@verdaccio/e2e-cli programmatic API is no longer available in the Rust build. Use the verdaccio-e2e binary.'); }\nexport function runSuite() { throw new Error('@verdaccio/e2e-cli programmatic API is no longer available in the Rust build. Use the verdaccio-e2e binary.'); }\nexport function createNpmAdapter() { throw new Error('@verdaccio/e2e-cli adapters are implemented in Rust. Use the verdaccio-e2e binary.'); }\nexport const createPnpmAdapter = createNpmAdapter;\nexport const createYarnClassicAdapter = createNpmAdapter;\nexport const createYarnModernAdapter = createNpmAdapter;\nexport const createBunAdapter = createNpmAdapter;\nexport const createDenoAdapter = createNpmAdapter;\n`;
|
|
18
|
-
const cjs = `function unavailable() { throw new Error('@verdaccio/e2e-cli programmatic API is no longer available in the Rust build. Use the verdaccio-e2e binary.'); }\nexports.allTests = [];\nexports.allScenarios = [];\nexports.runAll = unavailable;\nexports.runSuite = unavailable;\nexports.createNpmAdapter = unavailable;\nexports.createPnpmAdapter = unavailable;\nexports.createYarnClassicAdapter = unavailable;\nexports.createYarnModernAdapter = unavailable;\nexports.createBunAdapter = unavailable;\nexports.createDenoAdapter = unavailable;\n`;
|
|
19
|
-
const dts = `export type ExecOutput = { stdout: string; stderr: string };\nexport type PackageManagerAdapter = unknown;\nexport type TestDefinition = unknown;\nexport type TestContext = unknown;\nexport type CliOptions = unknown;\nexport const allTests: TestDefinition[];\nexport const allScenarios: TestDefinition[];\nexport function runAll(...args: unknown[]): never;\nexport function runSuite(...args: unknown[]): never;\nexport function createNpmAdapter(...args: unknown[]): never;\nexport function createPnpmAdapter(...args: unknown[]): never;\nexport function createYarnClassicAdapter(...args: unknown[]): never;\nexport function createYarnModernAdapter(...args: unknown[]): never;\nexport function createBunAdapter(...args: unknown[]): never;\nexport function createDenoAdapter(...args: unknown[]): never;\n`;
|
|
20
|
-
|
|
21
|
-
mkdirSync(resolve(root, 'build', 'esm'), { recursive: true });
|
|
22
|
-
mkdirSync(resolve(root, 'build', 'cjs'), { recursive: true });
|
|
23
|
-
writeFileSync(resolve(root, 'build', 'esm', 'index.js'), esm);
|
|
24
|
-
writeFileSync(resolve(root, 'build', 'cjs', 'index.cjs'), cjs);
|
|
25
|
-
writeFileSync(resolve(root, 'build', 'index.d.ts'), dts);
|
package/src/e2e_tests/audit.rs
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
use super::prelude::*;
|
|
2
|
-
|
|
3
|
-
pub(crate) fn test_audit(ctx: &mut TestContext<'_>) -> Result<()> {
|
|
4
|
-
if !matches!(ctx.adapter.kind, AdapterType::Npm | AdapterType::Bun) {
|
|
5
|
-
return Ok(());
|
|
6
|
-
}
|
|
7
|
-
for pkg_name in [
|
|
8
|
-
format!("verdaccio-audit-{}", ctx.run_id),
|
|
9
|
-
format!("@verdaccio/audit-{}", ctx.run_id),
|
|
10
|
-
] {
|
|
11
|
-
let mut deps = BTreeMap::new();
|
|
12
|
-
deps.insert("jquery".into(), "3.6.1".into());
|
|
13
|
-
let temp = prepare_project(ctx, &pkg_name, "1.0.0", deps, BTreeMap::new())?;
|
|
14
|
-
let mut install = vec!["install".into()];
|
|
15
|
-
install.extend(registry_arg(&ctx.adapter, &ctx.registry_url));
|
|
16
|
-
exec_adapter(ctx, Some(&temp), install)?;
|
|
17
|
-
let probe = Client::new()
|
|
18
|
-
.post(format!(
|
|
19
|
-
"{}/-/npm/v1/security/audits/quick",
|
|
20
|
-
ctx.registry_url
|
|
21
|
-
))
|
|
22
|
-
.header("Content-Type", "application/json")
|
|
23
|
-
.body("{}")
|
|
24
|
-
.send();
|
|
25
|
-
match probe {
|
|
26
|
-
Ok(resp) if resp.status().as_u16() == 404 => return Ok(()),
|
|
27
|
-
Err(_) => return Ok(()),
|
|
28
|
-
_ => {}
|
|
29
|
-
}
|
|
30
|
-
let mut args = vec!["audit".into(), "--json".into()];
|
|
31
|
-
args.extend(registry_arg(&ctx.adapter, &ctx.registry_url));
|
|
32
|
-
let resp = exec_adapter(ctx, Some(&temp), args)?;
|
|
33
|
-
if ctx.adapter.kind == AdapterType::Bun {
|
|
34
|
-
assert_true(
|
|
35
|
-
!resp.stdout.is_empty() || !resp.stderr.is_empty(),
|
|
36
|
-
"Expected audit output",
|
|
37
|
-
)?;
|
|
38
|
-
} else {
|
|
39
|
-
let parsed: Value = serde_json::from_str(&resp.stdout)?;
|
|
40
|
-
assert_true(
|
|
41
|
-
parsed.get("auditReportVersion").is_some(),
|
|
42
|
-
"Expected auditReportVersion",
|
|
43
|
-
)?;
|
|
44
|
-
assert_true(
|
|
45
|
-
parsed.get("vulnerabilities").is_some(),
|
|
46
|
-
"Expected vulnerabilities",
|
|
47
|
-
)?;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
Ok(())
|
|
51
|
-
}
|
package/src/e2e_tests/ci.rs
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
use super::prelude::*;
|
|
2
|
-
|
|
3
|
-
pub(crate) fn test_ci(ctx: &mut TestContext<'_>) -> Result<()> {
|
|
4
|
-
if ctx.adapter.kind == AdapterType::Deno {
|
|
5
|
-
return Ok(());
|
|
6
|
-
}
|
|
7
|
-
let mut deps = BTreeMap::new();
|
|
8
|
-
deps.insert("is-odd".into(), "1.0.0".into());
|
|
9
|
-
let temp = prepare_project(
|
|
10
|
-
ctx,
|
|
11
|
-
&format!("ci-test-{}", ctx.run_id),
|
|
12
|
-
"1.0.0",
|
|
13
|
-
deps,
|
|
14
|
-
BTreeMap::new(),
|
|
15
|
-
)?;
|
|
16
|
-
let mut install = vec!["install".into()];
|
|
17
|
-
install.extend(registry_arg(&ctx.adapter, &ctx.registry_url));
|
|
18
|
-
exec_adapter(ctx, Some(&temp), install)?;
|
|
19
|
-
let _ = fs::remove_dir_all(temp.join("node_modules"));
|
|
20
|
-
let _ = fs::remove_dir_all(temp.join(".pnpm-store"));
|
|
21
|
-
let mut args = match ctx.adapter.kind {
|
|
22
|
-
AdapterType::Npm => vec!["ci".into()],
|
|
23
|
-
AdapterType::Pnpm | AdapterType::YarnClassic | AdapterType::Bun => {
|
|
24
|
-
vec!["install".into(), "--frozen-lockfile".into()]
|
|
25
|
-
}
|
|
26
|
-
AdapterType::YarnModern => vec!["install".into(), "--immutable".into()],
|
|
27
|
-
AdapterType::Deno => vec!["ci".into()],
|
|
28
|
-
};
|
|
29
|
-
args.extend(registry_arg(&ctx.adapter, &ctx.registry_url));
|
|
30
|
-
exec_adapter(ctx, Some(&temp), args)?;
|
|
31
|
-
Ok(())
|
|
32
|
-
}
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
use super::prelude::*;
|
|
2
|
-
|
|
3
|
-
pub(crate) fn test_deprecate(ctx: &mut TestContext<'_>) -> Result<()> {
|
|
4
|
-
sub_test(ctx, "deprecate single version", |ctx| {
|
|
5
|
-
let pkg = format!("@verdaccio/dep1-{}", ctx.run_id);
|
|
6
|
-
let temp = prepare_deprecate_project(ctx, &pkg, "1.0.0")?;
|
|
7
|
-
publish_pkg(ctx, &temp)?;
|
|
8
|
-
deprecate_pkg(ctx, &temp, &format!("{pkg}@1.0.0"), "some message")?;
|
|
9
|
-
let info = info_pkg(ctx, &temp, &pkg)?;
|
|
10
|
-
assert_eq_json(info.get("name"), pkg.as_str(), "Package name mismatch")?;
|
|
11
|
-
assert_eq_json(
|
|
12
|
-
info.get("deprecated"),
|
|
13
|
-
"some message",
|
|
14
|
-
"Package should be deprecated",
|
|
15
|
-
)?;
|
|
16
|
-
Ok(())
|
|
17
|
-
})?;
|
|
18
|
-
sub_test(ctx, "un-deprecate", |ctx| {
|
|
19
|
-
let pkg = format!("@verdaccio/dep2-{}", ctx.run_id);
|
|
20
|
-
let temp = prepare_deprecate_project(ctx, &pkg, "1.0.0")?;
|
|
21
|
-
publish_pkg(ctx, &temp)?;
|
|
22
|
-
deprecate_pkg(ctx, &temp, &format!("{pkg}@1.0.0"), "some message")?;
|
|
23
|
-
let info = info_pkg(ctx, &temp, &pkg)?;
|
|
24
|
-
assert_eq_json(
|
|
25
|
-
info.get("deprecated"),
|
|
26
|
-
"some message",
|
|
27
|
-
"Package should be deprecated",
|
|
28
|
-
)?;
|
|
29
|
-
deprecate_pkg(ctx, &temp, &format!("{pkg}@1.0.0"), "")?;
|
|
30
|
-
let info = info_pkg(ctx, &temp, &pkg)?;
|
|
31
|
-
assert_true(
|
|
32
|
-
info.get("deprecated").is_none(),
|
|
33
|
-
"Package should be un-deprecated",
|
|
34
|
-
)?;
|
|
35
|
-
Ok(())
|
|
36
|
-
})?;
|
|
37
|
-
sub_test(ctx, "deprecate multiple versions", |ctx| {
|
|
38
|
-
let pkg = format!("@verdaccio/dep3-{}", ctx.run_id);
|
|
39
|
-
let temp = prepare_deprecate_project(ctx, &pkg, "1.0.0")?;
|
|
40
|
-
publish_pkg(ctx, &temp)?;
|
|
41
|
-
for _ in 0..3 {
|
|
42
|
-
bump_version(ctx, &temp, "minor")?;
|
|
43
|
-
publish_pkg(ctx, &temp)?;
|
|
44
|
-
}
|
|
45
|
-
deprecate_pkg(ctx, &temp, &pkg, "some message")?;
|
|
46
|
-
for version in ["1.0.0", "1.1.0", "1.2.0", "1.3.0"] {
|
|
47
|
-
let info = info_pkg(ctx, &temp, &format!("{pkg}@{version}"))?;
|
|
48
|
-
assert_eq_json(
|
|
49
|
-
info.get("deprecated"),
|
|
50
|
-
"some message",
|
|
51
|
-
"Version should be deprecated",
|
|
52
|
-
)?;
|
|
53
|
-
}
|
|
54
|
-
bump_version(ctx, &temp, "minor")?;
|
|
55
|
-
publish_pkg(ctx, &temp)?;
|
|
56
|
-
let info = info_pkg(ctx, &temp, &format!("{pkg}@1.4.0"))?;
|
|
57
|
-
assert_true(
|
|
58
|
-
info.get("deprecated").is_none(),
|
|
59
|
-
"New version should not be deprecated",
|
|
60
|
-
)?;
|
|
61
|
-
Ok(())
|
|
62
|
-
})?;
|
|
63
|
-
Ok(())
|
|
64
|
-
}
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
use super::prelude::*;
|
|
2
|
-
|
|
3
|
-
pub(crate) fn test_dist_tags(ctx: &mut TestContext<'_>) -> Result<()> {
|
|
4
|
-
let pkg1 = format!("@foo/dt1-{}", ctx.run_id);
|
|
5
|
-
let tf1 = prepare_project(ctx, &pkg1, "1.0.0", BTreeMap::new(), BTreeMap::new())?;
|
|
6
|
-
publish_pkg(ctx, &tf1)?;
|
|
7
|
-
bump_version(ctx, &tf1, "minor")?;
|
|
8
|
-
publish_pkg_extra(ctx, &tf1, vec!["--tag".into(), "beta".into()])?;
|
|
9
|
-
let mut args = vec!["dist-tag".into(), "ls".into(), "--json".into()];
|
|
10
|
-
args.extend(registry_arg(&ctx.adapter, &ctx.registry_url));
|
|
11
|
-
let resp = exec_adapter(ctx, Some(&tf1), args)?;
|
|
12
|
-
assert_eq_str(
|
|
13
|
-
&normalize_dist_tag_list(&resp.stdout),
|
|
14
|
-
"beta: 1.1.0\nlatest: 1.0.0",
|
|
15
|
-
)?;
|
|
16
|
-
|
|
17
|
-
let pkg2 = format!("@verdaccio/dt2-{}", ctx.run_id);
|
|
18
|
-
let tf2 = prepare_project(ctx, &pkg2, "1.0.0", BTreeMap::new(), BTreeMap::new())?;
|
|
19
|
-
publish_pkg(ctx, &tf2)?;
|
|
20
|
-
bump_version(ctx, &tf2, "minor")?;
|
|
21
|
-
publish_pkg_extra(ctx, &tf2, vec!["--tag".into(), "beta".into()])?;
|
|
22
|
-
let mut args = vec![
|
|
23
|
-
"dist-tag".into(),
|
|
24
|
-
"rm".into(),
|
|
25
|
-
format!("{pkg2}@1.1.0"),
|
|
26
|
-
"beta".into(),
|
|
27
|
-
];
|
|
28
|
-
args.extend(registry_arg(&ctx.adapter, &ctx.registry_url));
|
|
29
|
-
let resp = exec_adapter(ctx, Some(&tf2), args)?;
|
|
30
|
-
assert_eq_str(resp.stdout.trim(), &format!("-beta: {pkg2}@1.1.0"))?;
|
|
31
|
-
|
|
32
|
-
let pkg3 = format!("@verdaccio/dt3-{}", ctx.run_id);
|
|
33
|
-
let tf3 = prepare_project(ctx, &pkg3, "1.0.0", BTreeMap::new(), BTreeMap::new())?;
|
|
34
|
-
publish_pkg(ctx, &tf3)?;
|
|
35
|
-
bump_version(ctx, &tf3, "minor")?;
|
|
36
|
-
publish_pkg(ctx, &tf3)?;
|
|
37
|
-
let mut args = vec![
|
|
38
|
-
"dist-tag".into(),
|
|
39
|
-
"add".into(),
|
|
40
|
-
format!("{pkg3}@1.1.0"),
|
|
41
|
-
"alfa".into(),
|
|
42
|
-
];
|
|
43
|
-
args.extend(registry_arg(&ctx.adapter, &ctx.registry_url));
|
|
44
|
-
let resp = exec_adapter(ctx, Some(&tf3), args)?;
|
|
45
|
-
assert_eq_str(resp.stdout.trim(), &format!("+alfa: {pkg3}@1.1.0"))?;
|
|
46
|
-
Ok(())
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
fn normalize_dist_tag_list(output: &str) -> String {
|
|
50
|
-
output
|
|
51
|
-
.lines()
|
|
52
|
-
.map(str::trim)
|
|
53
|
-
.filter(|line| !line.is_empty())
|
|
54
|
-
.collect::<Vec<_>>()
|
|
55
|
-
.join("\n")
|
|
56
|
-
}
|
package/src/e2e_tests/info.rs
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
use super::prelude::*;
|
|
2
|
-
|
|
3
|
-
pub(crate) fn test_info(ctx: &mut TestContext<'_>) -> Result<()> {
|
|
4
|
-
let dir = create_temp_dir(ctx.state, "info-test")?
|
|
5
|
-
.path()
|
|
6
|
-
.to_path_buf();
|
|
7
|
-
fs::write(
|
|
8
|
-
dir.join("package.json"),
|
|
9
|
-
r#"{"name":"info-test","version":"1.0.0"}"#,
|
|
10
|
-
)?;
|
|
11
|
-
let mut args = vec!["info".into(), "verdaccio".into(), "--json".into()];
|
|
12
|
-
args.extend(registry_arg(&ctx.adapter, &ctx.registry_url));
|
|
13
|
-
let resp = exec_adapter(ctx, Some(&dir), args)?;
|
|
14
|
-
match ctx.adapter.kind {
|
|
15
|
-
AdapterType::YarnClassic => {
|
|
16
|
-
let found = resp.stdout.lines().any(|line| {
|
|
17
|
-
serde_json::from_str::<Value>(line)
|
|
18
|
-
.ok()
|
|
19
|
-
.and_then(|v| v.get("type").cloned())
|
|
20
|
-
.and_then(|v| v.as_str().map(|s| s == "inspect"))
|
|
21
|
-
.unwrap_or(false)
|
|
22
|
-
});
|
|
23
|
-
assert_true(
|
|
24
|
-
found,
|
|
25
|
-
"Expected yarn info NDJSON to contain an inspect entry",
|
|
26
|
-
)?;
|
|
27
|
-
}
|
|
28
|
-
AdapterType::Deno => assert_contains(&(resp.stdout + &resp.stderr), "verdaccio")?,
|
|
29
|
-
_ => {
|
|
30
|
-
let parsed = parse_info_json(&resp.stdout)?;
|
|
31
|
-
assert_eq_json(
|
|
32
|
-
parsed.get("name"),
|
|
33
|
-
"verdaccio",
|
|
34
|
-
"Expected package name verdaccio",
|
|
35
|
-
)?;
|
|
36
|
-
assert_true(
|
|
37
|
-
parsed.get("dependencies").is_some(),
|
|
38
|
-
"Expected dependencies to be defined",
|
|
39
|
-
)?;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
Ok(())
|
|
43
|
-
}
|
package/src/e2e_tests/install.rs
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
use super::prelude::*;
|
|
2
|
-
|
|
3
|
-
pub(crate) fn test_install(ctx: &mut TestContext<'_>) -> Result<()> {
|
|
4
|
-
let mut deps = BTreeMap::new();
|
|
5
|
-
deps.insert("react".into(), "18.2.0".into());
|
|
6
|
-
let temp = prepare_project(
|
|
7
|
-
ctx,
|
|
8
|
-
&format!("install-test-{}", ctx.run_id),
|
|
9
|
-
"1.0.0",
|
|
10
|
-
deps,
|
|
11
|
-
BTreeMap::new(),
|
|
12
|
-
)?;
|
|
13
|
-
let mut args = vec!["install".into()];
|
|
14
|
-
if ctx.adapter.kind == AdapterType::Npm {
|
|
15
|
-
args.push("--json".into());
|
|
16
|
-
}
|
|
17
|
-
args.extend(registry_arg(&ctx.adapter, &ctx.registry_url));
|
|
18
|
-
let resp = exec_adapter(ctx, Some(&temp), args)?;
|
|
19
|
-
if ctx.adapter.kind == AdapterType::Npm {
|
|
20
|
-
let parsed: Value = serde_json::from_str(&resp.stdout)?;
|
|
21
|
-
assert_true(
|
|
22
|
-
parsed.get("added").is_some(),
|
|
23
|
-
"Expected \"added\" field in install response",
|
|
24
|
-
)?;
|
|
25
|
-
}
|
|
26
|
-
Ok(())
|
|
27
|
-
}
|
package/src/e2e_tests/login.rs
DELETED
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
use super::prelude::*;
|
|
2
|
-
|
|
3
|
-
pub(crate) fn test_login(ctx: &mut TestContext<'_>) -> Result<()> {
|
|
4
|
-
if ctx.adapter.kind != AdapterType::YarnModern {
|
|
5
|
-
return Ok(());
|
|
6
|
-
}
|
|
7
|
-
let user1 = format!("login-a-{}", ctx.run_id);
|
|
8
|
-
let password1 = "test-password-123";
|
|
9
|
-
let email1 = format!("{user1}@test.example.com");
|
|
10
|
-
sub_test(ctx, "create new user + whoami", |ctx| {
|
|
11
|
-
let tf = prepare_login_project(ctx, &format!("verdaccio-login1-{}", ctx.run_id))?;
|
|
12
|
-
let login = yarn_login(ctx, &tf, &user1, password1, &email1)?;
|
|
13
|
-
assert_true(
|
|
14
|
-
login.stdout.contains("Logged in") || login.stdout.contains("token saved"),
|
|
15
|
-
"Expected login success message",
|
|
16
|
-
)?;
|
|
17
|
-
assert_contains(&yarn_whoami(ctx, &tf)?, &user1)
|
|
18
|
-
})?;
|
|
19
|
-
sub_test(ctx, "login existing user", |ctx| {
|
|
20
|
-
let tf = prepare_login_project(ctx, &format!("verdaccio-login2-{}", ctx.run_id))?;
|
|
21
|
-
let login = yarn_login(ctx, &tf, &user1, password1, &email1)?;
|
|
22
|
-
assert_true(
|
|
23
|
-
login.stdout.contains("Logged in") || login.stdout.contains("token saved"),
|
|
24
|
-
"Expected login success message",
|
|
25
|
-
)?;
|
|
26
|
-
assert_contains(&yarn_whoami(ctx, &tf)?, &user1)
|
|
27
|
-
})?;
|
|
28
|
-
sub_test(ctx, "wrong password fails", |ctx| {
|
|
29
|
-
let tf = prepare_login_project(ctx, &format!("verdaccio-login3-{}", ctx.run_id))?;
|
|
30
|
-
let failed = yarn_login(ctx, &tf, &user1, "wrong-password", &email1).is_err();
|
|
31
|
-
assert_true(failed, "Login with wrong password should have failed")
|
|
32
|
-
})?;
|
|
33
|
-
sub_test(ctx, "login then publish", |ctx| {
|
|
34
|
-
let pkg = format!("@verdaccio/login-pub-{}", ctx.run_id);
|
|
35
|
-
let tf = create_temp_dir(ctx.state, &format!("login-pub-{}", ctx.run_id))?
|
|
36
|
-
.path()
|
|
37
|
-
.to_path_buf();
|
|
38
|
-
fs::write(
|
|
39
|
-
tf.join(".yarnrc.yml"),
|
|
40
|
-
yarn_config(&ctx.registry_url, None, ctx.adapter.yarn_major)?,
|
|
41
|
-
)?;
|
|
42
|
-
fs::write(
|
|
43
|
-
tf.join("package.json"),
|
|
44
|
-
package_json(&pkg, "1.0.0", BTreeMap::new(), BTreeMap::new())?,
|
|
45
|
-
)?;
|
|
46
|
-
fs::write(tf.join("README.md"), readme(&pkg))?;
|
|
47
|
-
import_plugin(ctx, &tf, "npm-login")?;
|
|
48
|
-
yarn_login(ctx, &tf, &user1, password1, &email1)?;
|
|
49
|
-
exec_adapter(ctx, Some(&tf), vec!["install".into()])?;
|
|
50
|
-
let published = exec_adapter(ctx, Some(&tf), vec!["publish".into()])?;
|
|
51
|
-
assert_contains(&published.stdout, "Package archive published")
|
|
52
|
-
})?;
|
|
53
|
-
sub_test(ctx, "switch users", |ctx| {
|
|
54
|
-
let user2 = format!("login-b-{}", ctx.run_id);
|
|
55
|
-
let password2 = "other-password-456";
|
|
56
|
-
let email2 = format!("{user2}@test.example.com");
|
|
57
|
-
let tf = prepare_login_project(ctx, &format!("verdaccio-login5-{}", ctx.run_id))?;
|
|
58
|
-
yarn_login(ctx, &tf, &user1, password1, &email1)?;
|
|
59
|
-
assert_contains(&yarn_whoami(ctx, &tf)?, &user1)?;
|
|
60
|
-
yarn_login(ctx, &tf, &user2, password2, &email2)?;
|
|
61
|
-
assert_contains(&yarn_whoami(ctx, &tf)?, &user2)
|
|
62
|
-
})?;
|
|
63
|
-
Ok(())
|
|
64
|
-
}
|
package/src/e2e_tests/mod.rs
DELETED
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
pub(crate) mod audit;
|
|
2
|
-
pub(crate) mod ci;
|
|
3
|
-
pub(crate) mod deprecate;
|
|
4
|
-
pub(crate) mod dist_tags;
|
|
5
|
-
pub(crate) mod info;
|
|
6
|
-
pub(crate) mod install;
|
|
7
|
-
pub(crate) mod login;
|
|
8
|
-
pub(crate) mod ping;
|
|
9
|
-
pub(crate) mod publish;
|
|
10
|
-
pub(crate) mod search;
|
|
11
|
-
pub(crate) mod unpublish;
|
|
12
|
-
|
|
13
|
-
pub(crate) mod prelude {
|
|
14
|
-
pub(crate) use anyhow::{Context, Result};
|
|
15
|
-
pub(crate) use reqwest::blocking::Client;
|
|
16
|
-
pub(crate) use serde_json::Value;
|
|
17
|
-
pub(crate) use std::collections::BTreeMap;
|
|
18
|
-
pub(crate) use std::fs;
|
|
19
|
-
|
|
20
|
-
pub(crate) use crate::*;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
pub(crate) fn all_tests() -> Vec<crate::TestDefinition> {
|
|
24
|
-
vec![
|
|
25
|
-
crate::TestDefinition {
|
|
26
|
-
name: "publish",
|
|
27
|
-
requires: &["publish"],
|
|
28
|
-
applies_to: |_| true,
|
|
29
|
-
run: publish::test_publish,
|
|
30
|
-
},
|
|
31
|
-
crate::TestDefinition {
|
|
32
|
-
name: "install",
|
|
33
|
-
requires: &["install"],
|
|
34
|
-
applies_to: |_| true,
|
|
35
|
-
run: install::test_install,
|
|
36
|
-
},
|
|
37
|
-
crate::TestDefinition {
|
|
38
|
-
name: "ci",
|
|
39
|
-
requires: &["install"],
|
|
40
|
-
applies_to: |_| true,
|
|
41
|
-
run: ci::test_ci,
|
|
42
|
-
},
|
|
43
|
-
crate::TestDefinition {
|
|
44
|
-
name: "audit",
|
|
45
|
-
requires: &["audit"],
|
|
46
|
-
applies_to: |_| true,
|
|
47
|
-
run: audit::test_audit,
|
|
48
|
-
},
|
|
49
|
-
crate::TestDefinition {
|
|
50
|
-
name: "info",
|
|
51
|
-
requires: &["info"],
|
|
52
|
-
applies_to: |_| true,
|
|
53
|
-
run: info::test_info,
|
|
54
|
-
},
|
|
55
|
-
crate::TestDefinition {
|
|
56
|
-
name: "deprecate",
|
|
57
|
-
requires: &["deprecate"],
|
|
58
|
-
applies_to: |_| true,
|
|
59
|
-
run: deprecate::test_deprecate,
|
|
60
|
-
},
|
|
61
|
-
crate::TestDefinition {
|
|
62
|
-
name: "dist-tags",
|
|
63
|
-
requires: &["dist-tag"],
|
|
64
|
-
applies_to: |_| true,
|
|
65
|
-
run: dist_tags::test_dist_tags,
|
|
66
|
-
},
|
|
67
|
-
crate::TestDefinition {
|
|
68
|
-
name: "login",
|
|
69
|
-
requires: &["login"],
|
|
70
|
-
applies_to: |_| true,
|
|
71
|
-
run: login::test_login,
|
|
72
|
-
},
|
|
73
|
-
crate::TestDefinition {
|
|
74
|
-
name: "ping",
|
|
75
|
-
requires: &["ping"],
|
|
76
|
-
applies_to: |_| true,
|
|
77
|
-
run: ping::test_ping,
|
|
78
|
-
},
|
|
79
|
-
crate::TestDefinition {
|
|
80
|
-
name: "search",
|
|
81
|
-
requires: &["search"],
|
|
82
|
-
applies_to: |_| true,
|
|
83
|
-
run: search::test_search,
|
|
84
|
-
},
|
|
85
|
-
crate::TestDefinition {
|
|
86
|
-
name: "unpublish",
|
|
87
|
-
requires: &["unpublish"],
|
|
88
|
-
applies_to: |_| true,
|
|
89
|
-
run: unpublish::test_unpublish,
|
|
90
|
-
},
|
|
91
|
-
crate::TestDefinition {
|
|
92
|
-
name: "scenario:install-multiple-deps",
|
|
93
|
-
requires: &["publish", "install", "info"],
|
|
94
|
-
applies_to: |_| true,
|
|
95
|
-
run: crate::scenarios::install_multiple_deps::scenario_install_multiple_deps,
|
|
96
|
-
},
|
|
97
|
-
crate::TestDefinition {
|
|
98
|
-
name: "scenario:minimum-release-age",
|
|
99
|
-
requires: &["publish", "install"],
|
|
100
|
-
applies_to: crate::is_pnpm_minimum_release_age_capable,
|
|
101
|
-
run: crate::scenarios::minimum_release_age::scenario_minimum_release_age,
|
|
102
|
-
},
|
|
103
|
-
]
|
|
104
|
-
}
|
package/src/e2e_tests/ping.rs
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
use super::prelude::*;
|
|
2
|
-
|
|
3
|
-
pub(crate) fn test_ping(ctx: &mut TestContext<'_>) -> Result<()> {
|
|
4
|
-
let cwd = if ctx.adapter.kind == AdapterType::YarnModern {
|
|
5
|
-
let temp = prepare_project(
|
|
6
|
-
ctx,
|
|
7
|
-
&format!("verdaccio-ping-{}", ctx.run_id),
|
|
8
|
-
"1.0.0",
|
|
9
|
-
BTreeMap::new(),
|
|
10
|
-
BTreeMap::new(),
|
|
11
|
-
)?;
|
|
12
|
-
import_plugin(ctx, &temp, "npm-ping")?;
|
|
13
|
-
Some(temp)
|
|
14
|
-
} else {
|
|
15
|
-
None
|
|
16
|
-
};
|
|
17
|
-
let mut args = vec!["ping".into()];
|
|
18
|
-
if ctx.adapter.kind != AdapterType::YarnModern {
|
|
19
|
-
args.push("--json".into());
|
|
20
|
-
}
|
|
21
|
-
args.extend(registry_arg(&ctx.adapter, &ctx.registry_url));
|
|
22
|
-
let resp = exec_adapter(ctx, cwd.as_deref(), args)?;
|
|
23
|
-
if ctx.adapter.kind != AdapterType::YarnModern {
|
|
24
|
-
let parsed: Value = serde_json::from_str(&resp.stdout)?;
|
|
25
|
-
let expected_registry = format!("{}/", ctx.registry_url);
|
|
26
|
-
assert_eq_json(
|
|
27
|
-
parsed.get("registry"),
|
|
28
|
-
expected_registry.as_str(),
|
|
29
|
-
"Registry mismatch",
|
|
30
|
-
)?;
|
|
31
|
-
}
|
|
32
|
-
Ok(())
|
|
33
|
-
}
|
package/src/e2e_tests/publish.rs
DELETED
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
use super::prelude::*;
|
|
2
|
-
|
|
3
|
-
pub(crate) fn test_publish(ctx: &mut TestContext<'_>) -> Result<()> {
|
|
4
|
-
let packages = vec![
|
|
5
|
-
format!("verdaccio-memory-{}", ctx.run_id),
|
|
6
|
-
format!("verdaccio-{}", ctx.run_id),
|
|
7
|
-
format!("@verdaccio/foo-{}", ctx.run_id),
|
|
8
|
-
format!("@verdaccio/some-foo-{}", ctx.run_id),
|
|
9
|
-
];
|
|
10
|
-
for pkg_name in packages {
|
|
11
|
-
let temp = prepare_project(ctx, &pkg_name, "1.0.0", BTreeMap::new(), BTreeMap::new())?;
|
|
12
|
-
if ctx.adapter.kind == AdapterType::YarnModern {
|
|
13
|
-
exec_adapter(ctx, Some(&temp), vec!["install".into()])?;
|
|
14
|
-
}
|
|
15
|
-
let mut args = vec!["publish".into(), "--json".into()];
|
|
16
|
-
args.extend(registry_arg(&ctx.adapter, &ctx.registry_url));
|
|
17
|
-
let resp = exec_adapter(ctx, Some(&temp), args)?;
|
|
18
|
-
match ctx.adapter.kind {
|
|
19
|
-
AdapterType::YarnModern => assert_contains(&resp.stdout, "Package archive published")?,
|
|
20
|
-
AdapterType::YarnClassic => {
|
|
21
|
-
assert_true(!resp.stdout.is_empty(), "Expected publish output")?
|
|
22
|
-
}
|
|
23
|
-
AdapterType::Bun => {}
|
|
24
|
-
_ => {
|
|
25
|
-
if let Ok(parsed) = serde_json::from_str::<Value>(&resp.stdout) {
|
|
26
|
-
let expected_id = format!("{pkg_name}@1.0.0");
|
|
27
|
-
let published_name = parsed.get("name").and_then(Value::as_str);
|
|
28
|
-
let published_id = parsed.get("id").and_then(Value::as_str);
|
|
29
|
-
if published_name.is_some() || published_id.is_some() {
|
|
30
|
-
assert_true(
|
|
31
|
-
published_name == Some(pkg_name.as_str())
|
|
32
|
-
|| published_id == Some(expected_id.as_str()),
|
|
33
|
-
&format!(
|
|
34
|
-
"Expected package name \"{pkg_name}\" or id \"{expected_id}\""
|
|
35
|
-
),
|
|
36
|
-
)?;
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
assert_published(ctx, &pkg_name)?;
|
|
42
|
-
}
|
|
43
|
-
Ok(())
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
fn assert_published(ctx: &TestContext<'_>, pkg_name: &str) -> Result<()> {
|
|
47
|
-
let encoded = pkg_name.replace('/', "%2F");
|
|
48
|
-
let response = Client::new()
|
|
49
|
-
.get(format!(
|
|
50
|
-
"{}/{}",
|
|
51
|
-
ctx.registry_url.trim_end_matches('/'),
|
|
52
|
-
encoded
|
|
53
|
-
))
|
|
54
|
-
.bearer_auth(&ctx.token)
|
|
55
|
-
.send()
|
|
56
|
-
.with_context(|| format!("failed to fetch published package {pkg_name}"))?;
|
|
57
|
-
let status = response.status();
|
|
58
|
-
let body: Value = response.json().unwrap_or(Value::Null);
|
|
59
|
-
assert_true(
|
|
60
|
-
status.is_success(),
|
|
61
|
-
&format!("Expected published package {pkg_name}, got {status} {body}"),
|
|
62
|
-
)?;
|
|
63
|
-
assert_eq_json(
|
|
64
|
-
body.get("name"),
|
|
65
|
-
pkg_name,
|
|
66
|
-
"Expected published registry package name",
|
|
67
|
-
)
|
|
68
|
-
}
|
package/src/e2e_tests/search.rs
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
use super::prelude::*;
|
|
2
|
-
|
|
3
|
-
pub(crate) fn test_search(ctx: &mut TestContext<'_>) -> Result<()> {
|
|
4
|
-
let mut args = vec!["search".into(), "@verdaccio/cli".into(), "--json".into()];
|
|
5
|
-
args.extend(registry_arg(&ctx.adapter, &ctx.registry_url));
|
|
6
|
-
let resp = exec_adapter(ctx, None, args)?;
|
|
7
|
-
let parsed: Value = serde_json::from_str(&resp.stdout)?;
|
|
8
|
-
let found = parsed
|
|
9
|
-
.as_array()
|
|
10
|
-
.unwrap_or(&Vec::new())
|
|
11
|
-
.iter()
|
|
12
|
-
.any(|item| item.get("name").and_then(Value::as_str) == Some("@verdaccio/cli"));
|
|
13
|
-
assert_true(found, "Expected to find @verdaccio/cli in search results")
|
|
14
|
-
}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
use super::prelude::*;
|
|
2
|
-
|
|
3
|
-
pub(crate) fn test_unpublish(ctx: &mut TestContext<'_>) -> Result<()> {
|
|
4
|
-
let pkg = format!("@verdaccio/unpub1-{}", ctx.run_id);
|
|
5
|
-
let temp = prepare_project(ctx, &pkg, "1.0.0", BTreeMap::new(), BTreeMap::new())?;
|
|
6
|
-
for bump in ["minor", "minor", "major"] {
|
|
7
|
-
publish_pkg(ctx, &temp)?;
|
|
8
|
-
bump_version(ctx, &temp, bump)?;
|
|
9
|
-
}
|
|
10
|
-
publish_pkg(ctx, &temp)?;
|
|
11
|
-
let mut args = vec![
|
|
12
|
-
"unpublish".into(),
|
|
13
|
-
pkg.clone(),
|
|
14
|
-
"--force".into(),
|
|
15
|
-
"--loglevel=info".into(),
|
|
16
|
-
"--json".into(),
|
|
17
|
-
];
|
|
18
|
-
args.extend(registry_arg(&ctx.adapter, &ctx.registry_url));
|
|
19
|
-
let resp = exec_adapter(ctx, Some(&temp), args)?;
|
|
20
|
-
assert_contains(&resp.stdout, &pkg)?;
|
|
21
|
-
|
|
22
|
-
let pkg2 = format!("@verdaccio/unpub2-{}", ctx.run_id);
|
|
23
|
-
let temp2 = prepare_project(ctx, &pkg2, "1.0.0", BTreeMap::new(), BTreeMap::new())?;
|
|
24
|
-
publish_pkg(ctx, &temp2)?;
|
|
25
|
-
bump_version(ctx, &temp2, "minor")?;
|
|
26
|
-
publish_pkg(ctx, &temp2)?;
|
|
27
|
-
let mut args = vec![
|
|
28
|
-
"unpublish".into(),
|
|
29
|
-
format!("{pkg2}@1.0.0"),
|
|
30
|
-
"--force".into(),
|
|
31
|
-
"--loglevel=info".into(),
|
|
32
|
-
"--json".into(),
|
|
33
|
-
];
|
|
34
|
-
args.extend(registry_arg(&ctx.adapter, &ctx.registry_url));
|
|
35
|
-
let resp = exec_adapter(ctx, Some(&temp2), args)?;
|
|
36
|
-
assert_contains(&resp.stdout, &pkg2)
|
|
37
|
-
}
|