Skip to content

Commit

Permalink
Switch mockito to v1
Browse files Browse the repository at this point in the history
  • Loading branch information
ostenbom committed Feb 20, 2025
1 parent 7800917 commit 769f55f
Show file tree
Hide file tree
Showing 5 changed files with 85 additions and 75 deletions.
16 changes: 11 additions & 5 deletions Cargo.lock

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

1 change: 0 additions & 1 deletion cloudflare/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ chrono = { version = "0.4", default-features = false, features = [
"wasmbind",
] }
http = "1"
mockito = { version = "0.31", optional = true }
percent-encoding = "2.1.0"
reqwest = { version = "0.12.12", default-features = false, features = ["json"] }
serde = { version = "1.0", features = ["derive"] }
Expand Down
13 changes: 0 additions & 13 deletions cloudflare/src/framework/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,6 @@ pub enum Environment {
Production,
/// A custom endpoint
Custom(url::Url),
#[cfg(feature = "mockito")]
/// The local mock endpoint associated with `mockito`
Mockito,
}

impl<'a> From<&'a Environment> for url::Url {
Expand All @@ -59,8 +56,6 @@ impl<'a> From<&'a Environment> for url::Url {
url::Url::parse("https://api.cloudflare.com/client/v4/").unwrap()
}
Environment::Custom(url) => url.clone(),
#[cfg(feature = "mockito")]
Environment::Mockito => url::Url::parse(&mockito::server_url()).unwrap(),
}
}
}
Expand All @@ -74,14 +69,6 @@ pub struct HttpApiClient {
http_client: reqwest::blocking::Client,
}

#[cfg(all(feature = "blocking", not(target_arch = "wasm32")))]
impl HttpApiClient {
#[cfg(feature = "mockito")]
pub fn is_mock(&self) -> bool {
matches!(self.environment, Environment::Mockito)
}
}

