Files
herolib/lib/threefold/models_ledger/asset_test.v
2025-10-13 06:52:31 +04:00

162 lines
4.2 KiB
V

module models_ledger
import json
fn test_asset_crud() ! {
mut db := setup_test_db()!
mut asset_db := DBAsset{
db: db
}
// Create test
mut asset_arg := AssetArg{
name: 'TFT Token'
description: 'ThreeFold Token'
address: 'TFT123456789'
asset_type: 'token'
issuer: 1
supply: 1000000.0
decimals: 8
is_frozen: false
metadata: {
'symbol': 'TFT'
'blockchain': 'Stellar'
}
administrators: [u32(1), 2]
min_signatures: 1
}
mut asset := asset_db.new(asset_arg)!
asset = asset_db.set(asset)!
assert asset.id > 0
// Get test
retrieved := asset_db.get(asset.id)!
assert retrieved.name == 'TFT Token'
assert retrieved.description == 'ThreeFold Token'
assert retrieved.address == 'TFT123456789'
assert retrieved.asset_type == 'token'
assert retrieved.issuer == 1
assert retrieved.supply == 1000000.0
assert retrieved.decimals == 8
assert retrieved.is_frozen == false
assert retrieved.metadata == {
'symbol': 'TFT'
'blockchain': 'Stellar'
}
assert retrieved.administrators == [u32(1), 2]
assert retrieved.min_signatures == 1
// Update test
asset.name = 'Updated TFT Token'
asset.supply = 2000000.0
asset.is_frozen = true
asset_db.set(asset)!
retrieved = asset_db.get(asset.id)!
assert retrieved.name == 'Updated TFT Token'
assert retrieved.supply == 2000000.0
assert retrieved.is_frozen == true
// Delete test
success := asset_db.delete(asset.id)!
assert success == true
assert asset_db.exist(asset.id)! == false
}
fn test_asset_list_filtering() ! {
mut db := setup_test_db()!
mut asset_db := DBAsset{
db: db
}
// Create multiple test assets
for i in 0 .. 5 {
mut asset_arg := AssetArg{
name: 'Token ${i}'
description: 'Description ${i}'
address: 'ADDR${i}'
asset_type: if i < 3 { 'token' } else { 'nft' }
issuer: if i % 2 == 0 { u32(1) } else { u32(2) }
supply: 1000.0 * f64(i + 1)
decimals: 8
is_frozen: i >= 3
}
mut asset := asset_db.new(asset_arg)!
asset_db.set(asset)!
}
// Test filter by text
filtered := asset_db.list(AssetListArg{ filter: 'Token 1' })!
assert filtered.len == 1
assert filtered[0].name == 'Token 1'
// Test filter by asset_type
tokens := asset_db.list(AssetListArg{ asset_type: 'token' })!
assert tokens.len == 3
// Test filter by frozen status
frozen := asset_db.list(AssetListArg{ is_frozen: true, filter_frozen: true })!
assert frozen.len == 2
// Test filter by issuer
issuer1 := asset_db.list(AssetListArg{ issuer: 1, filter_issuer: true })!
assert issuer1.len == 3
// Test pagination
page1 := asset_db.list(AssetListArg{ limit: 2, offset: 0 })!
assert page1.len == 2
page2 := asset_db.list(AssetListArg{ limit: 2, offset: 2 })!
assert page2.len == 2
page3 := asset_db.list(AssetListArg{ limit: 2, offset: 4 })!
assert page3.len == 1
}
fn test_asset_api_handler() ! {
mut db := setup_test_db()!
mut factory := new_models_factory(db)!
// Test set method
asset_arg := AssetArg{
name: 'API Test Asset'
description: 'API test description'
address: 'TEST123'
asset_type: 'token'
issuer: 1
supply: 1000.0
decimals: 8
}
json_params := json.encode(asset_arg)
// Set
response := asset_handle(mut factory, 1, {}, UserRef{ id: 1 }, 'set', json_params)!
id := response.result.int()
assert id > 0
// Exist
response2 := asset_handle(mut factory, 2, {}, UserRef{ id: 1 }, 'exist', id.str())!
assert response2.result == 'true'
// Get
response3 := asset_handle(mut factory, 3, {}, UserRef{ id: 1 }, 'get', id.str())!
assert response3.result.contains('API Test Asset')
// List
response4 := asset_handle(mut factory, 4, {}, UserRef{ id: 1 }, 'list', '{}')!
assert response4.result.contains('API Test Asset')
// List with filters
filter_params := json.encode(AssetListArg{ asset_type: 'token' })
response5 := asset_handle(mut factory, 5, {}, UserRef{ id: 1 }, 'list', filter_params)!
assert response5.result.contains('API Test Asset')
// Delete
response6 := asset_handle(mut factory, 6, {}, UserRef{ id: 1 }, 'delete', id.str())!
assert response6.result == 'true'
// Verify deletion
response7 := asset_handle(mut factory, 7, {}, UserRef{ id: 1 }, 'exist', id.str())!
assert response7.result == 'false'
}