diff options
author | 2023-08-10 15:08:41 +0100 | |
---|---|---|
committer | 2023-08-10 15:08:41 +0100 | |
commit | 91cbcd589e7c4ab87e5994e4d0276ea1248dc5c2 (patch) | |
tree | a6b12c30168eb5fed4267dcb6a1f385b86afdcdf /internal/db/bundb/application_test.go | |
parent | [feature] List replies policy, refactor async workers (#2087) (diff) | |
download | gotosocial-91cbcd589e7c4ab87e5994e4d0276ea1248dc5c2.tar.xz |
[performance] remove last of relational queries to instead rely on caches (#2091)
Diffstat (limited to 'internal/db/bundb/application_test.go')
-rw-r--r-- | internal/db/bundb/application_test.go | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/internal/db/bundb/application_test.go b/internal/db/bundb/application_test.go new file mode 100644 index 000000000..d2ab05ebd --- /dev/null +++ b/internal/db/bundb/application_test.go @@ -0,0 +1,128 @@ +// GoToSocial +// Copyright (C) GoToSocial Authors admin@gotosocial.org +// SPDX-License-Identifier: AGPL-3.0-or-later +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see <http://www.gnu.org/licenses/>. + +package bundb_test + +import ( + "context" + "errors" + "reflect" + "testing" + "time" + + "github.com/stretchr/testify/suite" + "github.com/superseriousbusiness/gotosocial/internal/db" + "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" +) + +type ApplicationTestSuite struct { + BunDBStandardTestSuite +} + +func (suite *ApplicationTestSuite) TestGetApplicationBy() { + t := suite.T() + + // Create a new context for this test. + ctx, cncl := context.WithCancel(context.Background()) + defer cncl() + + // Sentinel error to mark avoiding a test case. + sentinelErr := errors.New("sentinel") + + // isEqual checks if 2 application models are equal. + isEqual := func(a1, a2 gtsmodel.Application) bool { + // Clear database-set fields. + a1.CreatedAt = time.Time{} + a2.CreatedAt = time.Time{} + a1.UpdatedAt = time.Time{} + a2.UpdatedAt = time.Time{} + + return reflect.DeepEqual(a1, a2) + } + + for _, app := range suite.testApplications { + for lookup, dbfunc := range map[string]func() (*gtsmodel.Application, error){ + "id": func() (*gtsmodel.Application, error) { + return suite.db.GetApplicationByID(ctx, app.ID) + }, + + "client_id": func() (*gtsmodel.Application, error) { + return suite.db.GetApplicationByClientID(ctx, app.ClientID) + }, + } { + // Clear database caches. + suite.state.Caches.Init() + + t.Logf("checking database lookup %q", lookup) + + // Perform database function. + checkApp, err := dbfunc() + if err != nil { + if err == sentinelErr { + continue + } + + t.Errorf("error encountered for database lookup %q: %v", lookup, err) + continue + } + + // Check received application data. + if !isEqual(*checkApp, *app) { + t.Errorf("application does not contain expected data: %+v", checkApp) + continue + } + } + } +} + +func (suite *ApplicationTestSuite) TestDeleteApplicationBy() { + t := suite.T() + + // Create a new context for this test. + ctx, cncl := context.WithCancel(context.Background()) + defer cncl() + + for _, app := range suite.testApplications { + for lookup, dbfunc := range map[string]func() error{ + "client_id": func() error { + return suite.db.DeleteApplicationByClientID(ctx, app.ClientID) + }, + } { + // Clear database caches. + suite.state.Caches.Init() + + t.Logf("checking database lookup %q", lookup) + + // Perform database function. + err := dbfunc() + if err != nil { + t.Errorf("error encountered for database lookup %q: %v", lookup, err) + continue + } + + // Ensure this application has been deleted and cache cleared. + if _, err := suite.db.GetApplicationByID(ctx, app.ID); err != db.ErrNoEntries { + t.Errorf("application does not appear to have been deleted %q: %v", lookup, err) + continue + } + } + } +} + +func TestApplicationTestSuite(t *testing.T) { + suite.Run(t, new(ApplicationTestSuite)) +} |