github.com/nats-io/nsc/v2@v2.8.7-0.20240307184528-efd7023c6896/cmd/describeoperator_test.go (about)

     1  /*
     2   * Copyright 2018-2023 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  	"os"
    22  	"path/filepath"
    23  	"strings"
    24  	"testing"
    25  
    26  	"github.com/nats-io/jwt/v2"
    27  
    28  	"github.com/stretchr/testify/require"
    29  )
    30  
    31  func TestDescribeOperator_Single(t *testing.T) {
    32  	ts := NewTestStore(t, "operator")
    33  	defer ts.Done(t)
    34  
    35  	pub := ts.GetOperatorPublicKey(t)
    36  	stdout, _, err := ExecuteCmd(createDescribeOperatorCmd())
    37  	require.NoError(t, err)
    38  	require.Contains(t, stdout, pub)
    39  	require.Contains(t, stdout, " operator ")
    40  }
    41  
    42  func TestDescribeOperator_Raw(t *testing.T) {
    43  	ts := NewTestStore(t, "operator")
    44  	defer ts.Done(t)
    45  	oldRaw := Raw
    46  	Raw = true
    47  	defer func() {
    48  		Raw = oldRaw
    49  	}()
    50  
    51  	stdout, _, err := ExecuteCmd(createDescribeOperatorCmd())
    52  	require.NoError(t, err)
    53  
    54  	oc, err := jwt.DecodeOperatorClaims(stdout)
    55  	require.NoError(t, err)
    56  
    57  	require.NotNil(t, oc)
    58  	require.Equal(t, "operator", oc.Name)
    59  }
    60  
    61  func TestDescribeOperator_Multiple(t *testing.T) {
    62  	ts := NewTestStore(t, "operator")
    63  	defer ts.Done(t)
    64  
    65  	ts.AddOperator(t, "A")
    66  
    67  	_, _, err := ExecuteCmd(createDescribeOperatorCmd())
    68  	require.NoError(t, err)
    69  }
    70  
    71  func TestDescribeOperator_MultipleWithContext(t *testing.T) {
    72  	ts := NewTestStore(t, "operator")
    73  	defer ts.Done(t)
    74  
    75  	ts.AddOperator(t, "A")
    76  	ts.AddOperator(t, "B")
    77  
    78  	err := GetConfig().SetOperator("B")
    79  	require.NoError(t, err)
    80  
    81  	pub := ts.GetOperatorPublicKey(t)
    82  
    83  	stdout, _, err := ExecuteCmd(createDescribeOperatorCmd())
    84  	require.NoError(t, err)
    85  	require.Contains(t, stdout, pub)
    86  	require.Contains(t, stdout, " B ")
    87  }
    88  
    89  func TestDescribeOperator_MultipleWithFlag(t *testing.T) {
    90  	ts := NewTestStore(t, "operator")
    91  	defer ts.Done(t)
    92  
    93  	ts.AddOperator(t, "A")
    94  	ts.AddOperator(t, "B")
    95  
    96  	pub := ts.GetOperatorPublicKey(t)
    97  
    98  	stdout, _, err := ExecuteCmd(createDescribeOperatorCmd(), "--name", "B")
    99  	require.NoError(t, err)
   100  	require.Contains(t, stdout, " B ")
   101  	require.Contains(t, stdout, pub)
   102  }
   103  
   104  func TestDescribeOperator_MultipleWithBadOperator(t *testing.T) {
   105  	ts := NewTestStore(t, "operator")
   106  	defer ts.Done(t)
   107  
   108  	_, _, err := ExecuteCmd(createDescribeOperatorCmd(), "--name", "C")
   109  	require.Error(t, err)
   110  }
   111  
   112  func TestDescribeOperator_AccountServerURL(t *testing.T) {
   113  	ts := NewTestStore(t, "O")
   114  	defer ts.Done(t)
   115  
   116  	stdout, _, err := ExecuteCmd(createDescribeOperatorCmd(), "--name", "O")
   117  	require.NoError(t, err)
   118  	require.NotContains(t, stdout, "Account JWT Server")
   119  
   120  	u := "https://asu.com:1234"
   121  	oc, err := ts.Store.ReadOperatorClaim()
   122  	require.NoError(t, err)
   123  	require.NotNil(t, oc)
   124  	oc.AccountServerURL = u
   125  	token, err := oc.Encode(ts.OperatorKey)
   126  	require.NoError(t, err)
   127  	err = ts.Store.StoreRaw([]byte(token))
   128  	require.NoError(t, err)
   129  
   130  	stdout, _, err = ExecuteCmd(createDescribeOperatorCmd(), "--name", "O")
   131  	require.NoError(t, err)
   132  	require.Contains(t, stdout, u)
   133  }
   134  
   135  func TestDescribeOperator_OperatorServiceURLs(t *testing.T) {
   136  	ts := NewTestStore(t, "O")
   137  	defer ts.Done(t)
   138  
   139  	stdout, _, err := ExecuteCmd(createDescribeOperatorCmd(), "--name", "O")
   140  	require.NoError(t, err)
   141  	require.NotContains(t, stdout, "Operator Service URLs")
   142  
   143  	urls := []string{"nats://localhost:4222", "tls://localhost:4333"}
   144  	oc, err := ts.Store.ReadOperatorClaim()
   145  	require.NoError(t, err)
   146  	oc.OperatorServiceURLs.Add(urls...)
   147  
   148  	token, err := oc.Encode(ts.OperatorKey)
   149  	require.NoError(t, err)
   150  	_, err = ts.Store.StoreClaim([]byte(token))
   151  	require.NoError(t, err)
   152  
   153  	stdout, _, err = ExecuteCmd(createDescribeOperatorCmd(), "--name", "O")
   154  	require.NoError(t, err)
   155  	require.Contains(t, stdout, "Operator Service URLs")
   156  	require.Contains(t, stdout, "nats://localhost:4222")
   157  	require.Contains(t, stdout, "tls://localhost:4333")
   158  }
   159  
   160  func TestDescribeOperator_Json(t *testing.T) {
   161  	ts := NewTestStore(t, "O")
   162  	defer ts.Done(t)
   163  
   164  	out, _, err := ExecuteCmd(rootCmd, "describe", "operator", "--json")
   165  	require.NoError(t, err)
   166  	m := make(map[string]interface{})
   167  	err = json.Unmarshal([]byte(out), &m)
   168  	require.NoError(t, err)
   169  	oc, err := ts.Store.ReadOperatorClaim()
   170  	require.NoError(t, err)
   171  	require.NotNil(t, oc)
   172  	require.Equal(t, oc.Subject, m["sub"])
   173  }
   174  
   175  func TestDescribeOperator_JsonPath(t *testing.T) {
   176  	ts := NewTestStore(t, "O")
   177  	defer ts.Done(t)
   178  
   179  	out, _, err := ExecuteCmd(rootCmd, "describe", "operator", "--field", "sub")
   180  	require.NoError(t, err)
   181  	oc, err := ts.Store.ReadOperatorClaim()
   182  	require.NoError(t, err)
   183  	require.Equal(t, fmt.Sprintf("\"%s\"\n", oc.Subject), out)
   184  }
   185  
   186  func TestDescribeOperator_Output(t *testing.T) {
   187  	ts := NewTestStore(t, "O")
   188  	defer ts.Done(t)
   189  
   190  	p := filepath.Join(ts.Dir, "O.json")
   191  	_, _, err := ExecuteCmd(rootCmd, "describe", "operator", "--json", "--output-file", p)
   192  	require.NoError(t, err)
   193  	data, err := os.ReadFile(p)
   194  	require.NoError(t, err)
   195  
   196  	oc := jwt.OperatorClaims{}
   197  	require.NoError(t, json.Unmarshal(data, &oc))
   198  	require.Equal(t, "O", oc.Name)
   199  
   200  	p = filepath.Join(ts.Dir, "O.txt")
   201  	_, _, err = ExecuteCmd(rootCmd, "describe", "operator", "--output-file", p)
   202  	require.NoError(t, err)
   203  	data, err = os.ReadFile(p)
   204  	require.NoError(t, err)
   205  	strings.Contains(string(data), "Operator Details")
   206  
   207  	p = filepath.Join(ts.Dir, "O.jwt")
   208  	_, _, err = ExecuteCmd(rootCmd, "describe", "operator", "--raw", "--output-file", p)
   209  	require.NoError(t, err)
   210  	data, err = os.ReadFile(p)
   211  	require.NoError(t, err)
   212  	require.Contains(t, string(data), "-----BEGIN NATS OPERATOR JWT-----\ney")
   213  }