new test contracts
This commit is contained in:
@@ -5,12 +5,75 @@
|
||||
# @LAYER: Domain (Core)
|
||||
# @RELATION: DEPENDS_ON -> [DEF:Infra:PostgresDB]
|
||||
# @RELATION: DEPENDS_ON -> [DEF:Infra:AuditLog]
|
||||
#
|
||||
# @INVARIANT: Total system balance must remain constant (Double-Entry Bookkeeping).
|
||||
# @INVARIANT: Negative transfers are strictly forbidden.
|
||||
# @INVARIANT: No partial commit must occur under failure (ACID Atomicity).
|
||||
|
||||
# @TEST_CONTRACT: TransferInput ->
|
||||
# {
|
||||
# required_fields: {
|
||||
# sender_id: str,
|
||||
# receiver_id: str,
|
||||
# amount: Decimal
|
||||
# },
|
||||
# invariants: [
|
||||
# "amount > 0",
|
||||
# "sender_id != receiver_id"
|
||||
# ],
|
||||
# constraints: [
|
||||
# "sender must exist",
|
||||
# "receiver must exist"
|
||||
# ]
|
||||
# }
|
||||
|
||||
# @TEST_CONTRACT: TransferResult ->
|
||||
# {
|
||||
# required_fields: {
|
||||
# tx_id: str,
|
||||
# status: str,
|
||||
# new_balance: Decimal
|
||||
# },
|
||||
# invariants: [
|
||||
# "status == COMPLETED implies balance mutation occurred"
|
||||
# ]
|
||||
# }
|
||||
|
||||
# @TEST_FIXTURE: sufficient_funds ->
|
||||
# {
|
||||
# sender_balance: 500.00,
|
||||
# receiver_balance: 100.00,
|
||||
# amount: 100.00
|
||||
# }
|
||||
|
||||
# @TEST_EDGE: insufficient_funds ->
|
||||
# {
|
||||
# sender_balance: 50.00,
|
||||
# receiver_balance: 100.00,
|
||||
# amount: 100.00
|
||||
# }
|
||||
#
|
||||
# @TEST_EDGE: negative_amount ->
|
||||
# {
|
||||
# sender_balance: 500.00,
|
||||
# receiver_balance: 100.00,
|
||||
# amount: -10.00
|
||||
# }
|
||||
#
|
||||
# @TEST_EDGE: self_transfer ->
|
||||
# {
|
||||
# sender_id: "acc_A",
|
||||
# receiver_id: "acc_A",
|
||||
# amount: 10.00
|
||||
# }
|
||||
|
||||
# @TEST_EDGE: audit_failure -> raises Exception
|
||||
# @TEST_EDGE: concurrency_conflict -> special: concurrent_execution
|
||||
|
||||
# @TEST_INVARIANT: total_balance_constant -> verifies: [sufficient_funds, concurrency_conflict]
|
||||
# @TEST_INVARIANT: no_partial_commit -> verifies: [audit_failure]
|
||||
# @TEST_INVARIANT: negative_transfer_forbidden -> verifies: [negative_amount]
|
||||
|
||||
# @TEST_DATA: sufficient_funds -> {"from": "acc_A", "to": "acc_B", "amt": 100.00}
|
||||
# @TEST_DATA: insufficient_funds -> {"from": "acc_empty", "to": "acc_B", "amt": 1000.00}
|
||||
# @TEST_DATA: concurrency_lock -> {./fixtures/transactions.json#race_condition}
|
||||
|
||||
from decimal import Decimal
|
||||
from typing import NamedTuple
|
||||
|
||||
Reference in New Issue
Block a user