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  }