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

Fix the logic of __get_personal_info used in ledger history API #641

Merged
merged 1 commit into from
Jun 7, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
43 changes: 23 additions & 20 deletions app/routers/ledger.py
Original file line number Diff line number Diff line change
Expand Up @@ -948,28 +948,31 @@ async def __get_personal_info(
elif token_type == TokenType.IBET_STRAIGHT_BOND.value:
token_contract = await IbetStraightBondContract(token_address).get()

if token_contract.require_personal_info_registered is False:
if token_contract.require_personal_info_registered is True:
# Get issuer account
issuer_account = (
await db.scalars(
select(Account)
.where(Account.issuer_address == token.issuer_address)
.limit(1)
)
).first()

# Retrieve personal info from contract storage
personal_info_contract = PersonalInfoContract(
issuer=issuer_account,
contract_address=token_contract.personal_info_contract_address,
)
personal_info = await personal_info_contract.get_info(
account_address=account_address, default_value=None
)
if any(personal_info.values()) is False:
personal_info_not_registered = True
else:
personal_info_not_registered = False
else:
# Do not retrieve contract data and return the default value
personal_info = ContractPersonalInfoType().model_dump()
personal_info_not_registered = True
return personal_info, personal_info_not_registered

# Get issuer account
issuer_account = (
await db.scalars(
select(Account)
.where(Account.issuer_address == token.issuer_address)
.limit(1)
)
).first()

# Retrieve personal info from contract storage
personal_info_contract = PersonalInfoContract(
issuer=issuer_account,
contract_address=token_contract.personal_info_contract_address,
)
personal_info = await personal_info_contract.get_info(
account_address=account_address, default_value=None
)
personal_info_not_registered = False
return personal_info, personal_info_not_registered
Original file line number Diff line number Diff line change
Expand Up @@ -1810,6 +1810,332 @@ def test_normal_3_4(self, client, db):
],
}

# <Normal_3_5>
# latest_flg = 1 (Get the latest personal info)
# - address_1 has personal info in the DB but the values are null
# - address_2 has personal info in the DB
def test_normal_3_5(self, client, db):
user_1 = config_eth_account("user1")
issuer_address = user_1["address"]
token_address = "0xABCdeF1234567890abcdEf123456789000000000"
account_address_1 = "0xABCdeF1234567890abCDeF123456789000000001"
account_address_2 = "0xaBcdEF1234567890aBCDEF123456789000000002"
personal_info_contract_address = "0xabcDEF1234567890AbcDEf123456789000000003"

# prepare data
_token = Token()
_token.type = TokenType.IBET_STRAIGHT_BOND.value
_token.tx_hash = ""
_token.issuer_address = issuer_address
_token.token_address = token_address
_token.abi = {}
_token.version = TokenVersion.V_24_06
db.add(_token)

_ledger_1 = Ledger()
_ledger_1.token_address = token_address
_ledger_1.token_type = TokenType.IBET_STRAIGHT_BOND.value
_ledger_1.ledger = {
"created": "2022/12/01",
"token_name": "テスト原簿",
"currency": "JPY",
"headers": [
{
"key": "aaa",
"value": "aaa",
},
{
"hoge": "aaaa",
"fuga": "bbbb",
},
],
"details": [
{
"token_detail_type": "権利_test_1",
"headers": [
{
"key": "aaa",
"value": "aaa",
},
{"test1": "a", "test2": "b"},
],
"data": [
{
"account_address": account_address_1,
"name": "name_test_1",
"address": "address_test_1",
"amount": 10,
"price": 20,
"balance": 30,
"acquisition_date": "2022/12/02",
},
{
"account_address": account_address_2,
"name": "name_test_2",
"address": "address_test_2",
"amount": 100,
"price": 200,
"balance": 300,
"acquisition_date": "2022/12/03",
},
],
"footers": [
{
"key": "aaa",
"value": "aaa",
},
{"f-test1": "a", "f-test2": "b"},
],
"some_personal_info_not_registered": False,
},
{
"token_detail_type": "権利_test_2",
"headers": [
{
"key": "aaa",
"value": "aaa",
},
{"test1-1": "a", "test2-1": "b"},
],
"data": [
{
"account_address": None,
"name": "name_test_1",
"address": "address_test_1",
"amount": 10,
"price": 20,
"balance": 200,
"acquisition_date": "2020/01/01",
},
{
"account_address": None,
"name": "name_test_2",
"address": "address_test_2",
"amount": 20,
"price": 30,
"balance": 600,
"acquisition_date": "2020/01/02",
},
],
"footers": [
{
"key": "aaa",
"value": "aaa",
},
{"f-test1-1": "a", "f-test2-1": "b"},
],
"some_personal_info_not_registered": False,
},
],
"footers": [
{
"key": "aaa",
"value": "aaa",
},
{
"f-hoge": "aaaa",
"f-fuga": "bbbb",
},
],
}
_ledger_1.ledger_created = datetime.strptime(
"2022/01/01 15:20:30", "%Y/%m/%d %H:%M:%S"
) # JST 2022/01/02
db.add(_ledger_1)

