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