github.com/nats-io/nsc/v2@v2.8.7-0.20240307184528-efd7023c6896/cmd/memresolverconfigbuilder_test.go (about) 1 /* 2 * Copyright 2018-2019 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 "fmt" 20 "os" 21 "path/filepath" 22 "testing" 23 24 "github.com/nats-io/nats-server/v2/server" 25 "github.com/stretchr/testify/require" 26 27 "github.com/nats-io/nsc/v2/cmd/store" 28 ) 29 30 func Test_MemResolverContainsStandardProperties(t *testing.T) { 31 ts := NewTestStore(t, "O") 32 defer ts.Done(t) 33 ts.AddAccount(t, "A") 34 35 builder := NewMemResolverConfigBuilder() 36 37 o, err := ts.Store.Read(store.JwtName("O")) 38 require.NoError(t, err) 39 err = builder.Add(o) 40 require.NoError(t, err) 41 42 a, err := ts.Store.Read(store.Accounts, "A", store.JwtName("A")) 43 require.NoError(t, err) 44 err = builder.Add(a) 45 require.NoError(t, err) 46 47 d, err := builder.Generate() 48 require.NoError(t, err) 49 50 conf := string(d) 51 require.Contains(t, conf, "resolver: MEMORY") 52 require.Contains(t, conf, "resolver_preload: {") 53 } 54 55 func Test_MemResolverNotContainsOperator(t *testing.T) { 56 ts := NewTestStore(t, "O") 57 defer ts.Done(t) 58 ts.AddAccount(t, "A") 59 60 builder := NewMemResolverConfigBuilder() 61 a, err := ts.Store.Read(store.Accounts, "A", store.JwtName("A")) 62 require.NoError(t, err) 63 err = builder.Add(a) 64 require.NoError(t, err) 65 66 _, err = builder.Generate() 67 require.Error(t, err) 68 require.Contains(t, err.Error(), "operator is not set") 69 } 70 71 func Test_MemResolverContainsOperator(t *testing.T) { 72 ts := NewTestStore(t, "O") 73 defer ts.Done(t) 74 ts.AddAccount(t, "A") 75 76 builder := NewMemResolverConfigBuilder() 77 78 o, err := ts.Store.Read(store.JwtName("O")) 79 require.NoError(t, err) 80 err = builder.Add(o) 81 require.NoError(t, err) 82 83 a, err := ts.Store.Read(store.Accounts, "A", store.JwtName("A")) 84 require.NoError(t, err) 85 err = builder.Add(a) 86 require.NoError(t, err) 87 88 d, err := builder.Generate() 89 require.NoError(t, err) 90 91 conf := string(d) 92 require.Contains(t, conf, string(o)) 93 } 94 95 func Test_MemResolverFiltersNonAccounts(t *testing.T) { 96 ts := NewTestStore(t, "O") 97 defer ts.Done(t) 98 ts.AddAccount(t, "A") 99 ts.AddAccount(t, "B") 100 ts.AddUser(t, "A", "ua") 101 102 builder := NewMemResolverConfigBuilder() 103 104 o, err := ts.Store.Read(store.JwtName("O")) 105 require.NoError(t, err) 106 err = builder.Add(o) 107 require.NoError(t, err) 108 109 aac, err := ts.Store.ReadAccountClaim("A") 110 require.NoError(t, err) 111 apk := aac.Subject 112 a, err := ts.Store.Read(store.Accounts, "A", store.JwtName("A")) 113 require.NoError(t, err) 114 err = builder.Add(a) 115 require.NoError(t, err) 116 117 ua, err := ts.Store.Read(store.Accounts, "A", store.Users, store.JwtName("ua")) 118 require.NoError(t, err) 119 err = builder.Add(ua) 120 require.NoError(t, err) 121 122 bac, err := ts.Store.ReadAccountClaim("B") 123 require.NoError(t, err) 124 bpk := bac.Subject 125 b, err := ts.Store.Read(store.Accounts, "B", store.JwtName("B")) 126 require.NoError(t, err) 127 err = builder.Add(b) 128 require.NoError(t, err) 129 130 d, err := builder.Generate() 131 require.NoError(t, err) 132 133 conf := string(d) 134 135 require.NotContains(t, conf, o) 136 require.NotContains(t, conf, ua) 137 require.Contains(t, conf, fmt.Sprintf(" %s: %s\n", apk, string(a))) 138 require.Contains(t, conf, fmt.Sprintf(" %s: %s\n", bpk, string(b))) 139 } 140 141 func Test_MemResolverErrorBadClaim(t *testing.T) { 142 builder := NewMemResolverConfigBuilder() 143 require.Error(t, builder.Add([]byte("bad"))) 144 } 145 146 func Test_MemResolverDir(t *testing.T) { 147 ts := NewTestStore(t, "O") 148 defer ts.Done(t) 149 ts.AddAccount(t, "A") 150 ts.AddAccount(t, "B") 151 152 out := filepath.Join(ts.Dir, "conf") 153 _, _, err := ExecuteCmd(createServerConfigCmd(), "--mem-resolver", 154 "--dir", out) 155 require.NoError(t, err) 156 require.FileExists(t, filepath.Join(out, "O.jwt")) 157 require.FileExists(t, filepath.Join(out, "A.jwt")) 158 require.FileExists(t, filepath.Join(out, "B.jwt")) 159 resolver := filepath.Join(out, "resolver.conf") 160 require.FileExists(t, resolver) 161 d, err := os.ReadFile(resolver) 162 require.NoError(t, err) 163 164 contents := string(d) 165 require.Contains(t, contents, fmt.Sprintf("operator: %q", "O.jwt")) 166 ac, err := ts.Store.ReadAccountClaim("A") 167 require.NoError(t, err) 168 require.Contains(t, contents, fmt.Sprintf("%s: %q", ac.Subject, "A.jwt")) 169 170 bc, err := ts.Store.ReadAccountClaim("B") 171 require.NoError(t, err) 172 require.Contains(t, contents, fmt.Sprintf("%s: %q", bc.Subject, "B.jwt")) 173 } 174 175 func Test_MemResolverServerParse(t *testing.T) { 176 ts := NewTestStore(t, "O") 177 defer ts.Done(t) 178 ts.AddAccount(t, "A") 179 ts.AddAccount(t, "B") 180 181 serverconf := filepath.Join(ts.Dir, "server.conf") 182 183 _, _, err := ExecuteCmd(createServerConfigCmd(), "--mem-resolver", 184 "--config-file", serverconf) 185 186 require.NoError(t, err) 187 188 var opts server.Options 189 require.NoError(t, opts.ProcessConfigFile(serverconf)) 190 } 191 192 func Test_MemResolverContainsSysAccount(t *testing.T) { 193 ts := NewTestStore(t, "O") 194 defer ts.Done(t) 195 ts.AddAccount(t, "A") 196 ts.AddAccount(t, "B") 197 198 stdout, _, err := ExecuteCmd(createServerConfigCmd(), "--mem-resolver", 199 "--sys-account", "B") 200 require.NoError(t, err) 201 202 ac, err := ts.Store.ReadAccountClaim("B") 203 require.NoError(t, err) 204 require.Contains(t, stdout, fmt.Sprintf("system_account: %s", ac.Subject)) 205 }