/// Configuration for the API client. Allows users to customize its behaviour.
pub struct HttpApiClientConfig {
/// The maximum time limit for an API request. If a request takes longer than this, it will be
Expand Down
5 changes: 2 additions & 3 deletions linkup-cli/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ path = "src/main.rs"
[dependencies]
clap = { version = "4.5.27", features = ["derive", "cargo"] }
clap_complete = "4.5.42"
cloudflare = { path = "../cloudflare", features = ["mockito"] }
cloudflare = { path = "../cloudflare" }
colored = "3.0.0"
ctrlc = { version = "3.4.5", features = ["termination"] }
hickory-resolver = { version = "0.24.2", features = ["tokio-runtime"] }
Expand Down Expand Up @@ -44,5 +44,4 @@ flate2 = "1.0.35"

[dev-dependencies]
mockall = "0.13.1"
# NOTE(augustoccesar)[2025-02-19]: This old version is to match the one being used by cloudflare
mockito = "0.31"
mockito = "1.6.1"
125 changes: 72 additions & 53 deletions linkup-cli/src/commands/deploy/cf_deploy.rs
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,10 @@ pub async fn deploy_to_cloudflare(

#[cfg(test)]
mod tests {
use cloudflare::framework::{
async_api::Client, auth, endpoint::spec::EndpointSpec, Environment, HttpApiClientConfig,
};
use mockito::{Mock, ServerGuard};
use std::cell::RefCell;

use crate::commands::deploy::{
Expand All @@ -138,6 +142,49 @@ mod tests {

use super::*;

fn test_client(mock_server_url: String) -> Client {
let mock_server_url = url::Url::parse(&mock_server_url).unwrap();
println!("mock_server_url: {:?}", mock_server_url);
Client::new(
auth::Credentials::UserAuthKey {
email: "[email protected]".to_string(),
key: "test-api-key".to_string(),
},
HttpApiClientConfig::default(),
Environment::Custom(mock_server_url),
)
.unwrap()
}

async fn mock_cloudflare_endpoints(
mock_server: &mut ServerGuard,
resources: &TargetCfResources,
) {
let req = cloudflare::endpoints::workers::ListBindings {
account_id: &resources.account_id,
script_name: &resources.worker_script_name,
};

let res = serde_json::to_string(&cloudflare::framework::response::ApiSuccess::<Vec<()>> {
result: vec![],
result_info: None,
messages: serde_json::json!([]),
errors: vec![],
})
.unwrap();

println!("req.path(): {:?}", req.path().to_string());
let path = format!("/{}", req.path().to_string().as_str());
println!("path: {:?}", path);

mock_server
.mock("GET", path.as_str())
.with_status(200)
.with_body(res)
.create_async()
.await;
}

const LOCAL_SCRIPT_CONTENT: &str = r#"
export default {
async fetch(request, env, ctx) {
Expand Down Expand Up @@ -457,11 +504,13 @@ export default {
};

let resources = test_resources();
let _mocks = mock_cloudflare_endpoints(&resources);

let mut mock_server = mockito::Server::new_async().await;
let client = test_client(mock_server.url());
let _mocks = mock_cloudflare_endpoints(&mut mock_server, &resources).await;

// Call deploy_to_cloudflare directly
let result =
deploy_to_cloudflare(&resources, &api, &cloudflare_test_client(), &notifier).await;
let result = deploy_to_cloudflare(&resources, &api, &client, &notifier).await;
assert!(result.is_ok());

// Check that a worker script was created
Expand Down Expand Up @@ -492,10 +541,11 @@ export default {
};

let resources = test_resources();
let _mocks = mock_cloudflare_endpoints(&resources);
let mut mock_server = mockito::Server::new_async().await;
let client = test_client(mock_server.url());
mock_cloudflare_endpoints(&mut mock_server, &resources).await;

let result =
deploy_to_cloudflare(&resources, &api, &cloudflare_test_client(), &notifier).await;
let result = deploy_to_cloudflare(&resources, &api, &client, &notifier).await;
assert!(result.is_ok());

assert_eq!(*notifier.confirmations_asked.borrow(), 1);
Expand Down Expand Up @@ -527,10 +577,11 @@ export default {
};

let resources = test_resources();
let _mocks = mock_cloudflare_endpoints(&resources);
let mut mock_server = mockito::Server::new_async().await;
let client = test_client(mock_server.url());
mock_cloudflare_endpoints(&mut mock_server, &resources).await;

let result =
deploy_to_cloudflare(&resources, &api, &cloudflare_test_client(), &notifier).await;
let result = deploy_to_cloudflare(&resources, &api, &client, &notifier).await;
assert!(result.is_ok());

assert_eq!(*notifier.confirmations_asked.borrow(), 1);
Expand All @@ -550,11 +601,12 @@ export default {
};

let resources = test_resources();
let _mocks = mock_cloudflare_endpoints(&resources);
let mut mock_server = mockito::Server::new_async().await;
let client = test_client(mock_server.url());
mock_cloudflare_endpoints(&mut mock_server, &resources).await;

// Call deploy_to_cloudflare directly
let result =
deploy_to_cloudflare(&resources, &api, &cloudflare_test_client(), &notifier).await;
let result = deploy_to_cloudflare(&resources, &api, &client, &notifier).await;
assert!(result.is_ok());

// Check DNS record created
Expand Down Expand Up @@ -583,11 +635,12 @@ export default {
};

let resources = test_resources();
let _mocks = mock_cloudflare_endpoints(&resources);
let mut mock_server = mockito::Server::new_async().await;
let client = test_client(mock_server.url());
mock_cloudflare_endpoints(&mut mock_server, &resources).await;

// Call deploy_to_cloudflare directly
let result =
deploy_to_cloudflare(&resources, &api, &cloudflare_test_client(), &notifier).await;
let result = deploy_to_cloudflare(&resources, &api, &client, &notifier).await;
assert!(result.is_ok());

let tokens = api.account_tokens.borrow();
Expand All @@ -611,11 +664,12 @@ export default {
};

let resources = test_resources();
let _mocks = mock_cloudflare_endpoints(&resources);
let mut mock_server = mockito::Server::new_async().await;
let client = test_client(mock_server.url());
mock_cloudflare_endpoints(&mut mock_server, &resources).await;

// Call deploy_to_cloudflare directly
let result =
deploy_to_cloudflare(&resources, &api, &cloudflare_test_client(), &notifier).await;
let result = deploy_to_cloudflare(&resources, &api, &client, &notifier).await;
assert!(result.is_ok());

let tokens = api.account_tokens.borrow();
Expand Down Expand Up @@ -905,39 +959,4 @@ export default {
linkup_account_token.unwrap().id,
);
}

// NOTE(augustoccesar)[2025-02-19]: This does not cover for testing when the binding for WORKER_TOKEN is already set.
// This code just allows us to keep the current tests working.
fn mock_cloudflare_endpoints(resources: &TargetCfResources) -> Vec<mockito::Mock> {
use cloudflare::framework::endpoint::spec::EndpointSpec;

let req = cloudflare::endpoints::workers::ListBindings {
account_id: &resources.account_id,
script_name: &resources.worker_script_name,
};

let res = serde_json::to_string(&cloudflare::framework::response::ApiSuccess::<Vec<()>> {
result: vec![],
result_info: None,
messages: serde_json::json!([]),
errors: vec![],
})
.unwrap();

let path = format!("/{}", req.path().to_string().as_str());
let bindings_mock = mockito::mock("GET", path.as_str()).with_body(res).create();

vec![bindings_mock]
}

fn cloudflare_test_client() -> cloudflare::framework::async_api::Client {
cloudflare::framework::async_api::Client::new(
cloudflare::framework::auth::Credentials::UserAuthToken {
token: "token_123".to_string(),
},
cloudflare::framework::HttpApiClientConfig::default(),
cloudflare::framework::Environment::Mockito,
)
.expect("Cloudflare test client to have been created")
}
}

0 comments on commit 769f55f

Please sign in to comment.