1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
use testcontainers::{core::WaitFor, Image};

const NAME: &str = "softwaremill/elasticmq";
const TAG: &str = "1.5.2";

#[derive(Debug, Default)]
pub struct ElasticMq;

impl Image for ElasticMq {
    type Args = ();

    fn name(&self) -> String {
        NAME.to_owned()
    }

    fn tag(&self) -> String {
        TAG.to_owned()
    }

    fn ready_conditions(&self) -> Vec<WaitFor> {
        vec![WaitFor::message_on_stdout("Started SQS rest server")]
    }
}

#[cfg(test)]
mod tests {
    use aws_config::{meta::region::RegionProviderChain, BehaviorVersion};
    use aws_sdk_sqs::{config::Credentials, Client};
    use testcontainers::clients;

    use crate::elasticmq::ElasticMq;

    #[tokio::test]
    async fn sqs_list_queues() {
        let docker = clients::Cli::default();
        let node = docker.run(ElasticMq);
        let host_port = node.get_host_port_ipv4(9324);
        let client = build_sqs_client(host_port).await;

        let result = client.list_queues().send().await.unwrap();
        // list should be empty
        assert!(result.queue_urls.filter(|urls| !urls.is_empty()).is_none())
    }

    async fn build_sqs_client(host_port: u16) -> Client {
        let endpoint_uri = format!("http://127.0.0.1:{host_port}");
        let region_provider = RegionProviderChain::default_provider().or_else("us-east-1");
        let creds = Credentials::new("fakeKey", "fakeSecret", None, None, "test");

        let shared_config = aws_config::defaults(BehaviorVersion::latest())
            .region(region_provider)
            .endpoint_url(endpoint_uri)
            .credentials_provider(creds)
            .load()
            .await;

        Client::new(&shared_config)
    }
}