Skip to content

Commit bb8d83c

Browse files
committed
test: add unit and e2e tests
Signed-off-by: dosi <dosi.kolev@limechain.tech>
1 parent 21d833c commit bb8d83c

2 files changed

Lines changed: 113 additions & 3 deletions

File tree

tests/integration/account_allowance_e2e_test.py

Lines changed: 64 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@
1515
from hiero_sdk_python.hbar import Hbar
1616
from hiero_sdk_python.response_code import ResponseCode
1717
from hiero_sdk_python.tokens.nft_id import NftId
18-
from hiero_sdk_python.tokens.token_associate_transaction import TokenAssociateTransaction
18+
from hiero_sdk_python.tokens.token_associate_transaction import (
19+
TokenAssociateTransaction,
20+
)
1921
from hiero_sdk_python.tokens.token_mint_transaction import TokenMintTransaction
2022
from hiero_sdk_python.transaction.transaction_id import TransactionId
2123
from hiero_sdk_python.transaction.transfer_transaction import TransferTransaction
@@ -61,7 +63,9 @@ def _mint_nft(env, token_id, metadata):
6163

6264

6365
@pytest.mark.integration
64-
def test_integration_cannot_transfer_on_behalf_of_spender_without_allowance_approval(env):
66+
def test_integration_cannot_transfer_on_behalf_of_spender_without_allowance_approval(
67+
env,
68+
):
6569
"""Test that a spender cannot transfer NFTs on behalf of account without allowance approval."""
6670
spender_account, receiver_account = _create_spender_and_receiver_accounts(env)
6771

@@ -264,7 +268,9 @@ def test_integration_fungible_token_allowance(env):
264268

265269

266270
@pytest.mark.integration
267-
def test_integration_cant_transfer_on_behalf_of_spender_after_removing_the_allowance_approval(env):
271+
def test_integration_cant_transfer_on_behalf_of_spender_after_removing_the_allowance_approval(
272+
env,
273+
):
268274
"""Test that a spender cannot transfer NFTs after the allowance approval is removed."""
269275
spender_account, receiver_account = _create_spender_and_receiver_accounts(env)
270276

@@ -486,3 +492,58 @@ def test_integration_cannot_send_deleted_token_nft_serials(env):
486492
f"Transfer should have failed with SPENDER_DOES_NOT_HAVE_ALLOWANCE"
487493
f"status but got: {ResponseCode(transfer_receipt.status).name}"
488494
)
495+
496+
497+
@pytest.mark.integration
498+
def test_integration_can_approve_serial_and_delete_all_serials_in_one_transaction(env):
499+
"""Test that approve-serial + delete-all-serials in one transaction preserves the per-serial allowance."""
500+
spender_account, receiver_account = _create_spender_and_receiver_accounts(env)
501+
502+
token_id = create_nft_token(env)
503+
assert token_id is not None
504+
505+
_associate_token_with_account(env, receiver_account, token_id)
506+
507+
nft_ids = _mint_nft(env, token_id, [b"\x01", b"\x02"])
508+
nft1 = nft_ids[0]
509+
nft2 = nft_ids[1]
510+
511+
# Approve nft1 specifically and delete-all-serials for the same (token, spender)
512+
# pair in the same transaction. The per-serial approval is preserved because the
513+
# two operations produce independent NftAllowance entries.
514+
receipt = (
515+
AccountAllowanceApproveTransaction()
516+
.approve_token_nft_allowance(nft1, env.operator_id, spender_account.id)
517+
.delete_token_nft_allowance_all_serials(token_id, env.operator_id, spender_account.id)
518+
.execute(env.client)
519+
)
520+
assert receipt.status == ResponseCode.SUCCESS, (
521+
f"Allowance approval failed with status: {ResponseCode(receipt.status).name}"
522+
)
523+
524+
# Transfer nft1 (should succeed - per-serial allowance preserved)
525+
transfer_receipt = (
526+
TransferTransaction()
527+
.set_transaction_id(TransactionId.generate(spender_account.id))
528+
.add_approved_nft_transfer(nft1, env.operator_id, receiver_account.id)
529+
.freeze_with(env.client)
530+
.sign(spender_account.key)
531+
.execute(env.client)
532+
)
533+
assert transfer_receipt.status == ResponseCode.SUCCESS, (
534+
f"Transfer failed with status: {ResponseCode(transfer_receipt.status).name}"
535+
)
536+
537+
# Transfer nft2 (should fail - delete-all-serials revoked any blanket allowance)
538+
transfer_receipt2 = (
539+
TransferTransaction()
540+
.set_transaction_id(TransactionId.generate(spender_account.id))
541+
.add_approved_nft_transfer(nft2, env.operator_id, receiver_account.id)
542+
.freeze_with(env.client)
543+
.sign(spender_account.key)
544+
.execute(env.client)
545+
)
546+
assert transfer_receipt2.status == ResponseCode.SPENDER_DOES_NOT_HAVE_ALLOWANCE, (
547+
f"Transfer should have failed with SPENDER_DOES_NOT_HAVE_ALLOWANCE"
548+
f"status but got: {ResponseCode(transfer_receipt2.status).name}"
549+
)

