use crate::error::Result;
use std::sync::Arc;
#[derive(Debug, Clone)]
pub struct BulkHandler<A: crate::auth::Authenticator> {
pub(crate) inner: Arc<crate::session::Session<A>>,
}
impl<A: crate::auth::Authenticator> BulkHandler<A> {
#[must_use]
pub(crate) fn new(inner: Arc<crate::session::Session<A>>) -> Self {
Self { inner }
}
pub async fn base_url(&self) -> Result<String> {
self.inner.resolve_url("jobs/ingest").await
}
}
#[cfg(test)]
mod tests {
use crate::client::{ForceClient, builder};
use crate::config::ClientConfig;
use crate::test_support::{MockAuthenticator, Must, MustMsg};
use wiremock::MockServer;
async fn create_test_client(mock_server_url: String) -> ForceClient<MockAuthenticator> {
let auth = MockAuthenticator::new("test_token", &mock_server_url);
builder()
.authenticate(auth)
.build()
.await
.must_msg("failed to create test client")
}
#[cfg(feature = "bulk")]
#[tokio::test]
async fn test_bulk_handler_construction() {
let mock_server = MockServer::start().await;
let client = create_test_client(mock_server.uri()).await;
let _handler = client.bulk();
}
#[cfg(feature = "bulk")]
#[tokio::test]
async fn test_bulk_handler_is_cloneable() {
let mock_server = MockServer::start().await;
let client = create_test_client(mock_server.uri()).await;
let handler1 = client.bulk();
let handler2 = handler1.clone();
let url1 = handler1.base_url().await.must();
let url2 = handler2.base_url().await.must();
assert_eq!(url1, url2);
}
#[cfg(feature = "bulk")]
#[tokio::test]
async fn test_base_url_construction() {
let mock_server = MockServer::start().await;
let client = create_test_client(mock_server.uri()).await;
let handler = client.bulk();
let base_url = handler.base_url().await.must();
assert!(base_url.contains(&mock_server.uri()));
assert!(base_url.contains("/services/data/"));
assert!(base_url.ends_with("v60.0/jobs/ingest")); }
#[cfg(feature = "bulk")]
#[tokio::test]
async fn test_base_url_with_custom_api_version() {
let mock_server = MockServer::start().await;
let auth = MockAuthenticator::new("test_token", &mock_server.uri());
let config = ClientConfig {
api_version: "v59.0".into(),
..Default::default()
};
let client = builder()
.authenticate(auth)
.config(config)
.build()
.await
.must();
let handler = client.bulk();
let base_url = handler.base_url().await.must();
assert!(base_url.ends_with("v59.0/jobs/ingest"));
}
}