algorand-python-testing 0.3.0b9__tar.gz → 0.4.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/.github/workflows/ci.yaml +3 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/.github/workflows/gh-pages.yaml +3 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/CHANGELOG.md +38 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/PKG-INFO +12 -11
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/README.md +11 -10
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/docs/api.md +10 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/docs/conf.py +10 -0
- algorand_python_testing-0.4.0/docs/faq.md +61 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/docs/index.md +1 -17
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/docs/testing-guide/avm-types.md +5 -6
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/pyproject.toml +5 -3
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/__init__.py +0 -3
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/arc4.py +35 -68
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/context_helpers/context_storage.py +3 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/context_helpers/ledger_context.py +73 -32
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/context_helpers/txn_context.py +7 -5
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/models/account.py +28 -26
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/models/application.py +16 -4
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/models/asset.py +18 -15
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/models/contract.py +5 -7
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/op/global_values.py +31 -3
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/op/misc.py +6 -20
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/primitives/biguint.py +5 -1
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/primitives/bytes.py +5 -1
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/primitives/string.py +5 -1
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/utils.py +13 -1
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/value_generators/avm.py +33 -21
- algorand_python_testing-0.4.0/tests/artifacts/Contains/contract.py +189 -0
- algorand_python_testing-0.4.0/tests/artifacts/Contains/data/MyContract.approval.teal +1479 -0
- algorand_python_testing-0.4.0/tests/artifacts/Contains/data/MyContract.clear.teal +7 -0
- algorand_python_testing-0.4.0/tests/artifacts/CreatedAppAsset/contract.py +31 -0
- algorand_python_testing-0.4.0/tests/artifacts/CreatedAppAsset/data/AppExpectingEffects.approval.teal +198 -0
- algorand_python_testing-0.4.0/tests/artifacts/CreatedAppAsset/data/AppExpectingEffects.arc32.json +77 -0
- algorand_python_testing-0.4.0/tests/artifacts/CreatedAppAsset/data/AppExpectingEffects.clear.teal +7 -0
- algorand_python_testing-0.4.0/tests/artifacts/CreatedAppAsset/other.py +7 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/StateOps/contract.py +10 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/StateOps/data/GlobalStateContract.approval.teal +173 -173
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/StateOps/data/GlobalStateContract.arc32.json +2 -2
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/StateOps/data/GlobalStateContract.clear.teal +1 -1
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/StateOps/data/ITxnOpsContract.approval.teal +21 -21
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/StateOps/data/ITxnOpsContract.arc32.json +2 -2
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/StateOps/data/ITxnOpsContract.clear.teal +1 -1
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/StateOps/data/LocalStateContract.approval.teal +145 -145
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/StateOps/data/LocalStateContract.arc32.json +2 -2
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/StateOps/data/LocalStateContract.clear.teal +1 -1
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/StateOps/data/StateAcctParamsGetContract.approval.teal +143 -91
- algorand_python_testing-0.4.0/tests/artifacts/StateOps/data/StateAcctParamsGetContract.arc32.json +253 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/StateOps/data/StateAppGlobalContract.approval.teal +39 -39
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/StateOps/data/StateAppGlobalContract.arc32.json +2 -2
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/StateOps/data/StateAppGlobalContract.clear.teal +1 -1
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/StateOps/data/StateAppGlobalExContract.approval.teal +13 -13
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/StateOps/data/StateAppGlobalExContract.arc32.json +2 -2
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/StateOps/data/StateAppGlobalExContract.clear.teal +1 -1
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/StateOps/data/StateAppLocalContract.approval.teal +55 -55
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/StateOps/data/StateAppLocalContract.arc32.json +2 -2
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/StateOps/data/StateAppLocalContract.clear.teal +1 -1
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/StateOps/data/StateAppLocalExContract.approval.teal +13 -13
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/StateOps/data/StateAppLocalExContract.arc32.json +2 -2
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/StateOps/data/StateAppLocalExContract.clear.teal +1 -1
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/StateOps/data/StateAppParamsContract.approval.teal +83 -83
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/StateOps/data/StateAppParamsContract.arc32.json +2 -2
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/StateOps/data/StateAppParamsContract.clear.teal +1 -1
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/StateOps/data/StateAssetHoldingContract.approval.teal +14 -14
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/StateOps/data/StateAssetHoldingContract.arc32.json +2 -2
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/StateOps/data/StateAssetHoldingContract.clear.teal +1 -1
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/StateOps/data/StateAssetParamsContract.approval.teal +110 -110
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/StateOps/data/StateAssetParamsContract.arc32.json +2 -2
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/StateOps/data/StateAssetParamsContract.clear.teal +1 -1
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/models/test_asset.py +12 -11
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/models/test_contract.py +19 -1
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/test_context.py +38 -1
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/test_op.py +76 -3
- algorand_python_testing-0.4.0/tests/utilities/__init__.py +0 -0
- algorand_python_testing-0.4.0/tests/value_generators/__init__.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/value_generators/test_avm.py +6 -3
- algorand_python_testing-0.3.0b9/docs/glossary.md +0 -8
- algorand_python_testing-0.3.0b9/tests/artifacts/StateOps/data/StateAcctParamsGetContract.arc32.json +0 -253
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/.coveragerc +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/.editorconfig +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/.github/pull_request_template.md +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/.github/workflows/cd.yaml +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/.gitignore +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/.pre-commit-config.yaml +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/.vscode/extensions.json +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/.vscode/launch.json +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/.vscode/settings.json +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/CONTRIBUTING.md +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/LICENSE +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/docs/Makefile +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/docs/__init__.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/docs/_static/custom.css +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/docs/algopy.md +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/docs/coverage.md +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/docs/examples.md +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/docs/make.bat +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/docs/testing-guide/arc4-types.md +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/docs/testing-guide/concepts.md +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/docs/testing-guide/contract-testing.md +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/docs/testing-guide/index.md +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/docs/testing-guide/opcodes.md +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/docs/testing-guide/signature-testing.md +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/docs/testing-guide/state-management.md +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/docs/testing-guide/subroutines.md +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/docs/testing-guide/transactions.md +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/examples/README.md +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/examples/__init__.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/examples/auction/__init__.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/examples/auction/contract.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/examples/auction/test_contract.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/examples/htlc_logicsig/__init__.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/examples/htlc_logicsig/signature.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/examples/htlc_logicsig/test_signature.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/examples/marketplace/__init__.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/examples/marketplace/contract.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/examples/marketplace/test_contract.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/examples/proof_of_attendance/__init__.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/examples/proof_of_attendance/contract.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/examples/proof_of_attendance/test_contract.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/examples/scratch_storage/__init__.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/examples/scratch_storage/contract.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/examples/scratch_storage/test_contract.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/examples/simple_voting/__init__.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/examples/simple_voting/contract.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/examples/simple_voting/test_contract.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/examples/zk_whitelist/__init__.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/examples/zk_whitelist/contract.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/examples/zk_whitelist/test_contract.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/scripts/__init__.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/scripts/check_stubs_cov.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/scripts/refresh_test_artifacts.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/scripts/validate_examples.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/compiled.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/constants.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/context.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/context_helpers/__init__.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/decorators/__init__.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/decorators/arc4.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/decorators/subroutine.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/enums.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/gtxn.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/itxn.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/itxn_loader.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/models/__init__.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/models/logicsig.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/models/template_variable.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/models/txn_fields.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/models/unsigned_builtins.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/mutable.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/op/__init__.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/op/block.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/op/constants.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/op/crypto.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/op/itxn.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/op/pure.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/op/txn.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/primitives/__init__.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/primitives/uint64.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/protocols.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/py.typed +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/state/__init__.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/state/box.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/state/global_state.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/state/local_state.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/state/utils.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/utilities/__init__.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/utilities/budget.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/utilities/log.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/value_generators/__init__.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/value_generators/arc4.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/value_generators/txn.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/algopy/__init__.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/algopy/arc4.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/algopy/gtxn.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/algopy/itxn.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/algopy/op.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/algopy/py.typed +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/algopy_testing/__init__.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/algopy_testing/py.typed +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/templates/.macros.j2 +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/templates/.release_notes.md.j2 +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/templates/CHANGELOG.md.j2 +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/__init__.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/arc4/__init__.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/arc4/conftest.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/arc4/test_abi_call.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/arc4/test_address.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/arc4/test_arc4_method_signature.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/arc4/test_bool.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/arc4/test_dynamic_array.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/arc4/test_dynamic_bytes.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/arc4/test_emit.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/arc4/test_static_array.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/arc4/test_string.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/arc4/test_struct.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/arc4/test_tuple.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/arc4/test_ufixednxm.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/arc4/test_uintn.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/Arc4ABIMethod/__init__.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/Arc4ABIMethod/contract.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.approval.teal +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.arc32.json +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.clear.teal +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/Arc4InnerTxns/__init__.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/Arc4InnerTxns/contract.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/Arc4InnerTxns/data/Arc4InnerTxnsContract.approval.teal +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/Arc4InnerTxns/data/Arc4InnerTxnsContract.arc32.json +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/Arc4InnerTxns/data/Arc4InnerTxnsContract.clear.teal +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/Arc4PrimitiveOps/__init__.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/Arc4PrimitiveOps/contract.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/Arc4PrimitiveOps/data/Arc4PrimitiveOpsContract.approval.teal +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/Arc4PrimitiveOps/data/Arc4PrimitiveOpsContract.arc32.json +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/Arc4PrimitiveOps/data/Arc4PrimitiveOpsContract.clear.teal +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/BoxContract/__init__.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/BoxContract/contract.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/BoxContract/data/BoxContract.approval.teal +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/BoxContract/data/BoxContract.arc32.json +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/BoxContract/data/BoxContract.clear.teal +0 -0
- {algorand_python_testing-0.3.0b9/tests/artifacts/CryptoOps → algorand_python_testing-0.4.0/tests/artifacts/Contains}/__init__.py +0 -0
- {algorand_python_testing-0.3.0b9/tests/artifacts/GlobalStateValidator → algorand_python_testing-0.4.0/tests/artifacts/CreatedAppAsset}/__init__.py +0 -0
- {algorand_python_testing-0.3.0b9/tests/artifacts/MiscellaneousOps → algorand_python_testing-0.4.0/tests/artifacts/CryptoOps}/__init__.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/CryptoOps/contract.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/CryptoOps/data/CryptoOpsContract.approval.teal +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/CryptoOps/data/CryptoOpsContract.arc32.json +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/CryptoOps/data/CryptoOpsContract.clear.teal +0 -0
- {algorand_python_testing-0.3.0b9/tests/artifacts/PrimitiveOps → algorand_python_testing-0.4.0/tests/artifacts/GlobalStateValidator}/__init__.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/GlobalStateValidator/contract.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/GlobalStateValidator/data/GlobalStateValidator.approval.teal +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/GlobalStateValidator/data/GlobalStateValidator.arc32.json +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/GlobalStateValidator/data/GlobalStateValidator.clear.teal +0 -0
- {algorand_python_testing-0.3.0b9/tests/artifacts/StateMutations → algorand_python_testing-0.4.0/tests/artifacts/MiscellaneousOps}/__init__.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/MiscellaneousOps/contract.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/MiscellaneousOps/data/MiscellaneousOpsContract.approval.teal +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/MiscellaneousOps/data/MiscellaneousOpsContract.arc32.json +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/MiscellaneousOps/data/MiscellaneousOpsContract.clear.teal +0 -0
- {algorand_python_testing-0.3.0b9/tests/artifacts/StateOps → algorand_python_testing-0.4.0/tests/artifacts/PrimitiveOps}/__init__.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/PrimitiveOps/contract.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.approval.teal +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.arc32.json +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.clear.teal +0 -0
- {algorand_python_testing-0.3.0b9/tests/artifacts → algorand_python_testing-0.4.0/tests/artifacts/StateMutations}/__init__.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/StateMutations/data/Contract.approval.teal +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/StateMutations/data/Contract.arc32.json +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/StateMutations/data/Contract.clear.teal +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/StateMutations/statemutations.py +0 -0
- {algorand_python_testing-0.3.0b9/tests/contexts → algorand_python_testing-0.4.0/tests/artifacts/StateOps}/__init__.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/StateOps/data/StateAcctParamsGet.approval.teal +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/StateOps/data/StateAcctParamsGet.arc32.json +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/StateOps/data/StateAcctParamsGet.clear.teal +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/artifacts/StateOps/data/StateAcctParamsGetContract.clear.teal +0 -0
- {algorand_python_testing-0.3.0b9/tests/models → algorand_python_testing-0.4.0/tests/artifacts}/__init__.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/common.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/conftest.py +0 -0
- {algorand_python_testing-0.3.0b9/tests/primitives → algorand_python_testing-0.4.0/tests/contexts}/__init__.py +0 -0
- {algorand_python_testing-0.3.0b9/tests/state → algorand_python_testing-0.4.0/tests/models}/__init__.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/models/test_box.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/models/test_box_map.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/models/test_box_ref.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/models/test_uenumerate.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/models/test_urange.py +0 -0
- {algorand_python_testing-0.3.0b9/tests/utilities → algorand_python_testing-0.4.0/tests/primitives}/__init__.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/primitives/conftest.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/primitives/test_biguint.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/primitives/test_bytes.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/primitives/test_string.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/primitives/test_uint64.py +0 -0
- {algorand_python_testing-0.3.0b9/tests/value_generators → algorand_python_testing-0.4.0/tests/state}/__init__.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/state/conftest.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/state/test_global_state.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/state/test_local_state.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/state/test_mutations.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/test_miscellaneous_op.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/util.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/utilities/conftest.py +0 -0
- {algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/tests/utilities/test_log.py +0 -0
|
@@ -1,4 +1,42 @@
|
|
|
1
1
|
# CHANGELOG
|
|
2
|
+
## v0.4.0 (2024-08-27)
|
|
3
|
+
|
|
4
|
+
## v0.4.0-beta.2 (2024-08-27)
|
|
5
|
+
|
|
6
|
+
## v0.4.0-beta.1 (2024-08-27)
|
|
7
|
+
|
|
8
|
+
### Feature
|
|
9
|
+
|
|
10
|
+
* add support for frozen on asset holdings, including a new ledger function `update_asset_holdings` for setting asset holding balances and frozen states ([`d777ca0`](https://github.com/algorandfoundation/algorand-python-testing/commit/d777ca0a318a8ade7a20363c9ce77fe8a8bf5d68))
|
|
11
|
+
|
|
12
|
+
* expand accepted types when interacting with accounts, applications and assets ([`f448a97`](https://github.com/algorandfoundation/algorand-python-testing/commit/f448a97cb154c9f90ecf42c599b240f12928af20))
|
|
13
|
+
|
|
14
|
+
wip
|
|
15
|
+
|
|
16
|
+
* replaced `account_exists` with `account_is_funded` as the later is more useful ([`4d08690`](https://github.com/algorandfoundation/algorand-python-testing/commit/4d086903eb93a70ce1d485cdd7b12d8472ef16db))
|
|
17
|
+
|
|
18
|
+
### Fix
|
|
19
|
+
|
|
20
|
+
* use correct type for Globals.caller_application_id ([`a30d85a`](https://github.com/algorandfoundation/algorand-python-testing/commit/a30d85a4416dfc2c5d901f3ace2265384ef60c01))
|
|
21
|
+
|
|
22
|
+
* do not allow specifying `address` for applications, it is derived from the app_id ([`00fe1bc`](https://github.com/algorandfoundation/algorand-python-testing/commit/00fe1bc8ea247dcc36b01154db36b984b151e396))
|
|
23
|
+
|
|
24
|
+
* do not treat asset and application ids as possible foreign array indexes ([`94a989f`](https://github.com/algorandfoundation/algorand-python-testing/commit/94a989f77169da2ae437c629cd5f4d8a872263f6))
|
|
25
|
+
|
|
26
|
+
* removed incorrect deduction in `algopy.op.balance` ([`76e67c5`](https://github.com/algorandfoundation/algorand-python-testing/commit/76e67c5e3dd1cda388a2a948d452ba89805add6a))
|
|
27
|
+
|
|
28
|
+
* ensure all comparable types return `NotImplemented` when a comparison is not possible ([`b055fa6`](https://github.com/algorandfoundation/algorand-python-testing/commit/b055fa68531e0b7923773ec10c2097a3d64b9dbe))
|
|
29
|
+
|
|
30
|
+
* `arc4_prefix` annotated to also accept `algopy.Bytes` ([`40328ca`](https://github.com/algorandfoundation/algorand-python-testing/commit/40328ca3701b3e255193e206e8a7b1bdb441a346))
|
|
31
|
+
|
|
32
|
+
### Documentation
|
|
33
|
+
|
|
34
|
+
* include usage of `algopy_testing_context` in README.md quick start ([`4702f60`](https://github.com/algorandfoundation/algorand-python-testing/commit/4702f60cfe7d09956a5ae6dbdcd72da29fdda808))
|
|
35
|
+
|
|
36
|
+
## v0.3.0 (2024-08-22)
|
|
37
|
+
|
|
38
|
+
## v0.3.0-beta.10 (2024-08-22)
|
|
39
|
+
|
|
2
40
|
## v0.3.0-beta.9 (2024-08-22)
|
|
3
41
|
|
|
4
42
|
## v0.3.0-beta.8 (2024-08-22)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: algorand-python-testing
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.4.0
|
|
4
4
|
Summary: Algorand Python testing library
|
|
5
5
|
Project-URL: Documentation, https://github.com/algorandfoundation/puya/tree/main/algopy_testing#README.md
|
|
6
6
|
Project-URL: Issues, https://github.com/algorandfoundation/puya/issues
|
|
@@ -55,17 +55,18 @@ Alternatively, if you want to start from scratch:
|
|
|
55
55
|
```python
|
|
56
56
|
from algopy_testing import algopy_testing_context
|
|
57
57
|
from your_contract import YourContract
|
|
58
|
-
|
|
58
|
+
|
|
59
59
|
def test_your_contract():
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
60
|
+
with algopy_testing_context() as context:
|
|
61
|
+
# Arrange
|
|
62
|
+
contract = YourContract()
|
|
63
|
+
expected_result = ... # Your expected result here
|
|
64
|
+
|
|
65
|
+
# Act
|
|
66
|
+
result = contract.your_method(context.any.uint64()) # Your test code here
|
|
67
|
+
|
|
68
|
+
# Assert
|
|
69
|
+
assert result == expected_result
|
|
69
70
|
```
|
|
70
71
|
|
|
71
72
|
5. Run your tests using your preferred Python testing framework (e.g., pytest, unittest)
|
|
@@ -32,17 +32,18 @@ Alternatively, if you want to start from scratch:
|
|
|
32
32
|
```python
|
|
33
33
|
from algopy_testing import algopy_testing_context
|
|
34
34
|
from your_contract import YourContract
|
|
35
|
-
|
|
35
|
+
|
|
36
36
|
def test_your_contract():
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
37
|
+
with algopy_testing_context() as context:
|
|
38
|
+
# Arrange
|
|
39
|
+
contract = YourContract()
|
|
40
|
+
expected_result = ... # Your expected result here
|
|
41
|
+
|
|
42
|
+
# Act
|
|
43
|
+
result = contract.your_method(context.any.uint64()) # Your test code here
|
|
44
|
+
|
|
45
|
+
# Assert
|
|
46
|
+
assert result == expected_result
|
|
46
47
|
```
|
|
47
48
|
|
|
48
49
|
5. Run your tests using your preferred Python testing framework (e.g., pytest, unittest)
|
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# API Reference
|
|
2
2
|
|
|
3
|
+
An overview of the `algorand-python-testing`'s `algopy_testing` module - covering the main classes and functions.
|
|
4
|
+
|
|
5
|
+
```{hint}
|
|
6
|
+
Spotted a typo in documentation? This project is open source, please submit an issue or a PR on [GitHub](https://github.com/algorand/algorand-python-testing).
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
```{warning}
|
|
10
|
+
Note, assume `_algopy_testing` to refer to `algopy_testing` namespace in the auto-generated class documentation above. To be patched in near future.
|
|
11
|
+
```
|
|
12
|
+
|
|
3
13
|
## Contexts
|
|
4
14
|
|
|
5
15
|
```{autodoc2-summary}
|
|
@@ -84,3 +84,13 @@ doctest_test_doctest_blocks = "default"
|
|
|
84
84
|
sphinxmermaid_mermaid_init = {
|
|
85
85
|
"theme": "dark",
|
|
86
86
|
}
|
|
87
|
+
|
|
88
|
+
# Ignore specific warning types
|
|
89
|
+
# TODO : remove upon refining autodoc2 (or finding alternative to sphinx)
|
|
90
|
+
suppress_warnings = [
|
|
91
|
+
"myst.xref_missing",
|
|
92
|
+
"autodoc2.dup_item",
|
|
93
|
+
"ref.python", # Ignore Python reference warnings
|
|
94
|
+
"ref.class", # Ignore class reference warnings
|
|
95
|
+
"ref.obj", # Ignore object reference warnings
|
|
96
|
+
]
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# FAQ
|
|
2
|
+
|
|
3
|
+
## What is a Test Context?
|
|
4
|
+
|
|
5
|
+
A Test Context is a context manager that provides a simulated Algorand environment for testing Python smart contracts. It allows developers to create and manipulate a virtual Algorand ecosystem for testing purposes. For more details, see the [Test Context section](testing-guide/concepts.md#test-context) in our documentation.
|
|
6
|
+
|
|
7
|
+
## What is the Algorand Virtual Machine (AVM)?
|
|
8
|
+
|
|
9
|
+
The Algorand Virtual Machine (AVM) is the runtime environment for Algorand smart contracts. It executes the compiled code of smart contracts on the Algorand blockchain. To learn more about the AVM, visit the [official Algorand documentation](https://developer.algorand.org/docs/get-details/dapps/avm/).
|
|
10
|
+
|
|
11
|
+
## What are Operational Codes in Algorand?
|
|
12
|
+
|
|
13
|
+
Operational Codes, or opcodes, are AVM instructions that are executed directly by the AVM. In the context of Algorand Python testing, these opcodes are provided by `algopy` stubs and are either emulated, implemented, or mocked by `algorand-python-testing`. For a comprehensive list of opcodes, refer to the [Algorand Developer Documentation](https://developer.algorand.org/docs/get-details/dapps/avm/teal/opcodes/?from_query=OPcodes#template-modal-overlay).
|
|
14
|
+
|
|
15
|
+
## What are Value Generators?
|
|
16
|
+
|
|
17
|
+
Value Generators are helper methods that generate randomized values for testing when the specific value of the tested type is not important. In the context of Algorand Python testing, these are represented by property on the context manager, accessed via `any.*` (or `any.arc4.*`, `any.txn.*`. in the case of ARC 4 types). To understand how to use Value Generators effectively, check out our [Value Generators section](testing-guide/concepts.md#value-generators) in the documentation.
|
|
18
|
+
|
|
19
|
+
## What are the limitations of the Algorand Python Testing framework?
|
|
20
|
+
|
|
21
|
+
The Algorand Python Testing framework emulates the Algorand Virtual Machine (AVM) for unit testing Algorand Python smart contracts without interacting with the real Algorand Network. However, it has some limitations due to its scope and purpose:
|
|
22
|
+
|
|
23
|
+
1. Simplified balance tracking and transaction validation
|
|
24
|
+
2. No consensus mechanism or AVM network operations simulation
|
|
25
|
+
3. Absence of a strict opcode budget system
|
|
26
|
+
4. Certain cryptographic operations are mocked or simplified
|
|
27
|
+
5. No state proof generation or verification
|
|
28
|
+
|
|
29
|
+
For scenarios where these limitations are crucial, it's recommended to pair this framework with integration testing. If you have a solid reason to justify introducing new emulated behaviour, please open an issue or contribute to the project on [Github](https://github.com/algorandfoundation/algorand-python-testing).
|
|
30
|
+
|
|
31
|
+
## How does balance tracking work in the testing framework?
|
|
32
|
+
|
|
33
|
+
The framework uses simplified balance tracking and transaction validation. For scenarios where precise balance or fee verification is important, it's recommended to complement unit tests with integration testing.
|
|
34
|
+
|
|
35
|
+
## Does the framework simulate the entire AVM network?
|
|
36
|
+
|
|
37
|
+
No, the framework does not simulate the entire AVM network or consensus mechanism. It focuses on emulating the parts of the AVM relevant to unit testing smart contracts.
|
|
38
|
+
|
|
39
|
+
## How does the framework handle opcode budgets?
|
|
40
|
+
|
|
41
|
+
The framework does not implement a strict opcode budget system. For scenarios where validating opcode budget is crucial, it's recommended to use integration testing alongside this framework.
|
|
42
|
+
|
|
43
|
+
## Are all cryptographic operations fully implemented?
|
|
44
|
+
|
|
45
|
+
Some cryptographic operations are mocked or simplified in the framework. For a detailed list of which operations are mocked, refer to the _mockable_ types under the [coverage](./coverage.md) section.
|
|
46
|
+
|
|
47
|
+
## Can I use this framework for security-critical validations?
|
|
48
|
+
|
|
49
|
+
While this framework is useful for unit testing and local development, it should not be the only tool used for security-critical validations or performance benchmarking. It's designed to approximate AVM behavior for common scenarios. Always complement your testing with additional integration testing options available in `algokit`, where you can test against real localnet or testnet environments.
|
|
50
|
+
|
|
51
|
+
## Is there an example of how to use this framework alongside integration tests?
|
|
52
|
+
|
|
53
|
+
Yes, the `algokit-python-template`, accessible via `algokit init`, provides a working example of how to structure `algorand-python-testing` along with regular integration tests against localnet.
|
|
54
|
+
|
|
55
|
+
```{hint}
|
|
56
|
+
An `algokit-python-template` accessible via `algokit init -t python`, provides a comprehensive and customizable working example of how to structure `algorand-python-testing` along with regular integration tests against localnet.
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Is it compatible with `pytest`?
|
|
60
|
+
|
|
61
|
+
Yes, it is compatible with `pytest` and _any_ other python testing framework as its agnostic of the testing framework as long as its python. If you spot incompatibility with a certain tool, please open an issue or contribute to the project on [Github](https://github.com/algorandfoundation/algorand-python-testing).
|
|
@@ -13,18 +13,6 @@ The `algorand-python-testing` package provides:
|
|
|
13
13
|
- An offline testing environment that simulates core AVM functionality
|
|
14
14
|
- A familiar Pythonic experience, compatible with testing frameworks like [pytest](https://docs.pytest.org/en/latest/), [unittest](https://docs.python.org/3/library/unittest.html), and [hypothesis](https://hypothesis.readthedocs.io/en/latest/)
|
|
15
15
|
|
|
16
|
-
```{testsetup}
|
|
17
|
-
import algopy
|
|
18
|
-
import algopy_testing
|
|
19
|
-
from algopy_testing import algopy_testing_context
|
|
20
|
-
|
|
21
|
-
# Create the context manager for snippets below
|
|
22
|
-
ctx_manager = algopy_testing_context()
|
|
23
|
-
|
|
24
|
-
# Enter the context
|
|
25
|
-
context = ctx_manager.__enter__()
|
|
26
|
-
```
|
|
27
|
-
|
|
28
16
|
## Quick Start
|
|
29
17
|
|
|
30
18
|
`algopy` is a prerequisite for `algorand-python-testing`, providing stubs and type annotations for Algorand Python syntax. It enhances code completion and type checking when writing smart contracts. Note that this code isn't directly executable in standard Python interpreters; it's compiled by `puya` into TEAL for Algorand Network deployment.
|
|
@@ -188,11 +176,7 @@ hidden: true
|
|
|
188
176
|
testing-guide/index
|
|
189
177
|
examples
|
|
190
178
|
coverage
|
|
191
|
-
|
|
179
|
+
faq
|
|
192
180
|
api
|
|
193
181
|
algopy
|
|
194
182
|
```
|
|
195
|
-
|
|
196
|
-
```{testcleanup}
|
|
197
|
-
ctx_manager.__exit__(None, None, None)
|
|
198
|
-
```
|
{algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/docs/testing-guide/avm-types.md
RENAMED
|
@@ -103,7 +103,7 @@ asset = context.ledger.get_asset(asset_id=random_asset.id)
|
|
|
103
103
|
|
|
104
104
|
# Update an asset
|
|
105
105
|
context.ledger.update_asset(
|
|
106
|
-
|
|
106
|
+
random_asset,
|
|
107
107
|
name=..., # Optional: New asset name
|
|
108
108
|
total=..., # Optional: New total supply
|
|
109
109
|
decimals=..., # Optional: Number of decimals
|
|
@@ -130,7 +130,7 @@ account = algopy.Account(raw_address) # zero address by default
|
|
|
130
130
|
# Generate a random account
|
|
131
131
|
random_account = context.any.account(
|
|
132
132
|
address=str(raw_address), # Optional: Specify a custom address, defaults to a random address
|
|
133
|
-
opted_asset_balances
|
|
133
|
+
opted_asset_balances={}, # Optional: Specify opted asset balances as dict of assets to balance
|
|
134
134
|
opted_apps=[], # Optional: Specify opted apps as sequence of algopy.Application objects
|
|
135
135
|
balance=..., # Optional: Specify an initial balance
|
|
136
136
|
min_balance=..., # Optional: Specify a minimum balance
|
|
@@ -145,7 +145,7 @@ random_account = context.any.account(
|
|
|
145
145
|
# Generate a random account that is opted into a specific asset
|
|
146
146
|
mock_asset = context.any.asset()
|
|
147
147
|
mock_account = context.any.account(
|
|
148
|
-
opted_asset_balances={mock_asset
|
|
148
|
+
opted_asset_balances={mock_asset: 123}
|
|
149
149
|
)
|
|
150
150
|
|
|
151
151
|
# Get an account by address
|
|
@@ -153,7 +153,7 @@ account = context.ledger.get_account(str(mock_account))
|
|
|
153
153
|
|
|
154
154
|
# Update an account
|
|
155
155
|
context.ledger.update_account(
|
|
156
|
-
|
|
156
|
+
mock_account,
|
|
157
157
|
balance=..., # Optional: New balance
|
|
158
158
|
min_balance=..., # Optional: New minimum balance
|
|
159
159
|
auth_address=context.any.account(), # Optional: New auth address
|
|
@@ -181,7 +181,6 @@ application = algopy.Application()
|
|
|
181
181
|
|
|
182
182
|
# Generate a random application
|
|
183
183
|
random_app = context.any.application(
|
|
184
|
-
address=..., # Optional: Specify a custom address for the application
|
|
185
184
|
approval_program=algopy.Bytes(b''), # Optional: Specify a custom approval program
|
|
186
185
|
clear_state_program=algopy.Bytes(b''), # Optional: Specify a custom clear state program
|
|
187
186
|
global_num_uint=algopy.UInt64(1), # Optional: Number of global uint values
|
|
@@ -197,7 +196,7 @@ app = context.ledger.get_app(app_id=random_app.id)
|
|
|
197
196
|
|
|
198
197
|
# Update an application
|
|
199
198
|
context.ledger.update_app(
|
|
200
|
-
|
|
199
|
+
random_app,
|
|
201
200
|
approval_program=..., # Optional: New approval program
|
|
202
201
|
clear_state_program=..., # Optional: New clear state program
|
|
203
202
|
global_num_uint=..., # Optional: New number of global uint values
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "algorand-python-testing"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.4.0"
|
|
8
8
|
description = 'Algorand Python testing library'
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.12"
|
|
@@ -150,8 +150,10 @@ post-install-commands = [
|
|
|
150
150
|
]
|
|
151
151
|
|
|
152
152
|
[tool.hatch.envs.docs.scripts]
|
|
153
|
-
|
|
154
|
-
|
|
153
|
+
test = "sphinx-build -b doctest docs docs/_build -W --keep-going -n -E"
|
|
154
|
+
clear = "rm -rf docs/_build"
|
|
155
|
+
build = "hatch run docs:clear && sphinx-build docs docs/_build -W --keep-going -n -E"
|
|
156
|
+
dev = "hatch run docs:test && sphinx-autobuild docs docs/_build"
|
|
155
157
|
|
|
156
158
|
# Examples environment
|
|
157
159
|
[tool.hatch.envs.examples]
|
{algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/__init__.py
RENAMED
|
@@ -25,9 +25,6 @@ from _algopy_testing.value_generators.arc4 import ARC4ValueGenerator
|
|
|
25
25
|
from _algopy_testing.value_generators.avm import AVMValueGenerator
|
|
26
26
|
from _algopy_testing.value_generators.txn import TxnValueGenerator
|
|
27
27
|
|
|
28
|
-
# TODO: clean up and ensure only algopy_testing namespace specific user facing abstractions
|
|
29
|
-
# are exposed Only keep the _value_generators, ledger_context, txn_context,
|
|
30
|
-
# context, and arc4_prexif from utils (make utils private)
|
|
31
28
|
__all__ = [
|
|
32
29
|
"ARC4Contract",
|
|
33
30
|
"ARC4ValueGenerator",
|
{algorand_python_testing-0.3.0b9 → algorand_python_testing-0.4.0}/src/_algopy_testing/arc4.py
RENAMED
|
@@ -2,6 +2,7 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import dataclasses
|
|
4
4
|
import decimal
|
|
5
|
+
import functools
|
|
5
6
|
import types
|
|
6
7
|
import typing
|
|
7
8
|
|
|
@@ -169,7 +170,8 @@ class _ABIEncoded(BytesBacked):
|
|
|
169
170
|
def __eq__(self, other: object) -> bool:
|
|
170
171
|
if isinstance(other, _ABIEncoded):
|
|
171
172
|
return self._type_info == other._type_info and self.bytes == other.bytes
|
|
172
|
-
|
|
173
|
+
else:
|
|
174
|
+
return NotImplemented
|
|
173
175
|
|
|
174
176
|
def __hash__(self) -> int:
|
|
175
177
|
return hash(self.bytes)
|
|
@@ -234,7 +236,11 @@ class String(_ABIEncoded):
|
|
|
234
236
|
return String(as_string(other) + self.native)
|
|
235
237
|
|
|
236
238
|
def __eq__(self, other: String | str) -> bool: # type: ignore[override]
|
|
237
|
-
|
|
239
|
+
try:
|
|
240
|
+
other_string = as_string(other)
|
|
241
|
+
except TypeError:
|
|
242
|
+
return NotImplemented
|
|
243
|
+
return self.native == other_string
|
|
238
244
|
|
|
239
245
|
def __bool__(self) -> bool:
|
|
240
246
|
"""Returns `True` if length is not zero."""
|
|
@@ -294,47 +300,12 @@ class _UIntN(_ABIEncoded, typing.Generic[_TBitSize], metaclass=_UIntNMeta):
|
|
|
294
300
|
bytes_value = int_to_bytes(value, self._type_info.max_bytes_len)
|
|
295
301
|
self._value = as_bytes(bytes_value)
|
|
296
302
|
|
|
297
|
-
def __eq__( # type: ignore[override]
|
|
298
|
-
self,
|
|
299
|
-
other: UIntN[_TBitSize] | BigUIntN[_TBitSize] | algopy.UInt64 | algopy.BigUInt | int,
|
|
300
|
-
) -> bool:
|
|
301
|
-
raise NotImplementedError
|
|
302
|
-
|
|
303
|
-
def __ne__( # type: ignore[override]
|
|
304
|
-
self,
|
|
305
|
-
other: UIntN[_TBitSize] | BigUIntN[_TBitSize] | algopy.UInt64 | algopy.BigUInt | int,
|
|
306
|
-
) -> bool:
|
|
307
|
-
raise NotImplementedError
|
|
308
|
-
|
|
309
|
-
def __le__(
|
|
310
|
-
self,
|
|
311
|
-
other: UIntN[_TBitSize] | BigUIntN[_TBitSize] | algopy.UInt64 | algopy.BigUInt | int,
|
|
312
|
-
) -> bool:
|
|
313
|
-
raise NotImplementedError
|
|
314
|
-
|
|
315
|
-
def __lt__(
|
|
316
|
-
self,
|
|
317
|
-
other: UIntN[_TBitSize] | BigUIntN[_TBitSize] | algopy.UInt64 | algopy.BigUInt | int,
|
|
318
|
-
) -> bool:
|
|
319
|
-
raise NotImplementedError
|
|
320
|
-
|
|
321
|
-
def __ge__(
|
|
322
|
-
self,
|
|
323
|
-
other: UIntN[_TBitSize] | BigUIntN[_TBitSize] | algopy.UInt64 | algopy.BigUInt | int,
|
|
324
|
-
) -> bool:
|
|
325
|
-
raise NotImplementedError
|
|
326
|
-
|
|
327
|
-
def __gt__(
|
|
328
|
-
self,
|
|
329
|
-
other: UIntN[_TBitSize] | BigUIntN[_TBitSize] | algopy.UInt64 | algopy.BigUInt | int,
|
|
330
|
-
) -> bool:
|
|
331
|
-
raise NotImplementedError
|
|
332
|
-
|
|
333
303
|
def __bool__(self) -> bool:
|
|
334
304
|
"""Returns `True` if not equal to zero."""
|
|
335
305
|
raise NotImplementedError
|
|
336
306
|
|
|
337
307
|
|
|
308
|
+
@functools.total_ordering
|
|
338
309
|
class UIntN(_UIntN, typing.Generic[_TBitSize]): # type: ignore[type-arg]
|
|
339
310
|
"""An ARC4 UInt consisting of the number of bits specified.
|
|
340
311
|
|
|
@@ -349,22 +320,18 @@ class UIntN(_UIntN, typing.Generic[_TBitSize]): # type: ignore[type-arg]
|
|
|
349
320
|
return algopy.UInt64(int.from_bytes(self._value))
|
|
350
321
|
|
|
351
322
|
def __eq__(self, other: object) -> bool:
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
def __le__(self, other: object) -> bool:
|
|
358
|
-
return as_int64(self.native) <= as_int(other, max=None)
|
|
323
|
+
try:
|
|
324
|
+
other_int = as_int64(other)
|
|
325
|
+
except (TypeError, ValueError):
|
|
326
|
+
return NotImplemented
|
|
327
|
+
return as_int64(self.native) == other_int
|
|
359
328
|
|
|
360
329
|
def __lt__(self, other: object) -> bool:
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
def __gt__(self, other: object) -> bool:
|
|
367
|
-
return as_int64(self.native) > as_int(other, max=None)
|
|
330
|
+
try:
|
|
331
|
+
other_int = as_int64(other)
|
|
332
|
+
except (TypeError, ValueError):
|
|
333
|
+
return NotImplemented
|
|
334
|
+
return as_int64(self.native) < other_int
|
|
368
335
|
|
|
369
336
|
def __bool__(self) -> bool:
|
|
370
337
|
return bool(self.native)
|
|
@@ -376,6 +343,7 @@ class UIntN(_UIntN, typing.Generic[_TBitSize]): # type: ignore[type-arg]
|
|
|
376
343
|
return _arc4_repr(self)
|
|
377
344
|
|
|
378
345
|
|
|
346
|
+
@functools.total_ordering
|
|
379
347
|
class BigUIntN(_UIntN, typing.Generic[_TBitSize]): # type: ignore[type-arg]
|
|
380
348
|
"""An ARC4 UInt consisting of the number of bits specified.
|
|
381
349
|
|
|
@@ -390,22 +358,18 @@ class BigUIntN(_UIntN, typing.Generic[_TBitSize]): # type: ignore[type-arg]
|
|
|
390
358
|
return algopy.BigUInt.from_bytes(self._value)
|
|
391
359
|
|
|
392
360
|
def __eq__(self, other: object) -> bool:
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
def __le__(self, other: object) -> bool:
|
|
399
|
-
return as_int512(self.native) <= as_int(other, max=None)
|
|
361
|
+
try:
|
|
362
|
+
other_int = as_int512(other)
|
|
363
|
+
except (TypeError, ValueError):
|
|
364
|
+
return NotImplemented
|
|
365
|
+
return as_int512(self.native) == other_int
|
|
400
366
|
|
|
401
367
|
def __lt__(self, other: object) -> bool:
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
def __gt__(self, other: object) -> bool:
|
|
408
|
-
return as_int512(self.native) > as_int(other, max=None)
|
|
368
|
+
try:
|
|
369
|
+
other_int = as_int512(other)
|
|
370
|
+
except (TypeError, ValueError):
|
|
371
|
+
return NotImplemented
|
|
372
|
+
return as_int512(self.native) < other_int
|
|
409
373
|
|
|
410
374
|
def __bool__(self) -> bool:
|
|
411
375
|
return bool(self.native)
|
|
@@ -749,8 +713,11 @@ class Address(StaticArray[Byte, typing.Literal[32]]):
|
|
|
749
713
|
`Account` or `str`"""
|
|
750
714
|
if isinstance(other, Address | Account):
|
|
751
715
|
return self.bytes == other.bytes
|
|
752
|
-
|
|
753
|
-
|
|
716
|
+
elif isinstance(other, str):
|
|
717
|
+
other_bytes: bytes = algosdk.encoding.decode_address(other)
|
|
718
|
+
return self.bytes == other_bytes
|
|
719
|
+
else:
|
|
720
|
+
return NotImplemented
|
|
754
721
|
|
|
755
722
|
def __str__(self) -> str:
|
|
756
723
|
return str(self.native)
|
|
@@ -104,6 +104,9 @@ def algopy_testing_context(
|
|
|
104
104
|
"""
|
|
105
105
|
from _algopy_testing.context import AlgopyTestContext
|
|
106
106
|
|
|
107
|
+
if _var.get(None) is not None:
|
|
108
|
+
raise RuntimeError("Nested `algopy_testing_context`s are not allowed.")
|
|
109
|
+
|
|
107
110
|
token = _var.set(
|
|
108
111
|
AlgopyTestContext(
|
|
109
112
|
default_sender=default_sender,
|