github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/cosmos-sdk/types/utils_test.go (about) 1 package types 2 3 import ( 4 "testing" 5 "time" 6 7 "github.com/stretchr/testify/require" 8 ) 9 10 func TestSortJSON(t *testing.T) { 11 cases := []struct { 12 unsortedJSON string 13 want string 14 wantErr bool 15 }{ 16 // simple case 17 {unsortedJSON: `{"cosmos":"foo", "atom":"bar", "tendermint":"foobar"}`, 18 want: `{"atom":"bar","cosmos":"foo","tendermint":"foobar"}`, wantErr: false}, 19 // failing case (invalid JSON): 20 {unsortedJSON: `"cosmos":"foo",,,, "atom":"bar", "tendermint":"foobar"}`, 21 want: "", 22 wantErr: true}, 23 // genesis.json 24 {unsortedJSON: `{"consensus_params":{"block_size_params":{"max_bytes":22020096,"max_txs":100000,"max_gas":-1},"tx_size_params":{"max_bytes":10240,"max_gas":-1},"block_gossip_params":{"block_part_size_bytes":65536},"evidence_params":{"max_age":100000}},"validators":[{"pub_key":{"type":"AC26791624DE60","value":"c7UMMAbjFuc5GhGPy0E5q5tefy12p9Tq0imXqdrKXwo="},"power":100,"name":""}],"app_hash":"","genesis_time":"2018-05-11T15:52:25.424795506Z","chain_id":"test-chain-Q6VeoW","app_state":{"accounts":[{"address":"718C9C23F98C9642569742ADDD9F9AB9743FBD5D","coins":[{"denom":"Token","amount":1000},{"denom":"stake","amount":50}]}],"stake":{"pool":{"total_supply":50,"bonded_shares":"0","unbonded_shares":"0","bonded_pool":0,"unbonded_pool":0,"inflation_last_time":0,"inflation":"7/100"},"params":{"inflation_rate_change":"13/100","inflation_max":"1/5","inflation_min":"7/100","goal_bonded":"67/100","max_validators":100,"bond_denom":"stake"},"candidates":null,"bonds":null}}}`, 25 want: `{"app_hash":"","app_state":{"accounts":[{"address":"718C9C23F98C9642569742ADDD9F9AB9743FBD5D","coins":[{"amount":1000,"denom":"Token"},{"amount":50,"denom":"stake"}]}],"stake":{"bonds":null,"candidates":null,"params":{"bond_denom":"stake","goal_bonded":"67/100","inflation_max":"1/5","inflation_min":"7/100","inflation_rate_change":"13/100","max_validators":100},"pool":{"bonded_pool":0,"bonded_shares":"0","inflation":"7/100","inflation_last_time":0,"total_supply":50,"unbonded_pool":0,"unbonded_shares":"0"}}},"chain_id":"test-chain-Q6VeoW","consensus_params":{"block_gossip_params":{"block_part_size_bytes":65536},"block_size_params":{"max_bytes":22020096,"max_gas":-1,"max_txs":100000},"evidence_params":{"max_age":100000},"tx_size_params":{"max_bytes":10240,"max_gas":-1}},"genesis_time":"2018-05-11T15:52:25.424795506Z","validators":[{"name":"","power":100,"pub_key":{"type":"AC26791624DE60","value":"c7UMMAbjFuc5GhGPy0E5q5tefy12p9Tq0imXqdrKXwo="}}]}`, 26 wantErr: false}, 27 // from the TXSpec: 28 {unsortedJSON: `{"chain_id":"test-chain-1","sequence":1,"fee_bytes":{"amount":[{"amount":5,"denom":"photon"}],"gas":10000},"msg_bytes":{"inputs":[{"address":"696E707574","coins":[{"amount":10,"denom":"atom"}]}],"outputs":[{"address":"6F7574707574","coins":[{"amount":10,"denom":"atom"}]}]},"alt_bytes":null}`, 29 want: `{"alt_bytes":null,"chain_id":"test-chain-1","fee_bytes":{"amount":[{"amount":5,"denom":"photon"}],"gas":10000},"msg_bytes":{"inputs":[{"address":"696E707574","coins":[{"amount":10,"denom":"atom"}]}],"outputs":[{"address":"6F7574707574","coins":[{"amount":10,"denom":"atom"}]}]},"sequence":1}`, 30 wantErr: false}, 31 } 32 33 for tcIndex, tc := range cases { 34 tc := tc 35 got, err := SortJSON([]byte(tc.unsortedJSON)) 36 if tc.wantErr { 37 require.NotNil(t, err, "tc #%d", tcIndex) 38 require.Panics(t, func() { MustSortJSON([]byte(tc.unsortedJSON)) }) 39 } else { 40 require.Nil(t, err, "tc #%d, err=%s", tcIndex, err) 41 require.NotPanics(t, func() { MustSortJSON([]byte(tc.unsortedJSON)) }) 42 require.Equal(t, got, MustSortJSON([]byte(tc.unsortedJSON))) 43 } 44 45 require.Equal(t, string(got), tc.want) 46 } 47 } 48 49 func TestTimeFormatAndParse(t *testing.T) { 50 cases := []struct { 51 RFC3339NanoStr string 52 SDKSortableTimeStr string 53 Equal bool 54 }{ 55 {"2009-11-10T23:00:00Z", "2009-11-10T23:00:00.000000000", true}, 56 {"2011-01-10T23:10:05.758230235Z", "2011-01-10T23:10:05.758230235", true}, 57 } 58 for _, tc := range cases { 59 tc := tc 60 timeFromRFC, err := time.Parse(time.RFC3339Nano, tc.RFC3339NanoStr) 61 require.Nil(t, err) 62 timeFromSDKFormat, err := time.Parse(SortableTimeFormat, tc.SDKSortableTimeStr) 63 require.Nil(t, err) 64 65 require.True(t, timeFromRFC.Equal(timeFromSDKFormat)) 66 require.Equal(t, timeFromRFC.Format(SortableTimeFormat), tc.SDKSortableTimeStr) 67 } 68 }