_idx_personal_info_1 = (
IDXPersonalInfo()
) # Note: account_address_1 has personal information in DB but the values are null
_idx_personal_info_1.account_address = account_address_1
_idx_personal_info_1.issuer_address = issuer_address
_idx_personal_info_1.personal_info = {
"name": None,
"address": None,
}
db.add(_idx_personal_info_1)

_idx_personal_info_2 = (
IDXPersonalInfo()
) # Note: account_address_2 has personal information in DB
_idx_personal_info_2.account_address = account_address_1
_idx_personal_info_2.issuer_address = issuer_address
_idx_personal_info_2.personal_info = {
"name": "name_db_2",
"address": "address_db_2",
}
db.add(_idx_personal_info_1)

_details_1 = LedgerDetailsTemplate()
_details_1.token_address = token_address
_details_1.token_detail_type = "権利_test_1"
_details_1.headers = [
{
"key": "aaa",
"value": "aaa",
},
{"test1": "a", "test2": "b"},
]
_details_1.footers = [
{
"key": "aaa",
"value": "aaa",
},
{"f-test1": "a", "f-test2": "b"},
]
_details_1.data_type = LedgerDetailsDataType.IBET_FIN.value
_details_1.data_source = token_address
db.add(_details_1)

db.commit()

# Mock
token = IbetStraightBondContract()
token.personal_info_contract_address = personal_info_contract_address
token.issuer_address = issuer_address
token.require_personal_info_registered = True
token_get_mock = mock.patch(
"app.model.blockchain.IbetStraightBondContract.get", return_value=token
)
personal_get_info_mock = mock.patch(
"app.model.blockchain.PersonalInfoContract.get_info"
)

# request target API
with token_get_mock as token_get_mock_patch, personal_get_info_mock as personal_get_info_mock_patch:
# Note:
# account_address_2 has no personal information in the DB
# and gets information from the contract
personal_get_info_mock_patch.side_effect = [
{
"name": None,
"address": None,
},
{
"name": "name_contract_2",
"address": "address_contract_2",
},
]

resp = client.get(
self.base_url.format(token_address=token_address, ledger_id=1),
params={
"latest_flg": 1,
},
headers={
"issuer-address": issuer_address,
},
)
# assertion
personal_get_info_mock_patch.assert_has_calls(
[call(account_address=account_address_2, default_value=None)]
)

# assertion
assert resp.status_code == 200
assert resp.json() == {
"created": "2022/12/01",
"token_name": "テスト原簿",
"currency": "JPY",
"headers": [
{
"key": "aaa",
"value": "aaa",
},
{
"hoge": "aaaa",
"fuga": "bbbb",
},
],
"details": [
{
"token_detail_type": "権利_test_1",
"headers": [
{
"key": "aaa",
"value": "aaa",
},
{"test1": "a", "test2": "b"},
],
"data": [
{
"account_address": account_address_1,
"name": None,
"address": None,
"amount": 10,
"price": 20,
"balance": 30,
"acquisition_date": "2022/12/02",
},
{
"account_address": account_address_2,
"name": "name_contract_2",
"address": "address_contract_2",
"amount": 100,
"price": 200,
"balance": 300,
"acquisition_date": "2022/12/03",
},
],
"footers": [
{
"key": "aaa",
"value": "aaa",
},
{"f-test1": "a", "f-test2": "b"},
],
"some_personal_info_not_registered": True,
},
{
"token_detail_type": "権利_test_2",
"headers": [
{
"key": "aaa",
"value": "aaa",
},
{"test1-1": "a", "test2-1": "b"},
],
"data": [
{
"account_address": None,
"name": "name_test_1",
"address": "address_test_1",
"amount": 10,
"price": 20,
"balance": 200,
"acquisition_date": "2020/01/01",
},
{
"account_address": None,
"name": "name_test_2",
"address": "address_test_2",
"amount": 20,
"price": 30,
"balance": 600,
"acquisition_date": "2020/01/02",
},
],
"footers": [
{
"key": "aaa",
"value": "aaa",
},
{"f-test1-1": "a", "f-test2-1": "b"},
],
"some_personal_info_not_registered": True,
},
],
"footers": [
{
"key": "aaa",
"value": "aaa",
},
{
"f-hoge": "aaaa",
"f-fuga": "bbbb",
},
],
}

# <Normal_4>
# Test `currency` backward compatibility
def test_normal_4(self, client, db):
Expand Down
Loading