fedimint-core 0.13.0-beta.0

fedimint-core provides common code used by both client and server.
Documentation
use futures::future;
use tokio::test;

use super::UpdateMerge;

#[test]
async fn test_merge_successful() {
    let update_merge = UpdateMerge::default();

    let result: Result<(), ()> = update_merge
        .merge(async {
            let _ = future::ready(Ok::<(), ()>(())).await;
            Ok::<(), ()>(())
        })
        .await;

    assert!(result.is_ok(), "Merge should be successful");
}

#[test]
async fn test_merge_failed() {
    let update_merge = UpdateMerge::default();

    let result: Result<(), ()> = update_merge
        .merge(async {
            let _ = future::ready(Ok::<(), ()>(())).await;
            Err::<(), ()>(())
        })
        .await;

    assert!(result.is_err(), "Merge should fail");
}

#[tokio::test]
async fn test_concurrent_merge() {
    let update_merge = UpdateMerge::default();

    let fut1 = async {
        let _ = future::ready(Ok::<(), ()>(())).await;
        update_merge
            .merge(async {
                let _ = future::ready(Ok::<(), ()>(())).await;
                Ok::<(), ()>(())
            })
            .await
    };
    let fut2 = async {
        let _ = future::ready(Ok::<(), ()>(())).await;
        update_merge
            .merge(async {
                let _ = future::ready(Ok::<(), ()>(())).await;
                Ok::<(), ()>(())
            })
            .await
    };

    let (result1, result2) = tokio::join!(fut1, fut2);

    assert!(
        result1.is_ok() && result2.is_ok(),
        "Both merges should be successful"
    );
}