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
60
61
62
63
64
65
66
67
68
pub mod auth;
pub mod search;
pub mod types;
use reqwest::Client;

pub const LOGIN_URL: &str = "https://api.twitter.com/1.1/onboarding/task.json";
pub const LOGOUR_URL: &str = "https://api.twitter.com/1.1/account/logout.json";
pub const GUEST_ACTIVE_URL: &str = "https://api.twitter.com/1.1/guest/activate.json";
pub const VERIFY_CREDENTIALS_URL: &str =
    "https://api.twitter.com/1.1/account/verify_credentials.json";
pub const OAUTH_URL: &str = "https://api.twitter.com/oauth2/token";
pub const BEARER_TOKEN: &str = "AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA";
pub const APP_CONSUMER_KEY: &str = "3nVuSoBZnx6U4vzUxf5w";
pub const APP_CONSUMER_SECRET: &str = "Bcs59EFbbsdF6Sl9Ng71smgStWEGwXXKSjYvPVt7qys";

pub struct ReAPI {
    client: Client,
    guest_token: String,
    csrf_token: String,
}

#[cfg(test)]
mod tests {
    use super::{
        types::{Data, Tweet},
        *,
    };

    async fn login(api: &mut ReAPI) -> Result<String, String> {
        dotenv::dotenv().ok();
        let name = std::env::var("TWITTER_USER_NAME").unwrap();
        let pwd = std::env::var("TWITTER_USER_PASSWORD").unwrap();
        api.login(&name, &pwd, "").await
    }

    async fn search(api: &mut ReAPI) -> Result<Data, reqwest::Error> {
        let content = "@shareverse_bot -filter:retweets";
        let limit = 50;
        let cursor = "";
        api.search(content, limit, cursor).await
    }

    async fn search_tweets(api: &mut ReAPI) -> Result<(Vec<Tweet>, String), reqwest::Error> {
        let content = "@shareverse_bot -filter:retweets";
        let limit = 50;
        let cursor = "";
        api.search_tweets(content, limit, cursor).await
    }

    #[tokio::test]
    async fn test() {
        let mut api = ReAPI::new();
        let loggined = login(&mut api).await;
        assert!(loggined.is_ok());

        let is_logged_in = api.is_logged_in().await;
        assert!(is_logged_in);

        let result = search(&mut api).await;
        assert!(result.is_ok());

        let res = search_tweets(&mut api).await;
        assert!(res.is_ok());

        let (tweets, _) = res.unwrap();
        assert!(tweets.len() > 0);
    }
}