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)) -} |