plex-api 0.0.12

Library for communication with Plex server. Work in progress, not ready for any use. See github for details.
Documentation
mod fixtures;

mod offline {
    use super::fixtures::offline::{client::*, Mocked};
    use httpmock::Method::{GET, PUT};
    use plex_api::{url::MYPLEX_ANNOUNCEMENTS, Error, HttpClient, MyPlex};

    #[plex_api_test_helper::offline_test]
    async fn list_announcements(client_anonymous: Mocked<HttpClient>) {
        let (client_anonymous, mock_server) = client_anonymous.split();

        let m = mock_server.mock(|when, then| {
            when.method(GET).path(MYPLEX_ANNOUNCEMENTS);
            then.status(200)
                .header("content-type", "application/xml")
                .body_from_file("tests/mocks/myplex/api/announcements.xml");
        });

        let plex = MyPlex::new(client_anonymous);
        let announcements_manager = plex.announcements().await;

        m.assert();

        let announcements_manager = announcements_manager.unwrap();

        let announcements = announcements_manager.announcements();

        assert_eq!(4, announcements.len());

        let first_announcement = &announcements[0];

        assert_eq!(78, first_announcement.id);
    }

    #[plex_api_test_helper::offline_test]
    async fn read_announcement(client_anonymous: Mocked<HttpClient>) {
        let (client_anonymous, mock_server) = client_anonymous.split();

        let m = mock_server.mock(|when, then| {
            when.method(GET).path(MYPLEX_ANNOUNCEMENTS);
            then.status(200)
                .header("content-type", "application/xml")
                .body_from_file("tests/mocks/myplex/api/announcements.xml");
        });

        let plex = MyPlex::new(client_anonymous);
        let announcements_manager = plex.announcements().await;
        m.assert();

        let mut announcements_manager = announcements_manager.unwrap();
        let announcements = announcements_manager.announcements_mut();

        let first_announcement = &mut announcements[0];
        assert_eq!(78, first_announcement.id);

        let mut m = mock_server.mock(|when, then| {
            when.method(PUT)
                .path(format!("{MYPLEX_ANNOUNCEMENTS}/{}", first_announcement.id))
                .query_param("read", "1");
            then.status(200)
                .header("content-type", "application/xml")
                .body(r#"<Response code="200" status="Updated announcement status"/>"#);
        });

        let tmp = first_announcement.read().await;
        m.assert();
        m.delete();

        tmp.unwrap();

        let m = mock_server.mock(|when, then| {
            when.method(PUT)
                .path(format!("{MYPLEX_ANNOUNCEMENTS}/{}", first_announcement.id))
                .query_param("read", "0");
            then.status(200)
                .header("content-type", "application/xml")
                .body(r#"<Response code="400" status="Some error"/>"#);
        });

        let tmp = first_announcement.unread().await;
        m.assert();

        let err = tmp.unwrap_err();

        assert!(matches!(err, Error::MyPlexApiError { code: 400, .. }));
    }
}

mod online {
    use super::fixtures::online::myplex;
    use plex_api::MyPlex;

    #[plex_api_test_helper::online_test_myplex]
    async fn list_announcements(#[future] myplex: MyPlex) {
        myplex.announcements().await.unwrap();
    }
}