github.1git.de/docker/cli@v26.1.3+incompatible/cli/command/stack/remove_test.go (about)

     1  package stack
     2  
     3  import (
     4  	"errors"
     5  	"io"
     6  	"strings"
     7  	"testing"
     8  
     9  	"github.com/docker/cli/internal/test"
    10  	"gotest.tools/v3/assert"
    11  	is "gotest.tools/v3/assert/cmp"
    12  )
    13  
    14  func fakeClientForRemoveStackTest(version string) *fakeClient {
    15  	allServices := []string{
    16  		objectName("foo", "service1"),
    17  		objectName("foo", "service2"),
    18  		objectName("bar", "service1"),
    19  		objectName("bar", "service2"),
    20  	}
    21  	allNetworks := []string{
    22  		objectName("foo", "network1"),
    23  		objectName("bar", "network1"),
    24  	}
    25  	allSecrets := []string{
    26  		objectName("foo", "secret1"),
    27  		objectName("foo", "secret2"),
    28  		objectName("bar", "secret1"),
    29  	}
    30  	allConfigs := []string{
    31  		objectName("foo", "config1"),
    32  		objectName("foo", "config2"),
    33  		objectName("bar", "config1"),
    34  	}
    35  	return &fakeClient{
    36  		version:  version,
    37  		services: allServices,
    38  		networks: allNetworks,
    39  		secrets:  allSecrets,
    40  		configs:  allConfigs,
    41  	}
    42  }
    43  
    44  func TestRemoveWithEmptyName(t *testing.T) {
    45  	cmd := newRemoveCommand(test.NewFakeCli(&fakeClient{}))
    46  	cmd.SetArgs([]string{"good", "'   '", "alsogood"})
    47  	cmd.SetOut(io.Discard)
    48  
    49  	assert.ErrorContains(t, cmd.Execute(), `invalid stack name: "'   '"`)
    50  }
    51  
    52  func TestRemoveStackVersion124DoesNotRemoveConfigsOrSecrets(t *testing.T) {
    53  	client := fakeClientForRemoveStackTest("1.24")
    54  	cmd := newRemoveCommand(test.NewFakeCli(client))
    55  	cmd.SetArgs([]string{"foo", "bar"})
    56  
    57  	assert.NilError(t, cmd.Execute())
    58  	assert.Check(t, is.DeepEqual(buildObjectIDs(client.services), client.removedServices))
    59  	assert.Check(t, is.DeepEqual(buildObjectIDs(client.networks), client.removedNetworks))
    60  	assert.Check(t, is.Len(client.removedSecrets, 0))
    61  	assert.Check(t, is.Len(client.removedConfigs, 0))
    62  }
    63  
    64  func TestRemoveStackVersion125DoesNotRemoveConfigs(t *testing.T) {
    65  	client := fakeClientForRemoveStackTest("1.25")
    66  	cmd := newRemoveCommand(test.NewFakeCli(client))
    67  	cmd.SetArgs([]string{"foo", "bar"})
    68  
    69  	assert.NilError(t, cmd.Execute())
    70  	assert.Check(t, is.DeepEqual(buildObjectIDs(client.services), client.removedServices))
    71  	assert.Check(t, is.DeepEqual(buildObjectIDs(client.networks), client.removedNetworks))
    72  	assert.Check(t, is.DeepEqual(buildObjectIDs(client.secrets), client.removedSecrets))
    73  	assert.Check(t, is.Len(client.removedConfigs, 0))
    74  }
    75  
    76  func TestRemoveStackVersion130RemovesEverything(t *testing.T) {
    77  	client := fakeClientForRemoveStackTest("1.30")
    78  	cmd := newRemoveCommand(test.NewFakeCli(client))
    79  	cmd.SetArgs([]string{"foo", "bar"})
    80  
    81  	assert.NilError(t, cmd.Execute())
    82  	assert.Check(t, is.DeepEqual(buildObjectIDs(client.services), client.removedServices))
    83  	assert.Check(t, is.DeepEqual(buildObjectIDs(client.networks), client.removedNetworks))
    84  	assert.Check(t, is.DeepEqual(buildObjectIDs(client.secrets), client.removedSecrets))
    85  	assert.Check(t, is.DeepEqual(buildObjectIDs(client.configs), client.removedConfigs))
    86  }
    87  
    88  func TestRemoveStackSkipEmpty(t *testing.T) {
    89  	allServices := []string{objectName("bar", "service1"), objectName("bar", "service2")}
    90  	allServiceIDs := buildObjectIDs(allServices)
    91  
    92  	allNetworks := []string{objectName("bar", "network1")}
    93  	allNetworkIDs := buildObjectIDs(allNetworks)
    94  
    95  	allSecrets := []string{objectName("bar", "secret1")}
    96  	allSecretIDs := buildObjectIDs(allSecrets)
    97  
    98  	allConfigs := []string{objectName("bar", "config1")}
    99  	allConfigIDs := buildObjectIDs(allConfigs)
   100  
   101  	fakeClient := &fakeClient{
   102  		version:  "1.30",
   103  		services: allServices,
   104  		networks: allNetworks,
   105  		secrets:  allSecrets,
   106  		configs:  allConfigs,
   107  	}
   108  	fakeCli := test.NewFakeCli(fakeClient)
   109  	cmd := newRemoveCommand(fakeCli)
   110  	cmd.SetArgs([]string{"foo", "bar"})
   111  
   112  	assert.NilError(t, cmd.Execute())
   113  	expectedList := []string{
   114  		"Removing service bar_service1",
   115  		"Removing service bar_service2",
   116  		"Removing secret bar_secret1",
   117  		"Removing config bar_config1",
   118  		"Removing network bar_network1\n",
   119  	}
   120  	assert.Check(t, is.Equal(strings.Join(expectedList, "\n"), fakeCli.OutBuffer().String()))
   121  	assert.Check(t, is.Contains(fakeCli.ErrBuffer().String(), "Nothing found in stack: foo\n"))
   122  	assert.Check(t, is.DeepEqual(allServiceIDs, fakeClient.removedServices))
   123  	assert.Check(t, is.DeepEqual(allNetworkIDs, fakeClient.removedNetworks))
   124  	assert.Check(t, is.DeepEqual(allSecretIDs, fakeClient.removedSecrets))
   125  	assert.Check(t, is.DeepEqual(allConfigIDs, fakeClient.removedConfigs))
   126  }
   127  
   128  func TestRemoveContinueAfterError(t *testing.T) {
   129  	allServices := []string{objectName("foo", "service1"), objectName("bar", "service1")}
   130  	allServiceIDs := buildObjectIDs(allServices)
   131  
   132  	allNetworks := []string{objectName("foo", "network1"), objectName("bar", "network1")}
   133  	allNetworkIDs := buildObjectIDs(allNetworks)
   134  
   135  	allSecrets := []string{objectName("foo", "secret1"), objectName("bar", "secret1")}
   136  	allSecretIDs := buildObjectIDs(allSecrets)
   137  
   138  	allConfigs := []string{objectName("foo", "config1"), objectName("bar", "config1")}
   139  	allConfigIDs := buildObjectIDs(allConfigs)
   140  
   141  	removedServices := []string{}
   142  	cli := &fakeClient{
   143  		version:  "1.30",
   144  		services: allServices,
   145  		networks: allNetworks,
   146  		secrets:  allSecrets,
   147  		configs:  allConfigs,
   148  
   149  		serviceRemoveFunc: func(serviceID string) error {
   150  			removedServices = append(removedServices, serviceID)
   151  
   152  			if strings.Contains(serviceID, "foo") {
   153  				return errors.New("")
   154  			}
   155  			return nil
   156  		},
   157  	}
   158  	cmd := newRemoveCommand(test.NewFakeCli(cli))
   159  	cmd.SetOut(io.Discard)
   160  	cmd.SetArgs([]string{"foo", "bar"})
   161  
   162  	assert.Error(t, cmd.Execute(), "Failed to remove some resources from stack: foo")
   163  	assert.Check(t, is.DeepEqual(allServiceIDs, removedServices))
   164  	assert.Check(t, is.DeepEqual(allNetworkIDs, cli.removedNetworks))
   165  	assert.Check(t, is.DeepEqual(allSecretIDs, cli.removedSecrets))
   166  	assert.Check(t, is.DeepEqual(allConfigIDs, cli.removedConfigs))
   167  }