github.com/nats-io/nsc@v0.0.0-20221206222106-35db9400b257/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/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  }