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  }