github.com/itscaro/cli@v0.0.0-20190705081621-c9db0fe93829/cli/command/trust/revoke_test.go (about)

     1  package trust
     2  
     3  import (
     4  	"io/ioutil"
     5  	"os"
     6  	"testing"
     7  
     8  	"github.com/docker/cli/cli/trust"
     9  	"github.com/docker/cli/internal/test"
    10  	"github.com/docker/cli/internal/test/notary"
    11  	"github.com/theupdateframework/notary/client"
    12  	"github.com/theupdateframework/notary/passphrase"
    13  	"github.com/theupdateframework/notary/trustpinning"
    14  	"gotest.tools/assert"
    15  	is "gotest.tools/assert/cmp"
    16  )
    17  
    18  func TestTrustRevokeCommandErrors(t *testing.T) {
    19  	testCases := []struct {
    20  		name          string
    21  		args          []string
    22  		expectedError string
    23  	}{
    24  		{
    25  			name:          "not-enough-args",
    26  			expectedError: "requires exactly 1 argument",
    27  		},
    28  		{
    29  			name:          "too-many-args",
    30  			args:          []string{"remote1", "remote2"},
    31  			expectedError: "requires exactly 1 argument",
    32  		},
    33  		{
    34  			name:          "sha-reference",
    35  			args:          []string{"870d292919d01a0af7e7f056271dc78792c05f55f49b9b9012b6d89725bd9abd"},
    36  			expectedError: "invalid repository name",
    37  		},
    38  		{
    39  			name:          "invalid-img-reference",
    40  			args:          []string{"ALPINE"},
    41  			expectedError: "invalid reference format",
    42  		},
    43  		{
    44  			name:          "digest-reference",
    45  			args:          []string{"ubuntu@sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2"},
    46  			expectedError: "cannot use a digest reference for IMAGE:TAG",
    47  		},
    48  	}
    49  	for _, tc := range testCases {
    50  		cmd := newRevokeCommand(
    51  			test.NewFakeCli(&fakeClient{}))
    52  		cmd.SetArgs(tc.args)
    53  		cmd.SetOutput(ioutil.Discard)
    54  		assert.ErrorContains(t, cmd.Execute(), tc.expectedError)
    55  	}
    56  }
    57  
    58  func TestTrustRevokeCommand(t *testing.T) {
    59  	testCases := []struct {
    60  		doc              string
    61  		notaryRepository func(trust.ImageRefAndAuth, []string) (client.Repository, error)
    62  		args             []string
    63  		expectedErr      string
    64  		expectedMessage  string
    65  	}{
    66  		{
    67  			doc:              "OfflineErrors_Confirm",
    68  			notaryRepository: notary.GetOfflineNotaryRepository,
    69  			args:             []string{"reg-name.io/image"},
    70  			expectedMessage:  "Please confirm you would like to delete all signature data for reg-name.io/image? [y/N] \nAborting action.",
    71  		},
    72  		{
    73  			doc:              "OfflineErrors_Offline",
    74  			notaryRepository: notary.GetOfflineNotaryRepository,
    75  			args:             []string{"reg-name.io/image", "-y"},
    76  			expectedErr:      "could not remove signature for reg-name.io/image: client is offline",
    77  		},
    78  		{
    79  			doc:              "OfflineErrors_WithTag_Offline",
    80  			notaryRepository: notary.GetOfflineNotaryRepository,
    81  			args:             []string{"reg-name.io/image:tag"},
    82  			expectedErr:      "could not remove signature for reg-name.io/image:tag: client is offline",
    83  		},
    84  		{
    85  			doc:              "UninitializedErrors_Confirm",
    86  			notaryRepository: notary.GetUninitializedNotaryRepository,
    87  			args:             []string{"reg-name.io/image"},
    88  			expectedMessage:  "Please confirm you would like to delete all signature data for reg-name.io/image? [y/N] \nAborting action.",
    89  		},
    90  		{
    91  			doc:              "UninitializedErrors_NoTrustData",
    92  			notaryRepository: notary.GetUninitializedNotaryRepository,
    93  			args:             []string{"reg-name.io/image", "-y"},
    94  			expectedErr:      "could not remove signature for reg-name.io/image:  does not have trust data for",
    95  		},
    96  		{
    97  			doc:              "UninitializedErrors_WithTag_NoTrustData",
    98  			notaryRepository: notary.GetUninitializedNotaryRepository,
    99  			args:             []string{"reg-name.io/image:tag"},
   100  			expectedErr:      "could not remove signature for reg-name.io/image:tag:  does not have trust data for",
   101  		},
   102  		{
   103  			doc:              "EmptyNotaryRepo_Confirm",
   104  			notaryRepository: notary.GetEmptyTargetsNotaryRepository,
   105  			args:             []string{"reg-name.io/image"},
   106  			expectedMessage:  "Please confirm you would like to delete all signature data for reg-name.io/image? [y/N] \nAborting action.",
   107  		},
   108  		{
   109  			doc:              "EmptyNotaryRepo_NoSignedTags",
   110  			notaryRepository: notary.GetEmptyTargetsNotaryRepository,
   111  			args:             []string{"reg-name.io/image", "-y"},
   112  			expectedErr:      "could not remove signature for reg-name.io/image: no signed tags to remove",
   113  		},
   114  		{
   115  			doc:              "EmptyNotaryRepo_NoValidTrustData",
   116  			notaryRepository: notary.GetEmptyTargetsNotaryRepository,
   117  			args:             []string{"reg-name.io/image:tag"},
   118  			expectedErr:      "could not remove signature for reg-name.io/image:tag: No valid trust data for tag",
   119  		},
   120  		{
   121  			doc:              "AllSigConfirmation",
   122  			notaryRepository: notary.GetEmptyTargetsNotaryRepository,
   123  			args:             []string{"alpine"},
   124  			expectedMessage:  "Please confirm you would like to delete all signature data for alpine? [y/N] \nAborting action.",
   125  		},
   126  	}
   127  
   128  	for _, tc := range testCases {
   129  		t.Run(tc.doc, func(t *testing.T) {
   130  			cli := test.NewFakeCli(&fakeClient{})
   131  			cli.SetNotaryClient(tc.notaryRepository)
   132  			cmd := newRevokeCommand(cli)
   133  			cmd.SetArgs(tc.args)
   134  			cmd.SetOutput(ioutil.Discard)
   135  			if tc.expectedErr != "" {
   136  				assert.ErrorContains(t, cmd.Execute(), tc.expectedErr)
   137  				return
   138  			}
   139  			assert.NilError(t, cmd.Execute())
   140  			assert.Check(t, is.Contains(cli.OutBuffer().String(), tc.expectedMessage))
   141  		})
   142  	}
   143  
   144  }
   145  
   146  func TestGetSignableRolesForTargetAndRemoveError(t *testing.T) {
   147  	tmpDir, err := ioutil.TempDir("", "notary-test-")
   148  	assert.NilError(t, err)
   149  	defer os.RemoveAll(tmpDir)
   150  
   151  	notaryRepo, err := client.NewFileCachedRepository(tmpDir, "gun", "https://localhost", nil, passphrase.ConstantRetriever("password"), trustpinning.TrustPinConfig{})
   152  	assert.NilError(t, err)
   153  	target := client.Target{}
   154  	err = getSignableRolesForTargetAndRemove(target, notaryRepo)
   155  	assert.Error(t, err, "client is offline")
   156  }