<< All versions
Skill v1.0.0
currentAutomated scan100/100internet-court/internet-court-skill/direct-tests
──Details
PublishedOctober 25, 2026 at 05:44 AM
Content Hashsha256:c5227b4e9a447063...
Git SHAfa89195eeb5c
──Files
Files (1 file, 4.9 KB)
SKILL.md4.9 KBactive
SKILL.md · 199 lines · 4.9 KB
version: "1.0.0" name: direct-tests description: Write and run fast direct mode tests for GenLayer intelligent contracts. allowed-tools:
- Bash
- Read
- Write
- Edit
Direct Mode Tests
Write fast, in-memory tests for intelligent contracts. No server, no Docker — tests run in ~30-50ms.
Running Tests
bash
pytest tests/direct/ -vpytest tests/direct/test_specific.py -vpytest tests/direct/test_specific.py::test_one_case -v
Fixtures
Available from genlayer-test pytest plugin:
python
def test_example(direct_vm, direct_deploy, direct_alice, direct_bob):# direct_vm — VMContext with cheatcodes# direct_deploy — deploy a contract file# direct_alice — test address# direct_bob — test addresspass
All fixtures: direct_vm, direct_deploy, direct_alice, direct_bob, direct_charlie, direct_owner, direct_accounts
Basic Test Pattern
python
def test_set_and_get(direct_vm, direct_deploy, direct_alice):contract = direct_deploy("contracts/my_contract.py")direct_vm.sender = direct_alicecontract.set_data("hello")result = contract.get_data(direct_alice)assert result == "hello"
Mocking Web Requests
For contracts that call gl.nondet.web.get():
python
import jsondef test_with_web_mock(direct_vm, direct_deploy, direct_alice):contract = direct_deploy("contracts/my_contract.py")direct_vm.sender = direct_alice# Pattern: regex matching on URLdirect_vm.mock_web(r".*api\.example\.com/prices.*",{"status": 200, "body": '{"price": 42.5}'},)contract.update_price("ETH/USD")assert contract.get_price("ETH/USD") == 42.5
Full mock format (when you need headers/method control)
python
direct_vm.mock_web(r"api\.example\.com/data",{"response": {"status": 200,"headers": {},"body": json.dumps({"key": "value"}).encode()},"method": "GET"})
Mocking LLM Responses
For contracts that call gl.nondet.exec_prompt():
python
direct_vm.mock_llm(r".*Extract the match result.*", # Regex on prompt textjson.dumps({"score": "2:1", "winner": 1}),)
Clearing Mocks
python
direct_vm.clear_mocks() # Reset between test scenarios
VMContext Cheatcodes
python
# Set transaction senderdirect_vm.sender = direct_alice# Set native value (wei)direct_vm.value = 1000000000000000000 # 1 ETH# Expect a revertwith direct_vm.expect_revert("Insufficient balance"):contract.withdraw(1000)# Temporary sender changewith direct_vm.prank(direct_bob):contract.method() # Called as bob# Snapshot and restore statesnap_id = direct_vm.snapshot()contract.modify_state()direct_vm.revert(snap_id) # State restored# Set account balancedirect_vm.deal(direct_alice, 1000000000000000000)# Time traveldirect_vm.warp("2024-06-01T12:00:00Z")
Test Organization
tests/direct/├── conftest.py # Shared fixtures and mock helpers├── test_<feature>.py # Tests per feature/method└── test_<feature>_web.py # Tests requiring web/LLM mocks
What to Test in Direct Mode
| Category | Example | |
|---|---|---|
| State transitions | Create → read back → verify fields | |
| Validation / reverts | Invalid inputs, unauthorized callers | |
| Access control | Owner-only methods, role checks | |
| Edge cases | Empty state, boundary values, overflow | |
| Web/LLM parsing | Mock responses → verify extraction logic |
Common Patterns
Testing access control
python
def test_only_owner(direct_vm, direct_deploy, direct_alice, direct_bob):contract = direct_deploy("contracts/my_contract.py")direct_vm.sender = direct_alicecontract.create_item("item_1")direct_vm.sender = direct_bobwith direct_vm.expect_revert("Only owner"):contract.delete_item("item_1")
Testing state transitions
python
def test_state_flow(direct_vm, direct_deploy, direct_alice):contract = direct_deploy("contracts/my_contract.py")direct_vm.sender = direct_alicecontract.create_item("item_1")assert contract.get_item("item_1")["status"] == "pending"contract.approve_item("item_1")assert contract.get_item("item_1")["status"] == "approved"
Reusable mock helpers (conftest.py)
python
import jsondef mock_price_api(direct_vm, pair: str, price: float):"""Mock a price API response."""direct_vm.mock_web(rf".*api\.example\.com/prices/{pair}.*",{"status": 200, "body": json.dumps({"price": price})},)
Tips
- Always
direct_vm.sender = ...before calling write methods - Use
--jsonflag ongenvm-lint checkbefore writing tests to understand the contract's interface - Direct mode runs leader function only — validator logic is not exercised. Use integration tests for full consensus validation.