code.gitea.io/gitea@v1.22.3/models/activities/notification_test.go (about)

     1  // Copyright 2017 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package activities_test
     5  
     6  import (
     7  	"context"
     8  	"testing"
     9  
    10  	activities_model "code.gitea.io/gitea/models/activities"
    11  	"code.gitea.io/gitea/models/db"
    12  	issues_model "code.gitea.io/gitea/models/issues"
    13  	"code.gitea.io/gitea/models/unittest"
    14  	user_model "code.gitea.io/gitea/models/user"
    15  
    16  	"github.com/stretchr/testify/assert"
    17  )
    18  
    19  func TestCreateOrUpdateIssueNotifications(t *testing.T) {
    20  	assert.NoError(t, unittest.PrepareTestDatabase())
    21  	issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 1})
    22  
    23  	assert.NoError(t, activities_model.CreateOrUpdateIssueNotifications(db.DefaultContext, issue.ID, 0, 2, 0))
    24  
    25  	// User 9 is inactive, thus notifications for user 1 and 4 are created
    26  	notf := unittest.AssertExistsAndLoadBean(t, &activities_model.Notification{UserID: 1, IssueID: issue.ID})
    27  	assert.Equal(t, activities_model.NotificationStatusUnread, notf.Status)
    28  	unittest.CheckConsistencyFor(t, &issues_model.Issue{ID: issue.ID})
    29  
    30  	notf = unittest.AssertExistsAndLoadBean(t, &activities_model.Notification{UserID: 4, IssueID: issue.ID})
    31  	assert.Equal(t, activities_model.NotificationStatusUnread, notf.Status)
    32  }
    33  
    34  func TestNotificationsForUser(t *testing.T) {
    35  	assert.NoError(t, unittest.PrepareTestDatabase())
    36  	user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
    37  	notfs, err := db.Find[activities_model.Notification](db.DefaultContext, activities_model.FindNotificationOptions{
    38  		UserID: user.ID,
    39  		Status: []activities_model.NotificationStatus{
    40  			activities_model.NotificationStatusRead,
    41  			activities_model.NotificationStatusUnread,
    42  		},
    43  	})
    44  	assert.NoError(t, err)
    45  	if assert.Len(t, notfs, 3) {
    46  		assert.EqualValues(t, 5, notfs[0].ID)
    47  		assert.EqualValues(t, user.ID, notfs[0].UserID)
    48  		assert.EqualValues(t, 4, notfs[1].ID)
    49  		assert.EqualValues(t, user.ID, notfs[1].UserID)
    50  		assert.EqualValues(t, 2, notfs[2].ID)
    51  		assert.EqualValues(t, user.ID, notfs[2].UserID)
    52  	}
    53  }
    54  
    55  func TestNotification_GetRepo(t *testing.T) {
    56  	assert.NoError(t, unittest.PrepareTestDatabase())
    57  	notf := unittest.AssertExistsAndLoadBean(t, &activities_model.Notification{RepoID: 1})
    58  	repo, err := notf.GetRepo(db.DefaultContext)
    59  	assert.NoError(t, err)
    60  	assert.Equal(t, repo, notf.Repository)
    61  	assert.EqualValues(t, notf.RepoID, repo.ID)
    62  }
    63  
    64  func TestNotification_GetIssue(t *testing.T) {
    65  	assert.NoError(t, unittest.PrepareTestDatabase())
    66  	notf := unittest.AssertExistsAndLoadBean(t, &activities_model.Notification{RepoID: 1})
    67  	issue, err := notf.GetIssue(db.DefaultContext)
    68  	assert.NoError(t, err)
    69  	assert.Equal(t, issue, notf.Issue)
    70  	assert.EqualValues(t, notf.IssueID, issue.ID)
    71  }
    72  
    73  func TestGetNotificationCount(t *testing.T) {
    74  	assert.NoError(t, unittest.PrepareTestDatabase())
    75  	user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
    76  	cnt, err := db.Count[activities_model.Notification](db.DefaultContext, activities_model.FindNotificationOptions{
    77  		UserID: user.ID,
    78  		Status: []activities_model.NotificationStatus{
    79  			activities_model.NotificationStatusRead,
    80  		},
    81  	})
    82  	assert.NoError(t, err)
    83  	assert.EqualValues(t, 0, cnt)
    84  
    85  	cnt, err = db.Count[activities_model.Notification](db.DefaultContext, activities_model.FindNotificationOptions{
    86  		UserID: user.ID,
    87  		Status: []activities_model.NotificationStatus{
    88  			activities_model.NotificationStatusUnread,
    89  		},
    90  	})
    91  	assert.NoError(t, err)
    92  	assert.EqualValues(t, 1, cnt)
    93  }
    94  
    95  func TestSetNotificationStatus(t *testing.T) {
    96  	assert.NoError(t, unittest.PrepareTestDatabase())
    97  	user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
    98  	notf := unittest.AssertExistsAndLoadBean(t,
    99  		&activities_model.Notification{UserID: user.ID, Status: activities_model.NotificationStatusRead})
   100  	_, err := activities_model.SetNotificationStatus(db.DefaultContext, notf.ID, user, activities_model.NotificationStatusPinned)
   101  	assert.NoError(t, err)
   102  	unittest.AssertExistsAndLoadBean(t,
   103  		&activities_model.Notification{ID: notf.ID, Status: activities_model.NotificationStatusPinned})
   104  
   105  	_, err = activities_model.SetNotificationStatus(db.DefaultContext, 1, user, activities_model.NotificationStatusRead)
   106  	assert.Error(t, err)
   107  	_, err = activities_model.SetNotificationStatus(db.DefaultContext, unittest.NonexistentID, user, activities_model.NotificationStatusRead)
   108  	assert.Error(t, err)
   109  }
   110  
   111  func TestUpdateNotificationStatuses(t *testing.T) {
   112  	assert.NoError(t, unittest.PrepareTestDatabase())
   113  	user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
   114  	notfUnread := unittest.AssertExistsAndLoadBean(t,
   115  		&activities_model.Notification{UserID: user.ID, Status: activities_model.NotificationStatusUnread})
   116  	notfRead := unittest.AssertExistsAndLoadBean(t,
   117  		&activities_model.Notification{UserID: user.ID, Status: activities_model.NotificationStatusRead})
   118  	notfPinned := unittest.AssertExistsAndLoadBean(t,
   119  		&activities_model.Notification{UserID: user.ID, Status: activities_model.NotificationStatusPinned})
   120  	assert.NoError(t, activities_model.UpdateNotificationStatuses(db.DefaultContext, user, activities_model.NotificationStatusUnread, activities_model.NotificationStatusRead))
   121  	unittest.AssertExistsAndLoadBean(t,
   122  		&activities_model.Notification{ID: notfUnread.ID, Status: activities_model.NotificationStatusRead})
   123  	unittest.AssertExistsAndLoadBean(t,
   124  		&activities_model.Notification{ID: notfRead.ID, Status: activities_model.NotificationStatusRead})
   125  	unittest.AssertExistsAndLoadBean(t,
   126  		&activities_model.Notification{ID: notfPinned.ID, Status: activities_model.NotificationStatusPinned})
   127  }
   128  
   129  func TestSetIssueReadBy(t *testing.T) {
   130  	assert.NoError(t, unittest.PrepareTestDatabase())
   131  	user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
   132  	issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 1})
   133  	assert.NoError(t, db.WithTx(db.DefaultContext, func(ctx context.Context) error {
   134  		return activities_model.SetIssueReadBy(ctx, issue.ID, user.ID)
   135  	}))
   136  
   137  	nt, err := activities_model.GetIssueNotification(db.DefaultContext, user.ID, issue.ID)
   138  	assert.NoError(t, err)
   139  	assert.EqualValues(t, activities_model.NotificationStatusRead, nt.Status)
   140  }