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  }