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 }