mod query_test_utils;
#[cfg(test)]
mod array_ops_tests {
use super::query_test_utils::shared::*; use parse_rs::query::ParseQuery; use uuid::Uuid;
#[tokio::test]
async fn test_query_contained_in() {
let client = setup_client();
let class_name = format!("TestArrayOps_{}", Uuid::new_v4().simple());
cleanup_test_class(&client, &class_name).await;
let score1 = create_test_score(
&client,
&class_name,
10,
"PlayerContainedIn1",
None,
Some(vec!["alpha".to_string()]),
)
.await
.unwrap();
let score2 = create_test_score(
&client,
&class_name,
20,
"PlayerContainedIn2",
None,
Some(vec!["beta".to_string()]),
)
.await
.unwrap();
let score3 = create_test_score(
&client,
&class_name,
30,
"PlayerContainedIn3",
None,
Some(vec!["gamma".to_string()]),
)
.await
.unwrap();
let _score4 = create_test_score(
&client,
&class_name,
40,
"PlayerNotInList",
None,
Some(vec!["delta".to_string()]),
)
.await
.unwrap();
let mut query_player = ParseQuery::new(&class_name);
let player_names_to_find = vec![
"PlayerContainedIn1".to_string(),
"PlayerContainedIn3".to_string(),
];
query_player.contained_in("player_name", player_names_to_find);
let results_player: Vec<GameScore> = query_player
.find(&client)
.await
.expect("Query contained_in player_name failed");
assert_eq!(
results_player.len(),
2,
"Expected two players from the list"
);
assert!(results_player.contains(&score1));
assert!(results_player.contains(&score3));
assert!(!results_player.contains(&score2));
let mut query_score = ParseQuery::new(&class_name);
let scores_to_find = vec![20, 40]; query_score.contained_in("score", scores_to_find);
let results_score: Vec<GameScore> = query_score
.find(&client)
.await
.expect("Query contained_in score failed");
assert_eq!(
results_score.len(),
2,
"Expected two players with specified scores"
);
assert!(results_score.contains(&score2));
assert!(results_score
.iter()
.any(|s| s.player_name == "PlayerNotInList"));
let mut query_empty_list = ParseQuery::new(&class_name);
let empty_names: Vec<String> = vec![];
query_empty_list.contained_in("player_name", empty_names);
let results_empty: Vec<GameScore> = query_empty_list
.find(&client)
.await
.expect("Query contained_in empty list failed");
assert!(
results_empty.is_empty(),
"Expected no results for contained_in with empty list"
);
cleanup_test_class(&client, &class_name).await;
}
#[tokio::test]
async fn test_query_not_contained_in() {
let client = setup_client();
let class_name = format!("TestArrayOps_{}", Uuid::new_v4().simple());
cleanup_test_class(&client, &class_name).await;
let score1 = create_test_score(&client, &class_name, 10, "PlayerNotIn1", None, None)
.await
.unwrap();
let score2 = create_test_score(&client, &class_name, 20, "PlayerToExclude1", None, None)
.await
.unwrap();
let score3 = create_test_score(&client, &class_name, 30, "PlayerNotIn2", None, None)
.await
.unwrap();
let score4 = create_test_score(&client, &class_name, 40, "PlayerToExclude2", None, None)
.await
.unwrap();
let mut query_player = ParseQuery::new(&class_name);
let player_names_to_exclude = vec![
"PlayerToExclude1".to_string(),
"PlayerToExclude2".to_string(),
];
query_player.not_contained_in("player_name", player_names_to_exclude);
let results_player: Vec<GameScore> = query_player
.find(&client)
.await
.expect("Query not_contained_in player_name failed");
assert_eq!(
results_player.len(),
2,
"Expected two players not in the exclusion list"
);
assert!(results_player.contains(&score1));
assert!(results_player.contains(&score3));
assert!(!results_player.contains(&score2));
assert!(!results_player.contains(&score4));
let mut query_score = ParseQuery::new(&class_name);
let scores_to_exclude = vec![10, 30]; query_score.not_contained_in("score", scores_to_exclude);
let results_score: Vec<GameScore> = query_score
.find(&client)
.await
.expect("Query not_contained_in score failed");
assert_eq!(
results_score.len(),
2,
"Expected two players with scores not in the exclusion list"
);
assert!(results_score.contains(&score2));
assert!(results_score.contains(&score4));
let mut query_empty_list = ParseQuery::new(&class_name);
let empty_names: Vec<String> = vec![];
query_empty_list.not_contained_in("player_name", empty_names);
let results_empty: Vec<GameScore> = query_empty_list
.find(&client)
.await
.expect("Query not_contained_in empty list failed");
assert_eq!(
results_empty.len(),
4,
"Expected all results for not_contained_in with empty list"
);
cleanup_test_class(&client, &class_name).await;
}
#[tokio::test]
async fn test_query_contains_all() {
let client = setup_client();
let class_name = format!("TestArrayOps_{}", Uuid::new_v4().simple());
cleanup_test_class(&client, &class_name).await;
let score1_skills = vec![
"fast".to_string(),
"solo".to_string(),
"competitive".to_string(),
];
let score2_skills = vec!["solo".to_string(), "puzzle".to_string()];
let score3_skills = vec![
"fast".to_string(),
"co-op".to_string(),
"competitive".to_string(),
];
let score4_skills = vec!["fast".to_string(), "solo".to_string()];
let score1 = create_test_score(
&client,
&class_name,
100,
"PlayerSkills1",
None,
Some(score1_skills.clone()),
)
.await
.unwrap();
let score2 = create_test_score(
&client,
&class_name,
200,
"PlayerSkills2",
None,
Some(score2_skills.clone()),
)
.await
.unwrap();
let score3_obj = create_test_score(
&client,
&class_name,
300,
"PlayerSkills3",
None,
Some(score3_skills.clone()),
)
.await
.unwrap();
let score4 = create_test_score(
&client,
&class_name,
400,
"PlayerSkills4",
None,
Some(score4_skills.clone()),
)
.await
.unwrap();
let score1_id = score1.object_id.as_ref().unwrap().clone();
let debug_q_s1 = ParseQuery::new(&class_name);
let fetched_score1_debug: GameScore = debug_q_s1
.get(&score1_id, &client)
.await
.expect("Failed to fetch score1 for debug");
assert_eq!(
fetched_score1_debug
.skills
.as_ref()
.expect("Fetched score1 skills are None"),
&score1_skills,
"Skills for score1 on server do not match expected after creation"
);
let score3_obj_id = score3_obj.object_id.as_ref().unwrap().clone();
let debug_q_s3 = ParseQuery::new(&class_name);
let fetched_score3_debug: GameScore = debug_q_s3
.get(&score3_obj_id, &client)
.await
.expect("Failed to fetch score3_obj for debug");
assert_eq!(
fetched_score3_debug
.skills
.as_ref()
.expect("Fetched score3_obj skills are None"),
&score3_skills,
"Skills for score3_obj on server do not match expected after creation"
);
let mut query1 = ParseQuery::new(&class_name);
let skills_to_find1 = vec!["fast".to_string(), "competitive".to_string()];
query1.contains_all("skills", skills_to_find1);
let results1: Vec<GameScore> = query1
.find(&client)
.await
.expect("Query contains_all (fast, competitive) for skills failed");
assert_eq!(
results1.len(),
2,
"Expected two players with skills 'fast' AND 'competitive'"
);
assert!(results1.contains(&score1));
assert!(results1.iter().any(|s| s.object_id == score3_obj.object_id));
let mut query2 = ParseQuery::new(&class_name);
let skills_to_find2 = vec!["solo".to_string()];
query2.contains_all("skills", skills_to_find2);
let results2: Vec<GameScore> = query2
.find(&client)
.await
.expect("Query contains_all (solo) for skills failed");
assert_eq!(
results2.len(),
3,
"Expected three players with skill 'solo'"
);
assert!(results2.contains(&score1));
assert!(results2.contains(&score2));
assert!(results2.contains(&score4));
let mut query3 = ParseQuery::new(&class_name);
let skills_to_find3 = vec![
"fast".to_string(),
"solo".to_string(),
"competitive".to_string(),
];
query3.contains_all("skills", skills_to_find3);
let results3: Vec<GameScore> = query3
.find(&client)
.await
.expect("Query contains_all (fast, solo, competitive) for skills failed");
assert_eq!(
results3.len(),
1,
"Expected one player with skills 'fast', 'solo', AND 'competitive'"
);
assert_eq!(results3[0], score1);
let mut query4 = ParseQuery::new(&class_name);
let skills_to_find4 = vec!["puzzle".to_string(), "fast".to_string()];
query4.contains_all("skills", skills_to_find4);
let results4: Vec<GameScore> = query4
.find(&client)
.await
.expect("Query contains_all (puzzle, fast) for skills failed");
assert!(
results4.is_empty(),
"Expected no players with skills 'puzzle' AND 'fast'"
);
let score5_no_skills = create_test_score(
&client,
&class_name,
500,
"PlayerSkills5NoSkills",
None,
Some(vec![]),
)
.await
.unwrap();
let score5_id = score5_no_skills
.object_id
.as_ref()
.expect("score5_no_skills has no object_id")
.clone();
let direct_fetch_q = ParseQuery::new(&class_name);
let fetched_score5_direct: GameScore = direct_fetch_q
.get(&score5_id, &client)
.await
.expect("Failed to fetch score5_no_skills directly by ID");
dbg!(&fetched_score5_direct.skills);
let mut query5 = ParseQuery::new(&class_name);
let skills_to_find5: Vec<String> = vec![];
query5.contains_all("skills", skills_to_find5);
let _results5: Vec<GameScore> = query5
.find(&client)
.await
.expect("Query contains_all (empty list) for skills failed");
cleanup_test_class(&client, &class_name).await;
}
}