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, ¶ms.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, ¶ms.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 }