diff options
Diffstat (limited to 'internal/validate')
22 files changed, 0 insertions, 2741 deletions
diff --git a/internal/validate/account_test.go b/internal/validate/account_test.go deleted file mode 100644 index 57f0f4900..000000000 --- a/internal/validate/account_test.go +++ /dev/null @@ -1,343 +0,0 @@ -// 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 validate_test - -import ( -	"crypto/rand" -	"crypto/rsa" -	"testing" -	"time" - -	"github.com/stretchr/testify/suite" -	"github.com/superseriousbusiness/gotosocial/internal/ap" -	"github.com/superseriousbusiness/gotosocial/internal/gtsmodel" -	"github.com/superseriousbusiness/gotosocial/internal/validate" -	"github.com/superseriousbusiness/gotosocial/testrig" -) - -func happyAccount() *gtsmodel.Account { -	priv, err := rsa.GenerateKey(rand.Reader, 2048) -	if err != nil { -		panic(err) -	} -	pub := &priv.PublicKey - -	return >smodel.Account{ -		ID:                      "01F8MH1H7YV1Z7D2C8K2730QBF", -		CreatedAt:               time.Now().Add(-48 * time.Hour), -		UpdatedAt:               time.Now().Add(-48 * time.Hour), -		Username:                "the_mighty_zork", -		Domain:                  "", -		AvatarMediaAttachmentID: "01F8MH58A357CV5K7R7TJMSH6S", -		AvatarMediaAttachment:   nil, -		AvatarRemoteURL:         "", -		HeaderMediaAttachmentID: "01PFPMWK2FF0D9WMHEJHR07C3Q", -		HeaderMediaAttachment:   nil, -		HeaderRemoteURL:         "", -		DisplayName:             "original zork (he/they)", -		Fields:                  []*gtsmodel.Field{}, -		Note:                    "hey yo this is my profile!", -		Memorial:                testrig.FalseBool(), -		AlsoKnownAs:             "", -		MovedToAccountID:        "", -		Bot:                     testrig.FalseBool(), -		Reason:                  "I wanna be on this damned webbed site so bad! Please! Wow", -		Locked:                  testrig.FalseBool(), -		Discoverable:            testrig.TrueBool(), -		Privacy:                 gtsmodel.VisibilityPublic, -		Sensitive:               testrig.FalseBool(), -		Language:                "en", -		StatusContentType:       "text/plain", -		URI:                     "http://localhost:8080/users/the_mighty_zork", -		URL:                     "http://localhost:8080/@the_mighty_zork", -		FetchedAt:               time.Time{}, -		InboxURI:                "http://localhost:8080/users/the_mighty_zork/inbox", -		OutboxURI:               "http://localhost:8080/users/the_mighty_zork/outbox", -		FollowersURI:            "http://localhost:8080/users/the_mighty_zork/followers", -		FollowingURI:            "http://localhost:8080/users/the_mighty_zork/following", -		FeaturedCollectionURI:   "http://localhost:8080/users/the_mighty_zork/collections/featured", -		ActorType:               ap.ActorPerson, -		PrivateKey:              priv, -		PublicKey:               pub, -		PublicKeyURI:            "http://localhost:8080/users/the_mighty_zork#main-key", -		SensitizedAt:            time.Time{}, -		SilencedAt:              time.Time{}, -		SuspendedAt:             time.Time{}, -		HideCollections:         testrig.FalseBool(), -		SuspensionOrigin:        "", -	} -} - -type AccountValidateTestSuite struct { -	suite.Suite -} - -func (suite *AccountValidateTestSuite) TestValidateAccountHappyPath() { -	// no problem here -	a := happyAccount() -	err := validate.Struct(*a) -	suite.NoError(err) -} - -// ID must be set and be valid ULID -func (suite *AccountValidateTestSuite) TestValidateAccountBadID() { -	a := happyAccount() - -	a.ID = "" -	err := validate.Struct(*a) -	suite.EqualError(err, "Key: 'Account.ID' Error:Field validation for 'ID' failed on the 'required' tag") - -	a.ID = "01FE96W293ZPRG9FQQP48HK8N001FE96W32AT24VYBGM12WN3GKB" -	err = validate.Struct(*a) -	suite.EqualError(err, "Key: 'Account.ID' Error:Field validation for 'ID' failed on the 'ulid' tag") -} - -// CreatedAt can be set or not -- it will be set in the database anyway -func (suite *AccountValidateTestSuite) TestValidateAccountNoCreatedAt() { -	a := happyAccount() - -	a.CreatedAt = time.Time{} -	err := validate.Struct(*a) -	suite.NoError(err) -} - -// FetchedAt must be defined if remote account -func (suite *AccountValidateTestSuite) TestValidateAccountNoWebfingeredAt() { -	a := happyAccount() - -	a.Domain = "example.org" -	a.FetchedAt = time.Time{} -	err := validate.Struct(*a) -	suite.EqualError(err, "Key: 'Account.FetchedAt' Error:Field validation for 'FetchedAt' failed on the 'required_with' tag") -} - -// Username must be set -func (suite *AccountValidateTestSuite) TestValidateAccountUsername() { -	a := happyAccount() - -	a.Username = "" -	err := validate.Struct(*a) -	suite.EqualError(err, "Key: 'Account.Username' Error:Field validation for 'Username' failed on the 'required' tag") -} - -// Domain must be either empty (for local accounts) or proper fqdn (for remote accounts) -func (suite *AccountValidateTestSuite) TestValidateAccountDomain() { -	a := happyAccount() -	a.FetchedAt = time.Now() - -	a.Domain = "" -	err := validate.Struct(*a) -	suite.NoError(err) - -	a.Domain = "localhost:8080" -	err = validate.Struct(*a) -	suite.EqualError(err, "Key: 'Account.Domain' Error:Field validation for 'Domain' failed on the 'fqdn' tag") - -	a.Domain = "ahhhhh" -	err = validate.Struct(*a) -	suite.EqualError(err, "Key: 'Account.Domain' Error:Field validation for 'Domain' failed on the 'fqdn' tag") - -	a.Domain = "https://www.example.org" -	err = validate.Struct(*a) -	suite.EqualError(err, "Key: 'Account.Domain' Error:Field validation for 'Domain' failed on the 'fqdn' tag") - -	a.Domain = "example.org:8080" -	err = validate.Struct(*a) -	suite.EqualError(err, "Key: 'Account.Domain' Error:Field validation for 'Domain' failed on the 'fqdn' tag") - -	a.Domain = "example.org" -	err = validate.Struct(*a) -	suite.NoError(err) -} - -// Attachment IDs must either be not set, or must be valid ULID -func (suite *AccountValidateTestSuite) TestValidateAttachmentIDs() { -	a := happyAccount() - -	a.AvatarMediaAttachmentID = "" -	a.HeaderMediaAttachmentID = "" -	err := validate.Struct(*a) -	suite.NoError(err) - -	a.AvatarMediaAttachmentID = "01FE96W293ZPRG9FQQP48HK8N001FE96W32AT24VYBGM12WN3GKB" -	a.HeaderMediaAttachmentID = "aaaa" -	err = validate.Struct(*a) -	suite.EqualError(err, "Key: 'Account.AvatarMediaAttachmentID' Error:Field validation for 'AvatarMediaAttachmentID' failed on the 'ulid' tag\nKey: 'Account.HeaderMediaAttachmentID' Error:Field validation for 'HeaderMediaAttachmentID' failed on the 'ulid' tag") -} - -// Attachment remote URLs must either not be set, or be valid URLs -func (suite *AccountValidateTestSuite) TestValidateAttachmentRemoteURLs() { -	a := happyAccount() - -	a.AvatarRemoteURL = "" -	a.HeaderRemoteURL = "" -	err := validate.Struct(*a) -	suite.NoError(err) - -	a.AvatarRemoteURL = "-------------" -	a.HeaderRemoteURL = "https://valid-url.com" -	err = validate.Struct(*a) -	suite.EqualError(err, "Key: 'Account.AvatarRemoteURL' Error:Field validation for 'AvatarRemoteURL' failed on the 'url' tag") - -	a.AvatarRemoteURL = "https://valid-url.com" -	a.HeaderRemoteURL = "" -	err = validate.Struct(*a) -	suite.NoError(err) -} - -// Default privacy must be set if account is local -func (suite *AccountValidateTestSuite) TestValidatePrivacy() { -	a := happyAccount() -	a.FetchedAt = time.Now() - -	a.Privacy = "" -	err := validate.Struct(*a) -	suite.EqualError(err, "Key: 'Account.Privacy' Error:Field validation for 'Privacy' failed on the 'required_without' tag") - -	a.Privacy = "not valid" -	err = validate.Struct(*a) -	suite.EqualError(err, "Key: 'Account.Privacy' Error:Field validation for 'Privacy' failed on the 'oneof' tag") - -	a.Privacy = gtsmodel.VisibilityFollowersOnly -	err = validate.Struct(*a) -	suite.NoError(err) - -	a.Privacy = "" -	a.Domain = "example.org" -	err = validate.Struct(*a) -	suite.NoError(err) - -	a.Privacy = "invalid" -	err = validate.Struct(*a) -	suite.EqualError(err, "Key: 'Account.Privacy' Error:Field validation for 'Privacy' failed on the 'oneof' tag") -} - -// If set, language must be a valid language -func (suite *AccountValidateTestSuite) TestValidateLanguage() { -	a := happyAccount() - -	a.Language = "" -	err := validate.Struct(*a) -	suite.NoError(err) - -	a.Language = "not valid" -	err = validate.Struct(*a) -	suite.EqualError(err, "Key: 'Account.Language' Error:Field validation for 'Language' failed on the 'bcp47_language_tag' tag") - -	a.Language = "en-uk" -	err = validate.Struct(*a) -	suite.NoError(err) -} - -// Account URI must be set and must be valid -func (suite *AccountValidateTestSuite) TestValidateAccountURI() { -	a := happyAccount() - -	a.URI = "invalid-uri" -	err := validate.Struct(*a) -	suite.EqualError(err, "Key: 'Account.URI' Error:Field validation for 'URI' failed on the 'url' tag") - -	a.URI = "" -	err = validate.Struct(*a) -	suite.EqualError(err, "Key: 'Account.URI' Error:Field validation for 'URI' failed on the 'required' tag") -} - -// ActivityPub URIs must be set on account if it's local -func (suite *AccountValidateTestSuite) TestValidateAccountURIs() { -	a := happyAccount() -	a.FetchedAt = time.Now() - -	a.InboxURI = "invalid-uri" -	a.OutboxURI = "invalid-uri" -	a.FollowersURI = "invalid-uri" -	a.FollowingURI = "invalid-uri" -	a.FeaturedCollectionURI = "invalid-uri" -	a.PublicKeyURI = "invalid-uri" -	err := validate.Struct(*a) -	suite.EqualError(err, "Key: 'Account.InboxURI' Error:Field validation for 'InboxURI' failed on the 'url' tag\nKey: 'Account.OutboxURI' Error:Field validation for 'OutboxURI' failed on the 'url' tag\nKey: 'Account.FollowingURI' Error:Field validation for 'FollowingURI' failed on the 'url' tag\nKey: 'Account.FollowersURI' Error:Field validation for 'FollowersURI' failed on the 'url' tag\nKey: 'Account.FeaturedCollectionURI' Error:Field validation for 'FeaturedCollectionURI' failed on the 'url' tag\nKey: 'Account.PublicKeyURI' Error:Field validation for 'PublicKeyURI' failed on the 'url' tag") - -	a.InboxURI = "" -	a.OutboxURI = "" -	a.FollowersURI = "" -	a.FollowingURI = "" -	a.FeaturedCollectionURI = "" -	a.PublicKeyURI = "" -	err = validate.Struct(*a) -	suite.EqualError(err, "Key: 'Account.InboxURI' Error:Field validation for 'InboxURI' failed on the 'required_without' tag\nKey: 'Account.OutboxURI' Error:Field validation for 'OutboxURI' failed on the 'required_without' tag\nKey: 'Account.FollowingURI' Error:Field validation for 'FollowingURI' failed on the 'required_without' tag\nKey: 'Account.FollowersURI' Error:Field validation for 'FollowersURI' failed on the 'required_without' tag\nKey: 'Account.FeaturedCollectionURI' Error:Field validation for 'FeaturedCollectionURI' failed on the 'required_without' tag\nKey: 'Account.PublicKeyURI' Error:Field validation for 'PublicKeyURI' failed on the 'required' tag") - -	a.Domain = "example.org" -	err = validate.Struct(*a) -	suite.EqualError(err, "Key: 'Account.PublicKeyURI' Error:Field validation for 'PublicKeyURI' failed on the 'required' tag") - -	a.InboxURI = "invalid-uri" -	a.OutboxURI = "invalid-uri" -	a.FollowersURI = "invalid-uri" -	a.FollowingURI = "invalid-uri" -	a.FeaturedCollectionURI = "invalid-uri" -	a.PublicKeyURI = "invalid-uri" -	err = validate.Struct(*a) -	suite.EqualError(err, "Key: 'Account.InboxURI' Error:Field validation for 'InboxURI' failed on the 'url' tag\nKey: 'Account.OutboxURI' Error:Field validation for 'OutboxURI' failed on the 'url' tag\nKey: 'Account.FollowingURI' Error:Field validation for 'FollowingURI' failed on the 'url' tag\nKey: 'Account.FollowersURI' Error:Field validation for 'FollowersURI' failed on the 'url' tag\nKey: 'Account.FeaturedCollectionURI' Error:Field validation for 'FeaturedCollectionURI' failed on the 'url' tag\nKey: 'Account.PublicKeyURI' Error:Field validation for 'PublicKeyURI' failed on the 'url' tag") -} - -// Actor type must be set and valid -func (suite *AccountValidateTestSuite) TestValidateActorType() { -	a := happyAccount() - -	a.ActorType = "" -	err := validate.Struct(*a) -	suite.EqualError(err, "Key: 'Account.ActorType' Error:Field validation for 'ActorType' failed on the 'oneof' tag") - -	a.ActorType = "not valid" -	err = validate.Struct(*a) -	suite.EqualError(err, "Key: 'Account.ActorType' Error:Field validation for 'ActorType' failed on the 'oneof' tag") - -	a.ActorType = ap.ActivityArrive -	err = validate.Struct(*a) -	suite.EqualError(err, "Key: 'Account.ActorType' Error:Field validation for 'ActorType' failed on the 'oneof' tag") - -	a.ActorType = ap.ActorOrganization -	err = validate.Struct(*a) -	suite.NoError(err) -} - -// Private key must be set on local accounts -func (suite *AccountValidateTestSuite) TestValidatePrivateKey() { -	a := happyAccount() -	a.FetchedAt = time.Now() - -	a.PrivateKey = nil -	err := validate.Struct(*a) -	suite.EqualError(err, "Key: 'Account.PrivateKey' Error:Field validation for 'PrivateKey' failed on the 'required_without' tag") - -	a.Domain = "example.org" -	err = validate.Struct(*a) -	suite.NoError(err) -} - -// Public key must be set -func (suite *AccountValidateTestSuite) TestValidatePublicKey() { -	a := happyAccount() - -	a.PublicKey = nil -	err := validate.Struct(*a) -	suite.EqualError(err, "Key: 'Account.PublicKey' Error:Field validation for 'PublicKey' failed on the 'required' tag") -} - -func TestAccountValidateTestSuite(t *testing.T) { -	suite.Run(t, new(AccountValidateTestSuite)) -} diff --git a/internal/validate/application_test.go b/internal/validate/application_test.go deleted file mode 100644 index 86c53a615..000000000 --- a/internal/validate/application_test.go +++ /dev/null @@ -1,132 +0,0 @@ -// 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 validate_test - -import ( -	"testing" -	"time" - -	"github.com/stretchr/testify/suite" -	"github.com/superseriousbusiness/gotosocial/internal/gtsmodel" -	"github.com/superseriousbusiness/gotosocial/internal/validate" -) - -func happyApplication() *gtsmodel.Application { -	return >smodel.Application{ -		ID:           "01FE91RJR88PSEEE30EV35QR8N", -		CreatedAt:    time.Now(), -		UpdatedAt:    time.Now(), -		Name:         "Tusky", -		Website:      "https://tusky.app", -		RedirectURI:  "oauth2redirect://com.keylesspalace.tusky/", -		ClientID:     "01FEEDMF6C0QD589MRK7919Z0R", -		ClientSecret: "bd740cf1-024a-4e4d-8c39-866538f52fe6", -		Scopes:       "read write follow", -	} -} - -type ApplicationValidateTestSuite struct { -	suite.Suite -} - -func (suite *ApplicationValidateTestSuite) TestValidateApplicationHappyPath() { -	// no problem here -	a := happyApplication() -	err := validate.Struct(a) -	suite.NoError(err) -} - -func (suite *ApplicationValidateTestSuite) TestValidateApplicationBadID() { -	a := happyApplication() - -	a.ID = "" -	err := validate.Struct(a) -	suite.EqualError(err, "Key: 'Application.ID' Error:Field validation for 'ID' failed on the 'required' tag") - -	a.ID = "01FE96W293ZPRG9FQQP48HK8N001FE96W32AT24VYBGM12WN3GKB" -	err = validate.Struct(a) -	suite.EqualError(err, "Key: 'Application.ID' Error:Field validation for 'ID' failed on the 'ulid' tag") -} - -func (suite *ApplicationValidateTestSuite) TestValidateApplicationNoCreatedAt() { -	a := happyApplication() - -	a.CreatedAt = time.Time{} -	err := validate.Struct(a) -	suite.NoError(err) -} - -func (suite *ApplicationValidateTestSuite) TestValidateApplicationName() { -	a := happyApplication() - -	a.Name = "" -	err := validate.Struct(a) -	suite.EqualError(err, "Key: 'Application.Name' Error:Field validation for 'Name' failed on the 'required' tag") -} - -func (suite *ApplicationValidateTestSuite) TestValidateApplicationWebsite() { -	a := happyApplication() - -	a.Website = "invalid-website" -	err := validate.Struct(a) -	suite.EqualError(err, "Key: 'Application.Website' Error:Field validation for 'Website' failed on the 'url' tag") - -	a.Website = "" -	err = validate.Struct(a) -	suite.NoError(err) -} - -func (suite *ApplicationValidateTestSuite) TestValidateApplicationRedirectURI() { -	a := happyApplication() - -	a.RedirectURI = "invalid-uri" -	err := validate.Struct(a) -	suite.EqualError(err, "Key: 'Application.RedirectURI' Error:Field validation for 'RedirectURI' failed on the 'uri' tag") - -	a.RedirectURI = "" -	err = validate.Struct(a) -	suite.EqualError(err, "Key: 'Application.RedirectURI' Error:Field validation for 'RedirectURI' failed on the 'required' tag") - -	a.RedirectURI = "urn:ietf:wg:oauth:2.0:oob" -	err = validate.Struct(a) -	suite.NoError(err) -} - -func (suite *ApplicationValidateTestSuite) TestValidateApplicationClientSecret() { -	a := happyApplication() - -	a.ClientSecret = "invalid-uuid" -	err := validate.Struct(a) -	suite.EqualError(err, "Key: 'Application.ClientSecret' Error:Field validation for 'ClientSecret' failed on the 'uuid' tag") - -	a.ClientSecret = "" -	err = validate.Struct(a) -	suite.EqualError(err, "Key: 'Application.ClientSecret' Error:Field validation for 'ClientSecret' failed on the 'required' tag") -} - -func (suite *ApplicationValidateTestSuite) TestValidateApplicationScopes() { -	a := happyApplication() - -	a.Scopes = "" -	err := validate.Struct(a) -	suite.EqualError(err, "Key: 'Application.Scopes' Error:Field validation for 'Scopes' failed on the 'required' tag") -} - -func TestApplicationValidateTestSuite(t *testing.T) { -	suite.Run(t, new(ApplicationValidateTestSuite)) -} diff --git a/internal/validate/block_test.go b/internal/validate/block_test.go deleted file mode 100644 index 96e206140..000000000 --- a/internal/validate/block_test.go +++ /dev/null @@ -1,115 +0,0 @@ -// 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 validate_test - -import ( -	"testing" -	"time" - -	"github.com/stretchr/testify/suite" -	"github.com/superseriousbusiness/gotosocial/internal/gtsmodel" -	"github.com/superseriousbusiness/gotosocial/internal/validate" -) - -func happyBlock() *gtsmodel.Block { -	return >smodel.Block{ -		ID:              "01FE91RJR88PSEEE30EV35QR8N", -		CreatedAt:       time.Now(), -		UpdatedAt:       time.Now(), -		URI:             "https://example.org/accounts/someone/blocks/01FE91RJR88PSEEE30EV35QR8N", -		AccountID:       "01FEED79PRMVWPRMFHFQM8MJQN", -		Account:         nil, -		TargetAccountID: "01FEEDMF6C0QD589MRK7919Z0R", -		TargetAccount:   nil, -	} -} - -type BlockValidateTestSuite struct { -	suite.Suite -} - -func (suite *BlockValidateTestSuite) TestValidateBlockHappyPath() { -	// no problem here -	b := happyBlock() -	err := validate.Struct(b) -	suite.NoError(err) -} - -func (suite *BlockValidateTestSuite) TestValidateBlockBadID() { -	b := happyBlock() - -	b.ID = "" -	err := validate.Struct(b) -	suite.EqualError(err, "Key: 'Block.ID' Error:Field validation for 'ID' failed on the 'required' tag") - -	b.ID = "01FE96W293ZPRG9FQQP48HK8N001FE96W32AT24VYBGM12WN3GKB" -	err = validate.Struct(b) -	suite.EqualError(err, "Key: 'Block.ID' Error:Field validation for 'ID' failed on the 'ulid' tag") -} - -func (suite *BlockValidateTestSuite) TestValidateBlockNoCreatedAt() { -	b := happyBlock() - -	b.CreatedAt = time.Time{} -	err := validate.Struct(b) -	suite.NoError(err) -} - -func (suite *BlockValidateTestSuite) TestValidateBlockCreatedByAccountID() { -	b := happyBlock() - -	b.AccountID = "" -	err := validate.Struct(b) -	suite.EqualError(err, "Key: 'Block.AccountID' Error:Field validation for 'AccountID' failed on the 'required' tag") - -	b.AccountID = "this-is-not-a-valid-ulid" -	err = validate.Struct(b) -	suite.EqualError(err, "Key: 'Block.AccountID' Error:Field validation for 'AccountID' failed on the 'ulid' tag") -} - -func (suite *BlockValidateTestSuite) TestValidateBlockTargetAccountID() { -	b := happyBlock() - -	b.TargetAccountID = "invalid-ulid" -	err := validate.Struct(b) -	suite.EqualError(err, "Key: 'Block.TargetAccountID' Error:Field validation for 'TargetAccountID' failed on the 'ulid' tag") - -	b.TargetAccountID = "01FEEDHX4G7EGHF5GD9E82Y51Q" -	err = validate.Struct(b) -	suite.NoError(err) - -	b.TargetAccountID = "" -	err = validate.Struct(b) -	suite.EqualError(err, "Key: 'Block.TargetAccountID' Error:Field validation for 'TargetAccountID' failed on the 'required' tag") -} - -func (suite *BlockValidateTestSuite) TestValidateBlockURI() { -	b := happyBlock() - -	b.URI = "invalid-uri" -	err := validate.Struct(b) -	suite.EqualError(err, "Key: 'Block.URI' Error:Field validation for 'URI' failed on the 'url' tag") - -	b.URI = "" -	err = validate.Struct(b) -	suite.EqualError(err, "Key: 'Block.URI' Error:Field validation for 'URI' failed on the 'required' tag") -} - -func TestBlockValidateTestSuite(t *testing.T) { -	suite.Run(t, new(BlockValidateTestSuite)) -} diff --git a/internal/validate/client_test.go b/internal/validate/client_test.go deleted file mode 100644 index ee8f0e66e..000000000 --- a/internal/validate/client_test.go +++ /dev/null @@ -1,101 +0,0 @@ -// 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 validate_test - -import ( -	"testing" -	"time" - -	"github.com/stretchr/testify/suite" -	"github.com/superseriousbusiness/gotosocial/internal/gtsmodel" -	"github.com/superseriousbusiness/gotosocial/internal/validate" -) - -func happyClient() *gtsmodel.Client { -	return >smodel.Client{ -		ID:        "01FE91RJR88PSEEE30EV35QR8N", -		CreatedAt: time.Now(), -		UpdatedAt: time.Now(), -		Secret:    "bd740cf1-024a-4e4d-8c39-866538f52fe6", -		Domain:    "oauth2redirect://com.keylesspalace.tusky/", -		UserID:    "01FEEDMF6C0QD589MRK7919Z0R", -	} -} - -type ClientValidateTestSuite struct { -	suite.Suite -} - -func (suite *ClientValidateTestSuite) TestValidateClientHappyPath() { -	// no problem here -	c := happyClient() -	err := validate.Struct(c) -	suite.NoError(err) -} - -func (suite *ClientValidateTestSuite) TestValidateClientBadID() { -	c := happyClient() - -	c.ID = "" -	err := validate.Struct(c) -	suite.EqualError(err, "Key: 'Client.ID' Error:Field validation for 'ID' failed on the 'required' tag") - -	c.ID = "01FE96W293ZPRG9FQQP48HK8N001FE96W32AT24VYBGM12WN3GKB" -	err = validate.Struct(c) -	suite.EqualError(err, "Key: 'Client.ID' Error:Field validation for 'ID' failed on the 'ulid' tag") -} - -func (suite *ClientValidateTestSuite) TestValidateClientNoCreatedAt() { -	c := happyClient() - -	c.CreatedAt = time.Time{} -	err := validate.Struct(c) -	suite.NoError(err) -} - -func (suite *ClientValidateTestSuite) TestValidateClientDomain() { -	c := happyClient() - -	c.Domain = "invalid-uri" -	err := validate.Struct(c) -	suite.EqualError(err, "Key: 'Client.Domain' Error:Field validation for 'Domain' failed on the 'uri' tag") - -	c.Domain = "" -	err = validate.Struct(c) -	suite.EqualError(err, "Key: 'Client.Domain' Error:Field validation for 'Domain' failed on the 'required' tag") - -	c.Domain = "urn:ietf:wg:oauth:2.0:oob" -	err = validate.Struct(c) -	suite.NoError(err) -} - -func (suite *ClientValidateTestSuite) TestValidateSecret() { -	c := happyClient() - -	c.Secret = "invalid-uuid" -	err := validate.Struct(c) -	suite.EqualError(err, "Key: 'Client.Secret' Error:Field validation for 'Secret' failed on the 'uuid' tag") - -	c.Secret = "" -	err = validate.Struct(c) -	suite.EqualError(err, "Key: 'Client.Secret' Error:Field validation for 'Secret' failed on the 'required' tag") -} - -func TestClientValidateTestSuite(t *testing.T) { -	suite.Run(t, new(ClientValidateTestSuite)) -} diff --git a/internal/validate/domainblock_test.go b/internal/validate/domainblock_test.go deleted file mode 100644 index f6504d1f3..000000000 --- a/internal/validate/domainblock_test.go +++ /dev/null @@ -1,122 +0,0 @@ -// 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 validate_test - -import ( -	"testing" -	"time" - -	"github.com/stretchr/testify/suite" -	"github.com/superseriousbusiness/gotosocial/internal/gtsmodel" -	"github.com/superseriousbusiness/gotosocial/internal/validate" -	"github.com/superseriousbusiness/gotosocial/testrig" -) - -func happyDomainBlock() *gtsmodel.DomainBlock { -	return >smodel.DomainBlock{ -		ID:                 "01FE91RJR88PSEEE30EV35QR8N", -		CreatedAt:          time.Now(), -		UpdatedAt:          time.Now(), -		Domain:             "baddudes.suck", -		CreatedByAccountID: "01FEED79PRMVWPRMFHFQM8MJQN", -		PrivateComment:     "we don't like em", -		PublicComment:      "poo poo dudes", -		Obfuscate:          testrig.FalseBool(), -		SubscriptionID:     "", -	} -} - -type DomainBlockValidateTestSuite struct { -	suite.Suite -} - -func (suite *DomainBlockValidateTestSuite) TestValidateDomainBlockHappyPath() { -	// no problem here -	d := happyDomainBlock() -	err := validate.Struct(d) -	suite.NoError(err) -} - -func (suite *DomainBlockValidateTestSuite) TestValidateDomainBlockBadID() { -	d := happyDomainBlock() - -	d.ID = "" -	err := validate.Struct(d) -	suite.EqualError(err, "Key: 'DomainBlock.ID' Error:Field validation for 'ID' failed on the 'required' tag") - -	d.ID = "01FE96W293ZPRG9FQQP48HK8N001FE96W32AT24VYBGM12WN3GKB" -	err = validate.Struct(d) -	suite.EqualError(err, "Key: 'DomainBlock.ID' Error:Field validation for 'ID' failed on the 'ulid' tag") -} - -func (suite *DomainBlockValidateTestSuite) TestValidateDomainBlockNoCreatedAt() { -	d := happyDomainBlock() - -	d.CreatedAt = time.Time{} -	err := validate.Struct(d) -	suite.NoError(err) -} - -func (suite *DomainBlockValidateTestSuite) TestValidateDomainBlockBadDomain() { -	d := happyDomainBlock() - -	d.Domain = "" -	err := validate.Struct(d) -	suite.EqualError(err, "Key: 'DomainBlock.Domain' Error:Field validation for 'Domain' failed on the 'required' tag") - -	d.Domain = "this-is-not-a-valid-domain" -	err = validate.Struct(d) -	suite.EqualError(err, "Key: 'DomainBlock.Domain' Error:Field validation for 'Domain' failed on the 'fqdn' tag") -} - -func (suite *DomainBlockValidateTestSuite) TestValidateDomainBlockCreatedByAccountID() { -	d := happyDomainBlock() - -	d.CreatedByAccountID = "" -	err := validate.Struct(d) -	suite.EqualError(err, "Key: 'DomainBlock.CreatedByAccountID' Error:Field validation for 'CreatedByAccountID' failed on the 'required' tag") - -	d.CreatedByAccountID = "this-is-not-a-valid-ulid" -	err = validate.Struct(d) -	suite.EqualError(err, "Key: 'DomainBlock.CreatedByAccountID' Error:Field validation for 'CreatedByAccountID' failed on the 'ulid' tag") -} - -func (suite *DomainBlockValidateTestSuite) TestValidateDomainBlockComments() { -	d := happyDomainBlock() - -	d.PrivateComment = "" -	d.PublicComment = "" -	err := validate.Struct(d) -	suite.NoError(err) -} - -func (suite *DomainBlockValidateTestSuite) TestValidateDomainSubscriptionID() { -	d := happyDomainBlock() - -	d.SubscriptionID = "invalid-ulid" -	err := validate.Struct(d) -	suite.EqualError(err, "Key: 'DomainBlock.SubscriptionID' Error:Field validation for 'SubscriptionID' failed on the 'ulid' tag") - -	d.SubscriptionID = "01FEEDHX4G7EGHF5GD9E82Y51Q" -	err = validate.Struct(d) -	suite.NoError(err) -} - -func TestDomainBlockValidateTestSuite(t *testing.T) { -	suite.Run(t, new(DomainBlockValidateTestSuite)) -} diff --git a/internal/validate/emaildomainblock_test.go b/internal/validate/emaildomainblock_test.go deleted file mode 100644 index 2aac0d72c..000000000 --- a/internal/validate/emaildomainblock_test.go +++ /dev/null @@ -1,96 +0,0 @@ -// 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 validate_test - -import ( -	"testing" -	"time" - -	"github.com/stretchr/testify/suite" -	"github.com/superseriousbusiness/gotosocial/internal/gtsmodel" -	"github.com/superseriousbusiness/gotosocial/internal/validate" -) - -func happyEmailDomainBlock() *gtsmodel.EmailDomainBlock { -	return >smodel.EmailDomainBlock{ -		ID:                 "01FE91RJR88PSEEE30EV35QR8N", -		CreatedAt:          time.Now(), -		UpdatedAt:          time.Now(), -		Domain:             "baddudes.suck", -		CreatedByAccountID: "01FEED79PRMVWPRMFHFQM8MJQN", -	} -} - -type EmailDomainBlockValidateTestSuite struct { -	suite.Suite -} - -func (suite *EmailDomainBlockValidateTestSuite) TestValidateEmailDomainBlockHappyPath() { -	// no problem here -	e := happyEmailDomainBlock() -	err := validate.Struct(e) -	suite.NoError(err) -} - -func (suite *EmailDomainBlockValidateTestSuite) TestValidateEmailDomainBlockBadID() { -	e := happyEmailDomainBlock() - -	e.ID = "" -	err := validate.Struct(e) -	suite.EqualError(err, "Key: 'EmailDomainBlock.ID' Error:Field validation for 'ID' failed on the 'required' tag") - -	e.ID = "01FE96W293ZPRG9FQQP48HK8N001FE96W32AT24VYBGM12WN3GKB" -	err = validate.Struct(e) -	suite.EqualError(err, "Key: 'EmailDomainBlock.ID' Error:Field validation for 'ID' failed on the 'ulid' tag") -} - -func (suite *EmailDomainBlockValidateTestSuite) TestValidateEmailDomainBlockNoCreatedAt() { -	e := happyEmailDomainBlock() - -	e.CreatedAt = time.Time{} -	err := validate.Struct(e) -	suite.NoError(err) -} - -func (suite *EmailDomainBlockValidateTestSuite) TestValidateEmailDomainBlockBadDomain() { -	e := happyEmailDomainBlock() - -	e.Domain = "" -	err := validate.Struct(e) -	suite.EqualError(err, "Key: 'EmailDomainBlock.Domain' Error:Field validation for 'Domain' failed on the 'required' tag") - -	e.Domain = "this-is-not-a-valid-domain" -	err = validate.Struct(e) -	suite.EqualError(err, "Key: 'EmailDomainBlock.Domain' Error:Field validation for 'Domain' failed on the 'fqdn' tag") -} - -func (suite *EmailDomainBlockValidateTestSuite) TestValidateEmailDomainBlockCreatedByAccountID() { -	e := happyEmailDomainBlock() - -	e.CreatedByAccountID = "" -	err := validate.Struct(e) -	suite.EqualError(err, "Key: 'EmailDomainBlock.CreatedByAccountID' Error:Field validation for 'CreatedByAccountID' failed on the 'required' tag") - -	e.CreatedByAccountID = "this-is-not-a-valid-ulid" -	err = validate.Struct(e) -	suite.EqualError(err, "Key: 'EmailDomainBlock.CreatedByAccountID' Error:Field validation for 'CreatedByAccountID' failed on the 'ulid' tag") -} - -func TestEmailDomainBlockValidateTestSuite(t *testing.T) { -	suite.Run(t, new(EmailDomainBlockValidateTestSuite)) -} diff --git a/internal/validate/emoji_test.go b/internal/validate/emoji_test.go deleted file mode 100644 index 9192cb1fc..000000000 --- a/internal/validate/emoji_test.go +++ /dev/null @@ -1,195 +0,0 @@ -// 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 validate_test - -import ( -	"os" -	"testing" -	"time" - -	"github.com/stretchr/testify/suite" -	"github.com/superseriousbusiness/gotosocial/internal/gtsmodel" -	"github.com/superseriousbusiness/gotosocial/internal/validate" -	"github.com/superseriousbusiness/gotosocial/testrig" -) - -func happyEmoji() *gtsmodel.Emoji { -	// the file validator actually runs os.Stat on given paths, so we need to just create small -	// temp files for both the main attachment file and the thumbnail - -	imageFile, err := os.CreateTemp("", "gts_test_emoji") -	if err != nil { -		panic(err) -	} -	if _, err := imageFile.WriteString("main"); err != nil { -		panic(err) -	} -	imagePath := imageFile.Name() -	if err := imageFile.Close(); err != nil { -		panic(err) -	} - -	staticFile, err := os.CreateTemp("", "gts_test_emoji_static") -	if err != nil { -		panic(err) -	} -	if _, err := staticFile.WriteString("thumbnail"); err != nil { -		panic(err) -	} -	imageStaticPath := staticFile.Name() -	if err := staticFile.Close(); err != nil { -		panic(err) -	} - -	return >smodel.Emoji{ -		ID:                     "01F8MH6NEM8D7527KZAECTCR76", -		CreatedAt:              time.Now().Add(-71 * time.Hour), -		UpdatedAt:              time.Now().Add(-71 * time.Hour), -		Shortcode:              "blob_test", -		Domain:                 "example.org", -		ImageRemoteURL:         "https://example.org/emojis/blob_test.gif", -		ImageStaticRemoteURL:   "https://example.org/emojis/blob_test.png", -		ImageURL:               "", -		ImageStaticURL:         "", -		ImagePath:              imagePath, -		ImageStaticPath:        imageStaticPath, -		ImageContentType:       "image/gif", -		ImageStaticContentType: "image/png", -		ImageFileSize:          1024, -		ImageStaticFileSize:    256, -		ImageUpdatedAt:         time.Now(), -		Disabled:               testrig.FalseBool(), -		URI:                    "https://example.org/emojis/blob_test", -		VisibleInPicker:        testrig.TrueBool(), -		CategoryID:             "01FEE47ZH70PWDSEAVBRFNX325", -	} -} - -type EmojiValidateTestSuite struct { -	suite.Suite -} - -func (suite *EmojiValidateTestSuite) TestValidateEmojiHappyPath() { -	// no problem here -	m := happyEmoji() -	err := validate.Struct(*m) -	suite.NoError(err) -} - -func (suite *EmojiValidateTestSuite) TestValidateEmojiBadFilePaths() { -	e := happyEmoji() - -	e.ImagePath = "/tmp/nonexistent/file/for/gotosocial/test" -	err := validate.Struct(e) -	suite.EqualError(err, "Key: 'Emoji.ImagePath' Error:Field validation for 'ImagePath' failed on the 'file' tag") - -	e.ImagePath = "" -	err = validate.Struct(e) -	suite.EqualError(err, "Key: 'Emoji.ImagePath' Error:Field validation for 'ImagePath' failed on the 'required' tag") - -	e.ImagePath = "???????????thisnot a valid path####" -	err = validate.Struct(e) -	suite.EqualError(err, "Key: 'Emoji.ImagePath' Error:Field validation for 'ImagePath' failed on the 'file' tag") - -	e.ImageStaticPath = "/tmp/nonexistent/file/for/gotosocial/test" -	err = validate.Struct(e) -	suite.EqualError(err, "Key: 'Emoji.ImagePath' Error:Field validation for 'ImagePath' failed on the 'file' tag\nKey: 'Emoji.ImageStaticPath' Error:Field validation for 'ImageStaticPath' failed on the 'file' tag") - -	e.ImageStaticPath = "" -	err = validate.Struct(e) -	suite.EqualError(err, "Key: 'Emoji.ImagePath' Error:Field validation for 'ImagePath' failed on the 'file' tag\nKey: 'Emoji.ImageStaticPath' Error:Field validation for 'ImageStaticPath' failed on the 'required' tag") - -	e.ImageStaticPath = "???????????thisnot a valid path####" -	err = validate.Struct(e) -	suite.EqualError(err, "Key: 'Emoji.ImagePath' Error:Field validation for 'ImagePath' failed on the 'file' tag\nKey: 'Emoji.ImageStaticPath' Error:Field validation for 'ImageStaticPath' failed on the 'file' tag") -} - -func (suite *EmojiValidateTestSuite) TestValidateEmojiURI() { -	e := happyEmoji() - -	e.URI = "aaaaaaaaaa" -	err := validate.Struct(e) -	suite.EqualError(err, "Key: 'Emoji.URI' Error:Field validation for 'URI' failed on the 'url' tag") - -	e.URI = "" -	err = validate.Struct(e) -	suite.EqualError(err, "Key: 'Emoji.URI' Error:Field validation for 'URI' failed on the 'url' tag") -} - -func (suite *EmojiValidateTestSuite) TestValidateEmojiURLCombos() { -	e := happyEmoji() - -	e.ImageRemoteURL = "" -	err := validate.Struct(e) -	suite.EqualError(err, "Key: 'Emoji.ImageRemoteURL' Error:Field validation for 'ImageRemoteURL' failed on the 'required_without' tag\nKey: 'Emoji.ImageURL' Error:Field validation for 'ImageURL' failed on the 'required_without' tag") - -	e.ImageURL = "https://whatever.org" -	err = validate.Struct(e) -	suite.NoError(err) - -	e.ImageStaticRemoteURL = "" -	err = validate.Struct(e) -	suite.EqualError(err, "Key: 'Emoji.ImageStaticRemoteURL' Error:Field validation for 'ImageStaticRemoteURL' failed on the 'required_without' tag\nKey: 'Emoji.ImageStaticURL' Error:Field validation for 'ImageStaticURL' failed on the 'required_without' tag") - -	e.ImageStaticURL = "https://whatever.org" -	err = validate.Struct(e) -	suite.NoError(err) - -	e.ImageURL = "" -	e.ImageStaticURL = "" -	e.ImageRemoteURL = "" -	e.ImageStaticRemoteURL = "" -	err = validate.Struct(e) -	suite.EqualError(err, "Key: 'Emoji.ImageRemoteURL' Error:Field validation for 'ImageRemoteURL' failed on the 'required_without' tag\nKey: 'Emoji.ImageStaticRemoteURL' Error:Field validation for 'ImageStaticRemoteURL' failed on the 'required_without' tag\nKey: 'Emoji.ImageURL' Error:Field validation for 'ImageURL' failed on the 'required_without' tag\nKey: 'Emoji.ImageStaticURL' Error:Field validation for 'ImageStaticURL' failed on the 'required_without' tag") -} - -func (suite *EmojiValidateTestSuite) TestValidateFileSize() { -	e := happyEmoji() - -	e.ImageFileSize = 0 -	err := validate.Struct(e) -	suite.EqualError(err, "Key: 'Emoji.ImageFileSize' Error:Field validation for 'ImageFileSize' failed on the 'required' tag") - -	e.ImageStaticFileSize = 0 -	err = validate.Struct(e) -	suite.EqualError(err, "Key: 'Emoji.ImageFileSize' Error:Field validation for 'ImageFileSize' failed on the 'required' tag\nKey: 'Emoji.ImageStaticFileSize' Error:Field validation for 'ImageStaticFileSize' failed on the 'required' tag") - -	e.ImageFileSize = -1 -	err = validate.Struct(e) -	suite.EqualError(err, "Key: 'Emoji.ImageFileSize' Error:Field validation for 'ImageFileSize' failed on the 'min' tag\nKey: 'Emoji.ImageStaticFileSize' Error:Field validation for 'ImageStaticFileSize' failed on the 'required' tag") - -	e.ImageStaticFileSize = -1 -	err = validate.Struct(e) -	suite.EqualError(err, "Key: 'Emoji.ImageFileSize' Error:Field validation for 'ImageFileSize' failed on the 'min' tag\nKey: 'Emoji.ImageStaticFileSize' Error:Field validation for 'ImageStaticFileSize' failed on the 'min' tag") -} - -func (suite *EmojiValidateTestSuite) TestValidateDomain() { -	e := happyEmoji() - -	e.Domain = "" -	err := validate.Struct(e) -	suite.EqualError(err, "Key: 'Emoji.ImageURL' Error:Field validation for 'ImageURL' failed on the 'required_without' tag\nKey: 'Emoji.ImageStaticURL' Error:Field validation for 'ImageStaticURL' failed on the 'required_without' tag") - -	e.Domain = "aaaaaaaaa" -	err = validate.Struct(e) -	suite.EqualError(err, "Key: 'Emoji.Domain' Error:Field validation for 'Domain' failed on the 'fqdn' tag") -} - -func TestEmojiValidateTestSuite(t *testing.T) { -	suite.Run(t, new(EmojiValidateTestSuite)) -} diff --git a/internal/validate/follow_test.go b/internal/validate/follow_test.go deleted file mode 100644 index 2128be4aa..000000000 --- a/internal/validate/follow_test.go +++ /dev/null @@ -1,87 +0,0 @@ -// 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 validate_test - -import ( -	"testing" -	"time" - -	"github.com/stretchr/testify/suite" -	"github.com/superseriousbusiness/gotosocial/internal/gtsmodel" -	"github.com/superseriousbusiness/gotosocial/internal/validate" -) - -func happyFollow() *gtsmodel.Follow { -	return >smodel.Follow{ -		ID:              "01FE91RJR88PSEEE30EV35QR8N", -		CreatedAt:       time.Now(), -		UpdatedAt:       time.Now(), -		AccountID:       "01FE96MAE58MXCE5C4SSMEMCEK", -		Account:         nil, -		TargetAccountID: "01FE96MXRHWZHKC0WH5FT82H1A", -		TargetAccount:   nil, -		URI:             "https://example.org/users/user1/activity/follow/01FE91RJR88PSEEE30EV35QR8N", -	} -} - -type FollowValidateTestSuite struct { -	suite.Suite -} - -func (suite *FollowValidateTestSuite) TestValidateFollowHappyPath() { -	// no problem here -	f := happyFollow() -	err := validate.Struct(f) -	suite.NoError(err) -} - -func (suite *FollowValidateTestSuite) TestValidateFollowBadID() { -	f := happyFollow() - -	f.ID = "" -	err := validate.Struct(f) -	suite.EqualError(err, "Key: 'Follow.ID' Error:Field validation for 'ID' failed on the 'required' tag") - -	f.ID = "01FE96W293ZPRG9FQQP48HK8N001FE96W32AT24VYBGM12WN3GKB" -	err = validate.Struct(f) -	suite.EqualError(err, "Key: 'Follow.ID' Error:Field validation for 'ID' failed on the 'ulid' tag") -} - -func (suite *FollowValidateTestSuite) TestValidateFollowNoCreatedAt() { -	f := happyFollow() - -	f.CreatedAt = time.Time{} -	err := validate.Struct(f) -	suite.NoError(err) -} - -func (suite *FollowValidateTestSuite) TestValidateFollowNoURI() { -	f := happyFollow() - -	f.URI = "" -	err := validate.Struct(f) -	suite.EqualError(err, "Key: 'Follow.URI' Error:Field validation for 'URI' failed on the 'required' tag") - -	f.URI = "this-is-not-a-valid-url" -	err = validate.Struct(f) -	suite.EqualError(err, "Key: 'Follow.URI' Error:Field validation for 'URI' failed on the 'url' tag") -} - -func TestFollowValidateTestSuite(t *testing.T) { -	suite.Run(t, new(FollowValidateTestSuite)) -} diff --git a/internal/validate/followrequest_test.go b/internal/validate/followrequest_test.go deleted file mode 100644 index 0c3d883bb..000000000 --- a/internal/validate/followrequest_test.go +++ /dev/null @@ -1,87 +0,0 @@ -// 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 validate_test - -import ( -	"testing" -	"time" - -	"github.com/stretchr/testify/suite" -	"github.com/superseriousbusiness/gotosocial/internal/gtsmodel" -	"github.com/superseriousbusiness/gotosocial/internal/validate" -) - -func happyFollowRequest() *gtsmodel.FollowRequest { -	return >smodel.FollowRequest{ -		ID:              "01FE91RJR88PSEEE30EV35QR8N", -		CreatedAt:       time.Now(), -		UpdatedAt:       time.Now(), -		AccountID:       "01FE96MAE58MXCE5C4SSMEMCEK", -		Account:         nil, -		TargetAccountID: "01FE96MXRHWZHKC0WH5FT82H1A", -		TargetAccount:   nil, -		URI:             "https://example.org/users/user1/activity/follow/01FE91RJR88PSEEE30EV35QR8N", -	} -} - -type FollowRequestValidateTestSuite struct { -	suite.Suite -} - -func (suite *FollowRequestValidateTestSuite) TestValidateFollowRequestHappyPath() { -	// no problem here -	f := happyFollowRequest() -	err := validate.Struct(f) -	suite.NoError(err) -} - -func (suite *FollowRequestValidateTestSuite) TestValidateFollowRequestBadID() { -	f := happyFollowRequest() - -	f.ID = "" -	err := validate.Struct(f) -	suite.EqualError(err, "Key: 'FollowRequest.ID' Error:Field validation for 'ID' failed on the 'required' tag") - -	f.ID = "01FE96W293ZPRG9FQQP48HK8N001FE96W32AT24VYBGM12WN3GKB" -	err = validate.Struct(f) -	suite.EqualError(err, "Key: 'FollowRequest.ID' Error:Field validation for 'ID' failed on the 'ulid' tag") -} - -func (suite *FollowRequestValidateTestSuite) TestValidateFollowRequestNoCreatedAt() { -	f := happyFollowRequest() - -	f.CreatedAt = time.Time{} -	err := validate.Struct(f) -	suite.NoError(err) -} - -func (suite *FollowRequestValidateTestSuite) TestValidateFollowRequestNoURI() { -	f := happyFollowRequest() - -	f.URI = "" -	err := validate.Struct(f) -	suite.EqualError(err, "Key: 'FollowRequest.URI' Error:Field validation for 'URI' failed on the 'required' tag") - -	f.URI = "this-is-not-a-valid-url" -	err = validate.Struct(f) -	suite.EqualError(err, "Key: 'FollowRequest.URI' Error:Field validation for 'URI' failed on the 'url' tag") -} - -func TestFollowRequestValidateTestSuite(t *testing.T) { -	suite.Run(t, new(FollowRequestValidateTestSuite)) -} diff --git a/internal/validate/instance_test.go b/internal/validate/instance_test.go deleted file mode 100644 index 38c68a616..000000000 --- a/internal/validate/instance_test.go +++ /dev/null @@ -1,145 +0,0 @@ -// 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 validate_test - -import ( -	"testing" -	"time" - -	"github.com/stretchr/testify/suite" -	"github.com/superseriousbusiness/gotosocial/internal/gtsmodel" -	"github.com/superseriousbusiness/gotosocial/internal/validate" -) - -func happyInstance() *gtsmodel.Instance { -	return >smodel.Instance{ -		ID:                     "01FE91RJR88PSEEE30EV35QR8N", -		CreatedAt:              time.Now(), -		UpdatedAt:              time.Now(), -		Domain:                 "example.org", -		Title:                  "Example Instance", -		URI:                    "https://example.org", -		SuspendedAt:            time.Time{}, -		DomainBlockID:          "", -		DomainBlock:            nil, -		ShortDescription:       "This is a description for the example/testing instance.", -		Description:            "This is a way longer description for the example/testing instance!", -		Terms:                  "Don't be a knobhead.", -		ContactEmail:           "admin@example.org", -		ContactAccountUsername: "admin", -		ContactAccountID:       "01FEE20H5QWHJDEXAEE9G96PR0", -		ContactAccount:         nil, -		Reputation:             420, -		Version:                "gotosocial 0.1.0", -	} -} - -type InstanceValidateTestSuite struct { -	suite.Suite -} - -func (suite *InstanceValidateTestSuite) TestValidateInstanceHappyPath() { -	// no problem here -	m := happyInstance() -	err := validate.Struct(*m) -	suite.NoError(err) -} - -func (suite *InstanceValidateTestSuite) TestValidateInstanceBadID() { -	m := happyInstance() - -	m.ID = "" -	err := validate.Struct(*m) -	suite.EqualError(err, "Key: 'Instance.ID' Error:Field validation for 'ID' failed on the 'required' tag") - -	m.ID = "01FE96W293ZPRG9FQQP48HK8N001FE96W32AT24VYBGM12WN3GKB" -	err = validate.Struct(*m) -	suite.EqualError(err, "Key: 'Instance.ID' Error:Field validation for 'ID' failed on the 'ulid' tag") -} - -func (suite *InstanceValidateTestSuite) TestValidateInstanceAccountURI() { -	i := happyInstance() - -	i.URI = "" -	err := validate.Struct(i) -	suite.EqualError(err, "Key: 'Instance.URI' Error:Field validation for 'URI' failed on the 'required' tag") - -	i.URI = "---------------------------" -	err = validate.Struct(i) -	suite.EqualError(err, "Key: 'Instance.URI' Error:Field validation for 'URI' failed on the 'url' tag") -} - -func (suite *InstanceValidateTestSuite) TestValidateInstanceDodgyAccountID() { -	i := happyInstance() - -	i.ContactAccountID = "9HZJ76B6VXSKF" -	err := validate.Struct(i) -	suite.EqualError(err, "Key: 'Instance.ContactAccountID' Error:Field validation for 'ContactAccountID' failed on the 'ulid' tag") - -	i.ContactAccountID = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!!!!!!!!!!!!" -	err = validate.Struct(i) -	suite.EqualError(err, "Key: 'Instance.ContactAccountID' Error:Field validation for 'ContactAccountID' failed on the 'ulid' tag") - -	i.ContactAccountID = "" -	err = validate.Struct(i) -	suite.EqualError(err, "Key: 'Instance.ContactAccountID' Error:Field validation for 'ContactAccountID' failed on the 'required_with' tag") - -	i.ContactAccountUsername = "" -	err = validate.Struct(i) -	suite.NoError(err) -} - -func (suite *InstanceValidateTestSuite) TestValidateInstanceDomain() { -	i := happyInstance() - -	i.Domain = "poopoo" -	err := validate.Struct(i) -	suite.EqualError(err, "Key: 'Instance.Domain' Error:Field validation for 'Domain' failed on the 'fqdn' tag") - -	i.Domain = "" -	err = validate.Struct(i) -	suite.EqualError(err, "Key: 'Instance.Domain' Error:Field validation for 'Domain' failed on the 'required' tag") - -	i.Domain = "https://aaaaaaaaaaaaah.org" -	err = validate.Struct(i) -	suite.EqualError(err, "Key: 'Instance.Domain' Error:Field validation for 'Domain' failed on the 'fqdn' tag") -} - -func (suite *InstanceValidateTestSuite) TestValidateInstanceContactEmail() { -	i := happyInstance() - -	i.ContactEmail = "poopoo" -	err := validate.Struct(i) -	suite.EqualError(err, "Key: 'Instance.ContactEmail' Error:Field validation for 'ContactEmail' failed on the 'email' tag") - -	i.ContactEmail = "" -	err = validate.Struct(i) -	suite.NoError(err) -} - -func (suite *InstanceValidateTestSuite) TestValidateInstanceNoCreatedAt() { -	i := happyInstance() - -	i.CreatedAt = time.Time{} -	err := validate.Struct(i) -	suite.NoError(err) -} - -func TestInstanceValidateTestSuite(t *testing.T) { -	suite.Run(t, new(InstanceValidateTestSuite)) -} diff --git a/internal/validate/mediaattachment_test.go b/internal/validate/mediaattachment_test.go deleted file mode 100644 index 1021319f2..000000000 --- a/internal/validate/mediaattachment_test.go +++ /dev/null @@ -1,230 +0,0 @@ -// 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 validate_test - -import ( -	"os" -	"testing" -	"time" - -	"github.com/stretchr/testify/suite" -	"github.com/superseriousbusiness/gotosocial/internal/gtsmodel" -	"github.com/superseriousbusiness/gotosocial/internal/validate" -	"github.com/superseriousbusiness/gotosocial/testrig" -) - -func happyMediaAttachment() *gtsmodel.MediaAttachment { -	// the file validator actually runs os.Stat on given paths, so we need to just create small -	// temp files for both the main attachment file and the thumbnail - -	mainFile, err := os.CreateTemp("", "gts_test_mainfile") -	if err != nil { -		panic(err) -	} -	if _, err := mainFile.WriteString("main"); err != nil { -		panic(err) -	} -	mainPath := mainFile.Name() -	if err := mainFile.Close(); err != nil { -		panic(err) -	} - -	thumbnailFile, err := os.CreateTemp("", "gts_test_thumbnail") -	if err != nil { -		panic(err) -	} -	if _, err := thumbnailFile.WriteString("thumbnail"); err != nil { -		panic(err) -	} -	thumbnailPath := thumbnailFile.Name() -	if err := thumbnailFile.Close(); err != nil { -		panic(err) -	} - -	return >smodel.MediaAttachment{ -		ID:        "01F8MH6NEM8D7527KZAECTCR76", -		CreatedAt: time.Now().Add(-71 * time.Hour), -		UpdatedAt: time.Now().Add(-71 * time.Hour), -		StatusID:  "01F8MH75CBF9JFX4ZAD54N0W0R", -		URL:       "http://localhost:8080/fileserver/01F8MH17FWEB39HZJ76B6VXSKF/attachment/original/01F8MH6NEM8D7527KZAECTCR76.jpg", -		RemoteURL: "", -		Type:      gtsmodel.FileTypeImage, -		FileMeta: gtsmodel.FileMeta{ -			Original: gtsmodel.Original{ -				Width:  1200, -				Height: 630, -				Size:   756000, -				Aspect: 1.9047619047619047, -			}, -			Small: gtsmodel.Small{ -				Width:  256, -				Height: 134, -				Size:   34304, -				Aspect: 1.9104477611940298, -			}, -		}, -		AccountID:         "01F8MH17FWEB39HZJ76B6VXSKF", -		Description:       "Black and white image of some 50's style text saying: Welcome On Board", -		ScheduledStatusID: "", -		Blurhash:          "LNJRdVM{00Rj%Mayt7j[4nWBofRj", -		Processing:        2, -		File: gtsmodel.File{ -			Path:        mainPath, -			ContentType: "image/jpeg", -			FileSize:    62529, -			UpdatedAt:   time.Now().Add(-71 * time.Hour), -		}, -		Thumbnail: gtsmodel.Thumbnail{ -			Path:        thumbnailPath, -			ContentType: "image/jpeg", -			FileSize:    6872, -			UpdatedAt:   time.Now().Add(-71 * time.Hour), -			URL:         "http://localhost:8080/fileserver/01F8MH17FWEB39HZJ76B6VXSKF/attachment/small/01F8MH6NEM8D7527KZAECTCR76.jpg", -			RemoteURL:   "", -		}, -		Avatar: testrig.FalseBool(), -		Header: testrig.FalseBool(), -	} -} - -type MediaAttachmentValidateTestSuite struct { -	suite.Suite -} - -func (suite *MediaAttachmentValidateTestSuite) TestValidateMediaAttachmentHappyPath() { -	// no problem here -	m := happyMediaAttachment() -	err := validate.Struct(m) -	suite.NoError(err) -} - -func (suite *MediaAttachmentValidateTestSuite) TestValidateMediaAttachmentBadFilePaths() { -	m := happyMediaAttachment() - -	m.File.Path = "/tmp/nonexistent/file/for/gotosocial/test" -	err := validate.Struct(m) -	suite.EqualError(err, "Key: 'MediaAttachment.File.Path' Error:Field validation for 'Path' failed on the 'file' tag") - -	m.File.Path = "" -	err = validate.Struct(m) -	suite.EqualError(err, "Key: 'MediaAttachment.File.Path' Error:Field validation for 'Path' failed on the 'required' tag") - -	m.File.Path = "???????????thisnot a valid path####" -	err = validate.Struct(m) -	suite.EqualError(err, "Key: 'MediaAttachment.File.Path' Error:Field validation for 'Path' failed on the 'file' tag") - -	m.Thumbnail.Path = "/tmp/nonexistent/file/for/gotosocial/test" -	err = validate.Struct(m) -	suite.EqualError(err, "Key: 'MediaAttachment.File.Path' Error:Field validation for 'Path' failed on the 'file' tag\nKey: 'MediaAttachment.Thumbnail.Path' Error:Field validation for 'Path' failed on the 'file' tag") - -	m.Thumbnail.Path = "" -	err = validate.Struct(m) -	suite.EqualError(err, "Key: 'MediaAttachment.File.Path' Error:Field validation for 'Path' failed on the 'file' tag\nKey: 'MediaAttachment.Thumbnail.Path' Error:Field validation for 'Path' failed on the 'required' tag") - -	m.Thumbnail.Path = "???????????thisnot a valid path####" -	err = validate.Struct(m) -	suite.EqualError(err, "Key: 'MediaAttachment.File.Path' Error:Field validation for 'Path' failed on the 'file' tag\nKey: 'MediaAttachment.Thumbnail.Path' Error:Field validation for 'Path' failed on the 'file' tag") -} - -func (suite *MediaAttachmentValidateTestSuite) TestValidateMediaAttachmentBadType() { -	m := happyMediaAttachment() - -	m.Type = "" -	err := validate.Struct(m) -	suite.EqualError(err, "Key: 'MediaAttachment.Type' Error:Field validation for 'Type' failed on the 'oneof' tag") - -	m.Type = "Not Supported" -	err = validate.Struct(m) -	suite.EqualError(err, "Key: 'MediaAttachment.Type' Error:Field validation for 'Type' failed on the 'oneof' tag") -} - -func (suite *MediaAttachmentValidateTestSuite) TestValidateMediaAttachmentBadFileMeta() { -	m := happyMediaAttachment() - -	m.FileMeta.Original.Aspect = 0 -	err := validate.Struct(m) -	suite.EqualError(err, "Key: 'MediaAttachment.FileMeta.Original.Aspect' Error:Field validation for 'Aspect' failed on the 'required_with' tag") - -	m.FileMeta.Original.Height = 0 -	err = validate.Struct(m) -	suite.EqualError(err, "Key: 'MediaAttachment.FileMeta.Original.Height' Error:Field validation for 'Height' failed on the 'required_with' tag\nKey: 'MediaAttachment.FileMeta.Original.Aspect' Error:Field validation for 'Aspect' failed on the 'required_with' tag") - -	m.FileMeta.Original = gtsmodel.Original{} -	err = validate.Struct(m) -	suite.NoError(err) - -	m.FileMeta.Focus.X = 3.6 -	err = validate.Struct(m) -	suite.EqualError(err, "Key: 'MediaAttachment.FileMeta.Focus.X' Error:Field validation for 'X' failed on the 'max' tag") - -	m.FileMeta.Focus.Y = -50 -	err = validate.Struct(m) -	suite.EqualError(err, "Key: 'MediaAttachment.FileMeta.Focus.X' Error:Field validation for 'X' failed on the 'max' tag\nKey: 'MediaAttachment.FileMeta.Focus.Y' Error:Field validation for 'Y' failed on the 'min' tag") -} - -func (suite *MediaAttachmentValidateTestSuite) TestValidateMediaAttachmentBadURLCombos() { -	m := happyMediaAttachment() - -	m.URL = "aaaaaaaaaa" -	err := validate.Struct(m) -	suite.EqualError(err, "Key: 'MediaAttachment.URL' Error:Field validation for 'URL' failed on the 'url' tag") - -	m.URL = "" -	err = validate.Struct(m) -	suite.EqualError(err, "Key: 'MediaAttachment.URL' Error:Field validation for 'URL' failed on the 'required_without' tag\nKey: 'MediaAttachment.RemoteURL' Error:Field validation for 'RemoteURL' failed on the 'required_without' tag") - -	m.RemoteURL = "oooooooooo" -	err = validate.Struct(m) -	suite.EqualError(err, "Key: 'MediaAttachment.RemoteURL' Error:Field validation for 'RemoteURL' failed on the 'url' tag") - -	m.RemoteURL = "https://a-valid-url.gay" -	err = validate.Struct(m) -	suite.NoError(err) -} - -func (suite *MediaAttachmentValidateTestSuite) TestValidateMediaAttachmentBlurhash() { -	m := happyMediaAttachment() - -	m.Blurhash = "" -	err := validate.Struct(m) -	suite.EqualError(err, "Key: 'MediaAttachment.Blurhash' Error:Field validation for 'Blurhash' failed on the 'required_if' tag") - -	m.Type = gtsmodel.FileTypeAudio -	err = validate.Struct(m) -	suite.NoError(err) - -	m.Blurhash = "some_blurhash" -	err = validate.Struct(m) -	suite.NoError(err) -} - -func (suite *MediaAttachmentValidateTestSuite) TestValidateMediaAttachmentProcessing() { -	m := happyMediaAttachment() - -	m.Processing = 420 -	err := validate.Struct(m) -	suite.EqualError(err, "Key: 'MediaAttachment.Processing' Error:Field validation for 'Processing' failed on the 'oneof' tag") - -	m.Processing = -5 -	err = validate.Struct(m) -	suite.EqualError(err, "Key: 'MediaAttachment.Processing' Error:Field validation for 'Processing' failed on the 'oneof' tag") -} - -func TestMediaAttachmentValidateTestSuite(t *testing.T) { -	suite.Run(t, new(MediaAttachmentValidateTestSuite)) -} diff --git a/internal/validate/mention_test.go b/internal/validate/mention_test.go deleted file mode 100644 index 52513bd8c..000000000 --- a/internal/validate/mention_test.go +++ /dev/null @@ -1,101 +0,0 @@ -// 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 validate_test - -import ( -	"testing" -	"time" - -	"github.com/stretchr/testify/suite" -	"github.com/superseriousbusiness/gotosocial/internal/gtsmodel" -	"github.com/superseriousbusiness/gotosocial/internal/validate" -) - -func happyMention() *gtsmodel.Mention { -	return >smodel.Mention{ -		ID:               "01FE91RJR88PSEEE30EV35QR8N", -		CreatedAt:        time.Now(), -		UpdatedAt:        time.Now(), -		OriginAccountID:  "01FE96MAE58MXCE5C4SSMEMCEK", -		OriginAccountURI: "https://some-instance/accounts/bleepbloop", -		OriginAccount:    nil, -		TargetAccountID:  "01FE96MXRHWZHKC0WH5FT82H1A", -		TargetAccount:    nil, -		StatusID:         "01FE96NBPNJNY26730FT6GZTFE", -		Status:           nil, -	} -} - -type MentionValidateTestSuite struct { -	suite.Suite -} - -func (suite *MentionValidateTestSuite) TestValidateMentionHappyPath() { -	// no problem here -	m := happyMention() -	err := validate.Struct(m) -	suite.NoError(err) -} - -func (suite *MentionValidateTestSuite) TestValidateMentionBadID() { -	m := happyMention() - -	m.ID = "" -	err := validate.Struct(m) -	suite.EqualError(err, "Key: 'Mention.ID' Error:Field validation for 'ID' failed on the 'required' tag") - -	m.ID = "01FE96W293ZPRG9FQQP48HK8N001FE96W32AT24VYBGM12WN3GKB" -	err = validate.Struct(m) -	suite.EqualError(err, "Key: 'Mention.ID' Error:Field validation for 'ID' failed on the 'ulid' tag") -} - -func (suite *MentionValidateTestSuite) TestValidateMentionAccountURI() { -	m := happyMention() - -	m.OriginAccountURI = "" -	err := validate.Struct(m) -	suite.EqualError(err, "Key: 'Mention.OriginAccountURI' Error:Field validation for 'OriginAccountURI' failed on the 'url' tag") - -	m.OriginAccountURI = "---------------------------" -	err = validate.Struct(m) -	suite.EqualError(err, "Key: 'Mention.OriginAccountURI' Error:Field validation for 'OriginAccountURI' failed on the 'url' tag") -} - -func (suite *MentionValidateTestSuite) TestValidateMentionDodgyStatusID() { -	m := happyMention() - -	m.StatusID = "9HZJ76B6VXSKF" -	err := validate.Struct(m) -	suite.EqualError(err, "Key: 'Mention.StatusID' Error:Field validation for 'StatusID' failed on the 'ulid' tag") - -	m.StatusID = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!!!!!!!!!!!!" -	err = validate.Struct(m) -	suite.EqualError(err, "Key: 'Mention.StatusID' Error:Field validation for 'StatusID' failed on the 'ulid' tag") -} - -func (suite *MentionValidateTestSuite) TestValidateMentionNoCreatedAt() { -	m := happyMention() - -	m.CreatedAt = time.Time{} -	err := validate.Struct(m) -	suite.NoError(err) -} - -func TestMentionValidateTestSuite(t *testing.T) { -	suite.Run(t, new(MentionValidateTestSuite)) -} diff --git a/internal/validate/notification_test.go b/internal/validate/notification_test.go deleted file mode 100644 index a76b8bf58..000000000 --- a/internal/validate/notification_test.go +++ /dev/null @@ -1,97 +0,0 @@ -// 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 validate_test - -import ( -	"testing" -	"time" - -	"github.com/stretchr/testify/suite" -	"github.com/superseriousbusiness/gotosocial/internal/gtsmodel" -	"github.com/superseriousbusiness/gotosocial/internal/validate" -) - -func happyNotification() *gtsmodel.Notification { -	return >smodel.Notification{ -		ID:               "01FE91RJR88PSEEE30EV35QR8N", -		CreatedAt:        time.Now(), -		NotificationType: gtsmodel.NotificationFave, -		OriginAccountID:  "01FE96MAE58MXCE5C4SSMEMCEK", -		OriginAccount:    nil, -		TargetAccountID:  "01FE96MXRHWZHKC0WH5FT82H1A", -		TargetAccount:    nil, -		StatusID:         "01FE96NBPNJNY26730FT6GZTFE", -		Status:           nil, -	} -} - -type NotificationValidateTestSuite struct { -	suite.Suite -} - -func (suite *NotificationValidateTestSuite) TestValidateNotificationHappyPath() { -	// no problem here -	n := happyNotification() -	err := validate.Struct(n) -	suite.NoError(err) -} - -func (suite *NotificationValidateTestSuite) TestValidateNotificationBadID() { -	n := happyNotification() - -	n.ID = "" -	err := validate.Struct(n) -	suite.EqualError(err, "Key: 'Notification.ID' Error:Field validation for 'ID' failed on the 'required' tag") - -	n.ID = "01FE96W293ZPRG9FQQP48HK8N001FE96W32AT24VYBGM12WN3GKB" -	err = validate.Struct(n) -	suite.EqualError(err, "Key: 'Notification.ID' Error:Field validation for 'ID' failed on the 'ulid' tag") -} - -func (suite *NotificationValidateTestSuite) TestValidateNotificationStatusID() { -	n := happyNotification() - -	n.StatusID = "" -	err := validate.Struct(n) -	suite.EqualError(err, "Key: 'Notification.StatusID' Error:Field validation for 'StatusID' failed on the 'required_if' tag") - -	n.StatusID = "9HZJ76B6VXSKF" -	err = validate.Struct(n) -	suite.EqualError(err, "Key: 'Notification.StatusID' Error:Field validation for 'StatusID' failed on the 'ulid' tag") - -	n.StatusID = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!!!!!!!!!!!!" -	err = validate.Struct(n) -	suite.EqualError(err, "Key: 'Notification.StatusID' Error:Field validation for 'StatusID' failed on the 'ulid' tag") - -	n.StatusID = "" -	n.NotificationType = gtsmodel.NotificationFollowRequest -	err = validate.Struct(n) -	suite.NoError(err) -} - -func (suite *NotificationValidateTestSuite) TestValidateNotificationNoCreatedAt() { -	n := happyNotification() - -	n.CreatedAt = time.Time{} -	err := validate.Struct(n) -	suite.NoError(err) -} - -func TestNotificationValidateTestSuite(t *testing.T) { -	suite.Run(t, new(NotificationValidateTestSuite)) -} diff --git a/internal/validate/routersession_test.go b/internal/validate/routersession_test.go deleted file mode 100644 index f9dc49e40..000000000 --- a/internal/validate/routersession_test.go +++ /dev/null @@ -1,87 +0,0 @@ -// 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 validate_test - -import ( -	"testing" - -	"github.com/stretchr/testify/suite" -	"github.com/superseriousbusiness/gotosocial/internal/gtsmodel" -	"github.com/superseriousbusiness/gotosocial/internal/validate" -) - -func happyRouterSession() *gtsmodel.RouterSession { -	return >smodel.RouterSession{ -		ID:    "01FE91RJR88PSEEE30EV35QR8N", -		Auth:  []byte("12345678901234567890123456789012"), -		Crypt: []byte("12345678901234567890123456789012"), -	} -} - -type RouterSessionValidateTestSuite struct { -	suite.Suite -} - -func (suite *RouterSessionValidateTestSuite) TestValidateRouterSessionHappyPath() { -	// no problem here -	r := happyRouterSession() -	err := validate.Struct(r) -	suite.NoError(err) -} - -func (suite *RouterSessionValidateTestSuite) TestValidateRouterSessionAuth() { -	r := happyRouterSession() - -	// remove auth struct -	r.Auth = nil -	err := validate.Struct(r) -	suite.EqualError(err, "Key: 'RouterSession.Auth' Error:Field validation for 'Auth' failed on the 'required' tag") - -	// auth bytes too long -	r.Auth = []byte("1234567890123456789012345678901234567890") -	err = validate.Struct(r) -	suite.EqualError(err, "Key: 'RouterSession.Auth' Error:Field validation for 'Auth' failed on the 'len' tag") - -	// auth bytes too short -	r.Auth = []byte("12345678901") -	err = validate.Struct(r) -	suite.EqualError(err, "Key: 'RouterSession.Auth' Error:Field validation for 'Auth' failed on the 'len' tag") -} - -func (suite *RouterSessionValidateTestSuite) TestValidateRouterSessionCrypt() { -	r := happyRouterSession() - -	// remove crypt struct -	r.Crypt = nil -	err := validate.Struct(r) -	suite.EqualError(err, "Key: 'RouterSession.Crypt' Error:Field validation for 'Crypt' failed on the 'required' tag") - -	// crypt bytes too long -	r.Crypt = []byte("1234567890123456789012345678901234567890") -	err = validate.Struct(r) -	suite.EqualError(err, "Key: 'RouterSession.Crypt' Error:Field validation for 'Crypt' failed on the 'len' tag") - -	// crypt bytes too short -	r.Crypt = []byte("12345678901") -	err = validate.Struct(r) -	suite.EqualError(err, "Key: 'RouterSession.Crypt' Error:Field validation for 'Crypt' failed on the 'len' tag") -} - -func TestRouterSessionValidateTestSuite(t *testing.T) { -	suite.Run(t, new(RouterSessionValidateTestSuite)) -} diff --git a/internal/validate/status_test.go b/internal/validate/status_test.go deleted file mode 100644 index db0cd8fda..000000000 --- a/internal/validate/status_test.go +++ /dev/null @@ -1,160 +0,0 @@ -// 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 validate_test - -import ( -	"testing" -	"time" - -	"github.com/stretchr/testify/suite" -	"github.com/superseriousbusiness/gotosocial/internal/ap" -	"github.com/superseriousbusiness/gotosocial/internal/gtsmodel" -	"github.com/superseriousbusiness/gotosocial/internal/validate" -	"github.com/superseriousbusiness/gotosocial/testrig" -) - -func happyStatus() *gtsmodel.Status { -	return >smodel.Status{ -		ID:                       "01FEBBH6NYDG87NK6A6EC543ED", -		CreatedAt:                time.Now(), -		UpdatedAt:                time.Now(), -		URI:                      "https://example.org/users/test_user/statuses/01FEBBH6NYDG87NK6A6EC543ED", -		URL:                      "https://example.org/@test_user/01FEBBH6NYDG87NK6A6EC543ED", -		Content:                  "<p>Test status! #hello</p>", -		AttachmentIDs:            []string{"01FEBBKZBY9H5FEP3PHVVAAGN1", "01FEBBM7S2R4WT6WWW22KN1PWE"}, -		Attachments:              nil, -		TagIDs:                   []string{"01FEBBNBMBSN1FESMZ1TCXNWYP"}, -		Tags:                     nil, -		MentionIDs:               nil, -		Mentions:                 nil, -		EmojiIDs:                 nil, -		Emojis:                   nil, -		Local:                    testrig.TrueBool(), -		AccountID:                "01FEBBQ4KEP3824WW61MF52638", -		Account:                  nil, -		AccountURI:               "https://example.org/users/test_user", -		InReplyToID:              "", -		InReplyToURI:             "", -		InReplyToAccountID:       "", -		InReplyTo:                nil, -		InReplyToAccount:         nil, -		BoostOfID:                "", -		BoostOfAccountID:         "", -		BoostOf:                  nil, -		BoostOfAccount:           nil, -		ContentWarning:           "hello world test post", -		Visibility:               gtsmodel.VisibilityPublic, -		Sensitive:                testrig.FalseBool(), -		Language:                 "en", -		CreatedWithApplicationID: "01FEBBZHF4GFVRXSJVXD0JTZZ2", -		CreatedWithApplication:   nil, -		Federated:                testrig.TrueBool(), -		Boostable:                testrig.TrueBool(), -		Replyable:                testrig.TrueBool(), -		Likeable:                 testrig.TrueBool(), -		ActivityStreamsType:      ap.ObjectNote, -		Text:                     "Test status! #hello", -	} -} - -type StatusValidateTestSuite struct { -	suite.Suite -} - -func (suite *StatusValidateTestSuite) TestValidateStatusHappyPath() { -	// no problem here -	s := happyStatus() -	err := validate.Struct(s) -	suite.NoError(err) -} - -func (suite *StatusValidateTestSuite) TestValidateStatusBadID() { -	s := happyStatus() - -	s.ID = "" -	err := validate.Struct(s) -	suite.EqualError(err, "Key: 'Status.ID' Error:Field validation for 'ID' failed on the 'required' tag") - -	s.ID = "01FE96W293ZPRG9FQQP48HK8N001FE96W32AT24VYBGM12WN3GKB" -	err = validate.Struct(s) -	suite.EqualError(err, "Key: 'Status.ID' Error:Field validation for 'ID' failed on the 'ulid' tag") -} - -func (suite *StatusValidateTestSuite) TestValidateStatusAttachmentIDs() { -	s := happyStatus() - -	s.AttachmentIDs[0] = "" -	err := validate.Struct(s) -	suite.EqualError(err, "Key: 'Status.AttachmentIDs[0]' Error:Field validation for 'AttachmentIDs[0]' failed on the 'ulid' tag") - -	s.AttachmentIDs[0] = "01FE96W293ZPRG9FQQP48HK8N001FE96W32AT24VYBGM12WN3GKB" -	err = validate.Struct(s) -	suite.EqualError(err, "Key: 'Status.AttachmentIDs[0]' Error:Field validation for 'AttachmentIDs[0]' failed on the 'ulid' tag") - -	s.AttachmentIDs[1] = "" -	err = validate.Struct(s) -	suite.EqualError(err, "Key: 'Status.AttachmentIDs[0]' Error:Field validation for 'AttachmentIDs[0]' failed on the 'ulid' tag\nKey: 'Status.AttachmentIDs[1]' Error:Field validation for 'AttachmentIDs[1]' failed on the 'ulid' tag") - -	s.AttachmentIDs = []string{} -	err = validate.Struct(s) -	suite.NoError(err) - -	s.AttachmentIDs = nil -	err = validate.Struct(s) -	suite.NoError(err) -} - -func (suite *StatusValidateTestSuite) TestStatusApplicationID() { -	s := happyStatus() - -	s.CreatedWithApplicationID = "" -	err := validate.Struct(s) -	suite.EqualError(err, "Key: 'Status.CreatedWithApplicationID' Error:Field validation for 'CreatedWithApplicationID' failed on the 'required_if' tag") - -	s.Local = testrig.FalseBool() -	err = validate.Struct(s) -	suite.NoError(err) -} - -func (suite *StatusValidateTestSuite) TestValidateStatusReplyFields() { -	s := happyStatus() - -	s.InReplyToAccountID = "01FEBCTP6DN7961PN81C3DVM4N                         " -	err := validate.Struct(s) -	suite.EqualError(err, "Key: 'Status.InReplyToID' Error:Field validation for 'InReplyToID' failed on the 'required_with' tag\nKey: 'Status.InReplyToURI' Error:Field validation for 'InReplyToURI' failed on the 'required_with' tag\nKey: 'Status.InReplyToAccountID' Error:Field validation for 'InReplyToAccountID' failed on the 'ulid' tag") - -	s.InReplyToAccountID = "01FEBCTP6DN7961PN81C3DVM4N" -	err = validate.Struct(s) -	suite.EqualError(err, "Key: 'Status.InReplyToID' Error:Field validation for 'InReplyToID' failed on the 'required_with' tag\nKey: 'Status.InReplyToURI' Error:Field validation for 'InReplyToURI' failed on the 'required_with' tag") - -	s.InReplyToURI = "https://example.org/users/mmbop/statuses/aaaaaaaa" -	err = validate.Struct(s) -	suite.EqualError(err, "Key: 'Status.InReplyToID' Error:Field validation for 'InReplyToID' failed on the 'required_with' tag") - -	s.InReplyToID = "not a valid ulid" -	err = validate.Struct(s) -	suite.EqualError(err, "Key: 'Status.InReplyToID' Error:Field validation for 'InReplyToID' failed on the 'ulid' tag") - -	s.InReplyToID = "01FEBD07E72DEY6YB9K10ZA6ST" -	err = validate.Struct(s) -	suite.NoError(err) -} - -func TestStatusValidateTestSuite(t *testing.T) { -	suite.Run(t, new(StatusValidateTestSuite)) -} diff --git a/internal/validate/statusbookmark_test.go b/internal/validate/statusbookmark_test.go deleted file mode 100644 index 3be9e56ed..000000000 --- a/internal/validate/statusbookmark_test.go +++ /dev/null @@ -1,87 +0,0 @@ -// 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 validate_test - -import ( -	"testing" -	"time" - -	"github.com/stretchr/testify/suite" -	"github.com/superseriousbusiness/gotosocial/internal/gtsmodel" -	"github.com/superseriousbusiness/gotosocial/internal/validate" -) - -func happyStatusBookmark() *gtsmodel.StatusBookmark { -	return >smodel.StatusBookmark{ -		ID:              "01FE91RJR88PSEEE30EV35QR8N", -		CreatedAt:       time.Now(), -		AccountID:       "01FE96MAE58MXCE5C4SSMEMCEK", -		Account:         nil, -		TargetAccountID: "01FE96MXRHWZHKC0WH5FT82H1A", -		TargetAccount:   nil, -		StatusID:        "01FE96NBPNJNY26730FT6GZTFE", -		Status:          nil, -	} -} - -type StatusBookmarkValidateTestSuite struct { -	suite.Suite -} - -func (suite *StatusBookmarkValidateTestSuite) TestValidateStatusBookmarkHappyPath() { -	// no problem here -	s := happyStatusBookmark() -	err := validate.Struct(s) -	suite.NoError(err) -} - -func (suite *StatusBookmarkValidateTestSuite) TestValidateStatusBookmarkBadID() { -	s := happyStatusBookmark() - -	s.ID = "" -	err := validate.Struct(s) -	suite.EqualError(err, "Key: 'StatusBookmark.ID' Error:Field validation for 'ID' failed on the 'required' tag") - -	s.ID = "01FE96W293ZPRG9FQQP48HK8N001FE96W32AT24VYBGM12WN3GKB" -	err = validate.Struct(s) -	suite.EqualError(err, "Key: 'StatusBookmark.ID' Error:Field validation for 'ID' failed on the 'ulid' tag") -} - -func (suite *StatusBookmarkValidateTestSuite) TestValidateStatusBookmarkDodgyStatusID() { -	s := happyStatusBookmark() - -	s.StatusID = "9HZJ76B6VXSKF" -	err := validate.Struct(s) -	suite.EqualError(err, "Key: 'StatusBookmark.StatusID' Error:Field validation for 'StatusID' failed on the 'ulid' tag") - -	s.StatusID = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!!!!!!!!!!!!" -	err = validate.Struct(s) -	suite.EqualError(err, "Key: 'StatusBookmark.StatusID' Error:Field validation for 'StatusID' failed on the 'ulid' tag") -} - -func (suite *StatusBookmarkValidateTestSuite) TestValidateStatusBookmarkNoCreatedAt() { -	s := happyStatusBookmark() - -	s.CreatedAt = time.Time{} -	err := validate.Struct(s) -	suite.NoError(err) -} - -func TestStatusBookmarkValidateTestSuite(t *testing.T) { -	suite.Run(t, new(StatusBookmarkValidateTestSuite)) -} diff --git a/internal/validate/statusfave_test.go b/internal/validate/statusfave_test.go deleted file mode 100644 index e864e39f2..000000000 --- a/internal/validate/statusfave_test.go +++ /dev/null @@ -1,100 +0,0 @@ -// 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 validate_test - -import ( -	"testing" -	"time" - -	"github.com/stretchr/testify/suite" -	"github.com/superseriousbusiness/gotosocial/internal/gtsmodel" -	"github.com/superseriousbusiness/gotosocial/internal/validate" -) - -func happyStatusFave() *gtsmodel.StatusFave { -	return >smodel.StatusFave{ -		ID:              "01FE91RJR88PSEEE30EV35QR8N", -		CreatedAt:       time.Now(), -		AccountID:       "01FE96MAE58MXCE5C4SSMEMCEK", -		Account:         nil, -		TargetAccountID: "01FE96MXRHWZHKC0WH5FT82H1A", -		TargetAccount:   nil, -		StatusID:        "01FE96NBPNJNY26730FT6GZTFE", -		Status:          nil, -		URI:             "https://example.org/users/user1/activity/faves/01FE91RJR88PSEEE30EV35QR8N", -	} -} - -type StatusFaveValidateTestSuite struct { -	suite.Suite -} - -func (suite *StatusFaveValidateTestSuite) TestValidateStatusFaveHappyPath() { -	// no problem here -	f := happyStatusFave() -	err := validate.Struct(f) -	suite.NoError(err) -} - -func (suite *StatusFaveValidateTestSuite) TestValidateStatusFaveBadID() { -	f := happyStatusFave() - -	f.ID = "" -	err := validate.Struct(f) -	suite.EqualError(err, "Key: 'StatusFave.ID' Error:Field validation for 'ID' failed on the 'required' tag") - -	f.ID = "01FE96W293ZPRG9FQQP48HK8N001FE96W32AT24VYBGM12WN3GKB" -	err = validate.Struct(f) -	suite.EqualError(err, "Key: 'StatusFave.ID' Error:Field validation for 'ID' failed on the 'ulid' tag") -} - -func (suite *StatusFaveValidateTestSuite) TestValidateStatusFaveDodgyStatusID() { -	f := happyStatusFave() - -	f.StatusID = "9HZJ76B6VXSKF" -	err := validate.Struct(f) -	suite.EqualError(err, "Key: 'StatusFave.StatusID' Error:Field validation for 'StatusID' failed on the 'ulid' tag") - -	f.StatusID = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!!!!!!!!!!!!" -	err = validate.Struct(f) -	suite.EqualError(err, "Key: 'StatusFave.StatusID' Error:Field validation for 'StatusID' failed on the 'ulid' tag") -} - -func (suite *StatusFaveValidateTestSuite) TestValidateStatusFaveNoCreatedAt() { -	f := happyStatusFave() - -	f.CreatedAt = time.Time{} -	err := validate.Struct(f) -	suite.NoError(err) -} - -func (suite *StatusFaveValidateTestSuite) TestValidateStatusFaveNoURI() { -	f := happyStatusFave() - -	f.URI = "" -	err := validate.Struct(f) -	suite.EqualError(err, "Key: 'StatusFave.URI' Error:Field validation for 'URI' failed on the 'required' tag") - -	f.URI = "this-is-not-a-valid-url" -	err = validate.Struct(f) -	suite.EqualError(err, "Key: 'StatusFave.URI' Error:Field validation for 'URI' failed on the 'url' tag") -} - -func TestStatusFaveValidateTestSuite(t *testing.T) { -	suite.Run(t, new(StatusFaveValidateTestSuite)) -} diff --git a/internal/validate/statusmute_test.go b/internal/validate/statusmute_test.go deleted file mode 100644 index 20358bb23..000000000 --- a/internal/validate/statusmute_test.go +++ /dev/null @@ -1,87 +0,0 @@ -// 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 validate_test - -import ( -	"testing" -	"time" - -	"github.com/stretchr/testify/suite" -	"github.com/superseriousbusiness/gotosocial/internal/gtsmodel" -	"github.com/superseriousbusiness/gotosocial/internal/validate" -) - -func happyStatusMute() *gtsmodel.StatusMute { -	return >smodel.StatusMute{ -		ID:              "01FE91RJR88PSEEE30EV35QR8N", -		CreatedAt:       time.Now(), -		AccountID:       "01FE96MAE58MXCE5C4SSMEMCEK", -		Account:         nil, -		TargetAccountID: "01FE96MXRHWZHKC0WH5FT82H1A", -		TargetAccount:   nil, -		StatusID:        "01FE96NBPNJNY26730FT6GZTFE", -		Status:          nil, -	} -} - -type StatusMuteValidateTestSuite struct { -	suite.Suite -} - -func (suite *StatusMuteValidateTestSuite) TestValidateStatusMuteHappyPath() { -	// no problem here -	m := happyStatusMute() -	err := validate.Struct(m) -	suite.NoError(err) -} - -func (suite *StatusMuteValidateTestSuite) TestValidateStatusMuteBadID() { -	m := happyStatusMute() - -	m.ID = "" -	err := validate.Struct(m) -	suite.EqualError(err, "Key: 'StatusMute.ID' Error:Field validation for 'ID' failed on the 'required' tag") - -	m.ID = "01FE96W293ZPRG9FQQP48HK8N001FE96W32AT24VYBGM12WN3GKB" -	err = validate.Struct(m) -	suite.EqualError(err, "Key: 'StatusMute.ID' Error:Field validation for 'ID' failed on the 'ulid' tag") -} - -func (suite *StatusMuteValidateTestSuite) TestValidateStatusMuteDodgyStatusID() { -	m := happyStatusMute() - -	m.StatusID = "9HZJ76B6VXSKF" -	err := validate.Struct(m) -	suite.EqualError(err, "Key: 'StatusMute.StatusID' Error:Field validation for 'StatusID' failed on the 'ulid' tag") - -	m.StatusID = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!!!!!!!!!!!!" -	err = validate.Struct(m) -	suite.EqualError(err, "Key: 'StatusMute.StatusID' Error:Field validation for 'StatusID' failed on the 'ulid' tag") -} - -func (suite *StatusMuteValidateTestSuite) TestValidateStatusMuteNoCreatedAt() { -	m := happyStatusMute() - -	m.CreatedAt = time.Time{} -	err := validate.Struct(m) -	suite.NoError(err) -} - -func TestStatusMuteValidateTestSuite(t *testing.T) { -	suite.Run(t, new(StatusMuteValidateTestSuite)) -} diff --git a/internal/validate/structvalidation.go b/internal/validate/structvalidation.go deleted file mode 100644 index 573e79fd2..000000000 --- a/internal/validate/structvalidation.go +++ /dev/null @@ -1,67 +0,0 @@ -// 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 validate - -import ( -	"reflect" - -	"github.com/go-playground/validator/v10" -	"github.com/superseriousbusiness/gotosocial/internal/regexes" -) - -var v *validator.Validate - -func ulidValidator(fl validator.FieldLevel) bool { -	field := fl.Field() - -	switch field.Kind() { -	case reflect.String: -		return regexes.ULID.MatchString(field.String()) -	default: -		return false -	} -} - -func init() { -	v = validator.New() -	if err := v.RegisterValidation("ulid", ulidValidator); err != nil { -		panic(err) -	} -} - -// Struct validates the passed struct, returning validator.ValidationErrors if invalid, or nil if OK. -func Struct(s interface{}) error { -	return processValidationError(v.Struct(s)) -} - -func processValidationError(err error) error { -	if err == nil { -		return nil -	} - -	if ive, ok := err.(*validator.InvalidValidationError); ok { -		panic(ive) -	} - -	valErr, ok := err.(validator.ValidationErrors) -	if !ok { -		panic("*validator.InvalidValidationError could not be coerced to validator.ValidationErrors") -	} - -	return valErr -} diff --git a/internal/validate/structvalidation_test.go b/internal/validate/structvalidation_test.go deleted file mode 100644 index f8ad514cf..000000000 --- a/internal/validate/structvalidation_test.go +++ /dev/null @@ -1,70 +0,0 @@ -// 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 validate_test - -import ( -	"testing" - -	"github.com/stretchr/testify/suite" -	"github.com/superseriousbusiness/gotosocial/internal/gtsmodel" -	"github.com/superseriousbusiness/gotosocial/internal/validate" -) - -type ValidateTestSuite struct { -	suite.Suite -} - -func (suite *ValidateTestSuite) TestValidateNilPointer() { -	var nilUser *gtsmodel.User -	suite.Panics(func() { -		validate.Struct(nilUser) -	}) -} - -func (suite *ValidateTestSuite) TestValidatePointer() { -	user := >smodel.User{} -	err := validate.Struct(user) -	suite.EqualError(err, "Key: 'User.ID' Error:Field validation for 'ID' failed on the 'required' tag\nKey: 'User.AccountID' Error:Field validation for 'AccountID' failed on the 'required' tag\nKey: 'User.EncryptedPassword' Error:Field validation for 'EncryptedPassword' failed on the 'required' tag\nKey: 'User.UnconfirmedEmail' Error:Field validation for 'UnconfirmedEmail' failed on the 'required_without' tag") -} - -func (suite *ValidateTestSuite) TestValidateNil() { -	suite.Panics(func() { -		validate.Struct(nil) -	}) -} - -func (suite *ValidateTestSuite) TestValidateWeirdULID() { -	type a struct { -		ID bool `validate:"required,ulid"` -	} - -	err := validate.Struct(a{ID: true}) -	suite.Error(err) -} - -func (suite *ValidateTestSuite) TestValidateNotStruct() { -	type aaaaaaa string -	aaaaaa := aaaaaaa("aaaa") -	suite.Panics(func() { -		validate.Struct(aaaaaa) -	}) -} - -func TestValidateTestSuite(t *testing.T) { -	suite.Run(t, new(ValidateTestSuite)) -} diff --git a/internal/validate/token_test.go b/internal/validate/token_test.go deleted file mode 100644 index 2ff0e0721..000000000 --- a/internal/validate/token_test.go +++ /dev/null @@ -1,98 +0,0 @@ -// 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 validate_test - -import ( -	"testing" -	"time" - -	"github.com/stretchr/testify/suite" -	"github.com/superseriousbusiness/gotosocial/internal/gtsmodel" -	"github.com/superseriousbusiness/gotosocial/internal/validate" -) - -func happyToken() *gtsmodel.Token { -	return >smodel.Token{ -		ID:          "01FE91RJR88PSEEE30EV35QR8N", -		CreatedAt:   time.Now(), -		UpdatedAt:   time.Now(), -		ClientID:    "01FEEDMF6C0QD589MRK7919Z0R", -		UserID:      "01FEK0BFJKYXB4Y51RBQ7P5P79", -		RedirectURI: "oauth2redirect://com.keylesspalace.tusky/", -		Scope:       "read write follow", -	} -} - -type TokenValidateTestSuite struct { -	suite.Suite -} - -func (suite *TokenValidateTestSuite) TestValidateTokenHappyPath() { -	// no problem here -	t := happyToken() -	err := validate.Struct(t) -	suite.NoError(err) -} - -func (suite *TokenValidateTestSuite) TestValidateTokenBadID() { -	t := happyToken() - -	t.ID = "" -	err := validate.Struct(t) -	suite.EqualError(err, "Key: 'Token.ID' Error:Field validation for 'ID' failed on the 'required' tag") - -	t.ID = "01FE96W293ZPRG9FQQP48HK8N001FE96W32AT24VYBGM12WN3GKB" -	err = validate.Struct(t) -	suite.EqualError(err, "Key: 'Token.ID' Error:Field validation for 'ID' failed on the 'ulid' tag") -} - -func (suite *TokenValidateTestSuite) TestValidateTokenNoCreatedAt() { -	t := happyToken() - -	t.CreatedAt = time.Time{} -	err := validate.Struct(t) -	suite.NoError(err) -} - -func (suite *TokenValidateTestSuite) TestValidateTokenRedirectURI() { -	t := happyToken() - -	t.RedirectURI = "invalid-uri" -	err := validate.Struct(t) -	suite.EqualError(err, "Key: 'Token.RedirectURI' Error:Field validation for 'RedirectURI' failed on the 'uri' tag") - -	t.RedirectURI = "" -	err = validate.Struct(t) -	suite.EqualError(err, "Key: 'Token.RedirectURI' Error:Field validation for 'RedirectURI' failed on the 'required' tag") - -	t.RedirectURI = "urn:ietf:wg:oauth:2.0:oob" -	err = validate.Struct(t) -	suite.NoError(err) -} - -func (suite *TokenValidateTestSuite) TestValidateTokenScope() { -	t := happyToken() - -	t.Scope = "" -	err := validate.Struct(t) -	suite.EqualError(err, "Key: 'Token.Scope' Error:Field validation for 'Scope' failed on the 'required' tag") -} - -func TestTokenValidateTestSuite(t *testing.T) { -	suite.Run(t, new(TokenValidateTestSuite)) -} diff --git a/internal/validate/user_test.go b/internal/validate/user_test.go deleted file mode 100644 index f61ff6e2f..000000000 --- a/internal/validate/user_test.go +++ /dev/null @@ -1,134 +0,0 @@ -// 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 validate_test - -import ( -	"net" -	"testing" -	"time" - -	"github.com/stretchr/testify/suite" -	"github.com/superseriousbusiness/gotosocial/internal/gtsmodel" -	"github.com/superseriousbusiness/gotosocial/internal/validate" -	"github.com/superseriousbusiness/gotosocial/testrig" -) - -func happyUser() *gtsmodel.User { -	return >smodel.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(), -		ConfirmationSentAt:     time.Time{}, -		UnconfirmedEmail:       "", -		Moderator:              testrig.FalseBool(), -		Admin:                  testrig.FalseBool(), -		Disabled:               testrig.FalseBool(), -		Approved:               testrig.TrueBool(), -	} -} - -type UserValidateTestSuite struct { -	suite.Suite -} - -func (suite *UserValidateTestSuite) TestValidateUserHappyPath() { -	// no problem here -	u := happyUser() -	err := validate.Struct(u) -	suite.NoError(err) -} - -func (suite *UserValidateTestSuite) TestValidateUserNoID() { -	// user has no id set -	u := happyUser() -	u.ID = "" - -	err := validate.Struct(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 := validate.Struct(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 := validate.Struct(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 := validate.Struct(u) -	suite.NoError(err) -} - -func (suite *UserValidateTestSuite) TestValidateUserNoConfirmedAt() { -	// user has Email but no ConfirmedAt -	u := happyUser() -	u.ConfirmedAt = time.Time{} - -	err := validate.Struct(u) -	suite.EqualError(err, "Key: 'User.ConfirmedAt' Error:Field validation for 'ConfirmedAt' failed on the 'required_with' tag") -} - -func (suite *UserValidateTestSuite) TestValidateUserUnlikelySignInCount() { -	// user has Email but no ConfirmedAt -	u := happyUser() -	u.SignInCount = -69 - -	err := validate.Struct(u) -	suite.EqualError(err, "Key: 'User.SignInCount' Error:Field validation for 'SignInCount' failed on the 'min' tag") -} - -func TestUserValidateTestSuite(t *testing.T) { -	suite.Run(t, new(UserValidateTestSuite)) -}  | 