tests/unit/account_allowance_approve_transaction_test.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,55 @@ def test_delete_token_nft_allowance_all_serials(account_allowance_transaction, s
217217
assert allowance.approved_for_all is False
218218

219219

220+
def test_delete_token_nft_allowance_all_serials_preserves_prior_serial_approval(
221+
account_allowance_transaction, sample_accounts, sample_tokens
222+
):
223+
"""Test that delete-all-serials does not fold into a prior per-serial approval."""
224+
token_id = sample_tokens["token1"]
225+
owner = sample_accounts["owner"]
226+
spender = sample_accounts["spender"]
227+
nft_id = NftId(token_id, 1)
228+
229+
account_allowance_transaction.approve_token_nft_allowance(nft_id, owner, spender)
230+
account_allowance_transaction.delete_token_nft_allowance_all_serials(token_id, owner, spender)
231+
232+
assert len(account_allowance_transaction.nft_allowances) == 2
233+
234+
first = account_allowance_transaction.nft_allowances[0]
235+
assert first.token_id == token_id
236+
assert first.owner_account_id == owner
237+
assert first.spender_account_id == spender
238+
assert first.serial_numbers == [1]
239+
assert first.approved_for_all is False
240+
241+
second = account_allowance_transaction.nft_allowances[1]
242+
assert second.token_id == token_id
243+
assert second.owner_account_id == owner
244+
assert second.spender_account_id == spender
245+
assert second.serial_numbers == []
246+
assert second.approved_for_all is False
247+
248+
249+
def test_delete_token_nft_allowance_all_serials_appends_per_call(
250+
account_allowance_transaction, sample_accounts, sample_tokens
251+
):
252+
"""Test that repeated delete-all-serials calls append one entry per call."""
253+
token_id = sample_tokens["token1"]
254+
owner = sample_accounts["owner"]
255+
spender = sample_accounts["spender"]
256+
257+
account_allowance_transaction.delete_token_nft_allowance_all_serials(token_id, owner, spender)
258+
account_allowance_transaction.delete_token_nft_allowance_all_serials(token_id, owner, spender)
259+
260+
assert len(account_allowance_transaction.nft_allowances) == 2
261+
for allowance in account_allowance_transaction.nft_allowances:
262+
assert allowance.token_id == token_id
263+
assert allowance.owner_account_id == owner
264+
assert allowance.spender_account_id == spender
265+
assert allowance.serial_numbers == []
266+
assert allowance.approved_for_all is False
267+
268+
220269
def test_add_all_token_nft_approval(account_allowance_transaction, sample_accounts, sample_tokens):
221270
"""Test adding all token NFT approval"""
222271
token_id = sample_tokens["token1"]

0 commit comments

Comments
 (0)