github.com/kbehouse/nsc@v0.0.6/cmd/generatecreds_test.go (about) 1 /* 2 * Copyright 2018 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 "os" 20 "testing" 21 22 "github.com/nats-io/jwt/v2" 23 24 "github.com/kbehouse/nsc/cmd/store" 25 "github.com/stretchr/testify/require" 26 ) 27 28 func TestGenerateConfig_Default(t *testing.T) { 29 ts := NewTestStore(t, "operator") 30 defer ts.Done(t) 31 32 ts.AddAccount(t, "A") 33 ts.AddUser(t, "A", "u") 34 35 accountJwt, err := ts.Store.Read(store.Accounts, "A", store.Users, "u.jwt") 36 require.NoError(t, err) 37 38 seed := ts.GetUserSeedKey(t, "A", "u") 39 require.NoError(t, err) 40 41 stdout, _, err := ExecuteCmd(createGenerateCredsCmd()) 42 require.NoError(t, err) 43 require.Contains(t, stdout, string(accountJwt)) 44 require.Contains(t, stdout, seed) 45 } 46 47 func TestGenerateConfig_MultipleAccounts(t *testing.T) { 48 ts := NewTestStore(t, "operator") 49 defer ts.Done(t) 50 51 ts.AddAccount(t, "B") 52 ts.AddUser(t, "B", "u") 53 ts.AddAccount(t, "A") 54 ts.AddUser(t, "A", "u") 55 56 accountJwt, err := ts.Store.Read(store.Accounts, "A", store.Users, "u.jwt") 57 require.NoError(t, err) 58 59 seed := ts.GetUserSeedKey(t, "A", "u") 60 require.NoError(t, err) 61 62 stdout, _, err := ExecuteCmd(createGenerateCredsCmd()) 63 require.NoError(t, err) 64 require.Contains(t, stdout, string(accountJwt)) 65 require.Contains(t, stdout, seed) 66 } 67 68 func TestGenerateConfig_MultipleAccountsAccountRequired(t *testing.T) { 69 ts := NewTestStore(t, "operator") 70 defer ts.Done(t) 71 72 ts.AddAccount(t, "A") 73 ts.AddAccount(t, "B") 74 ts.AddUser(t, "A", "u") 75 ts.AddUser(t, "B", "u") 76 77 GetConfig().SetAccount("") 78 _, _, err := ExecuteCmd(createGenerateCredsCmd()) 79 require.Error(t, err) 80 require.Contains(t, err.Error(), "account is required") 81 } 82 83 func TestGenerateConfig_MultipleUsers(t *testing.T) { 84 ts := NewTestStore(t, "operator") 85 defer ts.Done(t) 86 87 ts.AddAccount(t, "A") 88 ts.AddUser(t, "A", "u") 89 ts.AddUser(t, "A", "uu") 90 91 accountJwt, err := ts.Store.Read(store.Accounts, "A", store.Users, "u.jwt") 92 require.NoError(t, err) 93 94 seed := ts.GetUserSeedKey(t, "A", "u") 95 require.NoError(t, err) 96 97 _, _, err = ExecuteCmd(createGenerateCredsCmd()) 98 require.Error(t, err) 99 require.Equal(t, "user is required", err.Error()) 100 101 stdout, _, err := ExecuteCmd(createGenerateCredsCmd(), "--account", "A", "--name", "u") 102 require.NoError(t, err) 103 require.Contains(t, stdout, string(accountJwt)) 104 require.Contains(t, stdout, seed) 105 } 106 107 func TestGenerateConfig_Interactive(t *testing.T) { 108 ts := NewTestStore(t, "operator") 109 defer ts.Done(t) 110 111 ts.AddAccount(t, "A") 112 ts.AddAccount(t, "B") 113 ts.AddUser(t, "A", "u") 114 ts.AddUser(t, "A", "uu") 115 116 accountJwt, err := ts.Store.Read(store.Accounts, "A", store.Users, "u.jwt") 117 require.NoError(t, err) 118 119 seed := ts.GetUserSeedKey(t, "A", "u") 120 stdout, _, err := ExecuteInteractiveCmd(createGenerateCredsCmd(), []interface{}{0, 0}) 121 require.NoError(t, err) 122 require.Contains(t, stdout, string(accountJwt)) 123 require.Contains(t, stdout, seed) 124 } 125 126 func TestGenerateConfig_HonorsAccount(t *testing.T) { 127 ts := NewTestStore(t, "operator") 128 defer ts.Done(t) 129 130 ts.AddAccount(t, "A") 131 ts.AddUser(t, "A", "au") 132 ts.AddAccount(t, "B") 133 ts.AddUser(t, "B", "bu") 134 135 stdout, _, err := ExecuteCmd(createGenerateCredsCmd(), "--account", "A") 136 require.NoError(t, err) 137 userToken, err := jwt.ParseDecoratedJWT([]byte(stdout)) 138 require.NoError(t, err) 139 140 uc, err := jwt.DecodeUserClaims(userToken) 141 require.NoError(t, err) 142 require.Equal(t, "au", uc.Name) 143 144 stdout, _, err = ExecuteCmd(createGenerateCredsCmd(), "--account", "B") 145 require.NoError(t, err) 146 userToken, err = jwt.ParseDecoratedJWT([]byte(stdout)) 147 require.NoError(t, err) 148 149 uc, err = jwt.DecodeUserClaims(userToken) 150 require.NoError(t, err) 151 require.Equal(t, "bu", uc.Name) 152 } 153 154 func TestGenerateConfig_InteractiveHonorsAccount(t *testing.T) { 155 ts := NewTestStore(t, "operator") 156 defer ts.Done(t) 157 158 ts.AddAccount(t, "A") 159 ts.AddUser(t, "A", "au") 160 ts.AddAccount(t, "B") 161 ts.AddUser(t, "B", "bu") 162 163 t.Log(os.Args[0]) 164 165 inputs := []interface{}{0} 166 stdout, _, err := ExecuteInteractiveCmd(createGenerateCredsCmd(), inputs) 167 require.NoError(t, err) 168 userToken, err := jwt.ParseDecoratedJWT([]byte(stdout)) 169 require.NoError(t, err) 170 171 uc, err := jwt.DecodeUserClaims(userToken) 172 require.NoError(t, err) 173 require.Equal(t, "au", uc.Name) 174 }