github.com/resonatecoop/user-api@v1.0.0-13.0.20220915120639-05dc9c04014a/server/user_test.go (about)

     1  package server_test
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/resonatecoop/user-api/model"
     7  
     8  	_ "github.com/jackc/pgx/v4/stdlib"
     9  	pbUser "github.com/resonatecoop/user-api/proto/user"
    10  	"github.com/stretchr/testify/assert"
    11  )
    12  
    13  // type UserApiTestSuite struct {
    14  // 	suite.Suite
    15  // 	db  *bun.DB
    16  // 	ctx context.Context
    17  // }
    18  
    19  // func (suite *UserApiTestSuite) SetupTest() {
    20  // 	//TODO
    21  // }
    22  
    23  func getIntPointer(value int32) *int32 {
    24  	return &value
    25  }
    26  
    27  func (suite *UserApiTestSuite) TestAddUser() {
    28  	ctx := suite.ctx
    29  
    30  	// When attempting to add a user with admin access,
    31  	// the user is created but limited to default user role
    32  	newuser := pbUser.UserAddRequest{
    33  		Username: "joe@bloggs.com",
    34  		FullName: "Joe Bloggs",
    35  		RoleId:   getIntPointer(1),
    36  	}
    37  
    38  	_, err := suite.server.AddUser(ctx, &newuser)
    39  	if err != nil {
    40  		panic(err)
    41  	}
    42  
    43  	user := new(model.User)
    44  
    45  	err = suite.db.NewSelect().
    46  		Model(user).
    47  		Where("username = ?", "joe@bloggs.com").
    48  		Limit(1).
    49  		Scan(ctx)
    50  
    51  	// the record exists
    52  	assert.Nil(suite.T(), err)
    53  
    54  	// but the role has been limited to default
    55  	assert.Equal(suite.T(), int32(model.UserRole), user.RoleID)
    56  }
    57  
    58  func (suite *UserApiTestSuite) TestDeleteUser() {
    59  
    60  	ctx := suite.ctx
    61  
    62  	type cases []pbUser.UserRequest
    63  
    64  	users := cases{
    65  		{Id: "243b4178-6f98-4bf1-bbb1-46b57a901816"},
    66  		{Id: "5253747c-2b8c-40e2-8a70-bab91348a9bd"},
    67  		{Id: "86a72db9-eb16-45ae-8003-ac37d8dc5cbb"},
    68  	}
    69  
    70  	var response *pbUser.UserListResponse
    71  	var empty *pbUser.Empty
    72  
    73  	response, err := suite.server.ListUsers(ctx, empty)
    74  	if err != nil {
    75  		panic(err)
    76  	}
    77  
    78  	assert.Equal(suite.T(), 5, len(response.User))
    79  
    80  	_, err = suite.server.DeleteUser(ctx, &users[0])
    81  	if err != nil {
    82  		panic(err)
    83  	}
    84  
    85  	response, err = suite.server.ListUsers(ctx, empty)
    86  	if err != nil {
    87  		panic(err)
    88  	}
    89  	assert.Equal(suite.T(), 4, len(response.User))
    90  
    91  	newuser := pbUser.UserAddRequest{
    92  		Username: "joe@bloggs.com",
    93  		FullName: "Joe Bloggs",
    94  	}
    95  
    96  	_, err = suite.server.AddUser(ctx, &newuser)
    97  	if err != nil {
    98  		panic(err)
    99  	}
   100  
   101  	response, err = suite.server.ListUsers(ctx, empty)
   102  	if err != nil {
   103  		panic(err)
   104  	}
   105  	assert.Equal(suite.T(), 5, len(response.User))
   106  
   107  	user := new(model.User)
   108  
   109  	if err = suite.db.NewSelect().
   110  		Model(user).
   111  		Where("id = ?", "80b26113-37e0-456a-9f75-01db0eb550f8").
   112  		Limit(1).
   113  		Scan(ctx); err != nil {
   114  		fmt.Printf("No such user returned!")
   115  	}
   116  }
   117  
   118  // func (db *bun.DB, ctx context.Context) RunUserTests() {
   119  // 	testrun := new(UserApiTestSuite)
   120  // 	testrun.db = db
   121  // 	testrun.ctx = ctx
   122  
   123  // 	suite.Run(nil, testrun)
   124  // }
   125  
   126  // func (suite *OauthTestSuite) TestUserExistsFindsValidUser() {
   127  // 	validUsername := suite.users[0].Username
   128  // 	assert.True(suite.T(), suite.service.UserExists(validUsername))
   129  // }
   130  
   131  // func (suite *OauthTestSuite) TestUserExistsDoesntFindInvalidUser() {
   132  // 	invalidUsername := "bogus_name"
   133  // 	assert.False(suite.T(), suite.service.UserExists(invalidUsername))
   134  // }
   135  
   136  // func (suite *OauthTestSuite) TestUpdateUsernameWorksWithValidEntry() {
   137  // 	user, err := suite.service.CreateUser(
   138  // 		model.UserRole,  // role ID
   139  // 		"test@newuser",  // username
   140  // 		"test_password", // password
   141  // 	)
   142  
   143  // 	assert.NoError(suite.T(), err)
   144  // 	assert.NotNil(suite.T(), user)
   145  // 	assert.Equal(suite.T(), "test@newuser", user.Username)
   146  
   147  // 	newUsername := "mynew@email"
   148  
   149  // 	err = suite.service.UpdateUsername(user, newUsername)
   150  
   151  // 	assert.NoError(suite.T(), err)
   152  
   153  // 	assert.Equal(suite.T(), newUsername, user.Username)
   154  // }
   155  
   156  // func (suite *OauthTestSuite) TestUpdateUsernameTxWorksWithValidEntry() {
   157  // 	user, err := suite.service.CreateUser(
   158  // 		roles.User,      // role ID
   159  // 		"test@newuser",  // username
   160  // 		"test_password", // password
   161  // 	)
   162  
   163  // 	assert.NoError(suite.T(), err)
   164  // 	assert.NotNil(suite.T(), user)
   165  // 	assert.Equal(suite.T(), "test@newuser", user.Username)
   166  
   167  // 	newUsername := "mynew@email"
   168  
   169  // 	err = suite.service.UpdateUsernameTx(suite.db, user, newUsername)
   170  
   171  // 	assert.NoError(suite.T(), err)
   172  
   173  // 	assert.Equal(suite.T(), newUsername, user.Username)
   174  // }
   175  
   176  // func (suite *OauthTestSuite) TestUpdateUsernameFailsWithABlankEntry() {
   177  // 	user, err := suite.service.CreateUser(
   178  // 		roles.User,      // role ID
   179  // 		"test@newuser",  // username
   180  // 		"test_password", // password
   181  // 	)
   182  
   183  // 	assert.NoError(suite.T(), err)
   184  // 	assert.NotNil(suite.T(), user)
   185  // 	assert.Equal(suite.T(), "test@newuser", user.Username)
   186  
   187  // 	newUsername := ""
   188  
   189  // 	err = suite.service.UpdateUsername(user, newUsername)
   190  
   191  // 	assert.EqualError(suite.T(), err, oauth.ErrCannotSetEmptyUsername.Error())
   192  
   193  // 	assert.NotEqual(suite.T(), newUsername, user.Username)
   194  // }
   195  
   196  // func (suite *OauthTestSuite) TestFindUserByUsername() {
   197  // 	var (
   198  // 		user *model.User
   199  // 		err  error
   200  // 	)
   201  
   202  // 	// When we try to find a user with a bogus username
   203  // 	user, err = suite.service.FindUserByUsername("bogus")
   204  
   205  // 	// User object should be nil
   206  // 	assert.Nil(suite.T(), user)
   207  
   208  // 	// Correct error should be returned
   209  // 	if assert.NotNil(suite.T(), err) {
   210  // 		assert.Equal(suite.T(), oauth.ErrUserNotFound, err)
   211  // 	}
   212  
   213  // 	// When we try to find a user with a valid username
   214  // 	user, err = suite.service.FindUserByUsername("test@user")
   215  
   216  // 	// Error should be nil
   217  // 	assert.Nil(suite.T(), err)
   218  
   219  // 	// Correct user object should be returned
   220  // 	if assert.NotNil(suite.T(), user) {
   221  // 		assert.Equal(suite.T(), "test@user", user.Username)
   222  // 	}
   223  
   224  // 	// Test username case insensitiviness
   225  // 	user, err = suite.service.FindUserByUsername("TeSt@UsEr")
   226  
   227  // 	// Error should be nil
   228  // 	assert.Nil(suite.T(), err)
   229  
   230  // 	// Correct user object should be returned
   231  // 	if assert.NotNil(suite.T(), user) {
   232  // 		assert.Equal(suite.T(), "test@user", user.Username)
   233  // 	}
   234  // }
   235  
   236  // func (suite *OauthTestSuite) TestCreateUser() {
   237  // 	var (
   238  // 		user *model.User
   239  // 		err  error
   240  // 	)
   241  
   242  // 	// We try to insert a non unique user
   243  // 	user, err = suite.service.CreateUser(
   244  // 		roles.User,      // role ID
   245  // 		"test@user",     // username
   246  // 		"test_password", // password
   247  // 	)
   248  
   249  // 	// User object should be nil
   250  // 	assert.Nil(suite.T(), user)
   251  
   252  // 	// Correct error should be returned
   253  // 	if assert.NotNil(suite.T(), err) {
   254  // 		assert.Equal(suite.T(), oauth.ErrUsernameTaken.Error(), err.Error())
   255  // 	}
   256  
   257  // 	// We try to insert a unique user
   258  // 	user, err = suite.service.CreateUser(
   259  // 		roles.User,      // role ID
   260  // 		"test@newuser",  // username
   261  // 		"test_password", // password
   262  // 	)
   263  
   264  // 	// Error should be nil
   265  // 	assert.Nil(suite.T(), err)
   266  
   267  // 	// Correct user object should be returned
   268  // 	if assert.NotNil(suite.T(), user) {
   269  // 		assert.Equal(suite.T(), "test@newuser", user.Username)
   270  // 	}
   271  
   272  // 	// Test username case insensitivity
   273  // 	user, err = suite.service.CreateUser(
   274  // 		roles.User,      // role ID
   275  // 		"TeSt@NeWuSeR2", // username
   276  // 		"test_password", // password
   277  // 	)
   278  
   279  // 	// Error should be nil
   280  // 	assert.Nil(suite.T(), err)
   281  
   282  // 	// Correct user object should be returned
   283  // 	if assert.NotNil(suite.T(), user) {
   284  // 		assert.Equal(suite.T(), "test@newuser2", user.Username)
   285  // 	}
   286  // }
   287  
   288  // func (suite *OauthTestSuite) TestSetPassword() {
   289  // 	var (
   290  // 		user *model.User
   291  // 		err  error
   292  // 	)
   293  
   294  // 	// Insert a test user without a password
   295  // 	user = &model.User{
   296  // 		MyGormModel: model.MyGormModel{
   297  // 			ID:        uuid.New(),
   298  // 			CreatedAt: time.Now().UTC(),
   299  // 		},
   300  // 		RoleID:   util.StringOrNull(roles.User),
   301  // 		Username: "test@user_nopass",
   302  // 		Password: util.StringOrNull(""),
   303  // 	}
   304  // 	err = suite.suite.db.Create(user).Error
   305  // 	assert.NoError(suite.T(), err, "Inserting test data failed")
   306  
   307  // 	// Try to set an empty password
   308  // 	err = suite.service.SetPassword(user, "")
   309  
   310  // 	// Correct error should be returned
   311  // 	if assert.NotNil(suite.T(), err) {
   312  // 		assert.Equal(suite.T(), oauth.ErrPasswordTooShort, err)
   313  // 	}
   314  
   315  // 	// Try changing the password
   316  // 	err = suite.service.SetPassword(user, "test_password")
   317  
   318  // 	// Error should be nil
   319  // 	assert.Nil(suite.T(), err)
   320  
   321  // 	// User object should have been updated
   322  // 	assert.Equal(suite.T(), "test@user_nopass", user.Username)
   323  // 	assert.Nil(suite.T(), pass.VerifyPassword(user.Password.String, "test_password"))
   324  // }
   325  
   326  // func (suite *OauthTestSuite) TestAuthUser() {
   327  // 	var (
   328  // 		user *model.User
   329  // 		err  error
   330  // 	)
   331  
   332  // 	// Insert a test user without a password
   333  // 	err = suite.suite.db.Create(&model.User{
   334  // 		MyGormModel: model.MyGormModel{
   335  // 			ID:        uuid.New(),
   336  // 			CreatedAt: time.Now().UTC(),
   337  // 		},
   338  // 		RoleID:   util.StringOrNull(roles.User),
   339  // 		Username: "test@user_nopass",
   340  // 		Password: util.StringOrNull(""),
   341  // 	}).Error
   342  // 	assert.NoError(suite.T(), err, "Inserting test data failed")
   343  
   344  // 	// When we try to authenticate a user without a password
   345  // 	user, err = suite.service.AuthUser("test@user_nopass", "bogus")
   346  
   347  // 	// User object should be nil
   348  // 	assert.Nil(suite.T(), user)
   349  
   350  // 	// Correct error should be returned
   351  // 	if assert.NotNil(suite.T(), err) {
   352  // 		assert.Equal(suite.T(), oauth.ErrUserPasswordNotSet, err)
   353  // 	}
   354  
   355  // 	// When we try to authenticate with a bogus username
   356  // 	user, err = suite.service.AuthUser("bogus", "test_password")
   357  
   358  // 	// User object should be nil
   359  // 	assert.Nil(suite.T(), user)
   360  
   361  // 	// Correct error should be returned
   362  // 	if assert.NotNil(suite.T(), err) {
   363  // 		assert.Equal(suite.T(), oauth.ErrUserNotFound, err)
   364  // 	}
   365  
   366  // 	// When we try to authenticate with an invalid password
   367  // 	user, err = suite.service.AuthUser("test@user", "bogus")
   368  
   369  // 	// User object should be nil
   370  // 	assert.Nil(suite.T(), user)
   371  
   372  // 	// Correct error should be returned
   373  // 	if assert.NotNil(suite.T(), err) {
   374  // 		assert.Equal(suite.T(), oauth.ErrInvalidUserPassword, err)
   375  // 	}
   376  
   377  // 	// When we try to authenticate with valid username and password
   378  // 	user, err = suite.service.AuthUser("test@user", "test_password")
   379  
   380  // 	// Error should be nil
   381  // 	assert.Nil(suite.T(), err)
   382  
   383  // 	// Correct user object should be returned
   384  // 	if assert.NotNil(suite.T(), user) {
   385  // 		assert.Equal(suite.T(), "test@user", user.Username)
   386  // 	}
   387  
   388  // 	// Test username case insensitivity
   389  // 	user, err = suite.service.AuthUser("TeSt@UsEr", "test_password")
   390  
   391  // 	// Error should be nil
   392  // 	assert.Nil(suite.T(), err)
   393  
   394  // 	// Correct user object should be returned
   395  // 	if assert.NotNil(suite.T(), user) {
   396  // 		assert.Equal(suite.T(), "test@user", user.Username)
   397  // 	}
   398  // }
   399  
   400  // func (suite *OauthTestSuite) TestBlankPassword() {
   401  // 	var (
   402  // 		user *model.User
   403  // 		err  error
   404  // 	)
   405  
   406  // 	user, err = suite.service.CreateUser(
   407  // 		roles.User,         // role ID
   408  // 		"test@user_nopass", // username
   409  // 		"",                 // password,
   410  // 	)
   411  
   412  // 	// Error should be nil
   413  // 	assert.Nil(suite.T(), err)
   414  
   415  // 	// Correct user object should be returned
   416  // 	if assert.NotNil(suite.T(), user) {
   417  // 		assert.Equal(suite.T(), "test@user_nopass", user.Username)
   418  // 	}
   419  
   420  // 	// When we try to authenticate
   421  // 	user, err = suite.service.AuthUser("test@user_nopass", "")
   422  
   423  // 	// User object should be nil
   424  // 	assert.Nil(suite.T(), user)
   425  
   426  // 	// Correct error should be returned
   427  // 	if assert.NotNil(suite.T(), err) {
   428  // 		assert.Equal(suite.T(), oauth.ErrUserPasswordNotSet, err)
   429  // 	}
   430  // }