Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

test: setting up a branch for consolidating work on final todos/tests #13

Merged
merged 28 commits into from
Aug 21, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
d085e59
test: setting up a branch for consolidating work on final todos/tests
aorumbayev Aug 16, 2024
545cc90
test: extra tests for signatures contract against avm
aorumbayev Aug 18, 2024
4ebd11c
fix: when generating app/asset id's skip any that might already be re…
daniel-makerx Aug 19, 2024
1e04c4c
chore: fix typing for create_group
daniel-makerx Aug 19, 2024
0f11099
fix: ensure Global.current_application* properties match AVM
daniel-makerx Aug 19, 2024
14178ff
fix: ensure new Account's have field defaults populated
daniel-makerx Aug 19, 2024
c6e5222
test: add AVM execution for remaining methods on Arc4ABIMethod
daniel-makerx Aug 19, 2024
32cfec6
chore: git ignore .venv dirs
daniel-makerx Aug 19, 2024
2cfa6f6
test: test op.AssetParamsGet by index
daniel-makerx Aug 19, 2024
ab1fe32
fix: fix equality implementation for Account, to allow comparison wit…
daniel-makerx Aug 19, 2024
7386f42
test: simplify test_app_local_put_get_and_delete
daniel-makerx Aug 19, 2024
792ccec
test: add tests for `op.AcctParamsGet` by index
daniel-makerx Aug 19, 2024
fa15456
test: add tests for `op.AppParamsGet` by index, remove assumptions ab…
daniel-makerx Aug 19, 2024
e47dc01
test: update StateOps artifacts
daniel-makerx Aug 19, 2024
8addf0b
chore: tweaking update account to allow updating opted asset balances
aorumbayev Aug 20, 2024
4ba9486
refactor: todo on kwargs to match order of fn signature
aorumbayev Aug 20, 2024
f1052aa
chore: addressing todo on field validators on asset application gener…
aorumbayev Aug 20, 2024
cdd667c
docs: integrating pydoclint; formatting docs; removing docs from stub…
aorumbayev Aug 20, 2024
740d1bc
refactor: removing redundant ctx.reset() calls; moving boxes out of e…
aorumbayev Aug 20, 2024
cc4a3bb
chore: locking docstrings linter/formatter
aorumbayev Aug 20, 2024
19b9076
chore: testing ci
aorumbayev Aug 20, 2024
a4b48a5
chore: fixing hatch installation in ci to ensure its installed via 3.12
aorumbayev Aug 20, 2024
6b06f55
feat: rename txn_op_fields to active_txn_overrides to better reflect …
daniel-makerx Aug 21, 2024
015dd90
build: ignore exit code of docformatter
daniel-makerx Aug 21, 2024
248ea84
test: move opt_in into fixture
daniel-makerx Aug 21, 2024
bf772a1
test: assert on algopy types
daniel-makerx Aug 21, 2024
fb808f4
test: use correct method for overriding on_completion
daniel-makerx Aug 21, 2024
70e4574
test: use appropriate app_id when providing gtxns
daniel-makerx Aug 21, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,15 @@ jobs:
- name: Checkout source code
uses: actions/checkout@v4

- name: Install hatch
run: pipx install hatch

- name: Set up Python 3.12
uses: actions/setup-python@v5
with:
python-version: "3.12"
cache: "pip"

- name: Install hatch
run: pip install hatch

- name: Start LocalNet
run: pipx install algokit && algokit localnet start

Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,6 @@ examples/**/*.trace
# coverage output
.coverage
coverage.xml
.venv*

.cursorignore
324 changes: 159 additions & 165 deletions examples/auction/test_contract.py
Original file line number Diff line number Diff line change
@@ -1,165 +1,159 @@
# import time
# from collections.abc import Generator

# import algopy
# import pytest
# from algopy_testing import AlgopyTestContext, algopy_testing_context

# from .contract import AuctionContract


# @pytest.fixture()
# def context() -> Generator[AlgopyTestContext, None, None]:
# with algopy_testing_context() as ctx:
# yield ctx
# ctx.reset()


# def test_opt_into_asset(context: AlgopyTestContext) -> None:
# # Arrange
# asset = context.any.asset()
# contract = AuctionContract()

# # Act
# contract.opt_into_asset(asset)

# # Assert
# assert contract.asa.id == asset.id
# inner_txn = context.txn.last_group.last_itxn.asset_transfer
# assert (
# inner_txn.asset_receiver == context.get_app_for_contract(contract).address
# ), "Asset receiver does not match"
# assert inner_txn.xfer_asset == asset, "Transferred asset does not match"


