github.com/nats-io/nsc@v0.0.0-20221206222106-35db9400b257/cmd/describeaccount_test.go (about) 1 /* 2 * Copyright 2018-2022 The NATS Authors 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 package cmd 17 18 import ( 19 "encoding/json" 20 "fmt" 21 "testing" 22 23 "github.com/nats-io/jwt/v2" 24 25 "github.com/stretchr/testify/require" 26 ) 27 28 func TestDescribeAccount_Single(t *testing.T) { 29 ts := NewTestStore(t, "operator") 30 defer ts.Done(t) 31 32 opub := ts.GetOperatorPublicKey(t) 33 34 ts.AddAccount(t, "A") 35 pub := ts.GetAccountPublicKey(t, "A") 36 37 stdout, _, err := ExecuteCmd(createDescribeAccountCmd()) 38 require.NoError(t, err) 39 // account A public key 40 require.Contains(t, stdout, pub) 41 // operator public key 42 require.Contains(t, stdout, opub) 43 // name for the account 44 require.Contains(t, stdout, " A ") 45 } 46 47 func TestDescribeAccountRaw(t *testing.T) { 48 ts := NewTestStore(t, "operator") 49 defer ts.Done(t) 50 ts.AddAccount(t, "A") 51 52 Raw = true 53 stdout, _, err := ExecuteCmd(createDescribeAccountCmd()) 54 require.NoError(t, err) 55 56 ac, err := jwt.DecodeAccountClaims(stdout) 57 require.NoError(t, err) 58 59 require.NotNil(t, ac) 60 require.Equal(t, "A", ac.Name) 61 } 62 63 func TestDescribeAccount_Multiple(t *testing.T) { 64 ts := NewTestStore(t, "operator") 65 defer ts.Done(t) 66 67 ts.AddAccount(t, "A") 68 ts.AddAccount(t, "B") 69 70 out, _, err := ExecuteCmd(createDescribeAccountCmd()) 71 require.NoError(t, err) 72 out = StripTableDecorations(out) 73 require.Contains(t, out, "Name B") 74 } 75 76 func TestDescribeAccount_MultipleAccountRequired(t *testing.T) { 77 ts := NewTestStore(t, "operator") 78 defer ts.Done(t) 79 80 ts.AddAccount(t, "A") 81 ts.AddAccount(t, "B") 82 require.NoError(t, GetConfig().SetAccount("")) 83 84 _, _, err := ExecuteCmd(createDescribeAccountCmd()) 85 require.Error(t, err) 86 require.Contains(t, err.Error(), "account is required") 87 } 88 89 func TestDescribeAccount_MultipleWithContext(t *testing.T) { 90 ts := NewTestStore(t, "operator") 91 defer ts.Done(t) 92 93 ts.AddAccount(t, "A") 94 ts.AddAccount(t, "B") 95 96 err := GetConfig().SetAccount("B") 97 require.NoError(t, err) 98 99 opub := ts.GetOperatorPublicKey(t) 100 require.NoError(t, err) 101 102 pub := ts.GetAccountPublicKey(t, "B") 103 104 stdout, _, err := ExecuteCmd(createDescribeAccountCmd()) 105 require.NoError(t, err) 106 require.Contains(t, stdout, pub) 107 require.Contains(t, stdout, opub) 108 require.Contains(t, stdout, " B ") 109 } 110 111 func TestDescribeAccount_MultipleWithFlag(t *testing.T) { 112 ts := NewTestStore(t, "operator") 113 defer ts.Done(t) 114 115 ts.AddAccount(t, "A") 116 ts.AddAccount(t, "B") 117 118 pub := ts.GetAccountPublicKey(t, "B") 119 120 stdout, _, err := ExecuteCmd(createDescribeAccountCmd(), "--name", "B") 121 require.NoError(t, err) 122 require.Contains(t, stdout, pub) 123 require.Contains(t, stdout, " B ") 124 } 125 126 func TestDescribeAccount_MultipleWithBadAccount(t *testing.T) { 127 ts := NewTestStore(t, "operator") 128 defer ts.Done(t) 129 130 ts.AddAccount(t, "A") 131 ts.AddAccount(t, "B") 132 133 _, _, err := ExecuteCmd(createDescribeAccountCmd(), "--name", "C") 134 require.Error(t, err) 135 } 136 137 func TestDescribeAccount_Interactive(t *testing.T) { 138 ts := NewTestStore(t, "operator") 139 defer ts.Done(t) 140 141 ts.AddAccount(t, "A") 142 ts.AddAccount(t, "B") 143 144 _, _, err := ExecuteInteractiveCmd(createDescribeAccountCmd(), []interface{}{0}) 145 require.NoError(t, err) 146 } 147 148 func TestDescribeAccount_Latency(t *testing.T) { 149 ts := NewTestStore(t, "O") 150 defer ts.Done(t) 151 152 ts.AddAccount(t, "A") 153 ts.AddExport(t, "A", jwt.Service, "q", true) 154 ac, err := ts.Store.ReadAccountClaim("A") 155 require.NoError(t, err) 156 ac.Exports[0].Latency = &jwt.ServiceLatency{Sampling: 10, Results: "lat"} 157 token, err := ac.Encode(ts.OperatorKey) 158 require.NoError(t, err) 159 _, err = ts.Store.StoreClaim([]byte(token)) 160 require.NoError(t, err) 161 162 out, _, err := ExecuteInteractiveCmd(createDescribeAccountCmd(), []interface{}{0}) 163 require.NoError(t, err) 164 require.Contains(t, out, "lat (10%)") 165 } 166 167 func TestDescribeAccount_Json(t *testing.T) { 168 ts := NewTestStore(t, "O") 169 defer ts.Done(t) 170 171 ts.AddAccount(t, "A") 172 out, _, err := ExecuteCmd(rootCmd, "describe", "account", "--json") 173 require.NoError(t, err) 174 m := make(map[string]interface{}) 175 err = json.Unmarshal([]byte(out), &m) 176 require.NoError(t, err) 177 ac, err := ts.Store.ReadAccountClaim("A") 178 require.NoError(t, err) 179 require.Equal(t, ac.Subject, m["sub"]) 180 } 181 182 func TestDescribeAccount_JsonPath(t *testing.T) { 183 ts := NewTestStore(t, "O") 184 defer ts.Done(t) 185 186 ts.AddAccount(t, "A") 187 188 out, _, err := ExecuteCmd(rootCmd, "describe", "account", "--field", "sub") 189 require.NoError(t, err) 190 ac, err := ts.Store.ReadAccountClaim("A") 191 require.NoError(t, err) 192 require.Equal(t, fmt.Sprintf("\"%s\"\n", ac.Subject), out) 193 } 194 195 func TestDescribeAccount_JSTiers(t *testing.T) { 196 ts := NewTestStore(t, "O") 197 defer ts.Done(t) 198 199 ts.AddAccount(t, "A") 200 ac, err := ts.Store.ReadAccountClaim("A") 201 require.NoError(t, err) 202 ac.Limits.JetStreamTieredLimits = jwt.JetStreamTieredLimits{} 203 ac.Limits.JetStreamTieredLimits["R1"] = jwt.JetStreamLimits{ 204 DiskStorage: 1024, Streams: 10, MaxBytesRequired: true, DiskMaxStreamBytes: 512} 205 ac.Limits.JetStreamTieredLimits["R3"] = jwt.JetStreamLimits{ 206 MemoryStorage: 1024, Streams: 10, MaxBytesRequired: false, 207 MemoryMaxStreamBytes: 512, MaxAckPending: 99} 208 token, err := ac.Encode(ts.OperatorKey) 209 require.NoError(t, err) 210 _, err = ts.Store.StoreClaim([]byte(token)) 211 require.NoError(t, err) 212 out, _, err := ExecuteInteractiveCmd(createDescribeAccountCmd(), []interface{}{0}) 213 require.NoError(t, err) 214 require.Contains(t, out, " | R1") 215 require.Contains(t, out, " | R3") 216 require.Contains(t, out, " | required") 217 require.Contains(t, out, " | optional") 218 require.Contains(t, out, " | 99") 219 } 220 221 func TestDescribeAccount_Callout(t *testing.T) { 222 ts := NewTestStore(t, "test") 223 defer ts.Done(t) 224 225 ts.AddAccount(t, "A") 226 227 _, uPK, _ := CreateUserKey(t) 228 _, aPK, _ := CreateAccountKey(t) 229 _, _, err := ExecuteCmd(createEditAuthorizationCallout(), 230 "--auth-user", uPK, 231 "--allowed-account", aPK) 232 require.NoError(t, err) 233 234 out, _, err := ExecuteCmd(createDescribeAccountCmd()) 235 require.NoError(t, err) 236 require.Contains(t, out, fmt.Sprintf(" | %s", uPK)) 237 require.Contains(t, out, fmt.Sprintf(" | %s", aPK)) 238 }