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  }