mod common;
use ankurah::{policy::DEFAULT_CONTEXT as c, Node, PermissiveAgent};
use anyhow::Result;
use common::proto::{Attested, Event};
use std::sync::Arc;
#[tokio::test]
async fn postgres_duplicate_event_idempotency() -> Result<()> {
use common::*;
let (_container, storage_engine) = create_postgres_container().await?;
let node = Node::new_durable(Arc::new(storage_engine), PermissiveAgent::new());
node.system.create().await?;
let context = node.context(c)?;
let trx = context.begin();
let album = trx.create(&Album { name: "Test Album".to_owned(), year: "2024".to_owned() }).await?;
let album_id = album.id();
trx.commit().await?;
let collection = context.collection(&"album".into()).await?;
let events = collection.dump_entity_events(album_id).await?;
assert_eq!(events.len(), 1, "Should have exactly one event");
let event: Attested<Event> = events[0].clone();
let result1 = collection.add_event(&event).await;
assert!(result1.is_ok(), "First duplicate insert should succeed (idempotent): {:?}", result1.err());
assert_eq!(result1.unwrap(), false, "Should return false since event already exists");
let result2 = collection.add_event(&event).await;
assert!(result2.is_ok(), "Second duplicate insert should succeed (idempotent): {:?}", result2.err());
assert_eq!(result2.unwrap(), false, "Should return false since event already exists");
let events_after = collection.dump_entity_events(album_id).await?;
assert_eq!(events_after.len(), 1, "Should still have exactly one event");
Ok(())
}