@@ -328,6 +328,200 @@ fn non_voter_cannot_vote() {
328328 assert ! ( result. is_err( ) ) ;
329329}
330330
331+ // ── pagination: list_policies ─────────────────────────────────────────────────
332+
333+ #[ test]
334+ fn list_policies_empty_for_new_holder ( ) {
335+ let ( env, contract_id, _, _) = setup ( ) ;
336+ let client = NiffyInsureClient :: new ( & env, & contract_id) ;
337+ let holder = Address :: generate ( & env) ;
338+ let page = client. list_policies ( & holder, & 0u32 , & 10u32 ) ;
339+ assert_eq ! ( page. len( ) , 0u32 ) ;
340+ }
341+
342+ #[ test]
343+ fn list_policies_first_page ( ) {
344+ let ( env, contract_id, _, token) = setup ( ) ;
345+ let client = NiffyInsureClient :: new ( & env, & contract_id) ;
346+ let holder = Address :: generate ( & env) ;
347+
348+ env. as_contract ( & contract_id, || {
349+ for id in 1u32 ..=5 {
350+ storage:: set_policy ( & env, & holder, id, & make_policy ( & holder, id, & token) ) ;
351+ env. storage ( ) . persistent ( ) . set (
352+ & storage:: DataKey :: PolicyCounter ( holder. clone ( ) ) ,
353+ & id,
354+ ) ;
355+ }
356+ } ) ;
357+
358+ let page = client. list_policies ( & holder, & 0u32 , & 3u32 ) ;
359+ assert_eq ! ( page. len( ) , 3u32 ) ;
360+ assert_eq ! ( page. get( 0 ) . unwrap( ) . policy_id, 1u32 ) ;
361+ assert_eq ! ( page. get( 2 ) . unwrap( ) . policy_id, 3u32 ) ;
362+ }
363+
364+ #[ test]
365+ fn list_policies_second_page_cursor ( ) {
366+ let ( env, contract_id, _, token) = setup ( ) ;
367+ let client = NiffyInsureClient :: new ( & env, & contract_id) ;
368+ let holder = Address :: generate ( & env) ;
369+
370+ env. as_contract ( & contract_id, || {
371+ for id in 1u32 ..=5 {
372+ storage:: set_policy ( & env, & holder, id, & make_policy ( & holder, id, & token) ) ;
373+ env. storage ( ) . persistent ( ) . set (
374+ & storage:: DataKey :: PolicyCounter ( holder. clone ( ) ) ,
375+ & id,
376+ ) ;
377+ }
378+ } ) ;
379+
380+ let page = client. list_policies ( & holder, & 3u32 , & 10u32 ) ;
381+ assert_eq ! ( page. len( ) , 2u32 ) ;
382+ assert_eq ! ( page. get( 0 ) . unwrap( ) . policy_id, 4u32 ) ;
383+ assert_eq ! ( page. get( 1 ) . unwrap( ) . policy_id, 5u32 ) ;
384+ }
385+
386+ #[ test]
387+ fn list_policies_cursor_past_end_returns_empty ( ) {
388+ let ( env, contract_id, _, token) = setup ( ) ;
389+ let client = NiffyInsureClient :: new ( & env, & contract_id) ;
390+ let holder = Address :: generate ( & env) ;
391+
392+ env. as_contract ( & contract_id, || {
393+ storage:: set_policy ( & env, & holder, 1 , & make_policy ( & holder, 1 , & token) ) ;
394+ env. storage ( ) . persistent ( ) . set (
395+ & storage:: DataKey :: PolicyCounter ( holder. clone ( ) ) ,
396+ & 1u32 ,
397+ ) ;
398+ } ) ;
399+
400+ let page = client. list_policies ( & holder, & 99u32 , & 10u32 ) ;
401+ assert_eq ! ( page. len( ) , 0u32 ) ;
402+ }
403+
404+ #[ test]
405+ fn list_policies_limit_clamped_to_page_size_max ( ) {
406+ let ( env, contract_id, _, token) = setup ( ) ;
407+ let client = NiffyInsureClient :: new ( & env, & contract_id) ;
408+ let holder = Address :: generate ( & env) ;
409+
410+ env. as_contract ( & contract_id, || {
411+ for id in 1u32 ..=25 {
412+ storage:: set_policy ( & env, & holder, id, & make_policy ( & holder, id, & token) ) ;
413+ env. storage ( ) . persistent ( ) . set (
414+ & storage:: DataKey :: PolicyCounter ( holder. clone ( ) ) ,
415+ & id,
416+ ) ;
417+ }
418+ } ) ;
419+
420+ let page = client. list_policies ( & holder, & 0u32 , & 100u32 ) ;
421+ assert_eq ! ( page. len( ) , 20u32 ) ;
422+ }
423+
424+ // ── pagination: list_claims ───────────────────────────────────────────────────
425+
426+ fn make_claim ( env : & Env , claim_id : u64 , holder : & Address ) -> niffyinsure:: types:: Claim {
427+ use niffyinsure:: types:: { Claim , ClaimStatus } ;
428+ Claim {
429+ claim_id,
430+ policy_id : 1 ,
431+ claimant : holder. clone ( ) ,
432+ amount : 10_000_000 ,
433+ details : String :: from_str ( env, "test" ) ,
434+ image_urls : vec ! [ env] ,
435+ status : ClaimStatus :: Processing ,
436+ voting_deadline_ledger : 1000 ,
437+ approve_votes : 0 ,
438+ reject_votes : 0 ,
439+ filed_at : 1 ,
440+ appeal_open_deadline_ledger : 0 ,
441+ appeals_count : 0 ,
442+ appeal_deadline_ledger : 0 ,
443+ appeal_approve_votes : 0 ,
444+ appeal_reject_votes : 0 ,
445+ }
446+ }
447+
448+ #[ test]
449+ fn list_claims_empty_when_none_filed ( ) {
450+ let ( env, contract_id, _, _) = setup ( ) ;
451+ let client = NiffyInsureClient :: new ( & env, & contract_id) ;
452+ let page = client. list_claims ( & 0u64 , & 10u32 ) ;
453+ assert_eq ! ( page. len( ) , 0u32 ) ;
454+ }
455+
456+ #[ test]
457+ fn list_claims_first_page ( ) {
458+ let ( env, contract_id, _, _) = setup ( ) ;
459+ let client = NiffyInsureClient :: new ( & env, & contract_id) ;
460+ let holder = Address :: generate ( & env) ;
461+
462+ env. as_contract ( & contract_id, || {
463+ for id in 1u64 ..=5 {
464+ storage:: set_claim ( & env, & make_claim ( & env, id, & holder) ) ;
465+ env. storage ( ) . instance ( ) . set ( & storage:: DataKey :: ClaimCounter , & id) ;
466+ }
467+ } ) ;
468+
469+ let page = client. list_claims ( & 0u64 , & 3u32 ) ;
470+ assert_eq ! ( page. len( ) , 3u32 ) ;
471+ assert_eq ! ( page. get( 0 ) . unwrap( ) . claim_id, 1u64 ) ;
472+ assert_eq ! ( page. get( 2 ) . unwrap( ) . claim_id, 3u64 ) ;
473+ }
474+
475+ #[ test]
476+ fn list_claims_last_page_partial ( ) {
477+ let ( env, contract_id, _, _) = setup ( ) ;
478+ let client = NiffyInsureClient :: new ( & env, & contract_id) ;
479+ let holder = Address :: generate ( & env) ;
480+
481+ env. as_contract ( & contract_id, || {
482+ for id in 1u64 ..=5 {
483+ storage:: set_claim ( & env, & make_claim ( & env, id, & holder) ) ;
484+ env. storage ( ) . instance ( ) . set ( & storage:: DataKey :: ClaimCounter , & id) ;
485+ }
486+ } ) ;
487+
488+ let page = client. list_claims ( & 4u64 , & 10u32 ) ;
489+ assert_eq ! ( page. len( ) , 1u32 ) ;
490+ assert_eq ! ( page. get( 0 ) . unwrap( ) . claim_id, 5u64 ) ;
491+ }
492+
493+ #[ test]
494+ fn list_claims_cursor_past_end_returns_empty ( ) {
495+ let ( env, contract_id, _, _) = setup ( ) ;
496+ let client = NiffyInsureClient :: new ( & env, & contract_id) ;
497+ let holder = Address :: generate ( & env) ;
498+
499+ env. as_contract ( & contract_id, || {
500+ storage:: set_claim ( & env, & make_claim ( & env, 1 , & holder) ) ;
501+ env. storage ( ) . instance ( ) . set ( & storage:: DataKey :: ClaimCounter , & 1u64 ) ;
502+ } ) ;
503+
504+ let page = client. list_claims ( & 999u64 , & 10u32 ) ;
505+ assert_eq ! ( page. len( ) , 0u32 ) ;
506+ }
507+
508+ #[ test]
509+ fn list_claims_oversize_request_clamped ( ) {
510+ let ( env, contract_id, _, _) = setup ( ) ;
511+ let client = NiffyInsureClient :: new ( & env, & contract_id) ;
512+ let holder = Address :: generate ( & env) ;
513+
514+ env. as_contract ( & contract_id, || {
515+ for id in 1u64 ..=25 {
516+ storage:: set_claim ( & env, & make_claim ( & env, id, & holder) ) ;
517+ env. storage ( ) . instance ( ) . set ( & storage:: DataKey :: ClaimCounter , & id) ;
518+ }
519+ } ) ;
520+
521+ let page = client. list_claims ( & 0u64 , & 999u32 ) ;
522+ assert_eq ! ( page. len( ) , 20u32 ) ;
523+ }
524+
331525// ── counter immutability: generate_premium does not mutate storage ────────────
332526
333527#[ test]
0 commit comments