pocketcasts 0.1.4

Pocketcasts (unofficial) API client.
Documentation
extern crate dotenv;
extern crate once_cell;
extern crate pocketcasts;
extern crate tokio_test;

use once_cell::sync::OnceCell;
use pocketcasts::Pocketcasts;
use std::env;
use std::sync::Mutex;

struct ClientCredentials {
    pub email: String,
    pub password: String,
}

impl ClientCredentials {
    pub fn default() -> ClientCredentials {
        dotenv::dotenv().ok();
        let email = env::var("PC_EMAIL").expect("Missing env var PC_EMAIL");
        let password = env::var("PC_PASSWORD").expect("Missing env var PC_PASSWORD");
        ClientCredentials { email, password }
    }
}

static POCKETCASTS: OnceCell<Mutex<Pocketcasts>> = OnceCell::new();

fn login() -> Mutex<Pocketcasts> {
    tokio_test::block_on(async {
        let credentials = ClientCredentials::default();
        let pc = Pocketcasts::login(credentials.email, credentials.password)
            .await
            .unwrap();
        Mutex::new(pc)
    })
}

fn pocketcasts_client() -> Pocketcasts {
    let pc = POCKETCASTS.get_or_init(login);
    pc.lock().unwrap().clone()
}

#[test]
fn test_subscription_status() {
    let pc = pocketcasts_client();
    tokio_test::block_on(async {
        let status = pc.subscription_status().await;
        assert!(status.is_ok());
    });
}

#[test]
fn test_user_podcasts() {
    let pc = pocketcasts_client();
    tokio_test::block_on(async {
        let podcasts = pc.user_podcasts().await;
        assert!(podcasts.is_ok());
    });
}

#[test]
fn test_new_releases() {
    let pc = pocketcasts_client();
    tokio_test::block_on(async {
        let releases = pc.new_releases().await;
        assert!(releases.is_ok());
    });
}


#[test]
fn test_episode() {
    let pc = pocketcasts_client();
    tokio_test::block_on(async {
        let releases = pc.new_releases().await.unwrap();
        let episode_uuid = releases.episodes[0].uuid.to_string();
        let episode = pc.episode(episode_uuid.to_string()).await;
        assert!(episode.is_ok());
    });
}