github.com/stellar/stellar-etl@v1.0.1-0.20240312145900-4874b6bf2b89/internal/transform/contract_data_test.go (about) 1 package transform 2 3 import ( 4 "fmt" 5 "math/big" 6 "testing" 7 "time" 8 9 "github.com/stretchr/testify/assert" 10 11 "github.com/stellar/go/ingest" 12 "github.com/stellar/go/xdr" 13 ) 14 15 func TestTransformContractData(t *testing.T) { 16 type transformTest struct { 17 input ingest.Change 18 passphrase string 19 wantOutput ContractDataOutput 20 wantErr error 21 } 22 23 hardCodedInput := makeContractDataTestInput() 24 hardCodedOutput := makeContractDataTestOutput() 25 tests := []transformTest{ 26 { 27 ingest.Change{ 28 Type: xdr.LedgerEntryTypeOffer, 29 Pre: nil, 30 Post: &xdr.LedgerEntry{ 31 Data: xdr.LedgerEntryData{ 32 Type: xdr.LedgerEntryTypeOffer, 33 }, 34 }, 35 }, 36 "unit test", 37 ContractDataOutput{}, fmt.Errorf("Could not extract contract data from ledger entry; actual type is LedgerEntryTypeOffer"), 38 }, 39 } 40 41 for i := range hardCodedInput { 42 tests = append(tests, transformTest{ 43 input: hardCodedInput[i], 44 passphrase: "unit test", 45 wantOutput: hardCodedOutput[i], 46 wantErr: nil, 47 }) 48 } 49 50 for _, test := range tests { 51 header := xdr.LedgerHeaderHistoryEntry{ 52 Header: xdr.LedgerHeader{ 53 ScpValue: xdr.StellarValue{ 54 CloseTime: 1000, 55 }, 56 LedgerSeq: 10, 57 }, 58 } 59 TransformContractData := NewTransformContractDataStruct(MockAssetFromContractData, MockContractBalanceFromContractData) 60 actualOutput, actualError, _ := TransformContractData.TransformContractData(test.input, test.passphrase, header) 61 assert.Equal(t, test.wantErr, actualError) 62 assert.Equal(t, test.wantOutput, actualOutput) 63 } 64 } 65 66 func MockAssetFromContractData(ledgerEntry xdr.LedgerEntry, passphrase string) *xdr.Asset { 67 return &xdr.Asset{ 68 Type: xdr.AssetTypeAssetTypeNative, 69 } 70 } 71 72 func MockContractBalanceFromContractData(ledgerEntry xdr.LedgerEntry, passphrase string) ([32]byte, *big.Int, bool) { 73 var holder [32]byte 74 return holder, big.NewInt(0), true 75 } 76 77 func makeContractDataTestInput() []ingest.Change { 78 var hash xdr.Hash 79 var scStr xdr.ScString = "a" 80 81 contractDataLedgerEntry := xdr.LedgerEntry{ 82 LastModifiedLedgerSeq: 24229503, 83 Data: xdr.LedgerEntryData{ 84 Type: xdr.LedgerEntryTypeContractData, 85 ContractData: &xdr.ContractDataEntry{ 86 Contract: xdr.ScAddress{ 87 Type: xdr.ScAddressTypeScAddressTypeContract, 88 ContractId: &hash, 89 }, 90 Key: xdr.ScVal{ 91 Type: xdr.ScValTypeScvContractInstance, 92 Instance: &xdr.ScContractInstance{ 93 Executable: xdr.ContractExecutable{ 94 Type: xdr.ContractExecutableTypeContractExecutableWasm, 95 WasmHash: &hash, 96 }, 97 Storage: &xdr.ScMap{ 98 xdr.ScMapEntry{ 99 Key: xdr.ScVal{ 100 Type: xdr.ScValTypeScvString, 101 Str: &scStr, 102 }, 103 Val: xdr.ScVal{ 104 Type: xdr.ScValTypeScvString, 105 Str: &scStr, 106 }, 107 }, 108 }, 109 }, 110 }, 111 Durability: xdr.ContractDataDurabilityPersistent, 112 }, 113 }, 114 } 115 116 return []ingest.Change{ 117 { 118 Type: xdr.LedgerEntryTypeContractData, 119 Pre: &xdr.LedgerEntry{}, 120 Post: &contractDataLedgerEntry, 121 }, 122 } 123 } 124 125 func makeContractDataTestOutput() []ContractDataOutput { 126 return []ContractDataOutput{ 127 { 128 ContractId: "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABSC4", 129 ContractKeyType: "ScValTypeScvContractInstance", 130 ContractDurability: "ContractDataDurabilityPersistent", 131 ContractDataAssetCode: "", 132 ContractDataAssetIssuer: "", 133 ContractDataAssetType: "AssetTypeAssetTypeNative", 134 ContractDataBalanceHolder: "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABSC4", 135 ContractDataBalance: "0", 136 LastModifiedLedger: 24229503, 137 LedgerEntryChange: 1, 138 Deleted: false, 139 LedgerSequence: 10, 140 ClosedAt: time.Date(1970, time.January, 1, 0, 16, 40, 0, time.UTC), 141 LedgerKeyHash: "abfc33272095a9df4c310cff189040192a8aee6f6a23b6b462889114d80728ca", 142 }, 143 } 144 }