2023-03-12 16:00:57 +01:00
|
|
|
// GoToSocial
|
|
|
|
|
// Copyright (C) GoToSocial Authors admin@gotosocial.org
|
|
|
|
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
|
|
|
//
|
|
|
|
|
// This program is free software: you can redistribute it and/or modify
|
|
|
|
|
// it under the terms of the GNU Affero General Public License as published by
|
|
|
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
|
|
|
// (at your option) any later version.
|
|
|
|
|
//
|
|
|
|
|
// This program is distributed in the hope that it will be useful,
|
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
// GNU Affero General Public License for more details.
|
|
|
|
|
//
|
|
|
|
|
// You should have received a copy of the GNU Affero General Public License
|
|
|
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
2022-03-07 11:33:18 +01:00
|
|
|
|
|
|
|
|
package bundb_test
|
|
|
|
|
|
|
|
|
|
import (
|
2023-03-20 19:10:08 +01:00
|
|
|
"errors"
|
2022-03-07 11:33:18 +01:00
|
|
|
"testing"
|
|
|
|
|
"time"
|
|
|
|
|
|
2025-04-26 15:34:10 +02:00
|
|
|
"code.superseriousbusiness.org/gotosocial/internal/db"
|
|
|
|
|
"code.superseriousbusiness.org/gotosocial/internal/gtscontext"
|
|
|
|
|
"code.superseriousbusiness.org/gotosocial/internal/gtsmodel"
|
|
|
|
|
"code.superseriousbusiness.org/gotosocial/internal/id"
|
|
|
|
|
"code.superseriousbusiness.org/gotosocial/internal/paging"
|
|
|
|
|
"code.superseriousbusiness.org/gotosocial/internal/util"
|
2022-03-07 11:33:18 +01:00
|
|
|
"github.com/stretchr/testify/suite"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func (suite *NotificationTestSuite) spamNotifs() {
|
|
|
|
|
// spam a shit ton of notifs into the database
|
|
|
|
|
// half of them will be for zork, the other half
|
|
|
|
|
// will be for random accounts
|
|
|
|
|
notifCount := 10000
|
|
|
|
|
|
|
|
|
|
zork := suite.testAccounts["local_account_1"]
|
|
|
|
|
|
|
|
|
|
for i := 0; i < notifCount; i++ {
|
2023-02-03 20:03:05 +00:00
|
|
|
notifID := id.NewULID()
|
2022-03-07 11:33:18 +01:00
|
|
|
|
|
|
|
|
var targetAccountID string
|
|
|
|
|
if i%2 == 0 {
|
|
|
|
|
targetAccountID = zork.ID
|
|
|
|
|
} else {
|
[feature] Support new model of interaction flow for forward compat with v0.21.0 (#4394)
~~Still WIP!~~
This PR allows v0.20.0 of GtS to be forward-compatible with the interaction request / authorization flow that will fully replace the current flow in v0.21.0.
Basically, this means we need to recognize LikeRequest, ReplyRequest, and AnnounceRequest, and in response to those requests, deliver either a Reject or an Accept, with the latter pointing towards a LikeAuthorization, ReplyAuthorization, or AnnounceAuthorization, respectively. This can then be used by the remote instance to prove to third parties that the interaction has been accepted by the interactee. These Authorization types need to be dereferencable to third parties, so we need to serve them.
As well as recognizing the above "polite" interaction request types, we also need to still serve appropriate responses to "impolite" interaction request types, where an instance that's unaware of interaction policies tries to interact with a post by sending a reply, like, or boost directly, without wrapping it in a WhateverRequest type.
Doesn't fully close https://codeberg.org/superseriousbusiness/gotosocial/issues/4026 but gets damn near (just gotta update the federating with GtS documentation).
Migrations tested on both Postgres and SQLite.
Co-authored-by: kim <grufwub@gmail.com>
Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4394
Co-authored-by: tobi <tobi.smethurst@protonmail.com>
Co-committed-by: tobi <tobi.smethurst@protonmail.com>
2025-09-14 15:37:35 +02:00
|
|
|
targetAccountID = id.NewRandomULID()
|
2022-03-07 11:33:18 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
notif := >smodel.Notification{
|
|
|
|
|
ID: notifID,
|
2025-01-23 16:47:30 -08:00
|
|
|
NotificationType: gtsmodel.NotificationFavourite,
|
2022-03-07 11:33:18 +01:00
|
|
|
CreatedAt: time.Now(),
|
|
|
|
|
TargetAccountID: targetAccountID,
|
[feature] Support new model of interaction flow for forward compat with v0.21.0 (#4394)
~~Still WIP!~~
This PR allows v0.20.0 of GtS to be forward-compatible with the interaction request / authorization flow that will fully replace the current flow in v0.21.0.
Basically, this means we need to recognize LikeRequest, ReplyRequest, and AnnounceRequest, and in response to those requests, deliver either a Reject or an Accept, with the latter pointing towards a LikeAuthorization, ReplyAuthorization, or AnnounceAuthorization, respectively. This can then be used by the remote instance to prove to third parties that the interaction has been accepted by the interactee. These Authorization types need to be dereferencable to third parties, so we need to serve them.
As well as recognizing the above "polite" interaction request types, we also need to still serve appropriate responses to "impolite" interaction request types, where an instance that's unaware of interaction policies tries to interact with a post by sending a reply, like, or boost directly, without wrapping it in a WhateverRequest type.
Doesn't fully close https://codeberg.org/superseriousbusiness/gotosocial/issues/4026 but gets damn near (just gotta update the federating with GtS documentation).
Migrations tested on both Postgres and SQLite.
Co-authored-by: kim <grufwub@gmail.com>
Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4394
Co-authored-by: tobi <tobi.smethurst@protonmail.com>
Co-committed-by: tobi <tobi.smethurst@protonmail.com>
2025-09-14 15:37:35 +02:00
|
|
|
OriginAccountID: id.NewRandomULID(),
|
|
|
|
|
StatusOrEditID: id.NewRandomULID(),
|
2023-08-07 19:38:11 +02:00
|
|
|
Read: util.Ptr(false),
|
2022-03-07 11:33:18 +01:00
|
|
|
}
|
|
|
|
|
|
2025-05-22 12:26:11 +02:00
|
|
|
if err := suite.db.PutNotification(suite.T().Context(), notif); err != nil {
|
2022-03-07 11:33:18 +01:00
|
|
|
panic(err)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-06-05 21:40:08 +02:00
|
|
|
suite.T().Logf("put %d notifs in the db\n", notifCount)
|
2022-03-07 11:33:18 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type NotificationTestSuite struct {
|
|
|
|
|
BunDBStandardTestSuite
|
|
|
|
|
}
|
|
|
|
|
|
[performance] refactoring + add fave / follow / request / visibility caching (#1607)
* refactor visibility checking, add caching for visibility
* invalidate visibility cache items on account / status deletes
* fix requester ID passed to visibility cache nil ptr
* de-interface caches, fix home / public timeline caching + visibility
* finish adding code comments for visibility filter
* fix angry goconst linter warnings
* actually finish adding filter visibility code comments for timeline functions
* move home timeline status author check to after visibility
* remove now-unused code
* add more code comments
* add TODO code comment, update printed cache start names
* update printed cache names on stop
* start adding separate follow(request) delete db functions, add specific visibility cache tests
* add relationship type caching
* fix getting local account follows / followed-bys, other small codebase improvements
* simplify invalidation using cache hooks, add more GetAccountBy___() functions
* fix boosting to return 404 if not boostable but no error (to not leak status ID)
* remove dead code
* improved placement of cache invalidation
* update license headers
* add example follow, follow-request config entries
* add example visibility cache configuration to config file
* use specific PutFollowRequest() instead of just Put()
* add tests for all GetAccountBy()
* add GetBlockBy() tests
* update block to check primitive fields
* update and finish adding Get{Account,Block,Follow,FollowRequest}By() tests
* fix copy-pasted code
* update envparsing test
* whitespace
* fix bun struct tag
* add license header to gtscontext
* fix old license header
* improved error creation to not use fmt.Errorf() when not needed
* fix various rebase conflicts, fix account test
* remove commented-out code, fix-up mention caching
* fix mention select bun statement
* ensure mention target account populated, pass in context to customrenderer logging
* remove more uncommented code, fix typeutil test
* add statusfave database model caching
* add status fave cache configuration
* add status fave cache example config
* woops, catch missed error. nice catch linter!
* add back testrig panic on nil db
* update example configuration to match defaults, slight tweak to cache configuration defaults
* update envparsing test with new defaults
* fetch followingget to use the follow target account
* use accounnt.IsLocal() instead of empty domain check
* use constants for the cache visibility type check
* use bun.In() for notification type restriction in db query
* include replies when fetching PublicTimeline() (to account for single-author threads in Visibility{}.StatusPublicTimelineable())
* use bun query building for nested select statements to ensure working with postgres
* update public timeline future status checks to match visibility filter
* same as previous, for home timeline
* update public timeline tests to dynamically check for appropriate statuses
* migrate accounts to allow unique constraint on public_key
* provide minimal account with publicKey
---------
Signed-off-by: kim <grufwub@gmail.com>
Co-authored-by: tsmethurst <tobi.smethurst@protonmail.com>
2023-03-28 14:03:14 +01:00
|
|
|
func (suite *NotificationTestSuite) TestGetAccountNotificationsWithSpam() {
|
2022-03-07 11:33:18 +01:00
|
|
|
suite.spamNotifs()
|
|
|
|
|
testAccount := suite.testAccounts["local_account_1"]
|
|
|
|
|
before := time.Now()
|
2024-06-05 21:40:08 +02:00
|
|
|
notifications, err := suite.db.GetAccountNotifications(
|
2025-05-22 12:26:11 +02:00
|
|
|
gtscontext.SetBarebones(suite.T().Context()),
|
2024-06-05 21:40:08 +02:00
|
|
|
testAccount.ID,
|
2024-11-25 15:33:21 +00:00
|
|
|
&paging.Page{
|
|
|
|
|
Min: paging.EitherMinID("", id.Lowest),
|
|
|
|
|
Max: paging.MaxID(id.Highest),
|
|
|
|
|
Limit: 20,
|
|
|
|
|
},
|
2024-06-05 21:40:08 +02:00
|
|
|
nil,
|
2024-06-17 12:50:50 -07:00
|
|
|
nil,
|
2024-06-05 21:40:08 +02:00
|
|
|
)
|
2022-03-07 11:33:18 +01:00
|
|
|
suite.NoError(err)
|
|
|
|
|
timeTaken := time.Since(before)
|
2024-06-05 21:40:08 +02:00
|
|
|
suite.T().Logf("withSpam: got %d notifications in %s\n", len(notifications), timeTaken)
|
2022-03-07 11:33:18 +01:00
|
|
|
|
|
|
|
|
suite.NotNil(notifications)
|
|
|
|
|
for _, n := range notifications {
|
|
|
|
|
suite.Equal(testAccount.ID, n.TargetAccountID)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
[performance] refactoring + add fave / follow / request / visibility caching (#1607)
* refactor visibility checking, add caching for visibility
* invalidate visibility cache items on account / status deletes
* fix requester ID passed to visibility cache nil ptr
* de-interface caches, fix home / public timeline caching + visibility
* finish adding code comments for visibility filter
* fix angry goconst linter warnings
* actually finish adding filter visibility code comments for timeline functions
* move home timeline status author check to after visibility
* remove now-unused code
* add more code comments
* add TODO code comment, update printed cache start names
* update printed cache names on stop
* start adding separate follow(request) delete db functions, add specific visibility cache tests
* add relationship type caching
* fix getting local account follows / followed-bys, other small codebase improvements
* simplify invalidation using cache hooks, add more GetAccountBy___() functions
* fix boosting to return 404 if not boostable but no error (to not leak status ID)
* remove dead code
* improved placement of cache invalidation
* update license headers
* add example follow, follow-request config entries
* add example visibility cache configuration to config file
* use specific PutFollowRequest() instead of just Put()
* add tests for all GetAccountBy()
* add GetBlockBy() tests
* update block to check primitive fields
* update and finish adding Get{Account,Block,Follow,FollowRequest}By() tests
* fix copy-pasted code
* update envparsing test
* whitespace
* fix bun struct tag
* add license header to gtscontext
* fix old license header
* improved error creation to not use fmt.Errorf() when not needed
* fix various rebase conflicts, fix account test
* remove commented-out code, fix-up mention caching
* fix mention select bun statement
* ensure mention target account populated, pass in context to customrenderer logging
* remove more uncommented code, fix typeutil test
* add statusfave database model caching
* add status fave cache configuration
* add status fave cache example config
* woops, catch missed error. nice catch linter!
* add back testrig panic on nil db
* update example configuration to match defaults, slight tweak to cache configuration defaults
* update envparsing test with new defaults
* fetch followingget to use the follow target account
* use accounnt.IsLocal() instead of empty domain check
* use constants for the cache visibility type check
* use bun.In() for notification type restriction in db query
* include replies when fetching PublicTimeline() (to account for single-author threads in Visibility{}.StatusPublicTimelineable())
* use bun query building for nested select statements to ensure working with postgres
* update public timeline future status checks to match visibility filter
* same as previous, for home timeline
* update public timeline tests to dynamically check for appropriate statuses
* migrate accounts to allow unique constraint on public_key
* provide minimal account with publicKey
---------
Signed-off-by: kim <grufwub@gmail.com>
Co-authored-by: tsmethurst <tobi.smethurst@protonmail.com>
2023-03-28 14:03:14 +01:00
|
|
|
func (suite *NotificationTestSuite) TestGetAccountNotificationsWithoutSpam() {
|
2022-03-07 11:33:18 +01:00
|
|
|
testAccount := suite.testAccounts["local_account_1"]
|
|
|
|
|
before := time.Now()
|
2024-06-05 21:40:08 +02:00
|
|
|
notifications, err := suite.db.GetAccountNotifications(
|
2025-05-22 12:26:11 +02:00
|
|
|
gtscontext.SetBarebones(suite.T().Context()),
|
2024-06-05 21:40:08 +02:00
|
|
|
testAccount.ID,
|
2024-11-25 15:33:21 +00:00
|
|
|
&paging.Page{
|
|
|
|
|
Min: paging.EitherMinID("", id.Lowest),
|
|
|
|
|
Max: paging.MaxID(id.Highest),
|
|
|
|
|
Limit: 20,
|
|
|
|
|
},
|
2024-06-05 21:40:08 +02:00
|
|
|
nil,
|
2024-06-17 12:50:50 -07:00
|
|
|
nil,
|
2024-06-05 21:40:08 +02:00
|
|
|
)
|
2022-03-07 11:33:18 +01:00
|
|
|
suite.NoError(err)
|
|
|
|
|
timeTaken := time.Since(before)
|
2024-06-05 21:40:08 +02:00
|
|
|
suite.T().Logf("withoutSpam: got %d notifications in %s\n", len(notifications), timeTaken)
|
2022-03-07 11:33:18 +01:00
|
|
|
|
|
|
|
|
suite.NotNil(notifications)
|
|
|
|
|
for _, n := range notifications {
|
|
|
|
|
suite.Equal(testAccount.ID, n.TargetAccountID)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-03-20 19:10:08 +01:00
|
|
|
func (suite *NotificationTestSuite) TestDeleteNotificationsWithSpam() {
|
2022-08-01 11:13:49 +02:00
|
|
|
suite.spamNotifs()
|
|
|
|
|
testAccount := suite.testAccounts["local_account_1"]
|
|
|
|
|
|
2024-06-14 12:14:55 +02:00
|
|
|
// Test getting notifs first.
|
2024-06-05 21:40:08 +02:00
|
|
|
notifications, err := suite.db.GetAccountNotifications(
|
2025-05-22 12:26:11 +02:00
|
|
|
gtscontext.SetBarebones(suite.T().Context()),
|
2024-06-05 21:40:08 +02:00
|
|
|
testAccount.ID,
|
2024-11-25 15:33:21 +00:00
|
|
|
&paging.Page{
|
|
|
|
|
Min: paging.EitherMinID("", id.Lowest),
|
|
|
|
|
Max: paging.MaxID(id.Highest),
|
|
|
|
|
Limit: 20,
|
|
|
|
|
},
|
2024-06-05 21:40:08 +02:00
|
|
|
nil,
|
2024-06-17 12:50:50 -07:00
|
|
|
nil,
|
2024-06-05 21:40:08 +02:00
|
|
|
)
|
2024-06-14 12:14:55 +02:00
|
|
|
if err != nil {
|
|
|
|
|
suite.FailNow(err.Error())
|
|
|
|
|
}
|
|
|
|
|
suite.Len(notifications, 20)
|
|
|
|
|
|
|
|
|
|
// Now delete.
|
2025-05-22 12:26:11 +02:00
|
|
|
if err := suite.db.DeleteNotifications(suite.T().Context(), nil, testAccount.ID, ""); err != nil {
|
2024-06-14 12:14:55 +02:00
|
|
|
suite.FailNow(err.Error())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Now try getting again.
|
|
|
|
|
notifications, err = suite.db.GetAccountNotifications(
|
2025-05-22 12:26:11 +02:00
|
|
|
gtscontext.SetBarebones(suite.T().Context()),
|
2024-06-14 12:14:55 +02:00
|
|
|
testAccount.ID,
|
2024-11-25 15:33:21 +00:00
|
|
|
&paging.Page{
|
|
|
|
|
Min: paging.EitherMinID("", id.Lowest),
|
|
|
|
|
Max: paging.MaxID(id.Highest),
|
|
|
|
|
Limit: 20,
|
|
|
|
|
},
|
2024-06-14 12:14:55 +02:00
|
|
|
nil,
|
2024-06-17 12:50:50 -07:00
|
|
|
nil,
|
2024-06-14 12:14:55 +02:00
|
|
|
)
|
|
|
|
|
if err != nil {
|
|
|
|
|
suite.FailNow(err.Error())
|
|
|
|
|
}
|
2022-08-01 11:13:49 +02:00
|
|
|
suite.Empty(notifications)
|
|
|
|
|
}
|
|
|
|
|
|
2023-03-20 19:10:08 +01:00
|
|
|
func (suite *NotificationTestSuite) TestDeleteNotificationsWithTwoAccounts() {
|
2022-08-01 11:13:49 +02:00
|
|
|
suite.spamNotifs()
|
|
|
|
|
testAccount := suite.testAccounts["local_account_1"]
|
2025-05-22 12:26:11 +02:00
|
|
|
err := suite.db.DeleteNotifications(suite.T().Context(), nil, testAccount.ID, "")
|
2022-08-01 11:13:49 +02:00
|
|
|
suite.NoError(err)
|
|
|
|
|
|
2024-06-05 21:40:08 +02:00
|
|
|
notifications, err := suite.db.GetAccountNotifications(
|
2025-05-22 12:26:11 +02:00
|
|
|
gtscontext.SetBarebones(suite.T().Context()),
|
2024-06-05 21:40:08 +02:00
|
|
|
testAccount.ID,
|
2024-11-25 15:33:21 +00:00
|
|
|
&paging.Page{
|
|
|
|
|
Min: paging.EitherMinID("", id.Lowest),
|
|
|
|
|
Max: paging.MaxID(id.Highest),
|
|
|
|
|
Limit: 20,
|
|
|
|
|
},
|
2024-06-05 21:40:08 +02:00
|
|
|
nil,
|
2024-06-17 12:50:50 -07:00
|
|
|
nil,
|
2024-06-05 21:40:08 +02:00
|
|
|
)
|
2022-08-01 11:13:49 +02:00
|
|
|
suite.NoError(err)
|
2023-05-04 12:27:24 +02:00
|
|
|
suite.Nil(notifications)
|
2022-08-01 11:13:49 +02:00
|
|
|
suite.Empty(notifications)
|
|
|
|
|
|
|
|
|
|
notif := []*gtsmodel.Notification{}
|
2025-05-22 12:26:11 +02:00
|
|
|
err = suite.db.GetAll(suite.T().Context(), ¬if)
|
2022-08-01 11:13:49 +02:00
|
|
|
suite.NoError(err)
|
|
|
|
|
suite.NotEmpty(notif)
|
|
|
|
|
}
|
|
|
|
|
|
2023-03-20 19:10:08 +01:00
|
|
|
func (suite *NotificationTestSuite) TestDeleteNotificationsOriginatingFromAccount() {
|
|
|
|
|
testAccount := suite.testAccounts["local_account_2"]
|
|
|
|
|
|
2025-05-22 12:26:11 +02:00
|
|
|
if err := suite.db.DeleteNotifications(suite.T().Context(), nil, "", testAccount.ID); err != nil {
|
2023-03-20 19:10:08 +01:00
|
|
|
suite.FailNow(err.Error())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
notif := []*gtsmodel.Notification{}
|
2025-05-22 12:26:11 +02:00
|
|
|
if err := suite.db.GetAll(suite.T().Context(), ¬if); err != nil && !errors.Is(err, db.ErrNoEntries) {
|
2023-03-20 19:10:08 +01:00
|
|
|
suite.FailNow(err.Error())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for _, n := range notif {
|
|
|
|
|
if n.OriginAccountID == testAccount.ID {
|
|
|
|
|
suite.FailNowf("", "no notifications with origin account id %s should remain", testAccount.ID)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (suite *NotificationTestSuite) TestDeleteNotificationsOriginatingFromAndTargetingAccount() {
|
|
|
|
|
originAccount := suite.testAccounts["local_account_2"]
|
|
|
|
|
targetAccount := suite.testAccounts["admin_account"]
|
|
|
|
|
|
2025-05-22 12:26:11 +02:00
|
|
|
if err := suite.db.DeleteNotifications(suite.T().Context(), nil, targetAccount.ID, originAccount.ID); err != nil {
|
2023-03-20 19:10:08 +01:00
|
|
|
suite.FailNow(err.Error())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
notif := []*gtsmodel.Notification{}
|
2025-05-22 12:26:11 +02:00
|
|
|
if err := suite.db.GetAll(suite.T().Context(), ¬if); err != nil && !errors.Is(err, db.ErrNoEntries) {
|
2023-03-20 19:10:08 +01:00
|
|
|
suite.FailNow(err.Error())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for _, n := range notif {
|
2024-04-11 11:45:53 +02:00
|
|
|
if n.OriginAccountID == originAccount.ID && n.TargetAccountID == targetAccount.ID {
|
2023-03-20 19:10:08 +01:00
|
|
|
suite.FailNowf(
|
|
|
|
|
"",
|
|
|
|
|
"no notifications with origin account id %s and target account %s should remain",
|
|
|
|
|
originAccount.ID,
|
|
|
|
|
targetAccount.ID,
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (suite *NotificationTestSuite) TestDeleteNotificationsPertainingToStatusID() {
|
|
|
|
|
testStatus := suite.testStatuses["local_account_1_status_1"]
|
|
|
|
|
|
2025-05-22 12:26:11 +02:00
|
|
|
if err := suite.db.DeleteNotificationsForStatus(suite.T().Context(), testStatus.ID); err != nil {
|
2023-03-20 19:10:08 +01:00
|
|
|
suite.FailNow(err.Error())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
notif := []*gtsmodel.Notification{}
|
2025-05-22 12:26:11 +02:00
|
|
|
if err := suite.db.GetAll(suite.T().Context(), ¬if); err != nil && !errors.Is(err, db.ErrNoEntries) {
|
2023-03-20 19:10:08 +01:00
|
|
|
suite.FailNow(err.Error())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for _, n := range notif {
|
2025-05-11 13:38:13 +00:00
|
|
|
if n.StatusOrEditID == testStatus.ID {
|
2023-03-20 19:10:08 +01:00
|
|
|
suite.FailNowf("", "no notifications with status id %s should remain", testStatus.ID)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-03-07 11:33:18 +01:00
|
|
|
func TestNotificationTestSuite(t *testing.T) {
|
|
|
|
|
suite.Run(t, new(NotificationTestSuite))
|
|
|
|
|
}
|