# def test_start_auction(
# context: AlgopyTestContext,
# ) -> None:
# # Arrange
# contract = AuctionContract()
# app = context.get_app_for_contract(contract)
# latest_timestamp = context.any.uint64(1, 1000)
# starting_price = context.any.uint64()
# auction_duration = context.any.uint64(100, 1000)
# axfer_txn = context.any.txn.asset_transfer(
# asset_receiver=app.address,
# asset_amount=starting_price,
# )
# contract.asa_amount = starting_price
# context.ledger.patch_global_fields(
# latest_timestamp=latest_timestamp,
# )

# # Act
# with context.txn.create_group(txn_op_fields={"sender": context.default_sender}):
# contract.start_auction(
# starting_price,
# auction_duration,
# axfer_txn,
# )

# # Assert
# assert contract.auction_end == latest_timestamp + auction_duration
# assert contract.previous_bid == starting_price
# assert contract.asa_amount == starting_price


# def test_bid(context: AlgopyTestContext) -> None:
# # Arrange
# account = context.default_sender
# auction_end = context.any.uint64(min_value=int(time.time()) + 10_000)
# previous_bid = context.any.uint64(1, 100)
# pay_amount = context.any.uint64()

# contract = AuctionContract()
# contract.auction_end = auction_end
# contract.previous_bid = previous_bid
# pay = context.any.txn.payment(sender=account, amount=pay_amount)

# # Act
# contract.bid(pay=pay)

# # Assert
# assert contract.previous_bid == pay_amount
# assert contract.previous_bidder == account
# assert contract.claimable_amount[account] == pay_amount


# def test_claim_bids(
# context: AlgopyTestContext,
# ) -> None:
# # Arrange
# account = context.any.account()
# contract = AuctionContract()
# claimable_amount = context.any.uint64()
# contract.claimable_amount[account] = claimable_amount
# contract.previous_bidder = account
# previous_bid = context.any.uint64(max_value=int(claimable_amount))
# contract.previous_bid = previous_bid

# # Act
# with context.txn.create_group(txn_op_fields={"sender": account}):
# contract.claim_bids()

# # Assert
# expected_payment = claimable_amount - previous_bid
# last_inner_txn = context.txn.last_group.last_itxn.payment

# assert last_inner_txn.amount == expected_payment
# assert last_inner_txn.receiver == account
# assert contract.claimable_amount[account] == claimable_amount - expected_payment


# def test_claim_asset(context: AlgopyTestContext) -> None:
# # Arrange
# context.ledger.patch_global_fields(latest_timestamp=context.any.uint64())
# contract = AuctionContract()
# contract.auction_end = context.any.uint64(1, 100)
# contract.previous_bidder = context.default_sender
# asa_amount = context.any.uint64(1000, 2000)
# contract.asa_amount = asa_amount
# asset = context.any.asset()

# # Act
# contract.claim_asset(asset)

# # Assert
# last_inner_txn = context.txn.last_group.last_itxn.asset_transfer
# assert last_inner_txn.xfer_asset == asset
# assert last_inner_txn.asset_close_to == context.default_sender
# assert last_inner_txn.asset_receiver == context.default_sender
# assert last_inner_txn.asset_amount == asa_amount


# def test_delete_application(
# context: AlgopyTestContext,
# ) -> None:
# # Arrange
# account = context.any.account()

# # Act
# # setting sender will determine creator
# with context.txn.create_group(txn_op_fields={"sender": account}):
# contract = AuctionContract()

# with context.txn.create_group(
# gtxns=[
# context.any.txn.application_call(
# on_completion=algopy.OnCompleteAction.DeleteApplication
# )
# ]
# ):
# contract.delete_application()

# # Assert
# inner_transactions = context.txn.last_group.last_itxn.payment
# assert inner_transactions
# assert inner_transactions.type == algopy.TransactionType.Payment
# assert inner_transactions.receiver == account
# assert inner_transactions.close_remainder_to == account


# @pytest.mark.usefixtures("context")
# def test_clear_state_program() -> None:
# contract = AuctionContract()
# assert contract.clear_state_program()
import time
from collections.abc import Generator

import algopy
import pytest
from algopy_testing import AlgopyTestContext, algopy_testing_context

from .contract import AuctionContract


@pytest.fixture()
def context() -> Generator[AlgopyTestContext, None, None]:
with algopy_testing_context() as ctx:
yield ctx


def test_opt_into_asset(context: AlgopyTestContext) -> None:
# Arrange
asset = context.any.asset()
contract = AuctionContract()

