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  }