diff --git a/CHANGELOG.md b/CHANGELOG.md index da36873b9..b6b848bbc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [[Unreleased]] +### Fixed +- Rectify error in the Directory model in the LedgerEntry request. + ## [[4.4.0]] - 2025-12-16 ### Added diff --git a/tests/integration/reqs/test_ledger_entry.py b/tests/integration/reqs/test_ledger_entry.py new file mode 100644 index 000000000..bd434b48e --- /dev/null +++ b/tests/integration/reqs/test_ledger_entry.py @@ -0,0 +1,60 @@ +from tests.integration.integration_test_case import IntegrationTestCase +from tests.integration.it_utils import ( + fund_wallet_async, + sign_and_reliable_submission_async, + test_async_and_sync, +) +from xrpl.models.requests import LedgerEntry +from xrpl.models.requests.ledger_entry import Directory +from xrpl.models.response import ResponseStatus +from xrpl.models.transactions import DIDSet +from xrpl.wallet import Wallet + +_VALID_FIELD = "1234567890abcdefABCDEF" + + +class TestLedgerEntry(IntegrationTestCase): + @test_async_and_sync(globals()) + async def test_fetch_directory_model(self, client): + + owner_wallet = Wallet.create() + await fund_wallet_async(owner_wallet) + + # Create DID ledger object to populate the directory of owner_wallet account + setup_tx = DIDSet( + account=owner_wallet.address, + did_document=_VALID_FIELD, + uri=_VALID_FIELD, + data=_VALID_FIELD, + ) + response = await sign_and_reliable_submission_async( + setup_tx, owner_wallet, client + ) + self.assertEqual(response.status, ResponseStatus.SUCCESS) + self.assertEqual(response.result["engine_result"], "tesSUCCESS") + + # fetch the directory using the Dataclass model + response = await client.request( + LedgerEntry(directory=Directory(owner=owner_wallet.address, sub_index=0)) + ) + self.assertTrue(response.is_successful()) + self.assertEqual(response.result["node"]["LedgerEntryType"], "DirectoryNode") + + DIR_NODE_INDEX = response.result["index"] + + # fetch directory using JSON input + response = await client.request( + LedgerEntry( + directory={ + "owner": owner_wallet.address, + "sub_index": 0, + }, + ) + ) + self.assertTrue(response.is_successful()) + self.assertEqual(response.result["node"]["LedgerEntryType"], "DirectoryNode") + + # fetch directory using the ledger index + response = await client.request(LedgerEntry(index=DIR_NODE_INDEX)) + self.assertTrue(response.is_successful()) + self.assertEqual(response.result["node"]["LedgerEntryType"], "DirectoryNode") diff --git a/xrpl/models/requests/ledger_entry.py b/xrpl/models/requests/ledger_entry.py index 01afb02ae..f90462f97 100644 --- a/xrpl/models/requests/ledger_entry.py +++ b/xrpl/models/requests/ledger_entry.py @@ -118,24 +118,24 @@ class DepositPreauth(BaseModel): @dataclass(frozen=True, **KW_ONLY_DATACLASS) class Directory(BaseModel): """ - Required fields for requesting a DirectoryNode if not querying by - object ID. + The input requires either dir_root or owner as a sub-field, plus optionally a + sub_index sub-field. """ - owner: str = REQUIRED + owner: Optional[str] = None """ - This field is required. - - :meta hide-value: + (Optional) Unique address of the account associated with this directory. """ - dir_root: str = REQUIRED + dir_root: Optional[str] = None """ - This field is required. - - :meta hide-value: + (Optional) Unique index identifying the directory to retrieve, as a hex string. """ + sub_index: Optional[int] = None + """ + (Optional) If provided, jumps to a later "page" of the DirectoryNode. + """ @require_kwargs_on_init