context_test.go 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. package azure
  2. import (
  3. "context"
  4. "testing"
  5. "github.com/Azure/azure-sdk-for-go/profiles/2019-03-01/resources/mgmt/resources"
  6. "github.com/Azure/azure-sdk-for-go/profiles/preview/preview/subscription/mgmt/subscription"
  7. "github.com/Azure/go-autorest/autorest/to"
  8. "github.com/pkg/errors"
  9. "github.com/stretchr/testify/mock"
  10. "github.com/stretchr/testify/suite"
  11. "github.com/docker/api/context/store"
  12. . "github.com/onsi/gomega"
  13. )
  14. type ContextSuiteTest struct {
  15. suite.Suite
  16. mockUserSelector *MockUserSelector
  17. mockResourceGroupHeper *MockResourceGroupHelper
  18. contextCreateHelper contextCreateACIHelper
  19. }
  20. func (suite *ContextSuiteTest) BeforeTest(suiteName, testName string) {
  21. suite.mockUserSelector = &MockUserSelector{}
  22. suite.mockResourceGroupHeper = &MockResourceGroupHelper{}
  23. suite.contextCreateHelper = contextCreateACIHelper{
  24. suite.mockUserSelector,
  25. suite.mockResourceGroupHeper,
  26. }
  27. }
  28. func (suite *ContextSuiteTest) TestCreateSpecifiedSubscriptionAndGroup() {
  29. ctx := context.TODO()
  30. opts := options("1234", "myResourceGroup")
  31. suite.mockResourceGroupHeper.On("GetGroup", ctx, "1234", "myResourceGroup").Return(group("myResourceGroup", "eastus"), nil)
  32. data, description, err := suite.contextCreateHelper.createContextData(ctx, opts)
  33. Expect(err).To(BeNil())
  34. Expect(description).To(Equal("myResourceGroup@eastus"))
  35. Expect(data).To(Equal(aciContext("1234", "myResourceGroup", "eastus")))
  36. }
  37. func (suite *ContextSuiteTest) TestErrorOnNonExistentResourceGroup() {
  38. ctx := context.TODO()
  39. opts := options("1234", "myResourceGroup")
  40. notFoundError := errors.New(`Not Found: "myResourceGroup"`)
  41. suite.mockResourceGroupHeper.On("GetGroup", ctx, "1234", "myResourceGroup").Return(resources.Group{}, notFoundError)
  42. data, description, err := suite.contextCreateHelper.createContextData(ctx, opts)
  43. Expect(data).To(BeNil())
  44. Expect(description).To(Equal(""))
  45. Expect(err.Error()).To(Equal("Could not find resource group \"myResourceGroup\": Not Found: \"myResourceGroup\""))
  46. }
  47. func (suite *ContextSuiteTest) TestCreateNewResourceGroup() {
  48. ctx := context.TODO()
  49. opts := options("1234", "")
  50. suite.mockResourceGroupHeper.On("GetGroup", ctx, "1234", "myResourceGroup").Return(group("myResourceGroup", "eastus"), nil)
  51. selectOptions := []string{"create a new resource group", "group1 (eastus)", "group2 (westeurope)"}
  52. suite.mockUserSelector.On("userSelect", "Select a resource group", selectOptions).Return(0, nil)
  53. suite.mockResourceGroupHeper.On("CreateOrUpdate", ctx, "1234", mock.AnythingOfType("string"), mock.AnythingOfType("resources.Group")).Return(group("newResourceGroup", "eastus"), nil)
  54. suite.mockResourceGroupHeper.On("ListGroups", ctx, "1234").Return([]resources.Group{
  55. group("group1", "eastus"),
  56. group("group2", "westeurope"),
  57. }, nil)
  58. data, description, err := suite.contextCreateHelper.createContextData(ctx, opts)
  59. Expect(err).To(BeNil())
  60. Expect(description).To(Equal("newResourceGroup@eastus"))
  61. Expect(data).To(Equal(aciContext("1234", "newResourceGroup", "eastus")))
  62. }
  63. func (suite *ContextSuiteTest) TestSelectExistingResourceGroup() {
  64. ctx := context.TODO()
  65. opts := options("1234", "")
  66. selectOptions := []string{"create a new resource group", "group1 (eastus)", "group2 (westeurope)"}
  67. suite.mockUserSelector.On("userSelect", "Select a resource group", selectOptions).Return(2, nil)
  68. suite.mockResourceGroupHeper.On("ListGroups", ctx, "1234").Return([]resources.Group{
  69. group("group1", "eastus"),
  70. group("group2", "westeurope"),
  71. }, nil)
  72. data, description, err := suite.contextCreateHelper.createContextData(ctx, opts)
  73. Expect(err).To(BeNil())
  74. Expect(description).To(Equal("group2@westeurope"))
  75. Expect(data).To(Equal(aciContext("1234", "group2", "westeurope")))
  76. }
  77. func (suite *ContextSuiteTest) TestSelectSingleSubscriptionIdAndExistingResourceGroup() {
  78. ctx := context.TODO()
  79. opts := options("", "")
  80. suite.mockResourceGroupHeper.On("GetSubscriptionIDs", ctx).Return([]subscription.Model{subModel("123456", "Subscription1")}, nil)
  81. selectOptions := []string{"create a new resource group", "group1 (eastus)", "group2 (westeurope)"}
  82. suite.mockUserSelector.On("userSelect", "Select a resource group", selectOptions).Return(2, nil)
  83. suite.mockResourceGroupHeper.On("ListGroups", ctx, "123456").Return([]resources.Group{
  84. group("group1", "eastus"),
  85. group("group2", "westeurope"),
  86. }, nil)
  87. data, description, err := suite.contextCreateHelper.createContextData(ctx, opts)
  88. Expect(err).To(BeNil())
  89. Expect(description).To(Equal("group2@westeurope"))
  90. Expect(data).To(Equal(aciContext("123456", "group2", "westeurope")))
  91. }
  92. func (suite *ContextSuiteTest) TestSelectSubscriptionIdAndExistingResourceGroup() {
  93. ctx := context.TODO()
  94. opts := options("", "")
  95. sub1 := subModel("1234", "Subscription1")
  96. sub2 := subModel("5678", "Subscription2")
  97. suite.mockResourceGroupHeper.On("GetSubscriptionIDs", ctx).Return([]subscription.Model{sub1, sub2}, nil)
  98. selectOptions := []string{"Subscription1(1234)", "Subscription2(5678)"}
  99. suite.mockUserSelector.On("userSelect", "Select a subscription ID", selectOptions).Return(1, nil)
  100. selectOptions = []string{"create a new resource group", "group1 (eastus)", "group2 (westeurope)"}
  101. suite.mockUserSelector.On("userSelect", "Select a resource group", selectOptions).Return(2, nil)
  102. suite.mockResourceGroupHeper.On("ListGroups", ctx, "5678").Return([]resources.Group{
  103. group("group1", "eastus"),
  104. group("group2", "westeurope"),
  105. }, nil)
  106. data, description, err := suite.contextCreateHelper.createContextData(ctx, opts)
  107. Expect(err).To(BeNil())
  108. Expect(description).To(Equal("group2@westeurope"))
  109. Expect(data).To(Equal(aciContext("5678", "group2", "westeurope")))
  110. }
  111. func subModel(subID string, display string) subscription.Model {
  112. return subscription.Model{
  113. SubscriptionID: to.StringPtr(subID),
  114. DisplayName: to.StringPtr(display),
  115. }
  116. }
  117. func group(groupName string, location string) resources.Group {
  118. return resources.Group{
  119. Name: to.StringPtr(groupName),
  120. Location: to.StringPtr(location),
  121. }
  122. }
  123. func aciContext(subscriptionID string, resourceGroupName string, location string) store.AciContext {
  124. return store.AciContext{
  125. SubscriptionID: subscriptionID,
  126. Location: location,
  127. ResourceGroup: resourceGroupName,
  128. }
  129. }
  130. func options(subscriptionID string, resourceGroupName string) map[string]string {
  131. return map[string]string{
  132. "aciSubscriptionID": subscriptionID,
  133. "aciResourceGroup": resourceGroupName,
  134. }
  135. }
  136. func TestContextSuite(t *testing.T) {
  137. RegisterTestingT(t)
  138. suite.Run(t, new(ContextSuiteTest))
  139. }
  140. type MockUserSelector struct {
  141. mock.Mock
  142. }
  143. func (s *MockUserSelector) userSelect(message string, options []string) (int, error) {
  144. args := s.Called(message, options)
  145. return args.Int(0), args.Error(1)
  146. }
  147. type MockResourceGroupHelper struct {
  148. mock.Mock
  149. }
  150. func (s *MockResourceGroupHelper) GetSubscriptionIDs(ctx context.Context) ([]subscription.Model, error) {
  151. args := s.Called(ctx)
  152. return args.Get(0).([]subscription.Model), args.Error(1)
  153. }
  154. func (s *MockResourceGroupHelper) ListGroups(ctx context.Context, subscriptionID string) ([]resources.Group, error) {
  155. args := s.Called(ctx, subscriptionID)
  156. return args.Get(0).([]resources.Group), args.Error(1)
  157. }
  158. func (s *MockResourceGroupHelper) GetGroup(ctx context.Context, subscriptionID string, groupName string) (resources.Group, error) {
  159. args := s.Called(ctx, subscriptionID, groupName)
  160. return args.Get(0).(resources.Group), args.Error(1)
  161. }
  162. func (s *MockResourceGroupHelper) CreateOrUpdate(ctx context.Context, subscriptionID string, resourceGroupName string, parameters resources.Group) (result resources.Group, err error) {
  163. args := s.Called(ctx, subscriptionID, resourceGroupName, parameters)
  164. return args.Get(0).(resources.Group), args.Error(1)
  165. }
  166. func (s *MockResourceGroupHelper) Delete(ctx context.Context, subscriptionID string, resourceGroupName string) (err error) {
  167. args := s.Called(ctx, subscriptionID, resourceGroupName)
  168. return args.Error(0)
  169. }