2020-04-05 09:20:50 +03:00
// Copyright 2020 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2020-04-05 09:20:50 +03:00
2022-08-25 05:31:57 +03:00
package activities_test
2017-01-09 06:08:36 +03:00
import (
2023-08-07 13:23:59 +03:00
"fmt"
2017-05-26 04:38:18 +03:00
"path"
2017-01-09 06:08:36 +03:00
"testing"
2022-08-25 05:31:57 +03:00
activities_model "code.gitea.io/gitea/models/activities"
2022-03-13 19:40:47 +03:00
"code.gitea.io/gitea/models/db"
2022-09-21 23:51:42 +03:00
issue_model "code.gitea.io/gitea/models/issues"
2021-12-10 04:27:50 +03:00
repo_model "code.gitea.io/gitea/models/repo"
2021-11-12 17:36:47 +03:00
"code.gitea.io/gitea/models/unittest"
2021-11-24 12:49:20 +03:00
user_model "code.gitea.io/gitea/models/user"
2017-01-09 06:08:36 +03:00
"code.gitea.io/gitea/modules/setting"
2017-02-28 04:42:10 +03:00
2017-01-09 06:08:36 +03:00
"github.com/stretchr/testify/assert"
)
func TestAction_GetRepoPath ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2022-09-21 23:51:42 +03:00
repo := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : 1 } )
2022-08-16 05:22:25 +03:00
owner := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : repo . OwnerID } )
2022-08-25 05:31:57 +03:00
action := & activities_model . Action { RepoID : repo . ID }
2017-05-26 04:38:18 +03:00
assert . Equal ( t , path . Join ( owner . Name , repo . Name ) , action . GetRepoPath ( ) )
2017-01-09 06:08:36 +03:00
}
func TestAction_GetRepoLink ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2022-09-21 23:51:42 +03:00
repo := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : 1 } )
2022-08-16 05:22:25 +03:00
owner := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : repo . OwnerID } )
2022-09-21 23:51:42 +03:00
comment := unittest . AssertExistsAndLoadBean ( t , & issue_model . Comment { ID : 2 } )
action := & activities_model . Action { RepoID : repo . ID , CommentID : comment . ID }
2021-02-20 00:36:43 +03:00
setting . AppSubURL = "/suburl"
2017-05-26 04:38:18 +03:00
expected := path . Join ( setting . AppSubURL , owner . Name , repo . Name )
assert . Equal ( t , expected , action . GetRepoLink ( ) )
2022-09-21 23:51:42 +03:00
assert . Equal ( t , repo . HTMLURL ( ) , action . GetRepoAbsoluteLink ( ) )
2023-02-06 21:09:18 +03:00
assert . Equal ( t , comment . HTMLURL ( ) , action . GetCommentHTMLURL ( ) )
2017-01-09 06:08:36 +03:00
}
func TestGetFeeds ( t * testing . T ) {
// test with an individual user
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2022-08-16 05:22:25 +03:00
user := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 2 } )
2017-01-09 06:08:36 +03:00
2023-02-25 00:15:10 +03:00
actions , count , err := activities_model . GetFeeds ( db . DefaultContext , activities_model . GetFeedsOptions {
2020-01-13 20:33:46 +03:00
RequestedUser : user ,
Actor : user ,
IncludePrivate : true ,
OnlyPerformedBy : false ,
IncludeDeleted : true ,
2017-06-02 03:42:25 +03:00
} )
2017-01-09 06:08:36 +03:00
assert . NoError ( t , err )
2017-08-28 12:17:45 +03:00
if assert . Len ( t , actions , 1 ) {
assert . EqualValues ( t , 1 , actions [ 0 ] . ID )
assert . EqualValues ( t , user . ID , actions [ 0 ] . UserID )
}
2023-02-25 00:15:10 +03:00
assert . Equal ( t , int64 ( 1 ) , count )
2017-06-02 03:42:25 +03:00
2023-02-25 00:15:10 +03:00
actions , count , err = activities_model . GetFeeds ( db . DefaultContext , activities_model . GetFeedsOptions {
2020-01-13 20:33:46 +03:00
RequestedUser : user ,
Actor : user ,
IncludePrivate : false ,
OnlyPerformedBy : false ,
2017-06-02 03:42:25 +03:00
} )
2017-01-09 06:08:36 +03:00
assert . NoError ( t , err )
assert . Len ( t , actions , 0 )
2023-02-25 00:15:10 +03:00
assert . Equal ( t , int64 ( 0 ) , count )
2017-01-09 06:08:36 +03:00
}
2022-03-13 19:40:47 +03:00
func TestGetFeedsForRepos ( t * testing . T ) {
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2022-08-16 05:22:25 +03:00
user := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 2 } )
privRepo := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : 2 } )
pubRepo := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : 8 } )
2022-03-13 19:40:47 +03:00
// private repo & no login
2023-02-25 00:15:10 +03:00
actions , count , err := activities_model . GetFeeds ( db . DefaultContext , activities_model . GetFeedsOptions {
2022-03-13 19:40:47 +03:00
RequestedRepo : privRepo ,
IncludePrivate : true ,
} )
assert . NoError ( t , err )
assert . Len ( t , actions , 0 )
2023-02-25 00:15:10 +03:00
assert . Equal ( t , int64 ( 0 ) , count )
2022-03-13 19:40:47 +03:00
// public repo & no login
2023-02-25 00:15:10 +03:00
actions , count , err = activities_model . GetFeeds ( db . DefaultContext , activities_model . GetFeedsOptions {
2022-03-13 19:40:47 +03:00
RequestedRepo : pubRepo ,
IncludePrivate : true ,
} )
assert . NoError ( t , err )
assert . Len ( t , actions , 1 )
2023-02-25 00:15:10 +03:00
assert . Equal ( t , int64 ( 1 ) , count )
2022-03-13 19:40:47 +03:00
// private repo and login
2023-02-25 00:15:10 +03:00
actions , count , err = activities_model . GetFeeds ( db . DefaultContext , activities_model . GetFeedsOptions {
2022-03-13 19:40:47 +03:00
RequestedRepo : privRepo ,
IncludePrivate : true ,
Actor : user ,
} )
assert . NoError ( t , err )
assert . Len ( t , actions , 1 )
2023-02-25 00:15:10 +03:00
assert . Equal ( t , int64 ( 1 ) , count )
2022-03-13 19:40:47 +03:00
// public repo & login
2023-02-25 00:15:10 +03:00
actions , count , err = activities_model . GetFeeds ( db . DefaultContext , activities_model . GetFeedsOptions {
2022-03-13 19:40:47 +03:00
RequestedRepo : pubRepo ,
IncludePrivate : true ,
Actor : user ,
} )
assert . NoError ( t , err )
assert . Len ( t , actions , 1 )
2023-02-25 00:15:10 +03:00
assert . Equal ( t , int64 ( 1 ) , count )
2022-03-13 19:40:47 +03:00
}
2017-01-09 06:08:36 +03:00
func TestGetFeeds2 ( t * testing . T ) {
// test with an organization user
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2022-08-16 05:22:25 +03:00
org := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 3 } )
user := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 2 } )
2017-06-02 03:42:25 +03:00
2023-02-25 00:15:10 +03:00
actions , count , err := activities_model . GetFeeds ( db . DefaultContext , activities_model . GetFeedsOptions {
2020-01-13 20:33:46 +03:00
RequestedUser : org ,
Actor : user ,
IncludePrivate : true ,
OnlyPerformedBy : false ,
IncludeDeleted : true ,
2017-06-02 03:42:25 +03:00
} )
2017-01-09 06:08:36 +03:00
assert . NoError ( t , err )
assert . Len ( t , actions , 1 )
2017-08-28 12:17:45 +03:00
if assert . Len ( t , actions , 1 ) {
assert . EqualValues ( t , 2 , actions [ 0 ] . ID )
assert . EqualValues ( t , org . ID , actions [ 0 ] . UserID )
}
2023-02-25 00:15:10 +03:00
assert . Equal ( t , int64 ( 1 ) , count )
2017-06-02 03:42:25 +03:00
2023-02-25 00:15:10 +03:00
actions , count , err = activities_model . GetFeeds ( db . DefaultContext , activities_model . GetFeedsOptions {
2020-01-13 20:33:46 +03:00
RequestedUser : org ,
Actor : user ,
IncludePrivate : false ,
OnlyPerformedBy : false ,
IncludeDeleted : true ,
2017-06-02 03:42:25 +03:00
} )
2017-01-09 06:08:36 +03:00
assert . NoError ( t , err )
2017-02-28 04:42:10 +03:00
assert . Len ( t , actions , 0 )
2023-02-25 00:15:10 +03:00
assert . Equal ( t , int64 ( 0 ) , count )
2017-01-09 06:08:36 +03:00
}
2021-12-12 18:48:20 +03:00
2022-03-10 17:54:51 +03:00
func TestActivityReadable ( t * testing . T ) {
tt := [ ] struct {
desc string
user * user_model . User
doer * user_model . User
result bool
} { {
desc : "user should see own activity" ,
user : & user_model . User { ID : 1 } ,
doer : & user_model . User { ID : 1 } ,
result : true ,
} , {
desc : "anon should see activity if public" ,
user : & user_model . User { ID : 1 } ,
result : true ,
} , {
desc : "anon should NOT see activity" ,
user : & user_model . User { ID : 1 , KeepActivityPrivate : true } ,
result : false ,
} , {
desc : "user should see own activity if private too" ,
user : & user_model . User { ID : 1 , KeepActivityPrivate : true } ,
doer : & user_model . User { ID : 1 } ,
result : true ,
} , {
desc : "other user should NOT see activity" ,
user : & user_model . User { ID : 1 , KeepActivityPrivate : true } ,
doer : & user_model . User { ID : 2 } ,
result : false ,
} , {
desc : "admin should see activity" ,
user : & user_model . User { ID : 1 , KeepActivityPrivate : true } ,
doer : & user_model . User { ID : 2 , IsAdmin : true } ,
result : true ,
} }
for _ , test := range tt {
2022-08-25 05:31:57 +03:00
assert . Equal ( t , test . result , activities_model . ActivityReadable ( test . user , test . doer ) , test . desc )
2022-03-10 17:54:51 +03:00
}
}
2021-12-12 18:48:20 +03:00
func TestNotifyWatchers ( t * testing . T ) {
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2022-08-25 05:31:57 +03:00
action := & activities_model . Action {
2021-12-12 18:48:20 +03:00
ActUserID : 8 ,
RepoID : 1 ,
2022-08-25 05:31:57 +03:00
OpType : activities_model . ActionStarRepo ,
2021-12-12 18:48:20 +03:00
}
2022-11-19 11:12:33 +03:00
assert . NoError ( t , activities_model . NotifyWatchers ( db . DefaultContext , action ) )
2021-12-12 18:48:20 +03:00
// One watchers are inactive, thus action is only created for user 8, 1, 4, 11
2022-08-25 05:31:57 +03:00
unittest . AssertExistsAndLoadBean ( t , & activities_model . Action {
2021-12-12 18:48:20 +03:00
ActUserID : action . ActUserID ,
UserID : 8 ,
RepoID : action . RepoID ,
OpType : action . OpType ,
} )
2022-08-25 05:31:57 +03:00
unittest . AssertExistsAndLoadBean ( t , & activities_model . Action {
2021-12-12 18:48:20 +03:00
ActUserID : action . ActUserID ,
UserID : 1 ,
RepoID : action . RepoID ,
OpType : action . OpType ,
} )
2022-08-25 05:31:57 +03:00
unittest . AssertExistsAndLoadBean ( t , & activities_model . Action {
2021-12-12 18:48:20 +03:00
ActUserID : action . ActUserID ,
UserID : 4 ,
RepoID : action . RepoID ,
OpType : action . OpType ,
} )
2022-08-25 05:31:57 +03:00
unittest . AssertExistsAndLoadBean ( t , & activities_model . Action {
2021-12-12 18:48:20 +03:00
ActUserID : action . ActUserID ,
UserID : 11 ,
RepoID : action . RepoID ,
OpType : action . OpType ,
} )
}
2022-05-05 18:39:26 +03:00
func TestGetFeedsCorrupted ( t * testing . T ) {
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2022-08-16 05:22:25 +03:00
user := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 1 } )
2022-08-25 05:31:57 +03:00
unittest . AssertExistsAndLoadBean ( t , & activities_model . Action {
2022-05-05 18:39:26 +03:00
ID : 8 ,
RepoID : 1700 ,
} )
2023-02-25 00:15:10 +03:00
actions , count , err := activities_model . GetFeeds ( db . DefaultContext , activities_model . GetFeedsOptions {
2022-05-05 18:39:26 +03:00
RequestedUser : user ,
Actor : user ,
IncludePrivate : true ,
} )
assert . NoError ( t , err )
assert . Len ( t , actions , 0 )
2023-02-25 00:15:10 +03:00
assert . Equal ( t , int64 ( 0 ) , count )
2022-05-05 18:39:26 +03:00
}
2022-06-13 12:37:59 +03:00
func TestConsistencyUpdateAction ( t * testing . T ) {
2023-03-07 13:51:06 +03:00
if ! setting . Database . Type . IsSQLite3 ( ) {
2022-06-13 12:37:59 +03:00
t . Skip ( "Test is only for SQLite database." )
}
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
id := 8
2022-08-25 05:31:57 +03:00
unittest . AssertExistsAndLoadBean ( t , & activities_model . Action {
2022-06-13 12:37:59 +03:00
ID : int64 ( id ) ,
} )
_ , err := db . GetEngine ( db . DefaultContext ) . Exec ( ` UPDATE action SET created_unix = "" WHERE id = ? ` , id )
assert . NoError ( t , err )
2022-08-25 05:31:57 +03:00
actions := make ( [ ] * activities_model . Action , 0 , 1 )
2022-06-13 12:37:59 +03:00
//
// XORM returns an error when created_unix is a string
//
err = db . GetEngine ( db . DefaultContext ) . Where ( "id = ?" , id ) . Find ( & actions )
if assert . Error ( t , err ) {
assert . Contains ( t , err . Error ( ) , "type string to a int64: invalid syntax" )
}
//
// Get rid of incorrectly set created_unix
//
2022-11-19 11:12:33 +03:00
count , err := activities_model . CountActionCreatedUnixString ( db . DefaultContext )
2022-06-13 12:37:59 +03:00
assert . NoError ( t , err )
assert . EqualValues ( t , 1 , count )
2022-11-19 11:12:33 +03:00
count , err = activities_model . FixActionCreatedUnixString ( db . DefaultContext )
2022-06-13 12:37:59 +03:00
assert . NoError ( t , err )
assert . EqualValues ( t , 1 , count )
2022-11-19 11:12:33 +03:00
count , err = activities_model . CountActionCreatedUnixString ( db . DefaultContext )
2022-06-13 12:37:59 +03:00
assert . NoError ( t , err )
assert . EqualValues ( t , 0 , count )
2022-11-19 11:12:33 +03:00
count , err = activities_model . FixActionCreatedUnixString ( db . DefaultContext )
2022-06-13 12:37:59 +03:00
assert . NoError ( t , err )
assert . EqualValues ( t , 0 , count )
//
// XORM must be happy now
//
assert . NoError ( t , db . GetEngine ( db . DefaultContext ) . Where ( "id = ?" , id ) . Find ( & actions ) )
2022-08-25 05:31:57 +03:00
unittest . CheckConsistencyFor ( t , & activities_model . Action { } )
2022-06-13 12:37:59 +03:00
}
2023-08-07 13:23:59 +03:00
func TestDeleteIssueActions ( t * testing . T ) {
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
// load an issue
issue := unittest . AssertExistsAndLoadBean ( t , & issue_model . Issue { ID : 4 } )
assert . NotEqualValues ( t , issue . ID , issue . Index ) // it needs to use different ID/Index to test the DeleteIssueActions to delete some actions by IssueIndex
// insert a comment
err := db . Insert ( db . DefaultContext , & issue_model . Comment { Type : issue_model . CommentTypeComment , IssueID : issue . ID } )
assert . NoError ( t , err )
comment := unittest . AssertExistsAndLoadBean ( t , & issue_model . Comment { Type : issue_model . CommentTypeComment , IssueID : issue . ID } )
// truncate action table and insert some actions
err = db . TruncateBeans ( db . DefaultContext , & activities_model . Action { } )
assert . NoError ( t , err )
err = db . Insert ( db . DefaultContext , & activities_model . Action {
OpType : activities_model . ActionCommentIssue ,
CommentID : comment . ID ,
} )
assert . NoError ( t , err )
err = db . Insert ( db . DefaultContext , & activities_model . Action {
OpType : activities_model . ActionCreateIssue ,
RepoID : issue . RepoID ,
Content : fmt . Sprintf ( "%d|content..." , issue . Index ) ,
} )
assert . NoError ( t , err )
// assert that the actions exist, then delete them
unittest . AssertCount ( t , & activities_model . Action { } , 2 )
assert . NoError ( t , activities_model . DeleteIssueActions ( db . DefaultContext , issue . RepoID , issue . ID , issue . Index ) )
unittest . AssertCount ( t , & activities_model . Action { } , 0 )
}