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  }