Fix loader panic on empty

This commit is contained in:
Chris Tsang 2023-09-22 17:31:15 +01:00
parent e61b066b59
commit 5a6acd6731
2 changed files with 17 additions and 15 deletions

View File

@ -382,7 +382,6 @@ where
#[cfg(test)] #[cfg(test)]
#[cfg(feature = "mock")] #[cfg(feature = "mock")]
mod tests { mod tests {
use super::*;
use crate::entity::prelude::*; use crate::entity::prelude::*;
use crate::tests_cfg::*; use crate::tests_cfg::*;
use crate::{DbBackend, MockDatabase, Statement, Transaction}; use crate::{DbBackend, MockDatabase, Statement, Transaction};

View File

@ -143,6 +143,10 @@ where
return Err(query_err("Relation is HasMany instead of HasOne")); return Err(query_err("Relation is HasMany instead of HasOne"));
} }
if self.is_empty() {
return Ok(Vec::new());
}
let keys: Vec<ValueTuple> = self let keys: Vec<ValueTuple> = self
.iter() .iter()
.map(|model: &M| extract_key(&rel_def.from_col, model)) .map(|model: &M| extract_key(&rel_def.from_col, model))
@ -194,6 +198,10 @@ where
return Err(query_err("Relation is HasOne instead of HasMany")); return Err(query_err("Relation is HasOne instead of HasMany"));
} }
if self.is_empty() {
return Ok(Vec::new());
}
let keys: Vec<ValueTuple> = self let keys: Vec<ValueTuple> = self
.iter() .iter()
.map(|model: &M| extract_key(&rel_def.from_col, model)) .map(|model: &M| extract_key(&rel_def.from_col, model))
@ -269,6 +277,10 @@ where
))); )));
} }
if self.is_empty() {
return Ok(Vec::new());
}
let pkeys: Vec<ValueTuple> = self let pkeys: Vec<ValueTuple> = self
.iter() .iter()
.map(|model: &M| extract_key(&via_rel.from_col, model)) .map(|model: &M| extract_key(&via_rel.from_col, model))
@ -587,14 +599,11 @@ mod tests {
); );
} }
// FIXME: load many with empty vector will panic #[tokio::test]
// #[tokio::test]
async fn test_load_many_empty() { async fn test_load_many_empty() {
use sea_orm::{entity::prelude::*, tests_cfg::*, DbBackend, MockDatabase}; use sea_orm::{entity::prelude::*, tests_cfg::*, DbBackend, MockDatabase};
let db = MockDatabase::new(DbBackend::Postgres) let db = MockDatabase::new(DbBackend::Postgres).into_connection();
.append_query_results([[fruit_model(1, Some(1)), fruit_model(2, Some(1))]])
.into_connection();
let cakes: Vec<cake::Model> = vec![]; let cakes: Vec<cake::Model> = vec![];
@ -610,9 +619,7 @@ mod tests {
#[tokio::test] #[tokio::test]
async fn test_load_many_to_many_base() { async fn test_load_many_to_many_base() {
use sea_orm::{ use sea_orm::{tests_cfg::*, DbBackend, IntoMockRow, LoaderTrait, MockDatabase};
entity::prelude::*, tests_cfg::*, DbBackend, IntoMockRow, LoaderTrait, MockDatabase,
};
let db = MockDatabase::new(DbBackend::Postgres) let db = MockDatabase::new(DbBackend::Postgres)
.append_query_results([ .append_query_results([
@ -633,9 +640,7 @@ mod tests {
#[tokio::test] #[tokio::test]
async fn test_load_many_to_many_complex() { async fn test_load_many_to_many_complex() {
use sea_orm::{ use sea_orm::{tests_cfg::*, DbBackend, IntoMockRow, LoaderTrait, MockDatabase};
entity::prelude::*, tests_cfg::*, DbBackend, IntoMockRow, LoaderTrait, MockDatabase,
};
let db = MockDatabase::new(DbBackend::Postgres) let db = MockDatabase::new(DbBackend::Postgres)
.append_query_results([ .append_query_results([
@ -675,9 +680,7 @@ mod tests {
#[tokio::test] #[tokio::test]
async fn test_load_many_to_many_empty() { async fn test_load_many_to_many_empty() {
use sea_orm::{ use sea_orm::{tests_cfg::*, DbBackend, IntoMockRow, LoaderTrait, MockDatabase};
entity::prelude::*, tests_cfg::*, DbBackend, IntoMockRow, LoaderTrait, MockDatabase,
};
let db = MockDatabase::new(DbBackend::Postgres) let db = MockDatabase::new(DbBackend::Postgres)
.append_query_results([ .append_query_results([