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 }