| 
									
										
										
										
											2023-03-12 16:00:57 +01:00
										 |  |  | // GoToSocial | 
					
						
							|  |  |  | // Copyright (C) GoToSocial Authors admin@gotosocial.org | 
					
						
							|  |  |  | // SPDX-License-Identifier: AGPL-3.0-or-later | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // 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-10-31 15:46:23 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | package user_test | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"context" | 
					
						
							|  |  |  | 	"testing" | 
					
						
							|  |  |  | 	"time" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/stretchr/testify/suite" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type EmailConfirmTestSuite struct { | 
					
						
							|  |  |  | 	UserStandardTestSuite | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (suite *EmailConfirmTestSuite) TestConfirmEmail() { | 
					
						
							|  |  |  | 	ctx := context.Background() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	user := suite.testUsers["local_account_1"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// set a bunch of stuff on the user as though zork hasn't been confirmed yet, but has had an email sent 5 minutes ago | 
					
						
							| 
									
										
										
										
											2022-08-15 12:35:05 +02:00
										 |  |  | 	updatingColumns := []string{"unconfirmed_email", "email", "confirmed_at", "confirmation_sent_at", "confirmation_token"} | 
					
						
							| 
									
										
										
										
											2021-10-31 15:46:23 +01:00
										 |  |  | 	user.UnconfirmedEmail = "some.email@example.org" | 
					
						
							|  |  |  | 	user.Email = "" | 
					
						
							|  |  |  | 	user.ConfirmedAt = time.Time{} | 
					
						
							|  |  |  | 	user.ConfirmationSentAt = time.Now().Add(-5 * time.Minute) | 
					
						
							|  |  |  | 	user.ConfirmationToken = "1d1aa44b-afa4-49c8-ac4b-eceb61715cc6" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-08 13:50:48 +02:00
										 |  |  | 	err := suite.db.UpdateByID(ctx, user, user.ID, updatingColumns...) | 
					
						
							| 
									
										
										
										
											2021-10-31 15:46:23 +01:00
										 |  |  | 	suite.NoError(err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// confirm with the token set above | 
					
						
							| 
									
										
										
										
											2023-02-22 16:05:26 +01:00
										 |  |  | 	updatedUser, errWithCode := suite.user.EmailConfirm(ctx, "1d1aa44b-afa4-49c8-ac4b-eceb61715cc6") | 
					
						
							| 
									
										
										
										
											2021-10-31 15:46:23 +01:00
										 |  |  | 	suite.NoError(errWithCode) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// email should now be confirmed and token cleared | 
					
						
							|  |  |  | 	suite.Equal("some.email@example.org", updatedUser.Email) | 
					
						
							|  |  |  | 	suite.Empty(updatedUser.UnconfirmedEmail) | 
					
						
							|  |  |  | 	suite.Empty(updatedUser.ConfirmationToken) | 
					
						
							|  |  |  | 	suite.WithinDuration(updatedUser.ConfirmedAt, time.Now(), 1*time.Minute) | 
					
						
							|  |  |  | 	suite.WithinDuration(updatedUser.UpdatedAt, time.Now(), 1*time.Minute) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (suite *EmailConfirmTestSuite) TestConfirmEmailOldToken() { | 
					
						
							|  |  |  | 	ctx := context.Background() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	user := suite.testUsers["local_account_1"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// set a bunch of stuff on the user as though zork hasn't been confirmed yet, but has had an email sent 8 days ago | 
					
						
							| 
									
										
										
										
											2022-08-15 12:35:05 +02:00
										 |  |  | 	updatingColumns := []string{"unconfirmed_email", "email", "confirmed_at", "confirmation_sent_at", "confirmation_token"} | 
					
						
							| 
									
										
										
										
											2021-10-31 15:46:23 +01:00
										 |  |  | 	user.UnconfirmedEmail = "some.email@example.org" | 
					
						
							|  |  |  | 	user.Email = "" | 
					
						
							|  |  |  | 	user.ConfirmedAt = time.Time{} | 
					
						
							|  |  |  | 	user.ConfirmationSentAt = time.Now().Add(-192 * time.Hour) | 
					
						
							|  |  |  | 	user.ConfirmationToken = "1d1aa44b-afa4-49c8-ac4b-eceb61715cc6" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-08 13:50:48 +02:00
										 |  |  | 	err := suite.db.UpdateByID(ctx, user, user.ID, updatingColumns...) | 
					
						
							| 
									
										
										
										
											2021-10-31 15:46:23 +01:00
										 |  |  | 	suite.NoError(err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// confirm with the token set above | 
					
						
							| 
									
										
										
										
											2023-02-22 16:05:26 +01:00
										 |  |  | 	updatedUser, errWithCode := suite.user.EmailConfirm(ctx, "1d1aa44b-afa4-49c8-ac4b-eceb61715cc6") | 
					
						
							| 
									
										
										
										
											2021-10-31 15:46:23 +01:00
										 |  |  | 	suite.Nil(updatedUser) | 
					
						
							| 
									
										
										
										
											2024-04-11 11:45:53 +02:00
										 |  |  | 	suite.EqualError(errWithCode, "confirmation token expired (older than one week)") | 
					
						
							| 
									
										
										
										
											2021-10-31 15:46:23 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestEmailConfirmTestSuite(t *testing.T) { | 
					
						
							|  |  |  | 	suite.Run(t, &EmailConfirmTestSuite{}) | 
					
						
							|  |  |  | } |