github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/api/client/charms/downloader_s3_test.go (about)

     1  // Copyright 2023 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package charms_test
     5  
     6  import (
     7  	"net/url"
     8  
     9  	"github.com/juju/names/v5"
    10  	"go.uber.org/mock/gomock"
    11  	gc "gopkg.in/check.v1"
    12  
    13  	basemocks "github.com/juju/juju/api/base/mocks"
    14  	"github.com/juju/juju/api/client/charms"
    15  	"github.com/juju/juju/downloader"
    16  )
    17  
    18  type charmS3DownloaderSuite struct {
    19  }
    20  
    21  var _ = gc.Suite(&charmS3DownloaderSuite{})
    22  
    23  func (s *charmS3DownloaderSuite) TestCharmOpener(c *gc.C) {
    24  	correctURL, err := url.Parse("ch:mycharm")
    25  	c.Assert(err, gc.IsNil)
    26  
    27  	tests := []struct {
    28  		name               string
    29  		req                downloader.Request
    30  		mocks              func(*MockCharmGetter, *basemocks.MockAPICaller)
    31  		expectedErrPattern string
    32  	}{
    33  		{
    34  			name: "invalid ArchiveSha256 in request",
    35  			req: downloader.Request{
    36  				ArchiveSha256: "abcd012",
    37  			},
    38  			expectedErrPattern: "download request with archiveSha256 length 7 not valid",
    39  		},
    40  		{
    41  			name: "invalid URL in request",
    42  			req: downloader.Request{
    43  				ArchiveSha256: "abcd0123",
    44  				URL: &url.URL{
    45  					Scheme: "badscheme",
    46  					Host:   "badhost",
    47  				},
    48  			},
    49  			expectedErrPattern: "did not receive a valid charm URL.*",
    50  		},
    51  		{
    52  			name: "open charm OK",
    53  			req: downloader.Request{
    54  				ArchiveSha256: "abcd0123",
    55  				URL:           correctURL,
    56  			},
    57  			mocks: func(mockGetter *MockCharmGetter, mockCaller *basemocks.MockAPICaller) {
    58  
    59  				modelTag := names.NewModelTag("testmodel")
    60  				mockCaller.EXPECT().ModelTag().Return(modelTag, true)
    61  				mockGetter.EXPECT().GetCharm(gomock.Any(), "testmodel", "mycharm-abcd0123").MinTimes(1).Return(nil, nil)
    62  			},
    63  		},
    64  	}
    65  
    66  	for i, tt := range tests {
    67  		c.Logf("test %d - %s", i, tt.name)
    68  
    69  		ctrl := gomock.NewController(c)
    70  		defer ctrl.Finish()
    71  
    72  		mockCaller := basemocks.NewMockAPICaller(ctrl)
    73  		mockGetter := NewMockCharmGetter(ctrl)
    74  		if tt.mocks != nil {
    75  			tt.mocks(mockGetter, mockCaller)
    76  		}
    77  
    78  		charmOpener := charms.NewS3CharmOpener(mockGetter, mockCaller)
    79  		r, err := charmOpener.OpenCharm(tt.req)
    80  
    81  		if tt.expectedErrPattern != "" {
    82  			c.Assert(r, gc.IsNil)
    83  			c.Assert(err, gc.ErrorMatches, tt.expectedErrPattern)
    84  		} else {
    85  			c.Assert(err, gc.IsNil)
    86  		}
    87  	}
    88  }