2021-09-01 11:45:01 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/ *  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								   GoToSocial 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								   Copyright  ( C )  2021  GoToSocial  Authors  admin @ gotosocial . org 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								   This  program  is  free  software :  you  can  redistribute  it  and / or  modify 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								   it  under  the  terms  of  the  GNU  Affero  General  Public  License  as  published  by 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								   the  Free  Software  Foundation ,  either  version  3  of  the  License ,  or 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								   ( at  your  option )  any  later  version . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								   This  program  is  distributed  in  the  hope  that  it  will  be  useful , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								   but  WITHOUT  ANY  WARRANTY ;  without  even  the  implied  warranty  of 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								   MERCHANTABILITY  or  FITNESS  FOR  A  PARTICULAR  PURPOSE .   See  the 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								   GNU  Affero  General  Public  License  for  more  details . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								   You  should  have  received  a  copy  of  the  GNU  Affero  General  Public  License 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								   along  with  this  program .   If  not ,  see  < http : //www.gnu.org/licenses/>. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								* /  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-08-29 16:52:23 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								package  gtsmodel_test  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  (  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"net" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"testing" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"time" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"github.com/stretchr/testify/suite" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"github.com/superseriousbusiness/gotosocial/internal/gtsmodel" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  happyUser ( )  * gtsmodel . User  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  & gtsmodel . User { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ID :                      "01FE8TTK9F34BR0KG7639AJQTX" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Email :                   "whatever@example.org" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										AccountID :               "01FE8TWA7CN8J7237K5DFS1RY5" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Account :                 nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										EncryptedPassword :       "$2y$10$tkRapNGW.RWkEuCMWdgArunABFvsPGRvFQY3OibfSJo0RDL3z8WfC" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										CreatedAt :               time . Now ( ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										UpdatedAt :               time . Now ( ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										SignUpIP :                net . ParseIP ( "128.64.32.16" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										CurrentSignInAt :         time . Now ( ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										CurrentSignInIP :         net . ParseIP ( "128.64.32.16" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										LastSignInAt :            time . Now ( ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										LastSignInIP :            net . ParseIP ( "128.64.32.16" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										SignInCount :             0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										InviteID :                "" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ChosenLanguages :         [ ] string { } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										FilteredLanguages :       [ ] string { } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Locale :                  "en" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										CreatedByApplicationID :  "01FE8Y5EHMWCA1MHMTNHRVZ1X4" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										CreatedByApplication :    nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										LastEmailedAt :           time . Now ( ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ConfirmationToken :       "" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ConfirmedAt :             time . Now ( ) , 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-30 13:38:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ConfirmationSentAt :      time . Time { } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-29 16:52:23 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										UnconfirmedEmail :        "" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Moderator :               false , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Admin :                   false , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Disabled :                false , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Approved :                true , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								type  UserValidateTestSuite  struct  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									suite . Suite 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( suite  * UserValidateTestSuite )  TestValidateUserHappyPath ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// no problem here 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									u  :=  happyUser ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									err  :=  gtsmodel . ValidateStruct ( * u ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									suite . NoError ( err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( suite  * UserValidateTestSuite )  TestValidateUserNoID ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// user has no id set 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									u  :=  happyUser ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									u . ID  =  "" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									err  :=  gtsmodel . ValidateStruct ( * u ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									suite . EqualError ( err ,  "Key: 'User.ID' Error:Field validation for 'ID' failed on the 'required' tag" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( suite  * UserValidateTestSuite )  TestValidateUserNoEmail ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// user has no email or unconfirmed email set 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									u  :=  happyUser ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									u . Email  =  "" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									err  :=  gtsmodel . ValidateStruct ( * u ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									suite . EqualError ( err ,  "Key: 'User.Email' Error:Field validation for 'Email' failed on the 'required_with' tag\nKey: 'User.UnconfirmedEmail' Error:Field validation for 'UnconfirmedEmail' failed on the 'required_without' tag" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( suite  * UserValidateTestSuite )  TestValidateUserOnlyUnconfirmedEmail ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// user has only UnconfirmedEmail but ConfirmedAt is set 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									u  :=  happyUser ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									u . Email  =  "" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									u . UnconfirmedEmail  =  "whatever@example.org" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									err  :=  gtsmodel . ValidateStruct ( * u ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									suite . EqualError ( err ,  "Key: 'User.Email' Error:Field validation for 'Email' failed on the 'required_with' tag" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( suite  * UserValidateTestSuite )  TestValidateUserOnlyUnconfirmedEmailOK ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// user has only UnconfirmedEmail and ConfirmedAt is not set 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									u  :=  happyUser ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									u . Email  =  "" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									u . UnconfirmedEmail  =  "whatever@example.org" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									u . ConfirmedAt  =  time . Time { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									err  :=  gtsmodel . ValidateStruct ( * u ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									suite . NoError ( err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( suite  * UserValidateTestSuite )  TestValidateUserNoConfirmedAt ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// user has Email but no ConfirmedAt 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									u  :=  happyUser ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									u . ConfirmedAt  =  time . Time { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									err  :=  gtsmodel . ValidateStruct ( * u ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									suite . EqualError ( err ,  "Key: 'User.ConfirmedAt' Error:Field validation for 'ConfirmedAt' failed on the 'required_with' tag" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  TestUserValidateTestSuite ( t  * testing . T )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									suite . Run ( t ,  new ( UserValidateTestSuite ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}