diff --git a/cli/tests/integration/mod.rs b/cli/tests/integration/mod.rs index 80b3164327..5c9a00ff2a 100644 --- a/cli/tests/integration/mod.rs +++ b/cli/tests/integration/mod.rs @@ -132,6 +132,9 @@ mod node_compat_tests; mod node_unit_tests; #[path = "npm_tests.rs"] mod npm; +#[path = "publish_tests.rs"] +mod publish; + #[path = "repl_tests.rs"] mod repl; #[path = "run_tests.rs"] diff --git a/cli/tests/integration/publish_tests.rs b/cli/tests/integration/publish_tests.rs new file mode 100644 index 0000000000..6a40eabf60 --- /dev/null +++ b/cli/tests/integration/publish_tests.rs @@ -0,0 +1,38 @@ +// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license. + +static TEST_REGISTRY_URL: &str = "http://127.0.0.1:4250"; + +pub fn env_vars_for_registry() -> Vec<(String, String)> { + vec![ + ( + "DENO_REGISTRY_URL".to_string(), + TEST_REGISTRY_URL.to_string(), + ), + ( + "DENO_REGISTRY_API_URL".to_string(), + TEST_REGISTRY_URL.to_string(), + ), + ] +} + +itest!(no_token { + args: "do-not-use-publish publish/missing_deno_json", + output: "publish/no_token.out", + exit_code: 1, +}); + +itest!(missing_deno_json { + args: + "do-not-use-publish --token 'sadfasdf' $TESTDATA/publish/missing_deno_json", + output: "publish/missing_deno_json.out", + exit_code: 1, + temp_cwd: true, +}); + +itest!(successful { + args: "do-not-use-publish --token 'sadfasdf' $TESTDATA/publish/successful", + output: "publish/successful.out", + envs: env_vars_for_registry(), + http_server: true, + temp_cwd: true, +}); diff --git a/cli/tests/testdata/publish/missing_deno_json.out b/cli/tests/testdata/publish/missing_deno_json.out new file mode 100644 index 0000000000..adaf33ea8b --- /dev/null +++ b/cli/tests/testdata/publish/missing_deno_json.out @@ -0,0 +1 @@ +error: Failed to read deno.json file at [WILDCARD]missing_deno_json[WILDCARD] \ No newline at end of file diff --git a/cli/tests/testdata/publish/no_token.out b/cli/tests/testdata/publish/no_token.out new file mode 100644 index 0000000000..41415094c8 --- /dev/null +++ b/cli/tests/testdata/publish/no_token.out @@ -0,0 +1 @@ +error: No means to authenticate. Pass a token to `--token`[WILDCARD] diff --git a/cli/tests/testdata/publish/successful.out b/cli/tests/testdata/publish/successful.out new file mode 100644 index 0000000000..1049bbdb43 --- /dev/null +++ b/cli/tests/testdata/publish/successful.out @@ -0,0 +1,3 @@ +Publishing @foo/bar@1.0.0 ... +Successfully published @foo/bar@1.0.0 +http://127.0.0.1:4250/@foo/bar/1.0.0_meta.json diff --git a/cli/tests/testdata/publish/successful/deno.json b/cli/tests/testdata/publish/successful/deno.json new file mode 100644 index 0000000000..930f3aa084 --- /dev/null +++ b/cli/tests/testdata/publish/successful/deno.json @@ -0,0 +1,10 @@ +{ + "name": "@foo/bar", + "version": "1.0.0", + "exports": { + ".": "./mod.ts" + }, + "imports": { + "@std/http": "jsr:@std/http@1" + } +} diff --git a/cli/tests/testdata/publish/successful/mod.ts b/cli/tests/testdata/publish/successful/mod.ts new file mode 100644 index 0000000000..152bce40b6 --- /dev/null +++ b/cli/tests/testdata/publish/successful/mod.ts @@ -0,0 +1,5 @@ +import http from "@std/http"; + +export function foobar() { + return http.fileServer; +} diff --git a/cli/tools/registry/mod.rs b/cli/tools/registry/mod.rs index cfc335fd95..8c53fd5cd7 100644 --- a/cli/tools/registry/mod.rs +++ b/cli/tools/registry/mod.rs @@ -538,7 +538,7 @@ async fn perform_publish( package.version ); println!( - "{}/@{}/{}/{}_meta.json", + "{}@{}/{}/{}_meta.json", registry_url, package.scope, package.package, package.version ); } diff --git a/test_util/src/lib.rs b/test_util/src/lib.rs index 6700a49f10..ba54ef6249 100644 --- a/test_util/src/lib.rs +++ b/test_util/src/lib.rs @@ -48,6 +48,7 @@ use pty::Pty; use regex::Regex; use rustls_tokio_stream::TlsStream; use serde::Serialize; +use serde_json::json; use std::collections::HashMap; use std::convert::Infallible; use std::env; @@ -120,6 +121,7 @@ const WS_CLOSE_PORT: u16 = 4244; const WS_PING_PORT: u16 = 4245; const H2_GRPC_PORT: u16 = 4246; const H2S_GRPC_PORT: u16 = 4247; +const REGISTRY_SERVER_PORT: u16 = 4250; pub const PERMISSION_VARIANTS: [&str; 5] = ["read", "write", "env", "net", "run"]; @@ -1815,6 +1817,8 @@ pub async fn run_all_servers() { let h2_only_server_fut = wrap_http_h2_only_server(); let h2_grpc_server_fut = h2_grpc_server(); + let registry_server_fut = registry_server(); + let server_fut = async { futures::join!( redirect_server_fut, @@ -1840,6 +1844,7 @@ pub async fn run_all_servers() { h1_only_server_fut, h2_only_server_fut, h2_grpc_server_fut, + registry_server_fut, ) } .boxed_local(); @@ -2698,6 +2703,49 @@ pub fn parse_max_mem(output: &str) -> Option { None } +async fn registry_server_handler( + req: Request, +) -> Result, hyper::http::Error> { + let path = req.uri().path(); + + if path.starts_with("/scopes/") { + let body = serde_json::to_string_pretty(&json!({ + "id": "sdfwqer-sffg-qwerasdf", + "status": "success", + "error": null + })) + .unwrap(); + let res = Response::new(Body::from(body)); + return Ok(res); + } else if path.starts_with("/publish_status/") { + let body = serde_json::to_string_pretty(&json!({ + "id": "sdfwqer-qwer-qwerasdf", + "status": "success", + "error": null + })) + .unwrap(); + let res = Response::new(Body::from(body)); + return Ok(res); + } + + Response::builder() + .status(StatusCode::NOT_FOUND) + .body(Body::empty()) +} + +async fn registry_server() { + let registry_server_addr = + SocketAddr::from(([127, 0, 0, 1], REGISTRY_SERVER_PORT)); + let registry_server_svc = make_service_fn(|_| async { + Ok::<_, Infallible>(service_fn(registry_server_handler)) + }); + let registry_server = + Server::bind(®istry_server_addr).serve(registry_server_svc); + if let Err(e) = registry_server.await { + eprintln!("Registry server error: {:?}", e); + } +} + pub(crate) mod colors { use std::io::Write;