use crate::Entity;
use std::fmt::Debug;
pub async fn create<E>(mut instance: E, pool: &crate::Pool)
where
    E: Entity + Clone + Debug + Eq + Send,
{
    assert!(
        E::find(instance.pk(), pool).await.is_err(),
        "instance was found (find) before it was created"
    );
    assert!(
        E::find_optional(instance.pk(), pool)
            .await
            .unwrap()
            .is_none(),
        "instance was found (find_optional) before it was created"
    );
    instance.create(pool).await.expect("insertion did not work");
    let retrieved = E::find(instance.pk(), pool)
        .await
        .expect("instance not found after insertion");
    assert_eq!(instance, retrieved);
}
pub async fn read<E>(mut instance: E, pool: &crate::Pool)
where
    E: Entity + Clone + Debug + Eq + Send,
{
    assert!(
        E::find(instance.pk(), pool).await.is_err(),
        "instance was found (find) after deletion"
    );
    assert!(
        E::find_optional(instance.pk(), pool)
            .await
            .unwrap()
            .is_none(),
        "instance was found (find_optional) after deletion"
    );
    instance.create(pool).await.expect("insertion did not work");
    let retrieved = E::find(instance.pk(), pool)
        .await
        .expect("instance not found after insertion");
    assert_eq!(instance, retrieved);
}
pub async fn update<E>(mut instance: E, updates: Vec<E>, pool: &crate::Pool)
where
    E: Entity + Clone + Debug + Eq + Send,
{
    instance.save(pool).await.expect("insertion did not work");
    for mut update in updates {
        update
            .update(pool)
            .await
            .expect("updating the instance did not work");
        instance
            .reload(pool)
            .await
            .expect("reloading the instance did not work");
        assert_eq!(instance, update);
        let retrieved = E::find(instance.pk(), pool)
            .await
            .expect("instance not found after update");
        assert_eq!(instance, retrieved);
        let retrieved = E::find_optional(instance.pk(), pool)
            .await
            .unwrap()
            .expect("instance not found (find_optional) after update");
        assert_eq!(instance, retrieved);
    }
}
pub async fn delete<E>(mut instance: E, pool: &crate::Pool)
where
    E: Entity + Clone + Debug + Eq + Send,
{
    instance.create(pool).await.expect("insertion did not work");
    instance.delete(pool).await.expect("deletion did not work");
    instance
        .reload(pool)
        .await
        .expect_err("instance could be reloaded from db after deletion");
    assert!(
        E::find(instance.pk(), pool).await.is_err(),
        "instance was found (find) after deletion"
    );
    assert!(
        E::find_optional(instance.pk(), pool)
            .await
            .unwrap()
            .is_none(),
        "instance was found (find_optional) after deletion"
    );
    instance.create(pool).await.expect("insertion did not work");
    E::delete_by(instance.pk(), pool)
        .await
        .expect("deletion did not work");
    instance
        .reload(pool)
        .await
        .expect_err("instance could be reloaded from db after deletion");
}