feat: add wasm testing (#63)

This commit is contained in:
Mingwei Samuel 2024-02-24 20:50:00 -08:00
parent 1d6b513aa7
commit 2f54bb6381
17 changed files with 115 additions and 73 deletions

View file

@ -36,6 +36,12 @@ deny-unknown-enum-variants = [ "deny-unknown-enum-variants-strings", "deny-unkno
deny-unknown-enum-variants-strings = []
deny-unknown-enum-variants-integers = []
__proxy = []
[[example]]
name = "proxy"
required-features = [ "__proxy" ]
[dependencies]
futures = "0.3"
log = "0.4"
@ -60,8 +66,16 @@ web-time = "1.0.0"
[dev-dependencies]
env_logger = "0.10.0"
fake_instant = "0.5.0"
hyper = { version = "0.14", features = [ "server" ] }
tokio = { version = "1", features = [ "full" ] }
tokio-shared-rt = "0.1"
tracing = "0.1"
tracing-subscriber = "0.2"
[target.'cfg(not(target_family = "wasm"))'.dev-dependencies]
hyper = { version = "0.14", features = [ "server" ] }
tokio = { version = "1", features = [ "macros", "rt-multi-thread" ] }
tokio-shared-rt = "0.1"
[target.'cfg(target_family = "wasm")'.dev-dependencies]
console_error_panic_hook = "0.1"
console_log = "1.0"
wasm-bindgen = "0.2"
wasm-bindgen-test = "0.3"

View file

@ -1,5 +1,3 @@
// #![deny(warnings)]
use std::convert::Infallible;
use std::sync::OnceLock;

View file

@ -4,7 +4,7 @@ use testutils::*;
const ROUTE: PlatformRoute = PlatformRoute::RU;
#[tokio_shared_rt::test]
#[riven_test]
async fn summoner_leagues() -> Result<(), String> {
let sum = riot_api()
.summoner_v4()

View file

@ -11,7 +11,7 @@ static MATCHES: &[&str] = &[
];
/// Account-v1
#[tokio_shared_rt::test]
#[riven_test]
async fn account_v1_getbyriotid_getbypuuid() -> Result<(), String> {
// Game name is case and whitespace insensitive.
// But tag cannot have spaces. (Is it case sensitive?).
@ -34,7 +34,7 @@ async fn account_v1_getbyriotid_getbypuuid() -> Result<(), String> {
}
/// Tournament stub test.
#[tokio_shared_rt::test]
#[riven_test]
async fn tournamentstub() -> Result<(), String> {
let ts = riot_api().tournament_stub_v5();
let provider_id = ts
@ -95,12 +95,12 @@ async fn tournamentstub() -> Result<(), String> {
}
}
#[tokio_shared_rt::test]
#[riven_test]
async fn match_v5_get_test() -> Result<(), String> {
match_v5_get(ROUTE, MATCHES).await
}
#[tokio_shared_rt::test]
#[riven_test]
async fn match_v5_get_timeline_test() -> Result<(), String> {
match_v5_get_timeline(ROUTE, MATCHES).await
}

View file

@ -23,7 +23,7 @@ static MATCHES: &[&str] = &[
];
/// Summoner tests.
#[tokio_shared_rt::test]
#[riven_test]
async fn summoner_get_kanjikana() -> Result<(), String> {
let p = riot_api()
.summoner_v4()
@ -39,7 +39,7 @@ async fn summoner_get_kanjikana() -> Result<(), String> {
// Failure cases.
// /// Make sure get_raw_response(...) with invalid path fails as expected.
// #[tokio_shared_rt::test]
// #[riven_test]
// async fn raw_response_invalid -> Result<(), String> {
// let p = riot_api().get_raw_response("summoner-v4.getBySummonerName", Region::JP.into(), "INVALID/PATH".to_owned(), None);
// let r = p.await;
@ -49,7 +49,7 @@ async fn summoner_get_kanjikana() -> Result<(), String> {
/// summoner_v4().get_by_summoner_name(...) normally returns an option.
/// If we use `get` (instead of `get_optional`) make sure it errors.
#[tokio_shared_rt::test]
#[riven_test]
async fn get_nonoptional_invalid() -> Result<(), String> {
let path_string = format!(
"/lol/summoner/v4/summoners/by-name/{}",
@ -67,7 +67,7 @@ async fn get_nonoptional_invalid() -> Result<(), String> {
}
/// Check invalid code, make sure 403 is handled as expected.
#[tokio_shared_rt::test]
#[riven_test]
async fn tournament_forbidden() -> Result<(), String> {
let p = riot_api()
.tournament_v5()
@ -84,7 +84,7 @@ async fn tournament_forbidden() -> Result<(), String> {
// Disabled: Caihonbbt no longer ranked.
// /// tft-league-v1.getLeagueEntriesForSummoner
// /// https://github.com/MingweiSamuel/Riven/issues/25
// #[tokio_shared_rt::test]
// #[riven_test]
// async fn tft_league_getleagueentriesforsummoner() -> Result<(), String> {
// let sp = riot_api().summoner_v4().get_by_summoner_name(ROUTE, "Caihonbbt");
// let sr = sp.await.map_err(|e| e.to_string())?.ok_or_else(|| "Failed to get \"Caihonbbt\"".to_owned())?;
@ -96,7 +96,7 @@ async fn tournament_forbidden() -> Result<(), String> {
/// tft-league-v1.getTopRatedLadder
/// https://github.com/MingweiSamuel/Riven/issues/24
#[tokio_shared_rt::test]
#[riven_test]
async fn tft_league_gettopratedladder() -> Result<(), String> {
let lp = riot_api()
.tft_league_v1()
@ -107,17 +107,17 @@ async fn tft_league_gettopratedladder() -> Result<(), String> {
}
/// ASIA regional tests
#[tokio_shared_rt::test]
#[riven_test]
async fn league_v4_match_v5_latest_combo_test() -> Result<(), String> {
league_v4_match_v5_latest_combo(ROUTE).await
}
#[tokio_shared_rt::test]
#[riven_test]
async fn match_v5_get_test() -> Result<(), String> {
match_v5_get(ROUTE.to_regional(), MATCHES).await
}
#[tokio_shared_rt::test]
#[riven_test]
async fn match_v5_get_timeline_test() -> Result<(), String> {
match_v5_get_timeline(ROUTE.to_regional(), MATCHES).await
}

View file

@ -22,12 +22,12 @@ static MATCHES: &[&str] = &[
"EUW1_6568537080",
];
#[tokio_shared_rt::test]
#[riven_test]
async fn match_v5_get_test() -> Result<(), String> {
match_v5_get(ROUTE, MATCHES).await
}
#[tokio_shared_rt::test]
#[riven_test]
async fn match_v5_get_timeline_test() -> Result<(), String> {
match_v5_get_timeline(ROUTE, MATCHES).await
}

View file

@ -6,7 +6,7 @@ const ROUTE: PlatformRoute = PlatformRoute::EUW1;
// Champion Mastery tests
#[tokio_shared_rt::test]
#[riven_test]
async fn championmastery_getscore_ma5tery() -> Result<(), String> {
let sum = riot_api()
.summoner_v4()
@ -30,7 +30,7 @@ async fn championmastery_getscore_ma5tery() -> Result<(), String> {
Ok(())
}
#[tokio_shared_rt::test]
#[riven_test]
async fn championmastery_getall_ma5tery() -> Result<(), String> {
let sum = riot_api()
.summoner_v4()
@ -51,7 +51,7 @@ async fn championmastery_getall_ma5tery() -> Result<(), String> {
}
/// https://github.com/RiotGames/developer-relations/issues/602
#[tokio_shared_rt::test]
#[riven_test]
async fn spectator_combo() -> Result<(), String> {
let featured_p = riot_api().spectator_v4().get_featured_games(ROUTE);
let featured = featured_p.await.map_err(|e| e.to_string())?;

View file

@ -14,20 +14,20 @@ static TFT_MATCHES: &[&str] = &[
"EUW1_6807630149",
];
#[tokio_shared_rt::test]
#[riven_test]
async fn tftmatchv1_get_list() -> Result<(), String> {
tft_match_v1_get(ROUTE.to_regional(), TFT_MATCHES).await
}
// /// Don't have acecess to tft-status-v1.
// #[tokio_shared_rt::test]
// #[riven_test]
// async fn tftstatusv1_getplatformdata() -> Result<(), String> {
// let p = riot_api().tft_status_v1().get_platform_data(ROUTE);
// let _s = p.await.map_err(|e| e.to_string())?;
// Ok(())
// }
#[tokio_shared_rt::test]
#[riven_test]
async fn tftleaguev1_gettopratedladder() -> Result<(), String> {
let p = riot_api()
.tft_league_v1()
@ -41,7 +41,7 @@ async fn tftleaguev1_gettopratedladder() -> Result<(), String> {
Ok(())
}
#[tokio_shared_rt::test]
#[riven_test]
async fn tftmatchv1_getmatch() -> Result<(), String> {
let p = riot_api()
.tft_match_v1()
@ -53,7 +53,7 @@ async fn tftmatchv1_getmatch() -> Result<(), String> {
Ok(())
}
#[tokio_shared_rt::test]
#[riven_test]
async fn tftsummonerv1_getbyname() -> Result<(), String> {
let p = riot_api()
.tft_summoner_v1()
@ -65,7 +65,7 @@ async fn tftsummonerv1_getbyname() -> Result<(), String> {
Ok(())
}
#[tokio_shared_rt::test]
#[riven_test]
async fn tftsummonerv1_getbyname_none() -> Result<(), String> {
let p = riot_api()
.tft_summoner_v1()
@ -75,7 +75,7 @@ async fn tftsummonerv1_getbyname_none() -> Result<(), String> {
}
/// Get top rated player, get some of their matches.
#[tokio_shared_rt::test]
#[riven_test]
async fn tft_combo() -> Result<(), String> {
let top_players = riot_api()
.tft_league_v1()

View file

@ -1,6 +1,6 @@
mod testutils;
use riven::consts::*;
use testutils::riot_api;
use testutils::{riot_api, riven_test};
const ROUTE: PlatformRoute = PlatformRoute::LA1;
@ -9,7 +9,7 @@ const CHALLENGE_ID_ARAM_1K_DPM: i64 = 101101;
/// /lol/challenges/v1/challenges/{challengeId}/leaderboards/by-level/{level}
/// /lol/challenges/v1/player-data/{puuid}
#[tokio_shared_rt::test]
#[riven_test]
async fn lol_challenges_v1_leaderboards_playerdata() -> Result<(), String> {
let challenge_id = CHALLENGE_ID_ARAM_1K_DPM;
let leaderboard = riot_api()
@ -50,7 +50,7 @@ async fn lol_challenges_v1_leaderboards_playerdata() -> Result<(), String> {
/// /lol/challenges/v1/challenges/config
/// /lol/challenges/v1/challenges/{challengeId}/config
#[tokio_shared_rt::test]
#[riven_test]
async fn lol_challenges_v1_check_configs() -> Result<(), String> {
let challenges = riot_api()
.lol_challenges_v1()
@ -84,7 +84,7 @@ async fn lol_challenges_v1_check_configs() -> Result<(), String> {
/// /lol/challenges/v1/challenges/percentiles
/// /lol/challenges/v1/challenges/{challengeId}/percentiles
#[tokio_shared_rt::test]
#[riven_test]
async fn lol_challenges_v1_check_percentiles() -> Result<(), String> {
// Check all percentiles.
let percentiles = riot_api()

View file

@ -19,7 +19,7 @@ const ROUTE: PlatformRoute = PlatformRoute::NA1;
// Summoner tests.
#[tokio_shared_rt::test]
#[riven_test]
async fn summoner_double() -> Result<(), String> {
let l1p = riot_api()
.summoner_v4()
@ -39,7 +39,7 @@ async fn summoner_double() -> Result<(), String> {
Ok(())
}
#[tokio_shared_rt::test]
#[riven_test]
async fn champion_getrotation() -> Result<(), String> {
let p = riot_api().champion_v3().get_champion_info(ROUTE);
let d = p.await.map_err(|e| e.to_string())?;
@ -52,7 +52,7 @@ async fn champion_getrotation() -> Result<(), String> {
Ok(())
}
#[tokio_shared_rt::test]
#[riven_test]
async fn leagueexp_get() -> Result<(), String> {
let p = riot_api().league_exp_v4().get_league_entries(
ROUTE,
@ -68,7 +68,7 @@ async fn leagueexp_get() -> Result<(), String> {
Ok(())
}
#[tokio_shared_rt::test]
#[riven_test]
async fn champion_mastery_v4() -> Result<(), String> {
let summoner = riot_api()
.summoner_v4()
@ -87,7 +87,7 @@ async fn champion_mastery_v4() -> Result<(), String> {
// Commented out, requires special API key.
// /// LOR
// #[tokio_shared_rt::test]
// #[riven_test]
// async fn async fn lor_ranked_get_leaderboards() -> Result<(), String> {
// let future = riot_api().lor_ranked_v1().get_leaderboards(Region::AMERICAS);
// let _leaderboard = future.await.map_err(|e| e.to_string())?;
@ -96,7 +96,7 @@ async fn champion_mastery_v4() -> Result<(), String> {
// CLASH
#[tokio_shared_rt::test]
#[riven_test]
async fn clash_get_tournaments() -> Result<(), String> {
let p = riot_api().clash_v1().get_tournaments(ROUTE);
let tours = p.await.map_err(|e| e.to_string())?;
@ -108,7 +108,7 @@ async fn clash_get_tournaments() -> Result<(), String> {
Ok(())
}
#[tokio_shared_rt::test]
#[riven_test]
async fn clash_get_team_by_id_invalid() -> Result<(), String> {
let p = riot_api()
.clash_v1()
@ -118,7 +118,7 @@ async fn clash_get_team_by_id_invalid() -> Result<(), String> {
Ok(())
}
#[tokio_shared_rt::test]
#[riven_test]
async fn status() -> Result<(), String> {
let p = riot_api().lol_status_v4().get_platform_data(ROUTE);
let status = p.await.map_err(|e| e.to_string())?;

View file

@ -4,7 +4,7 @@ use testutils::*;
const ROUTE: PlatformRoute = PlatformRoute::PH2;
#[tokio_shared_rt::test]
#[riven_test]
async fn status() -> Result<(), String> {
let p = riot_api().lol_status_v4().get_platform_data(ROUTE);
let status = p.await.map_err(|e| e.to_string())?;

View file

@ -4,7 +4,7 @@ use testutils::*;
const ROUTE: PlatformRoute = PlatformRoute::SG2;
#[tokio_shared_rt::test]
#[riven_test]
async fn status() -> Result<(), String> {
let p = riot_api().lol_status_v4().get_platform_data(ROUTE);
let status = p.await.map_err(|e| e.to_string())?;

View file

@ -4,7 +4,7 @@ use testutils::*;
const ROUTE: PlatformRoute = PlatformRoute::TH2;
#[tokio_shared_rt::test]
#[riven_test]
async fn status() -> Result<(), String> {
let p = riot_api().lol_status_v4().get_platform_data(ROUTE);
let status = p.await.map_err(|e| e.to_string())?;

View file

@ -1,37 +1,33 @@
mod testutils;
use futures::future::join_all;
use riven::consts::*;
use riven::models::summoner_v4::Summoner;
use testutils::riot_api;
use testutils::{riot_api, riven_test};
const ROUTE: PlatformRoute = PlatformRoute::TR1;
#[tokio_shared_rt::test]
#[riven_test]
async fn league_summoner_bulk_test() -> Result<(), String> {
let p = riot_api()
.league_v4()
.get_challenger_league(ROUTE, QueueType::RANKED_SOLO_5x5);
// let p = future_start(p);
let ll = p.await.map_err(|e| e.to_string())?;
let league_list = p.await.map_err(|e| e.to_string())?;
println!("{:?} Challenger {} entries.", ROUTE, ll.entries.len());
println!(
"{:?} Challenger {} entries.",
ROUTE,
league_list.entries.len()
);
let sl = ll
.entries
.iter()
.take(50)
.map(|entry| {
riot_api()
.summoner_v4()
.get_by_summoner_id(ROUTE, &entry.summoner_id)
})
.map(tokio::spawn)
.collect::<Vec<_>>();
let summoner_vec = join_all(league_list.entries.iter().take(50).map(|entry| {
riot_api()
.summoner_v4()
.get_by_summoner_id(ROUTE, &entry.summoner_id)
}))
.await;
for (i, s) in sl.into_iter().enumerate() {
let summoner: Summoner = s
.await
.expect("tokio::spawn join error")
.map_err(|e| e.to_string())?;
for (i, s) in summoner_vec.into_iter().enumerate() {
let summoner: Summoner = s.map_err(|e| e.to_string())?;
println!("{}: {}", i + 1, summoner.name);
}

View file

@ -1,10 +1,10 @@
mod testutils;
use riven::consts::*;
use testutils::riot_api;
use testutils::{riot_api, riven_test};
const ROUTE: ValPlatformRoute = ValPlatformRoute::LATAM;
#[tokio_shared_rt::test]
#[riven_test]
async fn val_content_ranked_test() -> Result<(), String> {
let p = riot_api()
.val_content_v1()

View file

@ -4,7 +4,7 @@ use testutils::*;
const ROUTE: PlatformRoute = PlatformRoute::VN2;
#[tokio_shared_rt::test]
#[riven_test]
async fn status() -> Result<(), String> {
let p = riot_api().lol_status_v4().get_platform_data(ROUTE);
let status = p.await.map_err(|e| e.to_string())?;

View file

@ -1,10 +1,41 @@
#![allow(dead_code)]
#![allow(dead_code, unused_imports)]
#[cfg(not(target_family = "wasm"))]
use std::env::var as env_var;
use std::future::Future;
use std::sync::OnceLock;
use futures::try_join;
use riven::consts::{PlatformRoute, QueueType, RegionalRoute};
use riven::{RiotApi, RiotApiConfig};
#[cfg(not(target_family = "wasm"))]
pub use tokio_shared_rt::test as riven_test;
#[cfg(target_family = "wasm")]
pub use wasm_bindgen_test::wasm_bindgen_test as riven_test;
#[cfg(target_family = "wasm")]
#[allow(non_upper_case_globals)]
pub fn env_var<K: AsRef<str>>(key: K) -> Result<String, std::env::VarError> {
use wasm_bindgen::prelude::wasm_bindgen;
#[wasm_bindgen]
extern "C" {
type Process;
static process: Process;
type Env;
#[wasm_bindgen(method, getter)]
fn env(this: &Process) -> Env;
#[wasm_bindgen(method, structural, indexing_getter)]
fn get(this: &Env, field: &str) -> Option<String>;
}
process
.env()
.get(key.as_ref())
.ok_or(std::env::VarError::NotPresent)
}
#[macro_export]
macro_rules! rassert {
@ -40,9 +71,12 @@ static RIOT_API: OnceLock<RiotApi> = OnceLock::new();
pub fn riot_api() -> &'static RiotApi {
RIOT_API.get_or_init(|| {
// Initialize logger here, as a convenient trigger spot.
#[cfg(not(target_family = "wasm"))]
env_logger::init();
#[cfg(target_family = "wasm")]
console_log::init_with_level(log::Level::Info).unwrap();
let api_key = std::env::var("RGAPI_KEY")
let api_key = env_var("RGAPI_KEY")
.ok()
.or_else(|| {
use std::iter::FromIterator;
@ -112,7 +146,7 @@ pub async fn league_v4_match_v5_latest_combo(route: PlatformRoute) -> Result<(),
let mut match_ids: Vec<String> = match_ids.into_iter().flatten().collect();
match_ids.sort_unstable_by(|a, b| a.cmp(b).reverse()); // Sort descending, so latest are first.
let _ = tokio::try_join!(
let _ = try_join!(
match_v5_get(route.to_regional(), match_ids.iter().take(NUM_MATCHES)),
match_v5_get_timeline(route.to_regional(), match_ids.iter().take(NUM_MATCHES)),
)?;