code.gitea.io/gitea@v1.22.3/services/issue/reaction_test.go (about)

     1  // Copyright 2017 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package issue
     5  
     6  import (
     7  	"testing"
     8  
     9  	"code.gitea.io/gitea/models/db"
    10  	issues_model "code.gitea.io/gitea/models/issues"
    11  	repo_model "code.gitea.io/gitea/models/repo"
    12  	"code.gitea.io/gitea/models/unittest"
    13  	user_model "code.gitea.io/gitea/models/user"
    14  	"code.gitea.io/gitea/modules/setting"
    15  
    16  	"github.com/stretchr/testify/assert"
    17  )
    18  
    19  func addReaction(t *testing.T, doer *user_model.User, issue *issues_model.Issue, comment *issues_model.Comment, content string) {
    20  	var reaction *issues_model.Reaction
    21  	var err error
    22  	if comment == nil {
    23  		reaction, err = CreateIssueReaction(db.DefaultContext, doer, issue, content)
    24  	} else {
    25  		reaction, err = CreateCommentReaction(db.DefaultContext, doer, comment, content)
    26  	}
    27  	assert.NoError(t, err)
    28  	assert.NotNil(t, reaction)
    29  }
    30  
    31  func TestIssueAddReaction(t *testing.T) {
    32  	assert.NoError(t, unittest.PrepareTestDatabase())
    33  
    34  	user1 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
    35  	issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 1})
    36  
    37  	addReaction(t, user1, issue, nil, "heart")
    38  
    39  	unittest.AssertExistsAndLoadBean(t, &issues_model.Reaction{Type: "heart", UserID: user1.ID, IssueID: issue.ID})
    40  }
    41  
    42  func TestIssueAddDuplicateReaction(t *testing.T) {
    43  	assert.NoError(t, unittest.PrepareTestDatabase())
    44  
    45  	user1 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
    46  	issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 1})
    47  
    48  	addReaction(t, user1, issue, nil, "heart")
    49  
    50  	reaction, err := CreateIssueReaction(db.DefaultContext, user1, issue, "heart")
    51  	assert.Error(t, err)
    52  	assert.Equal(t, issues_model.ErrReactionAlreadyExist{Reaction: "heart"}, err)
    53  
    54  	existingR := unittest.AssertExistsAndLoadBean(t, &issues_model.Reaction{Type: "heart", UserID: user1.ID, IssueID: issue.ID})
    55  	assert.Equal(t, existingR.ID, reaction.ID)
    56  }
    57  
    58  func TestIssueDeleteReaction(t *testing.T) {
    59  	assert.NoError(t, unittest.PrepareTestDatabase())
    60  
    61  	user1 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
    62  	issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 1})
    63  
    64  	addReaction(t, user1, issue, nil, "heart")
    65  
    66  	err := issues_model.DeleteIssueReaction(db.DefaultContext, user1.ID, issue.ID, "heart")
    67  	assert.NoError(t, err)
    68  
    69  	unittest.AssertNotExistsBean(t, &issues_model.Reaction{Type: "heart", UserID: user1.ID, IssueID: issue.ID})
    70  }
    71  
    72  func TestIssueReactionCount(t *testing.T) {
    73  	assert.NoError(t, unittest.PrepareTestDatabase())
    74  
    75  	setting.UI.ReactionMaxUserNum = 2
    76  
    77  	user1 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
    78  	user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
    79  	org3 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 3})
    80  	user4 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 4})
    81  	ghost := user_model.NewGhostUser()
    82  
    83  	issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 2})
    84  	repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
    85  
    86  	addReaction(t, user1, issue, nil, "heart")
    87  	addReaction(t, user2, issue, nil, "heart")
    88  	addReaction(t, org3, issue, nil, "heart")
    89  	addReaction(t, org3, issue, nil, "+1")
    90  	addReaction(t, user4, issue, nil, "+1")
    91  	addReaction(t, user4, issue, nil, "heart")
    92  	addReaction(t, ghost, issue, nil, "-1")
    93  
    94  	reactionsList, _, err := issues_model.FindReactions(db.DefaultContext, issues_model.FindReactionsOptions{
    95  		IssueID: issue.ID,
    96  	})
    97  	assert.NoError(t, err)
    98  	assert.Len(t, reactionsList, 7)
    99  	_, err = reactionsList.LoadUsers(db.DefaultContext, repo)
   100  	assert.NoError(t, err)
   101  
   102  	reactions := reactionsList.GroupByType()
   103  	assert.Len(t, reactions["heart"], 4)
   104  	assert.Equal(t, 2, reactions["heart"].GetMoreUserCount())
   105  	assert.Equal(t, user1.Name+", "+user2.Name, reactions["heart"].GetFirstUsers())
   106  	assert.True(t, reactions["heart"].HasUser(1))
   107  	assert.False(t, reactions["heart"].HasUser(5))
   108  	assert.False(t, reactions["heart"].HasUser(0))
   109  	assert.Len(t, reactions["+1"], 2)
   110  	assert.Equal(t, 0, reactions["+1"].GetMoreUserCount())
   111  	assert.Len(t, reactions["-1"], 1)
   112  }
   113  
   114  func TestIssueCommentAddReaction(t *testing.T) {
   115  	assert.NoError(t, unittest.PrepareTestDatabase())
   116  
   117  	user1 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
   118  	comment := unittest.AssertExistsAndLoadBean(t, &issues_model.Comment{ID: 1})
   119  
   120  	addReaction(t, user1, nil, comment, "heart")
   121  
   122  	unittest.AssertExistsAndLoadBean(t, &issues_model.Reaction{Type: "heart", UserID: user1.ID, IssueID: comment.IssueID, CommentID: comment.ID})
   123  }
   124  
   125  func TestIssueCommentDeleteReaction(t *testing.T) {
   126  	assert.NoError(t, unittest.PrepareTestDatabase())
   127  
   128  	user1 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
   129  	user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
   130  	org3 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 3})
   131  	user4 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 4})
   132  
   133  	comment := unittest.AssertExistsAndLoadBean(t, &issues_model.Comment{ID: 1})
   134  
   135  	addReaction(t, user1, nil, comment, "heart")
   136  	addReaction(t, user2, nil, comment, "heart")
   137  	addReaction(t, org3, nil, comment, "heart")
   138  	addReaction(t, user4, nil, comment, "+1")
   139  
   140  	reactionsList, _, err := issues_model.FindReactions(db.DefaultContext, issues_model.FindReactionsOptions{
   141  		IssueID:   comment.IssueID,
   142  		CommentID: comment.ID,
   143  	})
   144  	assert.NoError(t, err)
   145  	assert.Len(t, reactionsList, 4)
   146  
   147  	reactions := reactionsList.GroupByType()
   148  	assert.Len(t, reactions["heart"], 3)
   149  	assert.Len(t, reactions["+1"], 1)
   150  }
   151  
   152  func TestIssueCommentReactionCount(t *testing.T) {
   153  	assert.NoError(t, unittest.PrepareTestDatabase())
   154  
   155  	user1 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
   156  	comment := unittest.AssertExistsAndLoadBean(t, &issues_model.Comment{ID: 1})
   157  
   158  	addReaction(t, user1, nil, comment, "heart")
   159  	assert.NoError(t, issues_model.DeleteCommentReaction(db.DefaultContext, user1.ID, comment.IssueID, comment.ID, "heart"))
   160  
   161  	unittest.AssertNotExistsBean(t, &issues_model.Reaction{Type: "heart", UserID: user1.ID, IssueID: comment.IssueID, CommentID: comment.ID})
   162  }