github.com/minio/console@v1.3.0/api/admin_subnet_test.go (about) 1 // This file is part of MinIO Console Server 2 // Copyright (c) 2022 MinIO, Inc. 3 // 4 // This program is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU Affero General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // This program is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU Affero General Public License for more details. 13 // 14 // You should have received a copy of the GNU Affero General Public License 15 // along with this program. If not, see <http://www.gnu.org/licenses/>. 16 17 package api 18 19 import ( 20 "context" 21 "net/http" 22 "net/http/httptest" 23 "net/url" 24 "os" 25 "testing" 26 27 "github.com/minio/console/api/operations" 28 subnetApi "github.com/minio/console/api/operations/subnet" 29 "github.com/minio/console/models" 30 "github.com/minio/madmin-go/v3" 31 "github.com/stretchr/testify/assert" 32 "github.com/stretchr/testify/suite" 33 ) 34 35 type AdminSubnetTestSuite struct { 36 suite.Suite 37 assert *assert.Assertions 38 currentServer string 39 isServerSet bool 40 server *httptest.Server 41 adminClient AdminClientMock 42 } 43 44 func (suite *AdminSubnetTestSuite) SetupSuite() { 45 suite.assert = assert.New(suite.T()) 46 suite.adminClient = AdminClientMock{} 47 minioGetConfigKVMock = func(_ string) ([]byte, error) { 48 return []byte("subnet license=mock api_key=mock proxy=http://mock.com"), nil 49 } 50 MinioServerInfoMock = func(_ context.Context) (madmin.InfoMessage, error) { 51 return madmin.InfoMessage{Servers: []madmin.ServerProperties{{}}}, nil 52 } 53 } 54 55 func (suite *AdminSubnetTestSuite) SetupTest() { 56 suite.server = httptest.NewServer(http.HandlerFunc(suite.serverHandler)) 57 suite.currentServer, suite.isServerSet = os.LookupEnv(ConsoleMinIOServer) 58 os.Setenv(ConsoleMinIOServer, suite.server.URL) 59 } 60 61 func (suite *AdminSubnetTestSuite) serverHandler(w http.ResponseWriter, _ *http.Request) { 62 w.WriteHeader(400) 63 } 64 65 func (suite *AdminSubnetTestSuite) TearDownSuite() { 66 } 67 68 func (suite *AdminSubnetTestSuite) TearDownTest() { 69 if suite.isServerSet { 70 os.Setenv(ConsoleMinIOServer, suite.currentServer) 71 } else { 72 os.Unsetenv(ConsoleMinIOServer) 73 } 74 } 75 76 func (suite *AdminSubnetTestSuite) TestRegisterSubnetHandlers() { 77 api := &operations.ConsoleAPI{} 78 suite.assertHandlersAreNil(api) 79 registerSubnetHandlers(api) 80 suite.assertHandlersAreNotNil(api) 81 } 82 83 func (suite *AdminSubnetTestSuite) assertHandlersAreNil(api *operations.ConsoleAPI) { 84 suite.assert.Nil(api.SubnetSubnetLoginHandler) 85 suite.assert.Nil(api.SubnetSubnetLoginMFAHandler) 86 suite.assert.Nil(api.SubnetSubnetRegisterHandler) 87 suite.assert.Nil(api.SubnetSubnetInfoHandler) 88 suite.assert.Nil(api.SubnetSubnetRegTokenHandler) 89 suite.assert.Nil(api.SubnetSubnetAPIKeyHandler) 90 } 91 92 func (suite *AdminSubnetTestSuite) assertHandlersAreNotNil(api *operations.ConsoleAPI) { 93 suite.assert.NotNil(api.SubnetSubnetLoginHandler) 94 suite.assert.NotNil(api.SubnetSubnetLoginMFAHandler) 95 suite.assert.NotNil(api.SubnetSubnetRegisterHandler) 96 suite.assert.NotNil(api.SubnetSubnetInfoHandler) 97 suite.assert.NotNil(api.SubnetSubnetRegTokenHandler) 98 suite.assert.NotNil(api.SubnetSubnetAPIKeyHandler) 99 } 100 101 func (suite *AdminSubnetTestSuite) TestSubnetLoginWithSubnetClientError() { 102 params, api := suite.initSubnetLoginRequest("", "", "") 103 response := api.SubnetSubnetLoginHandler.Handle(params, &models.Principal{}) 104 _, ok := response.(*subnetApi.SubnetLoginDefault) 105 suite.assert.True(ok) 106 } 107 108 func (suite *AdminSubnetTestSuite) TestSubnetLoginResponseWithApiKeyError() { 109 params, _ := suite.initSubnetLoginRequest("mock", "", "") 110 res, err := subnetLoginResponse(context.TODO(), suite.adminClient, params) 111 suite.assert.NotNil(err) 112 suite.assert.Nil(res) 113 } 114 115 func (suite *AdminSubnetTestSuite) TestSubnetLoginResponseWithCredentialsError() { 116 params, _ := suite.initSubnetLoginRequest("", "mock", "mock") 117 res, err := subnetLoginResponse(context.TODO(), suite.adminClient, params) 118 suite.assert.NotNil(err) 119 suite.assert.Nil(res) 120 } 121 122 func (suite *AdminSubnetTestSuite) initSubnetLoginRequest(apiKey, username, password string) (params subnetApi.SubnetLoginParams, api operations.ConsoleAPI) { 123 registerSubnetHandlers(&api) 124 params.HTTPRequest = &http.Request{} 125 params.Body = &models.SubnetLoginRequest{} 126 params.Body.APIKey = apiKey 127 params.Body.Username = username 128 params.Body.Password = password 129 return params, api 130 } 131 132 func (suite *AdminSubnetTestSuite) TestSubnetLoginMFAWithSubnetClientError() { 133 params, api := suite.initSubnetLoginMFARequest("", "", "") 134 response := api.SubnetSubnetLoginMFAHandler.Handle(params, &models.Principal{}) 135 _, ok := response.(*subnetApi.SubnetLoginMFADefault) 136 suite.assert.True(ok) 137 } 138 139 func (suite *AdminSubnetTestSuite) TestSubnetLoginWithMFAResponseError() { 140 params, _ := suite.initSubnetLoginMFARequest("mock", "mock", "mock") 141 res, err := subnetLoginWithMFAResponse(context.TODO(), suite.adminClient, params) 142 suite.assert.NotNil(err) 143 suite.assert.Nil(res) 144 } 145 146 func (suite *AdminSubnetTestSuite) initSubnetLoginMFARequest(username, mfaToken, otp string) (params subnetApi.SubnetLoginMFAParams, api operations.ConsoleAPI) { 147 registerSubnetHandlers(&api) 148 params.HTTPRequest = &http.Request{} 149 params.Body = &models.SubnetLoginMFARequest{} 150 params.Body.Username = &username 151 params.Body.MfaToken = &mfaToken 152 params.Body.Otp = &otp 153 return params, api 154 } 155 156 func (suite *AdminSubnetTestSuite) TestSubnetRegisterClientError() { 157 params, api := suite.initSubnetRegisterRequest("", "") 158 response := api.SubnetSubnetRegisterHandler.Handle(params, &models.Principal{}) 159 _, ok := response.(*subnetApi.SubnetRegisterDefault) 160 suite.assert.True(ok) 161 } 162 163 func (suite *AdminSubnetTestSuite) TestSubnetRegisterResponseError() { 164 params, _ := suite.initSubnetRegisterRequest("mock", "mock") 165 err := subnetRegisterResponse(context.TODO(), suite.adminClient, params) 166 suite.assert.NotNil(err) 167 } 168 169 func (suite *AdminSubnetTestSuite) initSubnetRegisterRequest(token, accountID string) (params subnetApi.SubnetRegisterParams, api operations.ConsoleAPI) { 170 registerSubnetHandlers(&api) 171 params.HTTPRequest = &http.Request{} 172 params.Body = &models.SubnetRegisterRequest{} 173 params.Body.Token = &token 174 params.Body.AccountID = &accountID 175 return params, api 176 } 177 178 func (suite *AdminSubnetTestSuite) TestSubnetInfoError() { 179 params, api := suite.initSubnetInfoRequest() 180 response := api.SubnetSubnetInfoHandler.Handle(params, &models.Principal{}) 181 _, ok := response.(*subnetApi.SubnetInfoDefault) 182 suite.assert.True(ok) 183 } 184 185 func (suite *AdminSubnetTestSuite) initSubnetInfoRequest() (params subnetApi.SubnetInfoParams, api operations.ConsoleAPI) { 186 registerSubnetHandlers(&api) 187 params.HTTPRequest = &http.Request{} 188 return params, api 189 } 190 191 func (suite *AdminSubnetTestSuite) TestSubnetRegTokenError() { 192 params, api := suite.initSubnetRegTokenRequest() 193 response := api.SubnetSubnetRegTokenHandler.Handle(params, &models.Principal{}) 194 _, ok := response.(*subnetApi.SubnetRegTokenDefault) 195 suite.assert.True(ok) 196 } 197 198 func (suite *AdminSubnetTestSuite) TestSubnetRegTokenResponse() { 199 res, err := subnetRegTokenResponse(context.TODO(), suite.adminClient) 200 suite.assert.Nil(err) 201 suite.assert.NotEqual("", res) 202 } 203 204 func (suite *AdminSubnetTestSuite) initSubnetRegTokenRequest() (params subnetApi.SubnetRegTokenParams, api operations.ConsoleAPI) { 205 registerSubnetHandlers(&api) 206 params.HTTPRequest = &http.Request{} 207 return params, api 208 } 209 210 func (suite *AdminSubnetTestSuite) TestSubnetAPIKeyWithClientError() { 211 params, api := suite.initSubnetAPIKeyRequest() 212 response := api.SubnetSubnetAPIKeyHandler.Handle(params, &models.Principal{}) 213 _, ok := response.(*subnetApi.SubnetAPIKeyDefault) 214 suite.assert.True(ok) 215 } 216 217 func (suite *AdminSubnetTestSuite) TestSubnetAPIKeyResponseError() { 218 params, _ := suite.initSubnetAPIKeyRequest() 219 res, err := subnetAPIKeyResponse(context.TODO(), suite.adminClient, params) 220 suite.assert.NotNil(err) 221 suite.assert.Nil(res) 222 } 223 224 func (suite *AdminSubnetTestSuite) initSubnetAPIKeyRequest() (params subnetApi.SubnetAPIKeyParams, api operations.ConsoleAPI) { 225 registerSubnetHandlers(&api) 226 params.HTTPRequest = &http.Request{} 227 params.HTTPRequest.URL = &url.URL{} 228 return params, api 229 } 230 231 func TestAdminSubnet(t *testing.T) { 232 suite.Run(t, new(AdminSubnetTestSuite)) 233 }