mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-11-04 03:32:25 -06:00 
			
		
		
		
	
		
			
	
	
		
			115 lines
		
	
	
	
		
			3.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			115 lines
		
	
	
	
		
			3.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 
								 | 
							
								// 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/>.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								package bundb_test
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import (
							 | 
						||
| 
								 | 
							
									"context"
							 | 
						||
| 
								 | 
							
									"errors"
							 | 
						||
| 
								 | 
							
									"testing"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									"github.com/stretchr/testify/suite"
							 | 
						||
| 
								 | 
							
									"github.com/superseriousbusiness/gotosocial/internal/db"
							 | 
						||
| 
								 | 
							
									"github.com/superseriousbusiness/gotosocial/internal/gtsmodel"
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								type ErrorsTestSuite struct {
							 | 
						||
| 
								 | 
							
									BunDBStandardTestSuite
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func (suite *ErrorsTestSuite) TestErrorAlreadyExists() {
							 | 
						||
| 
								 | 
							
									type testType struct {
							 | 
						||
| 
								 | 
							
										follow   *gtsmodel.Follow
							 | 
						||
| 
								 | 
							
										expected error
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									var (
							 | 
						||
| 
								 | 
							
										ctx           = context.Background()
							 | 
						||
| 
								 | 
							
										initialFollow = >smodel.Follow{
							 | 
						||
| 
								 | 
							
											ID:              "01HD11D8JH5V64GJRFDA7VFNDX",
							 | 
						||
| 
								 | 
							
											URI:             "https://example.org/unique_uri",
							 | 
						||
| 
								 | 
							
											AccountID:       "01HD11E9Y02HVXZ4YB20SG4QR9",
							 | 
						||
| 
								 | 
							
											TargetAccountID: "01HD11EPJWM919DRP9JCKDZBX6",
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										editFollow = func(f func(*gtsmodel.Follow)) *gtsmodel.Follow {
							 | 
						||
| 
								 | 
							
											edited := new(gtsmodel.Follow)
							 | 
						||
| 
								 | 
							
											*edited = *initialFollow
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											f(edited)
							 | 
						||
| 
								 | 
							
											return edited
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// Put the initial follow so we have
							 | 
						||
| 
								 | 
							
									// a constraint in place to fail on.
							 | 
						||
| 
								 | 
							
									if err := suite.db.PutFollow(ctx, initialFollow); err != nil {
							 | 
						||
| 
								 | 
							
										suite.FailNow(err.Error())
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									for i, test := range []testType{
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											// Try to put the initial follow in again.
							 | 
						||
| 
								 | 
							
											follow:   initialFollow,
							 | 
						||
| 
								 | 
							
											expected: db.ErrAlreadyExists,
							 | 
						||
| 
								 | 
							
										},
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											// Different ID but same URI,
							 | 
						||
| 
								 | 
							
											// should fail on URI constraint.
							 | 
						||
| 
								 | 
							
											follow: editFollow(func(f *gtsmodel.Follow) {
							 | 
						||
| 
								 | 
							
												f.ID = "01HD12ASEEBZ7MRY8AK51RJ20Y"
							 | 
						||
| 
								 | 
							
											}),
							 | 
						||
| 
								 | 
							
											expected: db.ErrAlreadyExists,
							 | 
						||
| 
								 | 
							
										},
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											// Different URI but same ID,
							 | 
						||
| 
								 | 
							
											// should fail on ID constraint.
							 | 
						||
| 
								 | 
							
											follow: editFollow(func(f *gtsmodel.Follow) {
							 | 
						||
| 
								 | 
							
												f.URI = "https://example.org/new_uri"
							 | 
						||
| 
								 | 
							
											}),
							 | 
						||
| 
								 | 
							
											expected: db.ErrAlreadyExists,
							 | 
						||
| 
								 | 
							
										},
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											// Different ID and URI, but same account and
							 | 
						||
| 
								 | 
							
											// target. Should fail on unique constraint.
							 | 
						||
| 
								 | 
							
											follow: editFollow(func(f *gtsmodel.Follow) {
							 | 
						||
| 
								 | 
							
												f.ID = "01HD12ASEEBZ7MRY8AK51RJ20Y"
							 | 
						||
| 
								 | 
							
												f.URI = "https://example.org/new_uri"
							 | 
						||
| 
								 | 
							
											}),
							 | 
						||
| 
								 | 
							
											expected: db.ErrAlreadyExists,
							 | 
						||
| 
								 | 
							
										},
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											// Put a follow with different ID, URI,
							 | 
						||
| 
								 | 
							
											// and AccountID. This should work fine.
							 | 
						||
| 
								 | 
							
											follow: editFollow(func(f *gtsmodel.Follow) {
							 | 
						||
| 
								 | 
							
												f.ID = "01HD12ASEEBZ7MRY8AK51RJ20Y"
							 | 
						||
| 
								 | 
							
												f.URI = "https://example.org/new_uri"
							 | 
						||
| 
								 | 
							
												f.AccountID = "01HD12DTPDR8A96S5K5M7SJAF3"
							 | 
						||
| 
								 | 
							
											}),
							 | 
						||
| 
								 | 
							
											expected: nil,
							 | 
						||
| 
								 | 
							
										},
							 | 
						||
| 
								 | 
							
									} {
							 | 
						||
| 
								 | 
							
										err := suite.db.PutFollow(ctx, test.follow)
							 | 
						||
| 
								 | 
							
										if !errors.Is(err, test.expected) {
							 | 
						||
| 
								 | 
							
											suite.Fail("", "test number %d expected %v, got %v", i+1, test.expected, err)
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func TestErrorsTestSuite(t *testing.T) {
							 | 
						||
| 
								 | 
							
									suite.Run(t, new(ErrorsTestSuite))
							 | 
						||
| 
								 | 
							
								}
							 |