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

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package charms_test
     5  
     6  import (
     7  	"context"
     8  	"io"
     9  	"net/http"
    10  	"strings"
    11  
    12  	jc "github.com/juju/testing/checkers"
    13  	"go.uber.org/mock/gomock"
    14  	gc "gopkg.in/check.v1"
    15  	"gopkg.in/httprequest.v1"
    16  
    17  	basemocks "github.com/juju/juju/api/base/mocks"
    18  	"github.com/juju/juju/api/client/charms"
    19  	"github.com/juju/juju/api/http/mocks"
    20  	coretesting "github.com/juju/juju/testing"
    21  )
    22  
    23  type charmDownloaderSuite struct {
    24  	coretesting.BaseSuite
    25  }
    26  
    27  var _ = gc.Suite(&charmDownloaderSuite{})
    28  
    29  func (s *charmDownloaderSuite) TestCharmOpener(c *gc.C) {
    30  	ctrl := gomock.NewController(c)
    31  	defer ctrl.Finish()
    32  
    33  	mockCaller := basemocks.NewMockAPICaller(ctrl)
    34  	mockHttpDoer := mocks.NewMockHTTPClient(ctrl)
    35  	reqClient := &httprequest.Client{
    36  		BaseURL: "http://somewhere.invalid",
    37  		Doer:    mockHttpDoer,
    38  	}
    39  
    40  	mockCaller.EXPECT().Context().Return(context.TODO()).MinTimes(1)
    41  	mockCaller.EXPECT().HTTPClient().Return(reqClient, nil).MinTimes(1)
    42  
    43  	charmData := "charmdatablob"
    44  	resp := &http.Response{
    45  		StatusCode: 200,
    46  		Header:     make(http.Header),
    47  		Body:       io.NopCloser(strings.NewReader(charmData)),
    48  	}
    49  	resp.Header.Add("Content-Type", "application/json")
    50  	mockHttpDoer.EXPECT().Do(
    51  		&httpURLMatcher{"http://somewhere.invalid/charms\\?file=%2A&url=ch%3Amycharm"},
    52  	).Return(resp, nil).MinTimes(1)
    53  
    54  	opener, err := charms.NewCharmOpener(mockCaller)
    55  	c.Assert(err, jc.ErrorIsNil)
    56  	reader, err := opener.OpenCharm("ch:mycharm")
    57  
    58  	defer reader.Close()
    59  	c.Assert(err, jc.ErrorIsNil)
    60  
    61  	data, err := io.ReadAll(reader)
    62  	c.Assert(err, jc.ErrorIsNil)
    63  	c.Check(data, jc.DeepEquals, []byte(charmData))
    64  }