github.com/kbehouse/nsc@v0.0.6/cmd/describeuser_test.go (about) 1 /* 2 * Copyright 2018-2020 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 TestDescribeUser_Single(t *testing.T) { 29 ts := NewTestStore(t, "operator") 30 defer ts.Done(t) 31 32 ts.AddAccount(t, "A") 33 ts.AddUser(t, "A", "a") 34 35 pub := ts.GetUserPublicKey(t, "A", "a") 36 apub := ts.GetAccountPublicKey(t, "A") 37 38 stdout, _, err := ExecuteCmd(CreateDescribeUserCmd()) 39 require.NoError(t, err) 40 // account A public key 41 require.Contains(t, stdout, apub) 42 // operator public key 43 require.Contains(t, stdout, pub) 44 // name for the account 45 require.Contains(t, stdout, " a ") 46 } 47 48 func TestDescribeUserRaw(t *testing.T) { 49 ts := NewTestStore(t, "operator") 50 defer ts.Done(t) 51 52 ts.AddAccount(t, "A") 53 ts.AddUser(t, "A", "U") 54 55 Raw = true 56 stdout, _, err := ExecuteCmd(CreateDescribeUserCmd()) 57 require.NoError(t, err) 58 59 uc, err := jwt.DecodeUserClaims(stdout) 60 require.NoError(t, err) 61 62 require.NotNil(t, uc) 63 require.Equal(t, "U", uc.Name) 64 } 65 66 func TestDescribeUser_Multiple(t *testing.T) { 67 ts := NewTestStore(t, "operator") 68 defer ts.Done(t) 69 70 ts.AddAccount(t, "A") 71 ts.AddUser(t, "A", "a") 72 ts.AddUser(t, "A", "b") 73 74 _, stderr, err := ExecuteCmd(CreateDescribeUserCmd()) 75 require.Error(t, err) 76 require.Contains(t, stderr, "user is required") 77 } 78 79 func TestDescribeUser_MultipleWithContext(t *testing.T) { 80 ts := NewTestStore(t, "operator") 81 defer ts.Done(t) 82 83 ts.AddAccount(t, "A") 84 ts.AddUser(t, "A", "a") 85 ts.AddAccount(t, "B") 86 ts.AddUser(t, "B", "b") 87 88 err := GetConfig().SetAccount("B") 89 require.NoError(t, err) 90 91 apub := ts.GetAccountPublicKey(t, "B") 92 93 pub := ts.GetUserPublicKey(t, "B", "b") 94 95 stdout, _, err := ExecuteCmd(CreateDescribeUserCmd()) 96 require.NoError(t, err) 97 require.Contains(t, stdout, apub) 98 require.Contains(t, stdout, pub) 99 require.Contains(t, stdout, " b ") 100 } 101 102 func TestDescribeUser_MultipleWithFlag(t *testing.T) { 103 ts := NewTestStore(t, "operator") 104 defer ts.Done(t) 105 106 ts.AddAccount(t, "A") 107 ts.AddAccount(t, "B") 108 ts.AddUser(t, "B", "b") 109 ts.AddUser(t, "B", "bb") 110 111 _, stderr, err := ExecuteCmd(CreateDescribeUserCmd(), "--account", "B") 112 require.Error(t, err) 113 require.Contains(t, stderr, "user is required") 114 115 apub := ts.GetAccountPublicKey(t, "B") 116 117 pub := ts.GetUserPublicKey(t, "B", "bb") 118 119 stdout, _, err := ExecuteCmd(CreateDescribeUserCmd(), "--account", "B", "--name", "bb") 120 require.NoError(t, err) 121 require.Contains(t, stdout, apub) 122 require.Contains(t, stdout, pub) 123 require.Contains(t, stdout, " bb ") 124 } 125 126 func TestDescribeUser_MultipleWithBadUser(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 ts.AddUser(t, "B", "b") 133 134 _, _, err := ExecuteCmd(CreateDescribeUserCmd(), "--account", "A") 135 require.Error(t, err) 136 137 _, _, err = ExecuteCmd(CreateDescribeUserCmd(), "--account", "B", "--name", "a") 138 require.Error(t, err) 139 140 _, _, err = ExecuteCmd(CreateDescribeUserCmd(), "--account", "B", "--name", "b") 141 require.NoError(t, err) 142 } 143 144 func TestDescribeUser_Interactive(t *testing.T) { 145 ts := NewTestStore(t, "operator") 146 defer ts.Done(t) 147 148 ts.AddAccount(t, "A") 149 ts.AddAccount(t, "B") 150 ts.AddUser(t, "B", "bb") 151 152 _, _, err := ExecuteInteractiveCmd(CreateDescribeUserCmd(), []interface{}{1, 0}) 153 require.NoError(t, err) 154 } 155 156 func TestDescribeUser_Account(t *testing.T) { 157 ts := NewTestStore(t, "operator") 158 defer ts.Done(t) 159 160 ts.AddAccount(t, "A") 161 _, pub, kp := CreateAccountKey(t) 162 _, _, err := ExecuteCmd(createEditAccount(), "--name", "A", "--sk", pub) 163 require.NoError(t, err) 164 165 // signed with default account key 166 ts.AddUser(t, "A", "aa") 167 stdout, _, err := ExecuteCmd(CreateDescribeUserCmd(), "--account", "A", "--name", "aa") 168 require.NoError(t, err) 169 require.NotContains(t, stdout, "Issuer Account") 170 171 // signed with a signing key 172 ts.AddUserWithSigner(t, "A", "bb", kp) 173 require.NoError(t, err) 174 stdout, _, err = ExecuteCmd(CreateDescribeUserCmd(), "--account", "A", "--name", "bb") 175 require.NoError(t, err) 176 require.Contains(t, stdout, "Issuer Account") 177 } 178 179 func TestDescribeRawUser(t *testing.T) { 180 ts := NewTestStore(t, "operator") 181 defer ts.Done(t) 182 183 ts.AddAccount(t, "A") 184 _, pub, kp := CreateAccountKey(t) 185 _, _, err := ExecuteCmd(createEditAccount(), "--name", "A", "--sk", pub) 186 require.NoError(t, err) 187 188 // signed with default account key 189 ts.AddUser(t, "A", "aa") 190 stdout, _, err := ExecuteCmd(CreateDescribeUserCmd(), "--account", "A", "--name", "aa") 191 require.NoError(t, err) 192 require.NotContains(t, stdout, "Issuer Account") 193 194 // signed with a signing key 195 ts.AddUserWithSigner(t, "A", "bb", kp) 196 require.NoError(t, err) 197 stdout, _, err = ExecuteCmd(CreateDescribeUserCmd(), "--account", "A", "--name", "bb") 198 require.NoError(t, err) 199 require.Contains(t, stdout, "Issuer Account") 200 } 201 202 func TestDescribeUser_Json(t *testing.T) { 203 ts := NewTestStore(t, "O") 204 defer ts.Done(t) 205 206 ts.AddAccount(t, "A") 207 ts.AddUser(t, "A", "aa") 208 209 out, _, err := ExecuteCmd(rootCmd, "describe", "user", "--json") 210 require.NoError(t, err) 211 m := make(map[string]interface{}) 212 err = json.Unmarshal([]byte(out), &m) 213 require.NoError(t, err) 214 uc, err := ts.Store.ReadUserClaim("A", "aa") 215 require.NoError(t, err) 216 require.NotNil(t, uc) 217 require.Equal(t, uc.Subject, m["sub"]) 218 } 219 220 func TestDescribeUser_JsonPath(t *testing.T) { 221 ts := NewTestStore(t, "O") 222 defer ts.Done(t) 223 224 ts.AddAccount(t, "A") 225 ts.AddUser(t, "A", "aa") 226 227 out, _, err := ExecuteCmd(rootCmd, "describe", "user", "--field", "sub") 228 require.NoError(t, err) 229 uc, err := ts.Store.ReadUserClaim("A", "aa") 230 require.NoError(t, err) 231 require.Equal(t, fmt.Sprintf("\"%s\"\n", uc.Subject), out) 232 } 233 234 func TestDescribeUser_Times(t *testing.T) { 235 ts := NewTestStore(t, "operator") 236 defer ts.Done(t) 237 238 ts.AddAccount(t, "A") 239 ts.AddUser(t, "A", "aa") 240 _, _, err := ExecuteCmd(CreateEditUserCmd(), "--time", "16:04:05-17:04:09") 241 require.NoError(t, err) 242 243 stdout, _, err := ExecuteCmd(CreateDescribeUserCmd(), "--account", "A", "--name", "aa") 244 require.NoError(t, err) 245 require.Contains(t, stdout, "16:04:05-17:04:09") 246 247 }