github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/apiserver/watcher_internal_test.go (about)

     1  // Copyright 2020 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package apiserver
     5  
     6  import (
     7  	jc "github.com/juju/testing/checkers"
     8  	"go.uber.org/mock/gomock"
     9  	gc "gopkg.in/check.v1"
    10  
    11  	"github.com/juju/juju/apiserver/mocks"
    12  	"github.com/juju/juju/core/life"
    13  	"github.com/juju/juju/core/multiwatcher"
    14  	"github.com/juju/juju/core/status"
    15  	"github.com/juju/juju/environs/config"
    16  	"github.com/juju/juju/rpc/params"
    17  	"github.com/juju/juju/testing"
    18  	coretesting "github.com/juju/juju/testing"
    19  )
    20  
    21  type allWatcherSuite struct {
    22  	testing.BaseSuite
    23  }
    24  
    25  var _ = gc.Suite(&allWatcherSuite{})
    26  
    27  func (s *allWatcherSuite) TestTranslateApplicationWithStatus(c *gc.C) {
    28  	s.assertTranslateApplicationWithStatus(c, newAllWatcherDeltaTranslater())
    29  }
    30  
    31  func (s *allWatcherSuite) assertTranslateApplicationWithStatus(c *gc.C, t DeltaTranslater) {
    32  	input := &multiwatcher.ApplicationInfo{
    33  		ModelUUID: testing.ModelTag.Id(),
    34  		Name:      "test-app",
    35  		CharmURL:  "test-app",
    36  		Life:      life.Alive,
    37  		Status: multiwatcher.StatusInfo{
    38  			Current: status.Active,
    39  		},
    40  	}
    41  	output := t.TranslateApplication(input)
    42  	c.Assert(output, jc.DeepEquals, &params.ApplicationInfo{
    43  		ModelUUID: input.ModelUUID,
    44  		Name:      input.Name,
    45  		CharmURL:  input.CharmURL,
    46  		Life:      input.Life,
    47  		Status: params.StatusInfo{
    48  			Current: status.Active,
    49  		},
    50  	})
    51  }
    52  
    53  func (s *allWatcherSuite) TestTranslateAction(c *gc.C) {
    54  	t := newAllWatcherDeltaTranslater()
    55  	input := &multiwatcher.ActionInfo{
    56  		ModelUUID:  testing.ModelTag.Id(),
    57  		ID:         "2",
    58  		Parameters: map[string]interface{}{"foo": "bar"},
    59  		Results:    map[string]interface{}{"done": true},
    60  	}
    61  	output := t.TranslateAction(input)
    62  	c.Assert(output, jc.DeepEquals, &params.ActionInfo{
    63  		ModelUUID: input.ModelUUID,
    64  		Id:        input.ID,
    65  		Receiver:  input.Receiver,
    66  		Name:      input.Name,
    67  		Status:    input.Status,
    68  		Message:   input.Message,
    69  		Enqueued:  input.Enqueued,
    70  		Started:   input.Started,
    71  		Completed: input.Completed,
    72  	})
    73  }
    74  
    75  func newDelta(info multiwatcher.EntityInfo) multiwatcher.Delta {
    76  	return multiwatcher.Delta{Entity: info}
    77  }
    78  
    79  func (s *allWatcherSuite) TestTranslate(c *gc.C) {
    80  	ctrl := gomock.NewController(c)
    81  	defer ctrl.Finish()
    82  
    83  	dt := mocks.NewMockDeltaTranslater(ctrl)
    84  
    85  	gomock.InOrder(
    86  		dt.EXPECT().TranslateModel(gomock.Any()).Return(nil),
    87  		dt.EXPECT().TranslateApplication(gomock.Any()).Return(nil),
    88  		dt.EXPECT().TranslateRemoteApplication(gomock.Any()).Return(nil),
    89  		dt.EXPECT().TranslateMachine(gomock.Any()).Return(nil),
    90  		dt.EXPECT().TranslateUnit(gomock.Any()).Return(nil),
    91  		dt.EXPECT().TranslateCharm(gomock.Any()).Return(nil),
    92  		dt.EXPECT().TranslateRelation(gomock.Any()).Return(nil),
    93  		dt.EXPECT().TranslateBranch(gomock.Any()).Return(nil),
    94  		dt.EXPECT().TranslateAnnotation(gomock.Any()).Return(nil),
    95  		dt.EXPECT().TranslateBlock(gomock.Any()).Return(nil),
    96  		dt.EXPECT().TranslateAction(gomock.Any()).Return(nil),
    97  		dt.EXPECT().TranslateApplicationOffer(gomock.Any()).Return(nil),
    98  	)
    99  
   100  	deltas := []multiwatcher.Delta{
   101  		newDelta(&multiwatcher.ModelInfo{}),
   102  		newDelta(&multiwatcher.ApplicationInfo{}),
   103  		newDelta(&multiwatcher.RemoteApplicationUpdate{}),
   104  		newDelta(&multiwatcher.MachineInfo{}),
   105  		newDelta(&multiwatcher.UnitInfo{}),
   106  		newDelta(&multiwatcher.CharmInfo{}),
   107  		newDelta(&multiwatcher.RelationInfo{}),
   108  		newDelta(&multiwatcher.BranchInfo{}),
   109  		newDelta(&multiwatcher.AnnotationInfo{}),
   110  		newDelta(&multiwatcher.BlockInfo{}),
   111  		newDelta(&multiwatcher.ActionInfo{}),
   112  		newDelta(&multiwatcher.ApplicationOfferInfo{}),
   113  	}
   114  	_ = translate(dt, deltas)
   115  }
   116  
   117  func (s *allWatcherSuite) TestTranslateModelEmpty(c *gc.C) {
   118  	translator := newAllWatcherDeltaTranslater()
   119  	entityInfo := translator.TranslateModel(&multiwatcher.ModelInfo{
   120  		Config: map[string]any{},
   121  	})
   122  	c.Assert(entityInfo, gc.NotNil)
   123  
   124  	modelUpdate := entityInfo.(*params.ModelUpdate)
   125  	c.Assert(modelUpdate, gc.NotNil)
   126  }
   127  
   128  func (s *allWatcherSuite) TestTranslateModelAgentVersion(c *gc.C) {
   129  	current := coretesting.CurrentVersion()
   130  	configAttrs := map[string]any{
   131  		"name":                 "some-name",
   132  		"type":                 "some-type",
   133  		"uuid":                 coretesting.ModelTag.Id(),
   134  		config.AgentVersionKey: current.Number.String(),
   135  	}
   136  
   137  	translator := newAllWatcherDeltaTranslater()
   138  	entityInfo := translator.TranslateModel(&multiwatcher.ModelInfo{
   139  		Config: configAttrs,
   140  	})
   141  	c.Assert(entityInfo, gc.NotNil)
   142  
   143  	modelUpdate := entityInfo.(*params.ModelUpdate)
   144  	c.Assert(modelUpdate, gc.NotNil)
   145  	c.Assert(modelUpdate.Version, gc.Equals, current.Number.String())
   146  }