Documentation
use std::fs::remove_dir_all;
use std::thread::sleep;
use std::time::Duration;
use tokio::sync::broadcast::{channel, Receiver, Sender};
use tonic::transport::Channel;
use wacker::{new_client_with_path, utils::generate_random_string, Client, Server};

pub struct TestServer {
    sender: Sender<()>,
    receiver: Receiver<()>,
    dir: String,
}

impl TestServer {
    pub fn new() -> Self {
        let (sender, receiver) = channel(1);
        Self {
            sender,
            receiver,
            dir: format!("wacker-test-{}", generate_random_string(5)),
        }
    }

    pub async fn start(&mut self) {
        let dir = self.dir.clone();
        let mut receiver = self.receiver.resubscribe();

        Server::new()
            .with_dir(dir.clone())
            .is_test(true)
            .start(async move {
                receiver.recv().await.expect("");
                remove_dir_all(dir).expect("remove dir failed");
            })
            .await
            .unwrap();
    }

    pub async fn client(&self) -> Client<Channel> {
        new_client_with_path(format!("{}/wacker.sock", self.dir)).await.unwrap()
    }
}

impl Drop for TestServer {
    fn drop(&mut self) {
        let _ = self.sender.send(());
        sleep(Duration::from_secs(1));
    }
}