github.com/nats-io/nsc@v0.0.0-20221206222106-35db9400b257/cmd/deleteimport_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  	"testing"
    20  
    21  	"github.com/nats-io/jwt/v2"
    22  	"github.com/stretchr/testify/require"
    23  )
    24  
    25  func Test_DeleteImport(t *testing.T) {
    26  	ts := NewTestStore(t, "delete import")
    27  	defer ts.Done(t)
    28  
    29  	ts.AddAccount(t, "A")
    30  	ts.AddExport(t, "A", jwt.Stream, "foo", false)
    31  	ts.AddExport(t, "A", jwt.Stream, "bar", false)
    32  
    33  	ts.AddAccount(t, "B")
    34  	ts.AddImport(t, "A", "foo", "B")
    35  	ts.AddImport(t, "A", "bar", "B")
    36  
    37  	tests := CmdTests{
    38  		{createDeleteImportCmd(), []string{"delete", "import", "--account", "A"}, nil, []string{"account \"A\" doesn't have imports"}, true},
    39  		{createDeleteImportCmd(), []string{"delete", "import", "--account", "B"}, nil, []string{"subject is required"}, true},
    40  		{createDeleteImportCmd(), []string{"delete", "import", "--account", "B", "--subject", "baz"}, nil, []string{"no import matching \"baz\" found"}, true},
    41  		{createDeleteImportCmd(), []string{"delete", "import", "--account", "B", "--subject", "foo"}, nil, []string{"deleted stream import \"foo\""}, false},
    42  	}
    43  
    44  	tests.Run(t, "root", "delete")
    45  }
    46  
    47  func Test_DeleteImportAccountRequired(t *testing.T) {
    48  	ts := NewTestStore(t, "delete import")
    49  	defer ts.Done(t)
    50  
    51  	ts.AddAccount(t, "A")
    52  	ts.AddExport(t, "A", jwt.Stream, "foo", false)
    53  	ts.AddAccount(t, "B")
    54  	ts.AddImport(t, "A", "foo", "B")
    55  
    56  	GetConfig().SetAccount("")
    57  	_, _, err := ExecuteCmd(createDeleteImportCmd(), "--subject", "A")
    58  	require.Error(t, err)
    59  	require.Contains(t, err.Error(), "account is required")
    60  }
    61  
    62  func Test_DeleteImportInteractive(t *testing.T) {
    63  	ts := NewTestStore(t, "test")
    64  	defer ts.Done(t)
    65  
    66  	ts.AddAccount(t, "A")
    67  	ts.AddExport(t, "A", jwt.Stream, "foo", false)
    68  	ts.AddExport(t, "A", jwt.Stream, "bar", false)
    69  
    70  	ts.AddAccount(t, "B")
    71  	ts.AddImport(t, "A", "foo", "B")
    72  	ts.AddImport(t, "A", "bar", "B")
    73  
    74  	input := []interface{}{1, 0, 0}
    75  	cmd := createDeleteImportCmd()
    76  	HoistRootFlags(cmd)
    77  	_, _, err := ExecuteInteractiveCmd(cmd, input)
    78  	require.NoError(t, err)
    79  
    80  	ac, err := ts.Store.ReadAccountClaim("B")
    81  	require.NoError(t, err)
    82  	require.Len(t, ac.Imports, 1)
    83  }
    84  
    85  func Test_DeleteAmbiguousImport(t *testing.T) {
    86  	ts := NewTestStore(t, "test")
    87  	defer ts.Done(t)
    88  
    89  	ts.AddAccount(t, "A")
    90  	ac, err := ts.Store.ReadAccountClaim("A")
    91  	require.NoError(t, err)
    92  
    93  	_, apk, _ := CreateAccountKey(t)
    94  	_, bpk, _ := CreateAccountKey(t)
    95  	_, cpk, _ := CreateAccountKey(t)
    96  
    97  	ac.Imports.Add(&jwt.Import{Account: apk, Subject: "x", Type: jwt.Stream})
    98  	ac.Imports.Add(&jwt.Import{Account: bpk, Subject: "x", Type: jwt.Stream})
    99  
   100  	vr := jwt.CreateValidationResults()
   101  	ac.Validate(vr)
   102  	require.False(t, vr.IsBlocking(true))
   103  
   104  	token, err := ac.Encode(ts.OperatorKey)
   105  	require.NoError(t, err)
   106  	_, err = ts.Store.StoreClaim([]byte(token))
   107  	require.NoError(t, err)
   108  
   109  	// fail because there are two with 'x'
   110  	_, _, err = ExecuteCmd(createDeleteImportCmd(), "--subject", "x")
   111  	require.Error(t, err)
   112  
   113  	// fail because no import for x from the specified account
   114  	_, _, err = ExecuteCmd(createDeleteImportCmd(), "--subject", "x", "--src-account", cpk)
   115  	require.Error(t, err)
   116  
   117  	// finally the right args
   118  	_, _, err = ExecuteCmd(createDeleteImportCmd(), "--subject", "x", "--src-account", apk)
   119  	require.NoError(t, err)
   120  
   121  	ac, err = ts.Store.ReadAccountClaim("A")
   122  	require.NoError(t, err)
   123  	require.Len(t, ac.Imports, 1)
   124  }