diff --git a/contracts/invoice_nft/src/lib.rs b/contracts/invoice_nft/src/lib.rs index 58af6c0..1058e2d 100644 --- a/contracts/invoice_nft/src/lib.rs +++ b/contracts/invoice_nft/src/lib.rs @@ -932,6 +932,7 @@ mod tests { &due_date, &ipfs_cid, &risk_score, + &None, ) } @@ -999,7 +1000,7 @@ mod tests { &1_000_000_000i128, &Symbol::new(&env, "USDC"), &due_date, - &ipfs_cid, + &cid, &25u32, &None, ); assert_eq!(id, 1); @@ -1022,7 +1023,7 @@ mod tests { let due_date = env.ledger().timestamp() + 86_400 * 2; let result = client.try_mint_invoice( &sme, &debtor_hash, &0i128, - &Symbol::new(&env, "USDC"), &due_date, &ipfs_cid, &10u32, &None, + &Symbol::new(&env, "USDC"), &due_date, &cid, &10u32, &None, ); assert_eq!(result.unwrap_err().unwrap(), KoraError::InvalidAmount); } @@ -1036,7 +1037,7 @@ mod tests { let due_date = env.ledger().timestamp() + 86_400 * 2; let result = client.try_mint_invoice( &sme, &debtor_hash, &-1_000_000_000i128, - &Symbol::new(&env, "USDC"), &due_date, &ipfs_cid, &10u32, &None, + &Symbol::new(&env, "USDC"), &due_date, &cid, &10u32, &None, ); assert_eq!(result.unwrap_err().unwrap(), KoraError::InvalidAmount); } @@ -1050,7 +1051,7 @@ mod tests { let due_date = env.ledger().timestamp() - 1; let result = client.try_mint_invoice( &sme, &debtor_hash, &1_000_000_000i128, - &Symbol::new(&env, "USDC"), &due_date, &ipfs_cid, &10u32, &None, + &Symbol::new(&env, "USDC"), &due_date, &cid, &10u32, &None, ); assert_eq!(result.unwrap_err().unwrap(), KoraError::InvalidDueDate); } @@ -1064,7 +1065,7 @@ mod tests { let due_date = env.ledger().timestamp(); // equal to now — not strictly future let result = client.try_mint_invoice( &sme, &debtor_hash, &1_000_000_000i128, - &Symbol::new(&env, "USDC"), &due_date, &ipfs_cid, &10u32, &None, + &Symbol::new(&env, "USDC"), &due_date, &cid, &10u32, &None, ); assert_eq!(result.unwrap_err().unwrap(), KoraError::InvalidDueDate); } @@ -1078,7 +1079,7 @@ mod tests { let due_date = env.ledger().timestamp() + 86_400 * 2; let result = client.try_mint_invoice( &sme, &debtor_hash, &1_000_000_000i128, - &Symbol::new(&env, "USDC"), &due_date, &ipfs_cid, &101u32, &None, + &Symbol::new(&env, "USDC"), &due_date, &cid, &101u32, &None, ); assert_eq!(result.unwrap_err().unwrap(), KoraError::InvalidRiskScore); } @@ -1092,7 +1093,7 @@ mod tests { let due_date = env.ledger().timestamp() + 86_400 * 2; let result = client.try_mint_invoice( &sme, &debtor_hash, &1_000_000_000i128, - &Symbol::new(&env, "USDC"), &due_date, &ipfs_cid, &10u32, &None, + &Symbol::new(&env, "USDC"), &due_date, &cid, &10u32, &None, ); assert_eq!(result.unwrap_err().unwrap(), KoraError::EmptyBytes); } @@ -1100,8 +1101,7 @@ mod tests { #[test] fn test_mint_multiple_invoices_increments_id() { let (env, _admin, client) = setup(); - let sme1 = Address::generate(&env); - let sme2 = Address::generate(&env); + let sme = Address::generate(&env); let debtor_hash = Bytes::from_slice(&env, &[1u8; 32]); let cid = ipfs_cid(&env); let due_date = env.ledger().timestamp() + 86_400 * 30; @@ -1111,7 +1111,7 @@ mod tests { &1_000_000_000i128, &Symbol::new(&env, "USDC"), &due_date, - &ipfs_cid, + &cid, &10u32, &None, ); let id2 = client.mint_invoice( @@ -1120,7 +1120,7 @@ mod tests { &2_000_000_000i128, &Symbol::new(&env, "USDC"), &due_date, - &ipfs_cid, + &cid, &20u32, &None, ); assert_eq!(id1, 1); @@ -1138,7 +1138,7 @@ mod tests { let large_amount = i128::MAX; let id = client.mint_invoice( &sme, &debtor_hash, &large_amount, - &Symbol::new(&env, "USDC"), &due_date, &ipfs_cid, &50u32, &None, + &Symbol::new(&env, "USDC"), &due_date, &cid, &50u32, &None, ); assert_eq!(client.get_invoice(&id).amount, large_amount); } @@ -1165,7 +1165,7 @@ mod tests { for (score, expected_tier) in &test_cases { let id = client.mint_invoice( &sme, &debtor_hash, &1_000_000_000i128, - &Symbol::new(&env, "USDC"), &due_date, &cid, score, + &Symbol::new(&env, "USDC"), &due_date, &cid, score, &None, ); assert_eq!(client.get_invoice(&id).risk_tier, *expected_tier); } @@ -1239,16 +1239,6 @@ mod tests { assert_eq!(result.unwrap_err().unwrap(), KoraError::InvalidInvoiceStatus); } - let id = client.mint_invoice( - &sme, - &debtor_hash, - &1_000_000_000i128, - &Symbol::new(&env, "USDC"), - &due_date, - &ipfs_cid, - &10u32, &None, - ); - #[test] fn test_set_funded_invalid_status_fails() { let (env, _admin, client) = setup(); @@ -1261,23 +1251,11 @@ mod tests { #[test] fn test_set_repaid_invalid_status_fails() { let (env, _admin, client) = setup(); - let sme = Address::generate(&env); - let debtor_hash = Bytes::from_slice(&env, &[1u8; 32]); - let ipfs_cid = String::from_str( - &env, - "bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi", - ); - let due_date = env.ledger().timestamp() + 86_400 * 30; - - let id = client.mint_invoice( - &sme, - &debtor_hash, - &1_000_000_000i128, - &Symbol::new(&env, "USDC"), - &due_date, - &ipfs_cid, - &10u32, &None, - ); + let id = mint_default(&env, &client, 10u32); + let pool = Address::generate(&env); + let result = client.try_set_repaid(&pool, &id); // Created → Repaid skips Listed/Funded + assert_eq!(result.unwrap_err().unwrap(), KoraError::InvalidInvoiceStatus); + } #[test] fn test_set_funded_idempotent_fails() { @@ -1331,7 +1309,7 @@ mod tests { &1_000_000_000i128, &Symbol::new(&env, "USDC"), &due_date, - &ipfs_cid, + &cid, &10u32, &None, ); let marketplace = Address::generate(&env); @@ -1356,7 +1334,7 @@ mod tests { &1_000_000_000i128, &Symbol::new(&env, "USDC"), &due_date, - &ipfs_cid, + &cid, &10u32, &None, ); let marketplace = Address::generate(&env); @@ -1381,7 +1359,7 @@ mod tests { &1_000_000_000i128, &Symbol::new(&env, "USDC"), &due_date, - &ipfs_cid, + &cid, &10u32, &None, ); let marketplace = Address::generate(&env); @@ -1408,7 +1386,7 @@ mod tests { &large_amount, &Symbol::new(&env, "USDC"), &due_date, - &ipfs_cid, + &cid, &50u32, &None, ); assert_eq!(client.get_invoice(&id).amount, large_amount); @@ -1427,7 +1405,7 @@ mod tests { &1_000_000_000i128, &Symbol::new(&env, "USDC"), &due_date, - &ipfs_cid, + &cid, &10u32, &None, ); let id2 = client.mint_invoice( @@ -1436,7 +1414,7 @@ mod tests { &2_000_000_000i128, &Symbol::new(&env, "EURC"), &due_date, - &ipfs_cid, + &cid, &20u32, &None, ); assert_eq!(client.get_invoice(&id1).currency, Symbol::new(&env, "USDC")); @@ -1485,7 +1463,7 @@ mod tests { &1_000_000_000i128, &Symbol::new(&env, "USDC"), &due_date, - &ipfs_cid, + &cid, &10u32, &None, ); let invoice = client.get_invoice(&id); @@ -1521,7 +1499,7 @@ mod tests { &1_000_000_000i128, &Symbol::new(&env, "USDC"), &due_date, - &ipfs_cid, + &cid, &10u32, &None, ); let marketplace = Address::generate(&env); @@ -1559,13 +1537,8 @@ mod tests { &ipfs_cid, &10u32, &None, ); - - let marketplace = Address::generate(&env); - client.set_listed(&marketplace, &id); - - let pool = Address::generate(&env); - client.set_funded(&pool, &id); - client.set_repaid(&pool, &id); + assert_eq!(client.next_id(), 2); + } #[test] fn test_invoice_count_increments() { @@ -1580,30 +1553,10 @@ mod tests { #[test] fn test_invalid_status_transition_created_to_funded_fails() { let (env, _admin, client) = setup(); - let sme = Address::generate(&env); - let debtor_hash = Bytes::from_slice(&env, &[1u8; 32]); - let ipfs_cid = String::from_str( - &env, - "bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi", - ); - let due_date = env.ledger().timestamp() + 86_400; - - let id = client.mint_invoice( - &sme, - &debtor_hash, - &1_000_000_000i128, - &Symbol::new(&env, "USDC"), - &due_date, - &ipfs_cid, - &10u32, &None, - ); - let id2 = client.mint_invoice( - &sme, &debtor_hash, &2_000_000_000i128, - &Symbol::new(&env, "EURC"), &due_date, &ipfs_cid, &20u32, &None, - ); - - assert_eq!(client.get_invoice(&id1).currency, Symbol::new(&env, "USDC")); - assert_eq!(client.get_invoice(&id2).currency, Symbol::new(&env, "EURC")); + let id = mint_default(&env, &client, 10u32); + let pool = Address::generate(&env); + let result = client.try_set_funded(&pool, &id); // Created → Funded skips Listed + assert_eq!(result.unwrap_err().unwrap(), KoraError::InvalidInvoiceStatus); } #[test] @@ -1630,7 +1583,7 @@ mod tests { &1_000_000_000i128, &Symbol::new(&env, "USDC"), &due_date, - &ipfs_cid, + &cid, &20u32, &None, ); assert_eq!(client.get_invoice(&id1).risk_tier, RiskTier::AAA); @@ -1640,7 +1593,7 @@ mod tests { &1_000_000_000i128, &Symbol::new(&env, "USDC"), &due_date, - &ipfs_cid, + &cid, &21u32, &None, ); assert_eq!(client.get_invoice(&id2).risk_tier, RiskTier::AA); @@ -1696,7 +1649,7 @@ mod tests { // Perform migration client.migrate(&admin); - let invoice_after = client.get_invoice(&id); + let invoice_after = client.get_invoice(&invoice_id); assert_eq!(invoice_before.id, invoice_after.id); assert_eq!(invoice_before.sme, invoice_after.sme); assert_eq!(invoice_before.amount, invoice_after.amount); @@ -1764,6 +1717,11 @@ mod tests { let (env, admin, client) = setup(); client.migrate(&admin); + let sme = Address::generate(&env); + let debtor_hash = Bytes::from_slice(&env, &[1u8; 32]); + let cid = ipfs_cid(&env); + let due_date = env.ledger().timestamp() + 86_400 * 30; + // Verify we can still mint and transition invoices after migration let invoice_id = client.mint_invoice( &sme, @@ -1771,17 +1729,16 @@ mod tests { &1_000_000_000i128, &Symbol::new(&env, "USDC"), &due_date, - &ipfs_cid, + &cid, &50u32, &None, ); let invoice = client.get_invoice(&invoice_id); assert_eq!(invoice.status, InvoiceStatus::Created); - // Transition through state machine let marketplace = Address::generate(&env); - client.set_listed(&marketplace, &id); - assert_eq!(client.get_invoice(&id).status, InvoiceStatus::Listed); + client.set_listed(&marketplace, &invoice_id); + assert_eq!(client.get_invoice(&invoice_id).status, InvoiceStatus::Listed); } // ── credit limit (outstanding exposure) ─────────────────────────────────── @@ -1800,7 +1757,7 @@ mod tests { client.mint_invoice( &sme, &debtor_hash, &1_000_000_000i128, - &Symbol::new(&env, "USDC"), &due_date, &ipfs_cid, &10u32, + &Symbol::new(&env, "USDC"), &due_date, &ipfs_cid, &10u32, &None, ); assert_eq!(client.get_outstanding_exposure(&sme), 1_000_000_000i128); } @@ -1817,7 +1774,7 @@ mod tests { let due_date = env.ledger().timestamp() + 86_400 * 30; let id = client.mint_invoice( &sme, &debtor_hash, &1_000_000_000i128, - &Symbol::new(&env, "USDC"), &due_date, &ipfs_cid, &10u32, + &Symbol::new(&env, "USDC"), &due_date, &ipfs_cid, &10u32, &None, ); let mp = Address::generate(&env); let pool = Address::generate(&env); @@ -1839,7 +1796,7 @@ mod tests { let due_date = env.ledger().timestamp() + 86_400 * 30; let id = client.mint_invoice( &sme, &debtor_hash, &1_000_000_000i128, - &Symbol::new(&env, "USDC"), &due_date, &ipfs_cid, &10u32, + &Symbol::new(&env, "USDC"), &due_date, &ipfs_cid, &10u32, &None, ); client.withdraw_invoice(&sme, &id); assert_eq!(client.get_outstanding_exposure(&sme), 0i128); @@ -1859,7 +1816,7 @@ mod tests { let due_date = env.ledger().timestamp() + 86_400 * 30; let id = client.mint_invoice( &sme, &debtor_hash, &1_000_000_000i128, - &Symbol::new(&env, "USDC"), &due_date, &ipfs_cid, &10u32, + &Symbol::new(&env, "USDC"), &due_date, &ipfs_cid, &10u32, &None, ); let new_debtor = Bytes::from_slice(&env, &[2u8; 32]); @@ -1888,7 +1845,7 @@ mod tests { let due_date = env.ledger().timestamp() + 86_400 * 30; let id = client.mint_invoice( &sme, &debtor_hash, &1_000_000_000i128, - &Symbol::new(&env, "USDC"), &due_date, &ipfs_cid, &10u32, + &Symbol::new(&env, "USDC"), &due_date, &ipfs_cid, &10u32, &None, ); let result = client.try_amend_invoice( &other, &id, &debtor_hash, &1_000_000_000i128, &due_date, &ipfs_cid, &10u32, @@ -1908,7 +1865,7 @@ mod tests { let due_date = env.ledger().timestamp() + 86_400 * 30; let id = client.mint_invoice( &sme, &debtor_hash, &1_000_000_000i128, - &Symbol::new(&env, "USDC"), &due_date, &ipfs_cid, &10u32, + &Symbol::new(&env, "USDC"), &due_date, &ipfs_cid, &10u32, &None, ); let marketplace = Address::generate(&env); client.set_listed(&marketplace, &id); @@ -1932,7 +1889,7 @@ mod tests { let due_date = env.ledger().timestamp() + 86_400 * 30; let id = client.mint_invoice( &sme, &debtor_hash, &1_000_000_000i128, - &Symbol::new(&env, "USDC"), &due_date, &ipfs_cid, &10u32, + &Symbol::new(&env, "USDC"), &due_date, &ipfs_cid, &10u32, &None, ); client.withdraw_invoice(&sme, &id); let result = client.try_get_invoice(&id); @@ -1952,7 +1909,7 @@ mod tests { let due_date = env.ledger().timestamp() + 86_400 * 30; let id = client.mint_invoice( &sme, &debtor_hash, &1_000_000_000i128, - &Symbol::new(&env, "USDC"), &due_date, &ipfs_cid, &10u32, + &Symbol::new(&env, "USDC"), &due_date, &ipfs_cid, &10u32, &None, ); let result = client.try_withdraw_invoice(&other, &id); assert_eq!(result.unwrap_err().unwrap(), KoraError::NotInvoiceOwner); @@ -1970,7 +1927,7 @@ mod tests { let due_date = env.ledger().timestamp() + 86_400 * 30; let id = client.mint_invoice( &sme, &debtor_hash, &1_000_000_000i128, - &Symbol::new(&env, "USDC"), &due_date, &ipfs_cid, &10u32, + &Symbol::new(&env, "USDC"), &due_date, &ipfs_cid, &10u32, &None, ); let marketplace = Address::generate(&env); client.set_listed(&marketplace, &id);