# Act
contract.opt_into_asset(asset)

# Assert
assert contract.asa.id == asset.id
inner_txn = context.txn.last_group.last_itxn.asset_transfer
assert (
inner_txn.asset_receiver == context.get_app_for_contract(contract).address
), "Asset receiver does not match"
assert inner_txn.xfer_asset == asset, "Transferred asset does not match"


def test_start_auction(
context: AlgopyTestContext,
) -> None:
# Arrange
contract = AuctionContract()
app = context.get_app_for_contract(contract)
latest_timestamp = context.any.uint64(1, 1000)
starting_price = context.any.uint64()
auction_duration = context.any.uint64(100, 1000)
axfer_txn = context.any.txn.asset_transfer(
asset_receiver=app.address,
asset_amount=starting_price,
)
contract.asa_amount = starting_price
context.ledger.patch_global_fields(
latest_timestamp=latest_timestamp,
)

# Act
contract.start_auction(
starting_price,
auction_duration,
axfer_txn,
)

# Assert
assert contract.auction_end == latest_timestamp + auction_duration
assert contract.previous_bid == starting_price
assert contract.asa_amount == starting_price


def test_bid(context: AlgopyTestContext) -> None:
# Arrange
account = context.default_sender
auction_end = context.any.uint64(min_value=int(time.time()) + 10_000)
previous_bid = context.any.uint64(1, 100)
pay_amount = context.any.uint64()

contract = AuctionContract()
contract.auction_end = auction_end
contract.previous_bid = previous_bid
pay = context.any.txn.payment(sender=account, amount=pay_amount)

# Act
contract.bid(pay=pay)

# Assert
assert contract.previous_bid == pay_amount
assert contract.previous_bidder == account
assert contract.claimable_amount[account] == pay_amount


def test_claim_bids(
context: AlgopyTestContext,
) -> None:
# Arrange
account = context.any.account()
contract = AuctionContract()
claimable_amount = context.any.uint64()
contract.claimable_amount[account] = claimable_amount
contract.previous_bidder = account
previous_bid = context.any.uint64(max_value=int(claimable_amount))
contract.previous_bid = previous_bid

# Act
with context.txn.create_group(active_txn_overrides={"sender": account}):
contract.claim_bids()

# Assert
expected_payment = claimable_amount - previous_bid
last_inner_txn = context.txn.last_group.last_itxn.payment

assert last_inner_txn.amount == expected_payment
assert last_inner_txn.receiver == account
assert contract.claimable_amount[account] == claimable_amount - expected_payment


def test_claim_asset(context: AlgopyTestContext) -> None:
# Arrange
context.ledger.patch_global_fields(latest_timestamp=context.any.uint64())
contract = AuctionContract()
contract.auction_end = context.any.uint64(1, 100)
contract.previous_bidder = context.default_sender
asa_amount = context.any.uint64(1000, 2000)
contract.asa_amount = asa_amount
asset = context.any.asset()

# Act
contract.claim_asset(asset)

# Assert
last_inner_txn = context.txn.last_group.last_itxn.asset_transfer
assert last_inner_txn.xfer_asset == asset
assert last_inner_txn.asset_close_to == context.default_sender
assert last_inner_txn.asset_receiver == context.default_sender
assert last_inner_txn.asset_amount == asa_amount


def test_delete_application(
context: AlgopyTestContext,
) -> None:
# Arrange
account = context.any.account()

# Act
# setting sender will determine creator
with context.txn.create_group(active_txn_overrides={"sender": account}):
contract = AuctionContract()

with context.txn.create_group(
active_txn_overrides={"on_completion": algopy.OnCompleteAction.DeleteApplication}
):
contract.delete_application()

# Assert
inner_transactions = context.txn.last_group.last_itxn.payment
assert inner_transactions
assert inner_transactions.type == algopy.TransactionType.Payment
assert inner_transactions.receiver == account
assert inner_transactions.close_remainder_to == account


@pytest.mark.usefixtures("context")
def test_clear_state_program() -> None:
contract = AuctionContract()
assert contract.clear_state_program()
26 changes: 0 additions & 26 deletions examples/box/test_contract.py

This file was deleted.

1 change: 0 additions & 1 deletion examples/htlc_logicsig/test_signature.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
def context() -> Generator[AlgopyTestContext, None, None]:
with algopy_testing_context() as ctx:
yield ctx
ctx.reset()


def test_seller_receives_payment(context: AlgopyTestContext) -> None:
Expand Down
Loading