allow filtering for had_errors
This commit is contained in:
parent
353ecd4c16
commit
b51b7a331d
4 changed files with 36 additions and 2 deletions
|
@ -8,9 +8,12 @@ use diesel::{PgConnection, QueryResult, RunQueryDsl};
|
|||
|
||||
pub struct ListBotMatches {
|
||||
pub bot_id: i32,
|
||||
pub opponent_id: Option<i32>,
|
||||
pub had_errors: Option<bool>,
|
||||
pub outcome: Option<BotMatchOutcome>,
|
||||
|
||||
pub opponent_id: Option<i32>,
|
||||
|
||||
// pagination options
|
||||
pub before: Option<NaiveDateTime>,
|
||||
pub after: Option<NaiveDateTime>,
|
||||
pub amount: i64,
|
||||
|
@ -29,6 +32,12 @@ impl QueryFragment<Pg> for ListBotMatches {
|
|||
"WHERE bot_id = "
|
||||
));
|
||||
out.push_bind_param::<Integer, _>(&self.bot_id)?;
|
||||
|
||||
if let Some(had_errors) = self.had_errors.as_ref() {
|
||||
out.push_sql(" AND match_players.had_errors = ");
|
||||
out.push_bind_param::<Bool, _>(had_errors)?;
|
||||
}
|
||||
|
||||
out.push_sql(") main_player ON matches.id = main_player.match_id");
|
||||
|
||||
if let Some(opponent_id) = self.opponent_id.as_ref() {
|
||||
|
@ -40,6 +49,7 @@ impl QueryFragment<Pg> for ListBotMatches {
|
|||
"WHERE bot_id = "
|
||||
));
|
||||
out.push_bind_param::<Integer, _>(opponent_id)?;
|
||||
|
||||
out.push_sql(") other_player ON matches.id = other_player.match_id");
|
||||
}
|
||||
|
||||
|
|
|
@ -177,6 +177,7 @@ pub fn list_bot_matches(
|
|||
bot_id: i32,
|
||||
opponent_id: Option<i32>,
|
||||
outcome: Option<BotMatchOutcome>,
|
||||
had_errors: Option<bool>,
|
||||
amount: i64,
|
||||
before: Option<NaiveDateTime>,
|
||||
after: Option<NaiveDateTime>,
|
||||
|
@ -184,8 +185,9 @@ pub fn list_bot_matches(
|
|||
) -> QueryResult<Vec<FullMatchData>> {
|
||||
let lbm = ListBotMatches {
|
||||
bot_id,
|
||||
opponent_id,
|
||||
outcome,
|
||||
had_errors,
|
||||
opponent_id,
|
||||
before,
|
||||
after,
|
||||
amount,
|
||||
|
|
|
@ -44,6 +44,7 @@ pub struct ListRecentMatchesParams {
|
|||
|
||||
bot: Option<String>,
|
||||
opponent: Option<String>,
|
||||
had_errors: Option<bool>,
|
||||
outcome: Option<BotMatchOutcome>,
|
||||
}
|
||||
|
||||
|
@ -85,6 +86,7 @@ pub async fn list_recent_matches(
|
|||
bot.id,
|
||||
opponent_id,
|
||||
params.outcome,
|
||||
params.had_errors,
|
||||
count,
|
||||
params.before,
|
||||
params.after,
|
||||
|
|
|
@ -389,5 +389,25 @@ async fn test_list_matches_with_errors() -> io::Result<()> {
|
|||
);
|
||||
assert_eq!(matches[0]["players"][1]["had_errors"].as_bool(), Some(true));
|
||||
|
||||
// test had_errors filter
|
||||
// TODO: maybe write a dedicated test for all list_matches options
|
||||
let response = app
|
||||
.call(
|
||||
Request::builder()
|
||||
.method(http::Method::GET)
|
||||
.header("Content-Type", "application/json")
|
||||
.uri(format!("/api/matches?bot=testbot&had_errors=false"))
|
||||
.body(Body::empty())
|
||||
.unwrap(),
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
assert_eq!(response.status(), StatusCode::OK);
|
||||
let body = hyper::body::to_bytes(response.into_body()).await.unwrap();
|
||||
let resp: JsonValue = serde_json::from_slice(&body).unwrap();
|
||||
|
||||
let matches = resp["matches"].as_array().unwrap();
|
||||
assert_eq!(matches.len(), 0);
|
||||
Ok(())
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue