use crate::{
AwsHttpClient, Result,
ops::opensearch::OpensearchOps,
types::opensearch::{DeleteDomainResponse, DescribeDomainResponse, ListDomainNamesResponse},
};
pub struct OpensearchClient<'a> {
ops: OpensearchOps<'a>,
}
impl<'a> OpensearchClient<'a> {
pub(crate) fn new(client: &'a AwsHttpClient) -> Self {
Self {
ops: OpensearchOps::new(client),
}
}
pub async fn list_domain_names(&self, engine_type: &str) -> Result<ListDomainNamesResponse> {
self.ops.list_domain_names(engine_type).await
}
pub async fn describe_domain(&self, domain_name: &str) -> Result<DescribeDomainResponse> {
self.ops.describe_domain(domain_name).await
}
pub async fn delete_domain(&self, domain_name: &str) -> Result<DeleteDomainResponse> {
self.ops.delete_domain(domain_name).await
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::MockClient;
use crate::types::opensearch::*;
#[tokio::test]
async fn test_list_domain_names_returns_domains() {
let mut mock = MockClient::new();
mock.expect_get("/2021-01-01/domain")
.returning_json(serde_json::json!({
"DomainNames": [
{"DomainName": "my-domain", "EngineType": "OpenSearch"}
]
}));
let client = AwsHttpClient::from_mock(mock);
let result = client.opensearch().list_domain_names("").await.unwrap();
assert_eq!(result.domain_names.len(), 1);
assert_eq!(
result.domain_names[0].domain_name.as_deref(),
Some("my-domain")
);
}
#[tokio::test]
async fn test_list_domain_names_returns_empty_when_no_domains() {
let mut mock = MockClient::new();
mock.expect_get("/2021-01-01/domain")
.returning_json(serde_json::json!({}));
let client = AwsHttpClient::from_mock(mock);
let result = client.opensearch().list_domain_names("").await.unwrap();
assert_eq!(result.domain_names.len(), 0);
}
#[tokio::test]
async fn test_describe_domain_returns_domain_status() {
let mut mock = MockClient::new();
mock.expect_get("/2021-01-01/opensearch/domain/test-domain")
.returning_json(serde_json::json!({
"DomainStatus": {
"DomainId": "123456789012/test-domain",
"DomainName": "test-domain",
"ARN": "arn:aws:es:us-east-1:123456789012:domain/test-domain",
"Created": true,
"Deleted": false,
"Processing": false,
"EngineVersion": "OpenSearch_2.11"
}
}));
let client = AwsHttpClient::from_mock(mock);
let result = client
.opensearch()
.describe_domain("test-domain")
.await
.unwrap();
let status = &result.domain_status;
assert_eq!(status.domain_name, "test-domain");
assert_eq!(status.domain_id, "123456789012/test-domain");
assert_eq!(status.created, Some(true));
assert_eq!(status.engine_version.as_deref(), Some("OpenSearch_2.11"));
}
#[tokio::test]
async fn test_delete_domain_returns_domain_status() {
let mut mock = MockClient::new();
mock.expect_delete("/2021-01-01/opensearch/domain/test-domain")
.returning_json(serde_json::json!({
"DomainStatus": {
"DomainId": "123456789012/test-domain",
"DomainName": "test-domain",
"ARN": "arn:aws:es:us-east-1:123456789012:domain/test-domain",
"Deleted": true
}
}));
let client = AwsHttpClient::from_mock(mock);
let result = client
.opensearch()
.delete_domain("test-domain")
.await
.unwrap();
let status = result.domain_status.as_ref().unwrap();
assert_eq!(status.domain_name, "test-domain");
assert_eq!(status.deleted, Some(true));
}
}