@@ -422,3 +422,136 @@ def test_claim_rewards_transaction_build_failure(
422422 currency_token = ADDRESS ,
423423 member_ip_ids = [IP_ID ],
424424 )
425+
426+
427+ class TestGroupGetClaimableReward :
428+ """Test class for Group.get_claimable_reward method"""
429+
430+ def test_get_claimable_reward_invalid_group_ip_id (
431+ self , group : Group , mock_web3_is_address
432+ ):
433+ """Test get_claimable_reward with invalid group IP ID."""
434+ invalid_group_ip_id = "invalid_group_ip_id"
435+ with mock_web3_is_address (False ):
436+ with pytest .raises (
437+ ValueError ,
438+ match = f"Failed to get claimable rewards: Invalid group IP ID: { invalid_group_ip_id } " ,
439+ ):
440+ group .get_claimable_reward (
441+ group_ip_id = invalid_group_ip_id ,
442+ currency_token = ADDRESS ,
443+ member_ip_ids = [IP_ID ],
444+ )
445+
446+ def test_get_claimable_reward_invalid_currency_token (self , group : Group , mock_web3 ):
447+ """Test get_claimable_reward with invalid currency token."""
448+ invalid_currency_token = "invalid_currency_token"
449+ with patch .object (mock_web3 , "is_address" ) as mock_is_address :
450+ # group_ip_id=True, currency_token=False, member_ip_ids=True
451+ mock_is_address .side_effect = [True , False ]
452+ with pytest .raises (
453+ ValueError ,
454+ match = f"Failed to get claimable rewards: Invalid currency token: { invalid_currency_token } " ,
455+ ):
456+ group .get_claimable_reward (
457+ group_ip_id = IP_ID ,
458+ currency_token = invalid_currency_token ,
459+ member_ip_ids = [IP_ID ],
460+ )
461+
462+ def test_get_claimable_reward_invalid_member_ip_id (self , group : Group , mock_web3 ):
463+ """Test get_claimable_reward with invalid member IP ID."""
464+ invalid_member_ip_id = "invalid_member_ip_id"
465+ with patch .object (mock_web3 , "is_address" ) as mock_is_address :
466+ # group_ip_id=True, currency_token=True, first_member=True, second_member=False
467+ mock_is_address .side_effect = [True , True , True , False ]
468+ with pytest .raises (
469+ ValueError ,
470+ match = f"Failed to get claimable rewards: Invalid member IP ID: { invalid_member_ip_id } " ,
471+ ):
472+ group .get_claimable_reward (
473+ group_ip_id = IP_ID ,
474+ currency_token = ADDRESS ,
475+ member_ip_ids = [ADDRESS , invalid_member_ip_id ],
476+ )
477+
478+ def test_get_claimable_reward_success (
479+ self ,
480+ group : Group ,
481+ mock_web3_is_address ,
482+ ):
483+ """Test successful get_claimable_reward operation."""
484+ expected_claimable_rewards = [100 , 200 , 300 ]
485+ member_ip_ids = [IP_ID , ADDRESS , ADDRESS ]
486+
487+ with mock_web3_is_address ():
488+ with patch .object (
489+ group .grouping_module_client ,
490+ "getClaimableReward" ,
491+ return_value = expected_claimable_rewards ,
492+ ) as mock_get_claimable_reward :
493+ result = group .get_claimable_reward (
494+ group_ip_id = IP_ID ,
495+ currency_token = ADDRESS ,
496+ member_ip_ids = member_ip_ids ,
497+ )
498+
499+ # Verify the result
500+ assert result == expected_claimable_rewards
501+ assert len (result ) == len (member_ip_ids )
502+ mock_get_claimable_reward .assert_called_once_with (
503+ groupId = IP_ID ,
504+ token = ADDRESS ,
505+ ipIds = member_ip_ids ,
506+ )
507+
508+ def test_get_claimable_reward_empty_member_ip_ids (
509+ self ,
510+ group : Group ,
511+ mock_web3_is_address ,
512+ ):
513+ """Test get_claimable_reward with empty member IP IDs list."""
514+ expected_claimable_rewards : list [int ] = []
515+
516+ with mock_web3_is_address ():
517+ with patch .object (
518+ group .grouping_module_client ,
519+ "getClaimableReward" ,
520+ return_value = expected_claimable_rewards ,
521+ ) as mock_get_claimable_reward :
522+ result = group .get_claimable_reward (
523+ group_ip_id = IP_ID ,
524+ currency_token = ADDRESS ,
525+ member_ip_ids = [],
526+ )
527+
528+ # Verify the result
529+ assert result == expected_claimable_rewards
530+ assert len (result ) == 0
531+
532+ # Verify the client method was called with correct parameters
533+ mock_get_claimable_reward .assert_called_once_with (
534+ groupId = IP_ID ,
535+ token = ADDRESS ,
536+ ipIds = [],
537+ )
538+
539+ def test_get_claimable_reward_client_call_failure (
540+ self , group : Group , mock_web3_is_address
541+ ):
542+ """Test get_claimable_reward when client call fails."""
543+ with mock_web3_is_address ():
544+ with patch .object (
545+ group .grouping_module_client ,
546+ "getClaimableReward" ,
547+ side_effect = Exception ("Client call failed" ),
548+ ):
549+ with pytest .raises (
550+ ValueError ,
551+ match = "Failed to get claimable rewards: Client call failed" ,
552+ ):
553+ group .get_claimable_reward (
554+ group_ip_id = IP_ID ,
555+ currency_token = ADDRESS ,
556+ member_ip_ids = [IP_ID ],
557+ )
0 commit comments