2019-11-29 06:59:40 -05:00
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
2017-02-13 10:52:50 -05:00
package api4
import (
2021-09-01 08:43:12 -04:00
"bytes"
2021-03-31 03:40:35 -04:00
"context"
2017-07-18 15:43:31 -04:00
"encoding/json"
2020-09-29 03:33:15 -04:00
"errors"
2017-11-20 18:57:35 -05:00
"fmt"
2017-02-13 10:52:50 -05:00
"net/http"
2017-07-18 15:43:31 -04:00
"net/http/httptest"
"net/url"
2021-04-16 03:26:08 -04:00
"os"
2017-03-29 11:06:51 -04:00
"reflect"
2019-07-30 05:27:18 -04:00
"sort"
2017-07-18 15:43:31 -04:00
"strings"
2017-02-13 10:52:50 -05:00
"testing"
2017-02-21 07:36:52 -05:00
"time"
2017-02-13 10:52:50 -05:00
2018-09-26 10:27:04 -04:00
"github.com/stretchr/testify/assert"
2019-07-03 17:23:04 -04:00
"github.com/stretchr/testify/require"
2018-09-26 10:27:04 -04:00
2021-07-22 02:51:47 -04:00
"github.com/mattermost/mattermost-server/v6/app"
"github.com/mattermost/mattermost-server/v6/model"
"github.com/mattermost/mattermost-server/v6/plugin/plugintest/mock"
"github.com/mattermost/mattermost-server/v6/store/storetest/mocks"
"github.com/mattermost/mattermost-server/v6/utils"
"github.com/mattermost/mattermost-server/v6/utils/testutils"
2017-02-13 10:52:50 -05:00
)
func TestCreatePost ( t * testing . T ) {
2020-02-10 13:31:41 -05:00
th := Setup ( t ) . InitBasic ( )
2017-10-02 04:50:56 -04:00
defer th . TearDown ( )
2021-08-13 07:12:16 -04:00
client := th . Client
2017-02-13 10:52:50 -05:00
2021-10-29 10:46:00 -04:00
post := & model . Post { ChannelId : th . BasicChannel . Id , Message : "#hashtag a" + model . NewId ( ) + "a" , Props : model . StringInterface { model . PropsAddChannelMember : "no good" } , DeleteAt : 101 }
2021-08-13 07:12:16 -04:00
rpost , resp , err2 := client . CreatePost ( post )
require . NoError ( t , err2 )
2017-03-31 09:56:20 -04:00
CheckCreatedStatus ( t , resp )
2017-02-13 10:52:50 -05:00
2019-11-28 17:41:51 -05:00
require . Equal ( t , post . Message , rpost . Message , "message didn't match" )
require . Equal ( t , "#hashtag" , rpost . Hashtags , "hashtag didn't match" )
2019-12-22 06:35:31 -05:00
require . Empty ( t , rpost . FileIds )
2019-11-28 17:41:51 -05:00
require . Equal ( t , 0 , int ( rpost . EditAt ) , "newly created post shouldn't have EditAt set" )
2021-07-12 14:05:36 -04:00
require . Nil ( t , rpost . GetProp ( model . PropsAddChannelMember ) , "newly created post shouldn't have Props['add_channel_member'] set" )
2021-10-29 10:46:00 -04:00
require . Equal ( t , 0 , int ( rpost . DeleteAt ) , "newly created post shouldn't have DeleteAt set" )
2017-10-20 13:38:26 -04:00
2017-02-13 10:52:50 -05:00
post . RootId = rpost . Id
2021-08-13 07:12:16 -04:00
_ , _ , err2 = client . CreatePost ( post )
require . NoError ( t , err2 )
2017-02-13 10:52:50 -05:00
post . RootId = "junk"
2021-08-13 07:12:16 -04:00
_ , resp , err2 = client . CreatePost ( post )
require . Error ( t , err2 )
2017-02-13 10:52:50 -05:00
CheckBadRequestStatus ( t , resp )
2017-06-19 12:08:52 -04:00
post2 := & model . Post { ChannelId : th . BasicChannel2 . Id , Message : "zz" + model . NewId ( ) + "a" , CreateAt : 123 }
2021-08-13 07:12:16 -04:00
rpost2 , _ , _ := client . CreatePost ( post2 )
2019-11-28 17:41:51 -05:00
require . NotEqual ( t , post2 . CreateAt , rpost2 . CreateAt , "create at should not match" )
2017-02-13 10:52:50 -05:00
2019-08-12 17:35:46 -04:00
t . Run ( "with file uploaded by same user" , func ( t * testing . T ) {
2021-08-13 07:12:16 -04:00
fileResp , _ , err := client . UploadFile ( [ ] byte ( "data" ) , th . BasicChannel . Id , "test" )
require . NoError ( t , err )
2019-08-12 17:35:46 -04:00
fileId := fileResp . FileInfos [ 0 ] . Id
2021-08-13 07:12:16 -04:00
postWithFiles , _ , err := client . CreatePost ( & model . Post {
2019-08-12 17:35:46 -04:00
ChannelId : th . BasicChannel . Id ,
Message : "with files" ,
FileIds : model . StringArray { fileId } ,
} )
2021-08-13 07:12:16 -04:00
require . NoError ( t , err )
2019-08-12 17:35:46 -04:00
assert . Equal ( t , model . StringArray { fileId } , postWithFiles . FileIds )
2021-08-13 07:12:16 -04:00
actualPostWithFiles , _ , err := client . GetPost ( postWithFiles . Id , "" )
require . NoError ( t , err )
2019-08-12 17:35:46 -04:00
assert . Equal ( t , model . StringArray { fileId } , actualPostWithFiles . FileIds )
} )
t . Run ( "with file uploaded by different user" , func ( t * testing . T ) {
2021-08-13 07:12:16 -04:00
fileResp , _ , err := th . SystemAdminClient . UploadFile ( [ ] byte ( "data" ) , th . BasicChannel . Id , "test" )
require . NoError ( t , err )
2019-08-12 17:35:46 -04:00
fileId := fileResp . FileInfos [ 0 ] . Id
2021-08-13 07:12:16 -04:00
postWithFiles , _ , err := client . CreatePost ( & model . Post {
2019-08-12 17:35:46 -04:00
ChannelId : th . BasicChannel . Id ,
Message : "with files" ,
FileIds : model . StringArray { fileId } ,
} )
2021-08-13 07:12:16 -04:00
require . NoError ( t , err )
2019-08-12 17:35:46 -04:00
assert . Empty ( t , postWithFiles . FileIds )
2021-08-13 07:12:16 -04:00
actualPostWithFiles , _ , err := client . GetPost ( postWithFiles . Id , "" )
require . NoError ( t , err )
2019-08-12 17:35:46 -04:00
assert . Empty ( t , actualPostWithFiles . FileIds )
} )
t . Run ( "with file uploaded by nouser" , func ( t * testing . T ) {
2021-08-13 07:12:16 -04:00
fileInfo , appErr := th . App . UploadFile ( th . Context , [ ] byte ( "data" ) , th . BasicChannel . Id , "test" )
require . Nil ( t , appErr )
2019-08-12 17:35:46 -04:00
fileId := fileInfo . Id
2021-08-13 07:12:16 -04:00
postWithFiles , _ , err := client . CreatePost ( & model . Post {
2019-08-12 17:35:46 -04:00
ChannelId : th . BasicChannel . Id ,
Message : "with files" ,
FileIds : model . StringArray { fileId } ,
} )
2021-08-13 07:12:16 -04:00
require . NoError ( t , err )
2019-08-12 17:35:46 -04:00
assert . Equal ( t , model . StringArray { fileId } , postWithFiles . FileIds )
2021-08-13 07:12:16 -04:00
actualPostWithFiles , _ , err := client . GetPost ( postWithFiles . Id , "" )
require . NoError ( t , err )
2019-08-12 17:35:46 -04:00
assert . Equal ( t , model . StringArray { fileId } , actualPostWithFiles . FileIds )
} )
2020-03-03 05:22:49 -05:00
t . Run ( "Create posts without the USE_CHANNEL_MENTIONS Permission - returns ephemeral message with mentions and no ephemeral message without mentions" , func ( t * testing . T ) {
WebSocketClient , err := th . CreateWebSocketClient ( )
WebSocketClient . Listen ( )
2021-08-13 07:12:16 -04:00
require . NoError ( t , err )
2020-03-03 05:22:49 -05:00
2020-02-12 10:45:34 -05:00
defer th . RestoreDefaultRolePermissions ( th . SaveDefaultRolePermissions ( ) )
2021-07-12 14:05:36 -04:00
th . RemovePermissionFromRole ( model . PermissionUseChannelMentions . Id , model . ChannelUserRoleId )
2020-02-12 10:45:34 -05:00
2020-03-03 05:22:49 -05:00
post . RootId = rpost . Id
post . Message = "a post with no channel mentions"
2021-08-13 07:12:16 -04:00
_ , _ , err = client . CreatePost ( post )
require . NoError ( t , err )
2020-03-03 05:22:49 -05:00
// Message with no channel mentions should result in no ephemeral message
timeout := time . After ( 300 * time . Millisecond )
waiting := true
for waiting {
select {
case event := <- WebSocketClient . EventChannel :
2021-07-12 14:05:36 -04:00
require . NotEqual ( t , model . WebsocketEventEphemeralMessage , event . EventType ( ) , "should not have ephemeral message event" )
2020-03-03 05:22:49 -05:00
case <- timeout :
waiting = false
}
}
2020-02-12 10:45:34 -05:00
post . RootId = rpost . Id
post . Message = "a post with @channel"
2021-08-13 07:12:16 -04:00
_ , _ , err = client . CreatePost ( post )
require . NoError ( t , err )
2020-02-12 10:45:34 -05:00
post . RootId = rpost . Id
post . Message = "a post with @all"
2021-08-13 07:12:16 -04:00
_ , _ , err = client . CreatePost ( post )
require . NoError ( t , err )
2020-02-12 10:45:34 -05:00
post . RootId = rpost . Id
post . Message = "a post with @here"
2021-08-13 07:12:16 -04:00
_ , _ , err = client . CreatePost ( post )
require . NoError ( t , err )
2020-03-03 05:22:49 -05:00
timeout = time . After ( 600 * time . Millisecond )
eventsToGo := 3 // 3 Posts created with @ mentions should result in 3 websocket events
for eventsToGo > 0 {
select {
case event := <- WebSocketClient . EventChannel :
2021-07-13 10:35:02 -04:00
if event . EventType ( ) == model . WebsocketEventEphemeralMessage {
require . Equal ( t , model . WebsocketEventEphemeralMessage , event . EventType ( ) )
2020-03-03 05:22:49 -05:00
eventsToGo = eventsToGo - 1
}
case <- timeout :
require . Fail ( t , "Should have received ephemeral message event and not timedout" )
eventsToGo = 0
}
}
2020-02-12 10:45:34 -05:00
} )
2017-10-09 13:30:48 -04:00
post . RootId = ""
2021-07-12 14:05:36 -04:00
post . Type = model . PostTypeSystemGeneric
2021-08-13 07:12:16 -04:00
_ , resp , err := client . CreatePost ( post )
require . Error ( t , err )
2017-10-09 13:30:48 -04:00
CheckBadRequestStatus ( t , resp )
post . Type = ""
2017-02-13 10:52:50 -05:00
post . RootId = rpost2 . Id
2021-08-13 07:12:16 -04:00
_ , resp , err = client . CreatePost ( post )
require . Error ( t , err )
2017-02-13 10:52:50 -05:00
CheckBadRequestStatus ( t , resp )
post . RootId = ""
post . ChannelId = "junk"
2021-08-13 07:12:16 -04:00
_ , resp , err = client . CreatePost ( post )
require . Error ( t , err )
2017-02-13 10:52:50 -05:00
CheckForbiddenStatus ( t , resp )
post . ChannelId = model . NewId ( )
2021-08-13 07:12:16 -04:00
_ , resp , err = client . CreatePost ( post )
require . Error ( t , err )
2017-02-13 10:52:50 -05:00
CheckForbiddenStatus ( t , resp )
2021-08-16 13:46:44 -04:00
r , err := client . DoAPIPost ( "/posts" , "garbage" )
2021-08-13 07:12:16 -04:00
require . Error ( t , err )
2019-11-28 17:41:51 -05:00
require . Equal ( t , http . StatusBadRequest , r . StatusCode )
2017-02-13 10:52:50 -05:00
2021-08-13 07:12:16 -04:00
client . Logout ( )
_ , resp , err = client . CreatePost ( post )
require . Error ( t , err )
2017-02-13 10:52:50 -05:00
CheckUnauthorizedStatus ( t , resp )
post . ChannelId = th . BasicChannel . Id
post . CreateAt = 123
2021-08-13 07:12:16 -04:00
rpost , _ , err = th . SystemAdminClient . CreatePost ( post )
require . NoError ( t , err )
2019-11-28 17:41:51 -05:00
require . Equal ( t , post . CreateAt , rpost . CreateAt , "create at should match" )
2017-02-13 10:52:50 -05:00
}
2018-04-17 08:20:47 -04:00
func TestCreatePostEphemeral ( t * testing . T ) {
2020-02-10 13:31:41 -05:00
th := Setup ( t ) . InitBasic ( )
2018-04-17 08:20:47 -04:00
defer th . TearDown ( )
2021-08-13 07:12:16 -04:00
client := th . SystemAdminClient
2018-04-17 08:20:47 -04:00
ephemeralPost := & model . PostEphemeral {
UserID : th . BasicUser2 . Id ,
2021-07-12 14:05:36 -04:00
Post : & model . Post { ChannelId : th . BasicChannel . Id , Message : "a" + model . NewId ( ) + "a" , Props : model . StringInterface { model . PropsAddChannelMember : "no good" } } ,
2018-04-17 08:20:47 -04:00
}
2021-08-13 07:12:16 -04:00
rpost , resp , err := client . CreatePostEphemeral ( ephemeralPost )
require . NoError ( t , err )
2018-04-17 08:20:47 -04:00
CheckCreatedStatus ( t , resp )
2019-11-28 17:41:51 -05:00
require . Equal ( t , ephemeralPost . Post . Message , rpost . Message , "message didn't match" )
require . Equal ( t , 0 , int ( rpost . EditAt ) , "newly created ephemeral post shouldn't have EditAt set" )
2018-04-17 08:20:47 -04:00
2021-08-16 13:46:44 -04:00
r , err := client . DoAPIPost ( "/posts/ephemeral" , "garbage" )
2021-08-13 07:12:16 -04:00
require . Error ( t , err )
2019-11-28 17:41:51 -05:00
require . Equal ( t , http . StatusBadRequest , r . StatusCode )
2018-04-17 08:20:47 -04:00
2021-08-13 07:12:16 -04:00
client . Logout ( )
_ , resp , err = client . CreatePostEphemeral ( ephemeralPost )
require . Error ( t , err )
2018-04-17 08:20:47 -04:00
CheckUnauthorizedStatus ( t , resp )
2021-08-13 07:12:16 -04:00
client = th . Client
_ , resp , err = client . CreatePostEphemeral ( ephemeralPost )
require . Error ( t , err )
2018-04-17 08:20:47 -04:00
CheckForbiddenStatus ( t , resp )
}
2017-07-18 15:43:31 -04:00
func testCreatePostWithOutgoingHook (
t * testing . T ,
hookContentType , expectedContentType , message , triggerWord string ,
fileIds [ ] string ,
triggerWhen int ,
2017-11-20 18:57:35 -05:00
commentPostType bool ,
2017-07-18 15:43:31 -04:00
) {
2020-02-10 13:31:41 -05:00
th := Setup ( t ) . InitBasic ( )
2017-10-02 04:50:56 -04:00
defer th . TearDown ( )
2017-07-18 15:43:31 -04:00
user := th . SystemAdminUser
team := th . BasicTeam
channel := th . BasicChannel
2019-01-31 08:12:01 -05:00
enableOutgoingWebhooks := * th . App . Config ( ) . ServiceSettings . EnableOutgoingWebhooks
allowedUntrustedInternalConnections := * th . App . Config ( ) . ServiceSettings . AllowedUntrustedInternalConnections
2018-07-11 06:58:16 -04:00
defer func ( ) {
2019-01-31 08:12:01 -05:00
th . App . UpdateConfig ( func ( cfg * model . Config ) { * cfg . ServiceSettings . EnableOutgoingWebhooks = enableOutgoingWebhooks } )
2018-07-11 06:58:16 -04:00
th . App . UpdateConfig ( func ( cfg * model . Config ) {
2019-01-31 08:12:01 -05:00
* cfg . ServiceSettings . AllowedUntrustedInternalConnections = allowedUntrustedInternalConnections
2018-07-11 06:58:16 -04:00
} )
} ( )
2019-01-31 08:12:01 -05:00
th . App . UpdateConfig ( func ( cfg * model . Config ) { * cfg . ServiceSettings . EnableOutgoingWebhooks = true } )
2017-10-18 18:36:43 -04:00
th . App . UpdateConfig ( func ( cfg * model . Config ) {
2019-07-17 10:04:09 -04:00
* cfg . ServiceSettings . AllowedUntrustedInternalConnections = "localhost,127.0.0.1"
2017-10-18 18:36:43 -04:00
} )
2017-07-18 15:43:31 -04:00
var hook * model . OutgoingWebhook
var post * model . Post
// Create a test server that is the target of the outgoing webhook. It will
// validate the webhook body fields and write to the success channel on
// success/failure.
success := make ( chan bool )
wait := make ( chan bool , 1 )
ts := httptest . NewServer ( http . HandlerFunc ( func ( w http . ResponseWriter , r * http . Request ) {
<- wait
requestContentType := r . Header . Get ( "Content-Type" )
if requestContentType != expectedContentType {
t . Logf ( "Content-Type is %s, should be %s" , requestContentType , expectedContentType )
success <- false
return
}
expectedPayload := & model . OutgoingWebhookPayload {
Token : hook . Token ,
TeamId : hook . TeamId ,
TeamDomain : team . Name ,
ChannelId : post . ChannelId ,
ChannelName : channel . Name ,
Timestamp : post . CreateAt ,
UserId : post . UserId ,
UserName : user . Username ,
PostId : post . Id ,
Text : post . Message ,
TriggerWord : triggerWord ,
FileIds : strings . Join ( post . FileIds , "," ) ,
}
// depending on the Content-Type, we expect to find a JSON or form encoded payload
if requestContentType == "application/json" {
decoder := json . NewDecoder ( r . Body )
o := & model . OutgoingWebhookPayload { }
decoder . Decode ( & o )
if ! reflect . DeepEqual ( expectedPayload , o ) {
t . Logf ( "JSON payload is %+v, should be %+v" , o , expectedPayload )
success <- false
return
}
} else {
err := r . ParseForm ( )
if err != nil {
t . Logf ( "Error parsing form: %q" , err )
success <- false
return
}
expectedFormValues , _ := url . ParseQuery ( expectedPayload . ToFormValues ( ) )
2017-11-20 18:57:35 -05:00
2017-07-18 15:43:31 -04:00
if ! reflect . DeepEqual ( expectedFormValues , r . Form ) {
t . Logf ( "Form values are: %q\n, should be: %q\n" , r . Form , expectedFormValues )
success <- false
return
}
}
2017-11-20 18:57:35 -05:00
respPostType := "" //if is empty or post will do a normal post.
if commentPostType {
2021-07-12 14:05:36 -04:00
respPostType = model . OutgoingHookResponseTypeComment
2017-11-20 18:57:35 -05:00
}
outGoingHookResponse := & model . OutgoingWebhookResponse {
Text : model . NewString ( "some test text" ) ,
Username : "TestCommandServer" ,
2022-03-16 07:47:57 -04:00
IconURL : "https://mattermost.com/wp-content/uploads/2022/02/icon.png" ,
2017-11-20 18:57:35 -05:00
Type : "custom_as" ,
ResponseType : respPostType ,
}
2021-09-01 08:43:12 -04:00
hookJSON , jsonErr := json . Marshal ( outGoingHookResponse )
require . NoError ( t , jsonErr )
w . Write ( hookJSON )
2017-07-18 15:43:31 -04:00
success <- true
} ) )
defer ts . Close ( )
// create an outgoing webhook, passing it the test server URL
var triggerWords [ ] string
if triggerWord != "" {
triggerWords = [ ] string { triggerWord }
}
2017-07-31 12:59:32 -04:00
2017-07-18 15:43:31 -04:00
hook = & model . OutgoingWebhook {
ChannelId : channel . Id ,
TeamId : team . Id ,
ContentType : hookContentType ,
TriggerWords : triggerWords ,
TriggerWhen : triggerWhen ,
CallbackURLs : [ ] string { ts . URL } ,
}
2021-08-13 07:12:16 -04:00
hook , _ , err := th . SystemAdminClient . CreateOutgoingWebhook ( hook )
require . NoError ( t , err )
2017-07-18 15:43:31 -04:00
// create a post to trigger the webhook
post = & model . Post {
ChannelId : channel . Id ,
Message : message ,
FileIds : fileIds ,
}
2021-08-13 07:12:16 -04:00
post , _ , err = th . SystemAdminClient . CreatePost ( post )
require . NoError ( t , err )
2017-07-18 15:43:31 -04:00
wait <- true
// We wait for the test server to write to the success channel and we make
// the test fail if that doesn't happen before the timeout.
select {
case ok := <- success :
2019-11-28 17:41:51 -05:00
require . True ( t , ok , "Test server did send an invalid webhook." )
2017-07-18 15:43:31 -04:00
case <- time . After ( time . Second ) :
2019-11-28 17:41:51 -05:00
require . FailNow ( t , "Timeout, test server did not send the webhook." )
2017-07-18 15:43:31 -04:00
}
2017-11-20 18:57:35 -05:00
if commentPostType {
time . Sleep ( time . Millisecond * 100 )
2021-08-13 07:12:16 -04:00
postList , _ , err := th . SystemAdminClient . GetPostThread ( post . Id , "" , false )
require . NoError ( t , err )
2019-11-28 17:41:51 -05:00
require . Equal ( t , post . Id , postList . Order [ 0 ] , "wrong order" )
2017-11-20 18:57:35 -05:00
2019-11-28 17:41:51 -05:00
_ , ok := postList . Posts [ post . Id ]
require . True ( t , ok , "should have had post" )
require . Len ( t , postList . Posts , 2 , "should have 2 posts" )
2017-11-20 18:57:35 -05:00
}
2017-07-18 15:43:31 -04:00
}
func TestCreatePostWithOutgoingHook_form_urlencoded ( t * testing . T ) {
2021-01-04 01:02:29 -05:00
testCreatePostWithOutgoingHook ( t , "application/x-www-form-urlencoded" , "application/x-www-form-urlencoded" , "triggerword lorem ipsum" , "triggerword" , [ ] string { "file_id_1" } , app . TriggerwordsExactMatch , false )
testCreatePostWithOutgoingHook ( t , "application/x-www-form-urlencoded" , "application/x-www-form-urlencoded" , "triggerwordaaazzz lorem ipsum" , "triggerword" , [ ] string { "file_id_1" } , app . TriggerwordsStartsWith , false )
testCreatePostWithOutgoingHook ( t , "application/x-www-form-urlencoded" , "application/x-www-form-urlencoded" , "" , "" , [ ] string { "file_id_1" } , app . TriggerwordsExactMatch , false )
testCreatePostWithOutgoingHook ( t , "application/x-www-form-urlencoded" , "application/x-www-form-urlencoded" , "" , "" , [ ] string { "file_id_1" } , app . TriggerwordsStartsWith , false )
testCreatePostWithOutgoingHook ( t , "application/x-www-form-urlencoded" , "application/x-www-form-urlencoded" , "triggerword lorem ipsum" , "triggerword" , [ ] string { "file_id_1" } , app . TriggerwordsExactMatch , true )
testCreatePostWithOutgoingHook ( t , "application/x-www-form-urlencoded" , "application/x-www-form-urlencoded" , "triggerwordaaazzz lorem ipsum" , "triggerword" , [ ] string { "file_id_1" } , app . TriggerwordsStartsWith , true )
2017-07-18 15:43:31 -04:00
}
func TestCreatePostWithOutgoingHook_json ( t * testing . T ) {
2021-01-04 01:02:29 -05:00
testCreatePostWithOutgoingHook ( t , "application/json" , "application/json" , "triggerword lorem ipsum" , "triggerword" , [ ] string { "file_id_1, file_id_2" } , app . TriggerwordsExactMatch , false )
testCreatePostWithOutgoingHook ( t , "application/json" , "application/json" , "triggerwordaaazzz lorem ipsum" , "triggerword" , [ ] string { "file_id_1, file_id_2" } , app . TriggerwordsStartsWith , false )
testCreatePostWithOutgoingHook ( t , "application/json" , "application/json" , "triggerword lorem ipsum" , "" , [ ] string { "file_id_1" } , app . TriggerwordsExactMatch , false )
testCreatePostWithOutgoingHook ( t , "application/json" , "application/json" , "triggerwordaaazzz lorem ipsum" , "" , [ ] string { "file_id_1" } , app . TriggerwordsStartsWith , false )
testCreatePostWithOutgoingHook ( t , "application/json" , "application/json" , "triggerword lorem ipsum" , "triggerword" , [ ] string { "file_id_1, file_id_2" } , app . TriggerwordsExactMatch , true )
testCreatePostWithOutgoingHook ( t , "application/json" , "application/json" , "triggerwordaaazzz lorem ipsum" , "" , [ ] string { "file_id_1" } , app . TriggerwordsStartsWith , true )
2017-07-18 15:43:31 -04:00
}
// hooks created before we added the ContentType field should be considered as
// application/x-www-form-urlencoded
func TestCreatePostWithOutgoingHook_no_content_type ( t * testing . T ) {
2021-01-04 01:02:29 -05:00
testCreatePostWithOutgoingHook ( t , "" , "application/x-www-form-urlencoded" , "triggerword lorem ipsum" , "triggerword" , [ ] string { "file_id_1" } , app . TriggerwordsExactMatch , false )
testCreatePostWithOutgoingHook ( t , "" , "application/x-www-form-urlencoded" , "triggerwordaaazzz lorem ipsum" , "triggerword" , [ ] string { "file_id_1" } , app . TriggerwordsStartsWith , false )
testCreatePostWithOutgoingHook ( t , "" , "application/x-www-form-urlencoded" , "triggerword lorem ipsum" , "" , [ ] string { "file_id_1, file_id_2" } , app . TriggerwordsExactMatch , false )
testCreatePostWithOutgoingHook ( t , "" , "application/x-www-form-urlencoded" , "triggerwordaaazzz lorem ipsum" , "" , [ ] string { "file_id_1, file_id_2" } , app . TriggerwordsStartsWith , false )
testCreatePostWithOutgoingHook ( t , "" , "application/x-www-form-urlencoded" , "triggerword lorem ipsum" , "triggerword" , [ ] string { "file_id_1" } , app . TriggerwordsExactMatch , true )
testCreatePostWithOutgoingHook ( t , "" , "application/x-www-form-urlencoded" , "triggerword lorem ipsum" , "" , [ ] string { "file_id_1, file_id_2" } , app . TriggerwordsExactMatch , true )
2017-07-18 15:43:31 -04:00
}
2017-07-31 12:59:32 -04:00
func TestCreatePostPublic ( t * testing . T ) {
2020-02-10 13:31:41 -05:00
th := Setup ( t ) . InitBasic ( )
2017-10-02 04:50:56 -04:00
defer th . TearDown ( )
2021-08-13 07:12:16 -04:00
client := th . Client
2017-07-31 12:59:32 -04:00
post := & model . Post { ChannelId : th . BasicChannel . Id , Message : "#hashtag a" + model . NewId ( ) + "a" }
2021-07-12 14:05:36 -04:00
user := model . User { Email : th . GenerateTestEmail ( ) , Nickname : "Joram Wilander" , Password : "hello1" , Username : GenerateTestUsername ( ) , Roles : model . SystemUserRoleId }
2017-07-31 12:59:32 -04:00
2021-08-13 07:12:16 -04:00
ruser , _ , err := client . CreateUser ( & user )
require . NoError ( t , err )
2017-07-31 12:59:32 -04:00
2021-08-13 07:12:16 -04:00
client . Login ( user . Email , user . Password )
2017-07-31 12:59:32 -04:00
2021-08-13 07:12:16 -04:00
_ , resp , err := client . CreatePost ( post )
require . Error ( t , err )
2017-07-31 12:59:32 -04:00
CheckForbiddenStatus ( t , resp )
2021-07-12 14:05:36 -04:00
th . App . UpdateUserRoles ( ruser . Id , model . SystemUserRoleId + " " + model . SystemPostAllPublicRoleId , false )
2020-06-12 07:43:50 -04:00
th . App . Srv ( ) . InvalidateAllCaches ( )
2017-07-31 12:59:32 -04:00
2021-08-13 07:12:16 -04:00
client . Login ( user . Email , user . Password )
2017-07-31 12:59:32 -04:00
2021-08-13 07:12:16 -04:00
_ , _ , err = client . CreatePost ( post )
require . NoError ( t , err )
2017-07-31 12:59:32 -04:00
post . ChannelId = th . BasicPrivateChannel . Id
2021-08-13 07:12:16 -04:00
_ , resp , err = client . CreatePost ( post )
require . Error ( t , err )
2017-07-31 12:59:32 -04:00
CheckForbiddenStatus ( t , resp )
2021-07-12 14:05:36 -04:00
th . App . UpdateUserRoles ( ruser . Id , model . SystemUserRoleId , false )
2021-05-11 06:00:44 -04:00
th . App . JoinUserToTeam ( th . Context , th . BasicTeam , ruser , "" )
2021-07-12 14:05:36 -04:00
th . App . UpdateTeamMemberRoles ( th . BasicTeam . Id , ruser . Id , model . TeamUserRoleId + " " + model . TeamPostAllPublicRoleId )
2020-06-12 07:43:50 -04:00
th . App . Srv ( ) . InvalidateAllCaches ( )
2017-07-31 12:59:32 -04:00
2021-08-13 07:12:16 -04:00
client . Login ( user . Email , user . Password )
2017-07-31 12:59:32 -04:00
post . ChannelId = th . BasicPrivateChannel . Id
2021-08-13 07:12:16 -04:00
_ , resp , err = client . CreatePost ( post )
require . Error ( t , err )
2017-07-31 12:59:32 -04:00
CheckForbiddenStatus ( t , resp )
post . ChannelId = th . BasicChannel . Id
2021-08-13 07:12:16 -04:00
_ , _ , err = client . CreatePost ( post )
require . NoError ( t , err )
2017-07-31 12:59:32 -04:00
}
2017-08-01 11:06:53 -04:00
func TestCreatePostAll ( t * testing . T ) {
2020-02-10 13:31:41 -05:00
th := Setup ( t ) . InitBasic ( )
2017-10-02 04:50:56 -04:00
defer th . TearDown ( )
2021-08-13 07:12:16 -04:00
client := th . Client
2017-08-01 11:06:53 -04:00
post := & model . Post { ChannelId : th . BasicChannel . Id , Message : "#hashtag a" + model . NewId ( ) + "a" }
2021-07-12 14:05:36 -04:00
user := model . User { Email : th . GenerateTestEmail ( ) , Nickname : "Joram Wilander" , Password : "hello1" , Username : GenerateTestUsername ( ) , Roles : model . SystemUserRoleId }
2017-08-01 11:06:53 -04:00
2021-05-11 06:00:44 -04:00
directChannel , _ := th . App . GetOrCreateDirectChannel ( th . Context , th . BasicUser . Id , th . BasicUser2 . Id )
2017-08-01 11:06:53 -04:00
2021-08-13 07:12:16 -04:00
ruser , _ , err := client . CreateUser ( & user )
require . NoError ( t , err )
2017-08-01 11:06:53 -04:00
2021-08-13 07:12:16 -04:00
client . Login ( user . Email , user . Password )
2017-08-01 11:06:53 -04:00
2021-08-13 07:12:16 -04:00
_ , resp , err := client . CreatePost ( post )
require . Error ( t , err )
2017-08-01 11:06:53 -04:00
CheckForbiddenStatus ( t , resp )
2021-07-12 14:05:36 -04:00
th . App . UpdateUserRoles ( ruser . Id , model . SystemUserRoleId + " " + model . SystemPostAllRoleId , false )
2020-06-12 07:43:50 -04:00
th . App . Srv ( ) . InvalidateAllCaches ( )
2017-08-01 11:06:53 -04:00
2021-08-13 07:12:16 -04:00
client . Login ( user . Email , user . Password )
2017-08-01 11:06:53 -04:00
2021-08-13 07:12:16 -04:00
_ , _ , err = client . CreatePost ( post )
require . NoError ( t , err )
2017-08-01 11:06:53 -04:00
post . ChannelId = th . BasicPrivateChannel . Id
2021-08-13 07:12:16 -04:00
_ , _ , err = client . CreatePost ( post )
require . NoError ( t , err )
2017-08-01 11:06:53 -04:00
post . ChannelId = directChannel . Id
2021-08-13 07:12:16 -04:00
_ , _ , err = client . CreatePost ( post )
require . NoError ( t , err )
2017-08-01 11:06:53 -04:00
2021-07-12 14:05:36 -04:00
th . App . UpdateUserRoles ( ruser . Id , model . SystemUserRoleId , false )
2021-05-11 06:00:44 -04:00
th . App . JoinUserToTeam ( th . Context , th . BasicTeam , ruser , "" )
2021-07-12 14:05:36 -04:00
th . App . UpdateTeamMemberRoles ( th . BasicTeam . Id , ruser . Id , model . TeamUserRoleId + " " + model . TeamPostAllRoleId )
2020-06-12 07:43:50 -04:00
th . App . Srv ( ) . InvalidateAllCaches ( )
2017-08-01 11:06:53 -04:00
2021-08-13 07:12:16 -04:00
client . Login ( user . Email , user . Password )
2017-08-01 11:06:53 -04:00
post . ChannelId = th . BasicPrivateChannel . Id
2021-08-13 07:12:16 -04:00
_ , _ , err = client . CreatePost ( post )
require . NoError ( t , err )
2017-08-01 11:06:53 -04:00
post . ChannelId = th . BasicChannel . Id
2021-08-13 07:12:16 -04:00
_ , _ , err = client . CreatePost ( post )
require . NoError ( t , err )
2017-08-01 11:06:53 -04:00
post . ChannelId = directChannel . Id
2021-08-13 07:12:16 -04:00
_ , resp , err = client . CreatePost ( post )
require . Error ( t , err )
2017-08-01 11:06:53 -04:00
CheckForbiddenStatus ( t , resp )
}
2017-10-20 13:38:26 -04:00
func TestCreatePostSendOutOfChannelMentions ( t * testing . T ) {
2020-02-10 13:31:41 -05:00
th := Setup ( t ) . InitBasic ( )
2017-10-20 13:38:26 -04:00
defer th . TearDown ( )
2021-08-13 07:12:16 -04:00
client := th . Client
2017-10-20 13:38:26 -04:00
WebSocketClient , err := th . CreateWebSocketClient ( )
2021-08-13 07:12:16 -04:00
require . NoError ( t , err )
2017-10-20 13:38:26 -04:00
WebSocketClient . Listen ( )
inChannelUser := th . CreateUser ( )
th . LinkUserToTeam ( inChannelUser , th . BasicTeam )
2021-04-02 05:03:23 -04:00
th . App . AddUserToChannel ( inChannelUser , th . BasicChannel , false )
2017-10-20 13:38:26 -04:00
post1 := & model . Post { ChannelId : th . BasicChannel . Id , Message : "@" + inChannelUser . Username }
2021-08-13 07:12:16 -04:00
_ , resp , err := client . CreatePost ( post1 )
require . NoError ( t , err )
2017-10-20 13:38:26 -04:00
CheckCreatedStatus ( t , resp )
timeout := time . After ( 300 * time . Millisecond )
waiting := true
for waiting {
select {
case event := <- WebSocketClient . EventChannel :
2021-07-12 14:05:36 -04:00
require . NotEqual ( t , model . WebsocketEventEphemeralMessage , event . EventType ( ) , "should not have ephemeral message event" )
2017-10-20 13:38:26 -04:00
case <- timeout :
waiting = false
}
}
outOfChannelUser := th . CreateUser ( )
th . LinkUserToTeam ( outOfChannelUser , th . BasicTeam )
post2 := & model . Post { ChannelId : th . BasicChannel . Id , Message : "@" + outOfChannelUser . Username }
2021-08-13 07:12:16 -04:00
_ , resp , err = client . CreatePost ( post2 )
require . NoError ( t , err )
2017-10-20 13:38:26 -04:00
CheckCreatedStatus ( t , resp )
timeout = time . After ( 300 * time . Millisecond )
waiting = true
for waiting {
select {
case event := <- WebSocketClient . EventChannel :
2021-07-12 14:05:36 -04:00
if event . EventType ( ) != model . WebsocketEventEphemeralMessage {
2017-10-20 13:38:26 -04:00
// Ignore any other events
continue
}
2021-09-01 08:43:12 -04:00
var wpost model . Post
err := json . Unmarshal ( [ ] byte ( event . GetData ( ) [ "post" ] . ( string ) ) , & wpost )
require . NoError ( t , err )
2019-11-28 17:41:51 -05:00
2021-07-12 14:05:36 -04:00
acm , ok := wpost . GetProp ( model . PropsAddChannelMember ) . ( map [ string ] interface { } )
2019-11-28 17:41:51 -05:00
require . True ( t , ok , "should have received ephemeral post with 'add_channel_member' in props" )
require . True ( t , acm [ "post_id" ] != nil , "should not be nil" )
require . True ( t , acm [ "user_ids" ] != nil , "should not be nil" )
require . True ( t , acm [ "usernames" ] != nil , "should not be nil" )
2017-10-20 13:38:26 -04:00
waiting = false
case <- timeout :
2019-11-28 17:41:51 -05:00
require . FailNow ( t , "timed out waiting for ephemeral message event" )
2017-10-20 13:38:26 -04:00
}
}
}
2020-01-13 09:50:56 -05:00
func TestCreatePostCheckOnlineStatus ( t * testing . T ) {
2020-02-10 13:31:41 -05:00
th := Setup ( t ) . InitBasic ( )
2020-01-13 09:50:56 -05:00
defer th . TearDown ( )
2022-02-11 02:07:05 -05:00
api , err := Init ( th . Server )
require . NoError ( t , err )
2020-01-13 09:50:56 -05:00
session , _ := th . App . GetSession ( th . Client . AuthToken )
2020-05-27 08:05:02 -04:00
cli := th . CreateClient ( )
2022-02-11 02:07:05 -05:00
_ , _ , err = cli . Login ( th . BasicUser2 . Username , th . BasicUser2 . Password )
2021-08-13 07:12:16 -04:00
require . NoError ( t , err )
2020-05-27 08:05:02 -04:00
wsClient , err := th . CreateWebSocketClientWithClient ( cli )
2021-08-13 07:12:16 -04:00
require . NoError ( t , err )
2020-06-16 08:00:58 -04:00
defer wsClient . Close ( )
2020-05-27 08:05:02 -04:00
wsClient . Listen ( )
2020-06-16 08:00:58 -04:00
waitForEvent := func ( isSetOnline bool ) {
timeout := time . After ( 5 * time . Second )
for {
2020-06-04 05:52:40 -04:00
select {
case ev := <- wsClient . EventChannel :
2021-07-12 14:05:36 -04:00
if ev . EventType ( ) == model . WebsocketEventPosted {
2020-06-16 08:00:58 -04:00
assert . True ( t , ev . GetData ( ) [ "set_online" ] . ( bool ) == isSetOnline )
return
2020-05-27 08:05:02 -04:00
}
2020-06-04 05:52:40 -04:00
case <- timeout :
2020-06-29 22:55:47 -04:00
// We just skip the test instead of failing because waiting for more than 5 seconds
2021-04-01 13:44:56 -04:00
// to get a response does not make sense, and it will unnecessarily slow down
2020-06-29 22:55:47 -04:00
// the tests further in an already congested CI environment.
t . Skip ( "timed out waiting for event" )
2020-05-27 08:05:02 -04:00
}
}
2020-06-16 08:00:58 -04:00
}
2020-05-27 08:05:02 -04:00
2021-08-16 13:46:44 -04:00
handler := api . APIHandler ( createPost )
2020-01-13 09:50:56 -05:00
resp := httptest . NewRecorder ( )
post := & model . Post {
ChannelId : th . BasicChannel . Id ,
Message : "some message" ,
}
2021-09-01 08:43:12 -04:00
postJSON , jsonErr := json . Marshal ( post )
require . NoError ( t , jsonErr )
req := httptest . NewRequest ( "POST" , "/api/v4/posts?set_online=false" , bytes . NewReader ( postJSON ) )
2021-07-12 14:05:36 -04:00
req . Header . Set ( model . HeaderAuth , "Bearer " + session . Token )
2020-01-13 09:50:56 -05:00
handler . ServeHTTP ( resp , req )
assert . Equal ( t , http . StatusCreated , resp . Code )
2020-06-16 08:00:58 -04:00
waitForEvent ( false )
2020-01-13 09:50:56 -05:00
2021-08-13 07:12:16 -04:00
_ , appErr := th . App . GetStatus ( th . BasicUser . Id )
require . NotNil ( t , appErr )
assert . Equal ( t , "app.status.get.missing.app_error" , appErr . Id )
2020-01-13 09:50:56 -05:00
2021-09-01 08:43:12 -04:00
postJSON , jsonErr = json . Marshal ( post )
require . NoError ( t , jsonErr )
req = httptest . NewRequest ( "POST" , "/api/v4/posts" , bytes . NewReader ( postJSON ) )
2021-07-12 14:05:36 -04:00
req . Header . Set ( model . HeaderAuth , "Bearer " + session . Token )
2020-01-13 09:50:56 -05:00
handler . ServeHTTP ( resp , req )
assert . Equal ( t , http . StatusCreated , resp . Code )
2020-06-16 08:00:58 -04:00
waitForEvent ( true )
2020-01-13 09:50:56 -05:00
2021-08-13 07:12:16 -04:00
st , appErr := th . App . GetStatus ( th . BasicUser . Id )
require . Nil ( t , appErr )
2020-01-13 09:50:56 -05:00
assert . Equal ( t , "online" , st . Status )
}
2017-02-28 04:34:32 -05:00
func TestUpdatePost ( t * testing . T ) {
2020-02-10 13:31:41 -05:00
th := Setup ( t ) . InitBasic ( )
2017-10-02 04:50:56 -04:00
defer th . TearDown ( )
2021-08-13 07:12:16 -04:00
client := th . Client
2017-02-28 04:34:32 -05:00
channel := th . BasicChannel
2020-06-12 07:43:50 -04:00
th . App . Srv ( ) . SetLicense ( model . NewTestLicense ( ) )
2017-02-28 04:34:32 -05:00
2019-08-12 17:36:08 -04:00
fileIds := make ( [ ] string , 3 )
2021-08-13 07:12:16 -04:00
data , err2 := testutils . ReadTestFile ( "test.png" )
require . NoError ( t , err2 )
2019-08-12 17:36:08 -04:00
for i := 0 ; i < len ( fileIds ) ; i ++ {
2021-08-13 07:12:16 -04:00
fileResp , _ , err := client . UploadFile ( data , channel . Id , "test.png" )
require . NoError ( t , err )
2019-08-12 17:36:08 -04:00
fileIds [ i ] = fileResp . FileInfos [ 0 ] . Id
2017-02-28 04:34:32 -05:00
}
2021-05-11 06:00:44 -04:00
rpost , appErr := th . App . CreatePost ( th . Context , & model . Post {
2019-08-12 17:36:08 -04:00
UserId : th . BasicUser . Id ,
ChannelId : channel . Id ,
Message : "zz" + model . NewId ( ) + "a" ,
FileIds : fileIds ,
2020-05-27 08:05:02 -04:00
} , channel , false , true )
2021-02-17 03:52:18 -05:00
require . Nil ( t , appErr )
2019-08-12 17:36:08 -04:00
assert . Equal ( t , rpost . Message , rpost . Message , "full name didn't match" )
assert . EqualValues ( t , 0 , rpost . EditAt , "Newly created post shouldn't have EditAt set" )
assert . Equal ( t , model . StringArray ( fileIds ) , rpost . FileIds , "FileIds should have been set" )
t . Run ( "same message, fewer files" , func ( t * testing . T ) {
msg := "zz" + model . NewId ( ) + " update post"
rpost . Message = msg
rpost . UserId = ""
2021-08-13 07:12:16 -04:00
rupost , _ , err := client . UpdatePost ( rpost . Id , & model . Post {
2019-08-12 17:36:08 -04:00
Id : rpost . Id ,
Message : rpost . Message ,
FileIds : fileIds [ 0 : 2 ] , // one fewer file id
} )
2021-08-13 07:12:16 -04:00
require . NoError ( t , err )
2017-02-28 04:34:32 -05:00
2019-08-12 17:36:08 -04:00
assert . Equal ( t , rupost . Message , msg , "failed to updates" )
assert . NotEqual ( t , 0 , rupost . EditAt , "EditAt not updated for post" )
assert . Equal ( t , model . StringArray ( fileIds ) , rupost . FileIds , "FileIds should have not have been updated" )
2017-06-26 16:05:50 -04:00
2021-08-13 07:12:16 -04:00
actual , _ , err := client . GetPost ( rpost . Id , "" )
require . NoError ( t , err )
2017-02-28 04:34:32 -05:00
2019-08-12 17:36:08 -04:00
assert . Equal ( t , actual . Message , msg , "failed to updates" )
assert . NotEqual ( t , 0 , actual . EditAt , "EditAt not updated for post" )
assert . Equal ( t , model . StringArray ( fileIds ) , actual . FileIds , "FileIds should have not have been updated" )
} )
2017-02-28 04:34:32 -05:00
2019-08-12 17:36:08 -04:00
t . Run ( "new message, invalid props" , func ( t * testing . T ) {
msg1 := "#hashtag a" + model . NewId ( ) + " update post again"
rpost . Message = msg1
2021-07-12 14:05:36 -04:00
rpost . AddProp ( model . PropsAddChannelMember , "no good" )
2021-08-13 07:12:16 -04:00
rrupost , _ , err := client . UpdatePost ( rpost . Id , rpost )
require . NoError ( t , err )
2017-02-28 04:34:32 -05:00
2019-08-12 17:36:08 -04:00
assert . Equal ( t , msg1 , rrupost . Message , "failed to update message" )
assert . Equal ( t , "#hashtag" , rrupost . Hashtags , "failed to update hashtags" )
2021-07-12 14:05:36 -04:00
assert . Nil ( t , rrupost . GetProp ( model . PropsAddChannelMember ) , "failed to sanitize Props['add_channel_member'], should be nil" )
2017-02-28 04:34:32 -05:00
2021-08-13 07:12:16 -04:00
actual , _ , err := client . GetPost ( rpost . Id , "" )
require . NoError ( t , err )
2017-10-20 13:38:26 -04:00
2019-08-12 17:36:08 -04:00
assert . Equal ( t , msg1 , actual . Message , "failed to update message" )
assert . Equal ( t , "#hashtag" , actual . Hashtags , "failed to update hashtags" )
2021-07-12 14:05:36 -04:00
assert . Nil ( t , actual . GetProp ( model . PropsAddChannelMember ) , "failed to sanitize Props['add_channel_member'], should be nil" )
2019-08-12 17:36:08 -04:00
} )
2017-02-28 04:34:32 -05:00
2019-08-12 17:36:08 -04:00
t . Run ( "join/leave post" , func ( t * testing . T ) {
2021-08-13 07:12:16 -04:00
var rpost2 * model . Post
rpost2 , appErr = th . App . CreatePost ( th . Context , & model . Post {
2019-08-12 17:36:08 -04:00
ChannelId : channel . Id ,
Message : "zz" + model . NewId ( ) + "a" ,
2021-07-12 14:05:36 -04:00
Type : model . PostTypeJoinLeave ,
2019-08-12 17:36:08 -04:00
UserId : th . BasicUser . Id ,
2020-05-27 08:05:02 -04:00
} , channel , false , true )
2021-08-13 07:12:16 -04:00
require . Nil ( t , appErr )
2017-02-28 04:34:32 -05:00
2019-08-12 17:36:08 -04:00
up2 := & model . Post {
Id : rpost2 . Id ,
ChannelId : channel . Id ,
Message : "zz" + model . NewId ( ) + " update post 2" ,
}
2021-08-13 07:12:16 -04:00
_ , resp , err := client . UpdatePost ( rpost2 . Id , up2 )
require . Error ( t , err )
2019-08-12 17:36:08 -04:00
CheckBadRequestStatus ( t , resp )
} )
2019-04-04 14:01:21 -04:00
2021-05-11 06:00:44 -04:00
rpost3 , appErr := th . App . CreatePost ( th . Context , & model . Post {
2019-08-12 17:36:08 -04:00
ChannelId : channel . Id ,
Message : "zz" + model . NewId ( ) + "a" ,
UserId : th . BasicUser . Id ,
2020-05-27 08:05:02 -04:00
} , channel , false , true )
2021-02-17 03:52:18 -05:00
require . Nil ( t , appErr )
2019-08-12 17:36:08 -04:00
t . Run ( "new message, add files" , func ( t * testing . T ) {
up3 := & model . Post {
Id : rpost3 . Id ,
ChannelId : channel . Id ,
Message : "zz" + model . NewId ( ) + " update post 3" ,
FileIds : fileIds [ 0 : 2 ] ,
}
2021-08-13 07:12:16 -04:00
rrupost3 , _ , err := client . UpdatePost ( rpost3 . Id , up3 )
require . NoError ( t , err )
2019-08-12 17:36:08 -04:00
assert . Empty ( t , rrupost3 . FileIds )
2019-04-04 14:01:21 -04:00
2021-08-13 07:12:16 -04:00
actual , _ , err := client . GetPost ( rpost . Id , "" )
require . NoError ( t , err )
2019-08-12 17:36:08 -04:00
assert . Equal ( t , model . StringArray ( fileIds ) , actual . FileIds )
2019-04-04 14:01:21 -04:00
} )
2019-08-12 17:36:08 -04:00
t . Run ( "add slack attachments" , func ( t * testing . T ) {
up4 := & model . Post {
Id : rpost3 . Id ,
ChannelId : channel . Id ,
Message : "zz" + model . NewId ( ) + " update post 3" ,
}
up4 . AddProp ( "attachments" , [ ] model . SlackAttachment {
{
Text : "Hello World" ,
} ,
} )
2021-08-13 07:12:16 -04:00
rrupost3 , _ , err := client . UpdatePost ( rpost3 . Id , up4 )
require . NoError ( t , err )
2019-08-12 17:36:08 -04:00
assert . NotEqual ( t , rpost3 . EditAt , rrupost3 . EditAt )
assert . NotEqual ( t , rpost3 . Attachments ( ) , rrupost3 . Attachments ( ) )
} )
2017-04-04 15:17:47 -04:00
2019-08-12 17:36:08 -04:00
t . Run ( "logged out" , func ( t * testing . T ) {
2021-08-13 07:12:16 -04:00
client . Logout ( )
_ , resp , err := client . UpdatePost ( rpost . Id , rpost )
require . Error ( t , err )
2019-08-12 17:36:08 -04:00
CheckUnauthorizedStatus ( t , resp )
} )
2017-04-04 15:17:47 -04:00
2019-08-12 17:36:08 -04:00
t . Run ( "different user" , func ( t * testing . T ) {
th . LoginBasic2 ( )
2021-08-13 07:12:16 -04:00
_ , resp , err := client . UpdatePost ( rpost . Id , rpost )
require . Error ( t , err )
2019-08-12 17:36:08 -04:00
CheckForbiddenStatus ( t , resp )
2017-04-04 15:17:47 -04:00
2021-08-13 07:12:16 -04:00
client . Logout ( )
2019-08-12 17:36:08 -04:00
} )
2018-09-24 09:35:39 -04:00
2019-08-12 17:36:08 -04:00
t . Run ( "different user, but team admin" , func ( t * testing . T ) {
th . LoginTeamAdmin ( )
2021-08-13 07:12:16 -04:00
_ , resp , err := client . UpdatePost ( rpost . Id , rpost )
require . Error ( t , err )
2019-08-12 17:36:08 -04:00
CheckForbiddenStatus ( t , resp )
2018-09-24 09:35:39 -04:00
2021-08-13 07:12:16 -04:00
client . Logout ( )
2019-08-12 17:36:08 -04:00
} )
t . Run ( "different user, but system admin" , func ( t * testing . T ) {
2021-08-13 07:12:16 -04:00
_ , _ , err := th . SystemAdminClient . UpdatePost ( rpost . Id , rpost )
require . NoError ( t , err )
2019-08-12 17:36:08 -04:00
} )
2017-02-28 04:34:32 -05:00
}
2018-09-27 15:15:47 -04:00
func TestUpdateOthersPostInDirectMessageChannel ( t * testing . T ) {
// This test checks that a sysadmin with the "EDIT_OTHERS_POSTS" permission can edit someone else's post in a
// channel without a team (DM/GM). This indirectly checks for the proper cascading all the way to system-wide roles
// on the user object of permissions based on a post in a channel with no team ID.
2020-02-10 13:31:41 -05:00
th := Setup ( t ) . InitBasic ( )
2018-09-27 15:15:47 -04:00
defer th . TearDown ( )
dmChannel := th . CreateDmChannel ( th . SystemAdminUser )
post := & model . Post {
Message : "asd" ,
ChannelId : dmChannel . Id ,
PendingPostId : model . NewId ( ) + ":" + fmt . Sprint ( model . GetMillis ( ) ) ,
UserId : th . BasicUser . Id ,
CreateAt : 0 ,
}
2021-08-13 07:12:16 -04:00
post , _ , err := th . Client . CreatePost ( post )
require . NoError ( t , err )
2018-09-27 15:15:47 -04:00
post . Message = "changed"
2021-08-13 07:12:16 -04:00
_ , _ , err = th . SystemAdminClient . UpdatePost ( post . Id , post )
require . NoError ( t , err )
2018-09-27 15:15:47 -04:00
}
2017-03-29 11:06:51 -04:00
func TestPatchPost ( t * testing . T ) {
2020-02-10 13:31:41 -05:00
th := Setup ( t ) . InitBasic ( )
2017-10-02 04:50:56 -04:00
defer th . TearDown ( )
2021-08-13 07:12:16 -04:00
client := th . Client
2017-03-29 11:06:51 -04:00
channel := th . BasicChannel
2020-06-12 07:43:50 -04:00
th . App . Srv ( ) . SetLicense ( model . NewTestLicense ( ) )
2017-03-29 11:06:51 -04:00
2021-07-21 03:45:29 -04:00
fileIDs := make ( [ ] string , 3 )
2021-08-13 07:12:16 -04:00
data , err2 := testutils . ReadTestFile ( "test.png" )
require . NoError ( t , err2 )
2021-07-21 03:45:29 -04:00
for i := 0 ; i < len ( fileIDs ) ; i ++ {
2021-08-13 07:12:16 -04:00
fileResp , _ , err := client . UploadFile ( data , channel . Id , "test.png" )
require . NoError ( t , err )
2021-07-21 03:45:29 -04:00
fileIDs [ i ] = fileResp . FileInfos [ 0 ] . Id
2019-08-12 17:36:08 -04:00
}
2021-07-21 03:45:29 -04:00
sort . Strings ( fileIDs )
2019-08-12 17:36:08 -04:00
2017-03-29 11:06:51 -04:00
post := & model . Post {
ChannelId : channel . Id ,
IsPinned : true ,
Message : "#hashtag a message" ,
Props : model . StringInterface { "channel_header" : "old_header" } ,
2021-07-21 03:45:29 -04:00
FileIds : fileIDs [ 0 : 2 ] ,
2017-03-29 11:06:51 -04:00
HasReactions : true ,
}
2021-08-13 07:12:16 -04:00
post , _ , err := client . CreatePost ( post )
require . NoError ( t , err )
2017-03-29 11:06:51 -04:00
2019-08-12 17:36:08 -04:00
var rpost * model . Post
t . Run ( "new message, props, files, HasReactions bit" , func ( t * testing . T ) {
patch := & model . PostPatch { }
2017-03-29 11:06:51 -04:00
2019-08-12 17:36:08 -04:00
patch . IsPinned = model . NewBool ( false )
patch . Message = model . NewString ( "#otherhashtag other message" )
patch . Props = & model . StringInterface { "channel_header" : "new_header" }
2021-07-21 03:45:29 -04:00
patchFileIds := model . StringArray ( fileIDs ) // one extra file
2019-08-12 17:36:08 -04:00
patch . FileIds = & patchFileIds
patch . HasReactions = model . NewBool ( false )
2017-03-29 11:06:51 -04:00
2021-08-13 07:12:16 -04:00
rpost , _ , err = client . PatchPost ( post . Id , patch )
require . NoError ( t , err )
2017-03-29 11:06:51 -04:00
2019-08-12 17:36:08 -04:00
assert . False ( t , rpost . IsPinned , "IsPinned did not update properly" )
assert . Equal ( t , "#otherhashtag other message" , rpost . Message , "Message did not update properly" )
2020-03-13 16:12:20 -04:00
assert . Equal ( t , * patch . Props , rpost . GetProps ( ) , "Props did not update properly" )
2019-08-12 17:36:08 -04:00
assert . Equal ( t , "#otherhashtag" , rpost . Hashtags , "Message did not update properly" )
2021-07-21 03:45:29 -04:00
assert . Equal ( t , model . StringArray ( fileIDs [ 0 : 2 ] ) , rpost . FileIds , "FileIds should not update" )
2019-08-12 17:36:08 -04:00
assert . False ( t , rpost . HasReactions , "HasReactions did not update properly" )
} )
2017-03-29 11:06:51 -04:00
2019-08-12 17:36:08 -04:00
t . Run ( "add slack attachments" , func ( t * testing . T ) {
patch2 := & model . PostPatch { }
attachments := [ ] model . SlackAttachment {
{
Text : "Hello World" ,
} ,
}
patch2 . Props = & model . StringInterface { "attachments" : attachments }
2019-04-04 14:01:21 -04:00
2021-08-13 07:12:16 -04:00
rpost2 , _ , err := client . PatchPost ( post . Id , patch2 )
require . NoError ( t , err )
2020-03-13 16:12:20 -04:00
assert . NotEmpty ( t , rpost2 . GetProp ( "attachments" ) )
2019-08-12 17:36:08 -04:00
assert . NotEqual ( t , rpost . EditAt , rpost2 . EditAt )
} )
2019-04-04 14:01:21 -04:00
2019-08-12 17:36:08 -04:00
t . Run ( "invalid requests" , func ( t * testing . T ) {
2021-08-16 13:46:44 -04:00
r , err := client . DoAPIPut ( "/posts/" + post . Id + "/patch" , "garbage" )
2020-03-04 14:14:23 -05:00
require . EqualError ( t , err , ": Invalid or missing post in request body., " )
2019-08-12 17:36:08 -04:00
require . Equal ( t , http . StatusBadRequest , r . StatusCode , "wrong status code" )
2017-03-29 11:06:51 -04:00
2019-08-12 17:36:08 -04:00
patch := & model . PostPatch { }
2021-08-13 07:12:16 -04:00
_ , resp , err := client . PatchPost ( "junk" , patch )
require . Error ( t , err )
2019-08-12 17:36:08 -04:00
CheckBadRequestStatus ( t , resp )
} )
2017-03-29 11:06:51 -04:00
2019-08-12 17:36:08 -04:00
t . Run ( "unknown post" , func ( t * testing . T ) {
patch := & model . PostPatch { }
2021-08-13 07:12:16 -04:00
_ , resp , err := client . PatchPost ( GenerateTestId ( ) , patch )
require . Error ( t , err )
2019-08-12 17:36:08 -04:00
CheckForbiddenStatus ( t , resp )
} )
2017-03-29 11:06:51 -04:00
2019-08-12 17:36:08 -04:00
t . Run ( "logged out" , func ( t * testing . T ) {
2021-08-13 07:12:16 -04:00
client . Logout ( )
2019-08-12 17:36:08 -04:00
patch := & model . PostPatch { }
2021-08-13 07:12:16 -04:00
_ , resp , err := client . PatchPost ( post . Id , patch )
require . Error ( t , err )
2019-08-12 17:36:08 -04:00
CheckUnauthorizedStatus ( t , resp )
} )
2017-03-29 11:06:51 -04:00
2019-08-12 17:36:08 -04:00
t . Run ( "different user" , func ( t * testing . T ) {
th . LoginBasic2 ( )
patch := & model . PostPatch { }
2021-08-13 07:12:16 -04:00
_ , resp , err := client . PatchPost ( post . Id , patch )
require . Error ( t , err )
2019-08-12 17:36:08 -04:00
CheckForbiddenStatus ( t , resp )
} )
2017-04-04 15:17:47 -04:00
2019-08-12 17:36:08 -04:00
t . Run ( "different user, but team admin" , func ( t * testing . T ) {
th . LoginTeamAdmin ( )
patch := & model . PostPatch { }
2021-08-13 07:12:16 -04:00
_ , resp , err := client . PatchPost ( post . Id , patch )
require . Error ( t , err )
2019-08-12 17:36:08 -04:00
CheckForbiddenStatus ( t , resp )
} )
2017-03-29 11:06:51 -04:00
2019-08-12 17:36:08 -04:00
t . Run ( "different user, but system admin" , func ( t * testing . T ) {
patch := & model . PostPatch { }
2021-08-13 07:12:16 -04:00
_ , _ , err := th . SystemAdminClient . PatchPost ( post . Id , patch )
require . NoError ( t , err )
2019-08-12 17:36:08 -04:00
} )
2020-06-23 16:08:55 -04:00
t . Run ( "edit others posts permission can function independently of edit own post" , func ( t * testing . T ) {
th . LoginBasic2 ( )
patch := & model . PostPatch { }
2021-08-13 07:12:16 -04:00
_ , resp , err := client . PatchPost ( post . Id , patch )
require . Error ( t , err )
2020-06-23 16:08:55 -04:00
CheckForbiddenStatus ( t , resp )
// Add permission to edit others'
defer th . RestoreDefaultRolePermissions ( th . SaveDefaultRolePermissions ( ) )
2021-07-12 14:05:36 -04:00
th . RemovePermissionFromRole ( model . PermissionEditPost . Id , model . ChannelUserRoleId )
th . AddPermissionToRole ( model . PermissionEditOthersPosts . Id , model . ChannelUserRoleId )
2020-06-23 16:08:55 -04:00
2021-08-13 07:12:16 -04:00
_ , _ , err = client . PatchPost ( post . Id , patch )
require . NoError ( t , err )
2020-06-23 16:08:55 -04:00
} )
2017-03-29 11:06:51 -04:00
}
2017-03-31 09:58:47 -04:00
func TestPinPost ( t * testing . T ) {
2020-02-10 13:31:41 -05:00
th := Setup ( t ) . InitBasic ( )
2017-10-02 04:50:56 -04:00
defer th . TearDown ( )
2021-08-13 07:12:16 -04:00
client := th . Client
2017-03-31 09:58:47 -04:00
post := th . BasicPost
2021-08-13 07:12:16 -04:00
_ , err := client . PinPost ( post . Id )
require . NoError ( t , err )
2017-03-31 09:58:47 -04:00
2021-08-13 07:12:16 -04:00
rpost , appErr := th . App . GetSinglePost ( post . Id )
require . Nil ( t , appErr )
2019-11-28 17:41:51 -05:00
require . True ( t , rpost . IsPinned , "failed to pin post" )
2017-03-31 09:58:47 -04:00
2021-08-13 07:12:16 -04:00
resp , err := client . PinPost ( "junk" )
require . Error ( t , err )
2017-03-31 09:58:47 -04:00
CheckBadRequestStatus ( t , resp )
2021-08-13 07:12:16 -04:00
resp , err = client . PinPost ( GenerateTestId ( ) )
require . Error ( t , err )
2017-03-31 09:58:47 -04:00
CheckForbiddenStatus ( t , resp )
2021-08-13 07:12:16 -04:00
client . Logout ( )
resp , err = client . PinPost ( post . Id )
require . Error ( t , err )
2017-03-31 09:58:47 -04:00
CheckUnauthorizedStatus ( t , resp )
2021-08-13 07:12:16 -04:00
_ , err = th . SystemAdminClient . PinPost ( post . Id )
require . NoError ( t , err )
2017-03-31 09:58:47 -04:00
}
func TestUnpinPost ( t * testing . T ) {
2020-02-10 13:31:41 -05:00
th := Setup ( t ) . InitBasic ( )
2017-10-02 04:50:56 -04:00
defer th . TearDown ( )
2021-08-13 07:12:16 -04:00
client := th . Client
2017-03-31 09:58:47 -04:00
pinnedPost := th . CreatePinnedPost ( )
2021-08-13 07:12:16 -04:00
_ , err := client . UnpinPost ( pinnedPost . Id )
require . NoError ( t , err )
2017-03-31 09:58:47 -04:00
2021-08-13 07:12:16 -04:00
rpost , appErr := th . App . GetSinglePost ( pinnedPost . Id )
require . Nil ( t , appErr )
2019-11-28 17:41:51 -05:00
require . False ( t , rpost . IsPinned )
2017-03-31 09:58:47 -04:00
2021-08-13 07:12:16 -04:00
resp , err := client . UnpinPost ( "junk" )
require . Error ( t , err )
2017-03-31 09:58:47 -04:00
CheckBadRequestStatus ( t , resp )
2021-08-13 07:12:16 -04:00
resp , err = client . UnpinPost ( GenerateTestId ( ) )
require . Error ( t , err )
2017-03-31 09:58:47 -04:00
CheckForbiddenStatus ( t , resp )
2021-08-13 07:12:16 -04:00
client . Logout ( )
resp , err = client . UnpinPost ( pinnedPost . Id )
require . Error ( t , err )
2017-03-31 09:58:47 -04:00
CheckUnauthorizedStatus ( t , resp )
2021-08-13 07:12:16 -04:00
_ , err = th . SystemAdminClient . UnpinPost ( pinnedPost . Id )
require . NoError ( t , err )
2017-03-31 09:58:47 -04:00
}
2017-02-13 10:52:50 -05:00
func TestGetPostsForChannel ( t * testing . T ) {
2020-02-10 13:31:41 -05:00
th := Setup ( t ) . InitBasic ( )
2017-10-02 04:50:56 -04:00
defer th . TearDown ( )
2021-08-13 07:12:16 -04:00
client := th . Client
2017-02-13 10:52:50 -05:00
post1 := th . CreatePost ( )
post2 := th . CreatePost ( )
2017-06-19 12:08:52 -04:00
post3 := & model . Post { ChannelId : th . BasicChannel . Id , Message : "zz" + model . NewId ( ) + "a" , RootId : post1 . Id }
2021-08-13 07:12:16 -04:00
post3 , _ , _ = client . CreatePost ( post3 )
2017-03-24 16:46:11 -04:00
2017-06-20 17:05:13 -04:00
time . Sleep ( 300 * time . Millisecond )
since := model . GetMillis ( )
time . Sleep ( 300 * time . Millisecond )
2017-03-24 16:46:11 -04:00
post4 := th . CreatePost ( )
2017-02-13 10:52:50 -05:00
2020-06-22 04:36:37 -04:00
th . TestForAllClients ( t , func ( t * testing . T , c * model . Client4 ) {
2021-08-13 07:12:16 -04:00
posts , resp , err := c . GetPostsForChannel ( th . BasicChannel . Id , 0 , 60 , "" , false )
require . NoError ( t , err )
2020-06-22 04:36:37 -04:00
require . Equal ( t , post4 . Id , posts . Order [ 0 ] , "wrong order" )
require . Equal ( t , post3 . Id , posts . Order [ 1 ] , "wrong order" )
require . Equal ( t , post2 . Id , posts . Order [ 2 ] , "wrong order" )
require . Equal ( t , post1 . Id , posts . Order [ 3 ] , "wrong order" )
2017-02-13 10:52:50 -05:00
2021-08-13 07:12:16 -04:00
posts , resp , _ = c . GetPostsForChannel ( th . BasicChannel . Id , 0 , 3 , resp . Etag , false )
2020-06-22 04:36:37 -04:00
CheckEtag ( t , posts , resp )
2017-02-13 10:52:50 -05:00
2021-08-13 07:12:16 -04:00
posts , _ , err = c . GetPostsForChannel ( th . BasicChannel . Id , 0 , 3 , "" , false )
require . NoError ( t , err )
2020-06-22 04:36:37 -04:00
require . Len ( t , posts . Order , 3 , "wrong number returned" )
2017-02-13 10:52:50 -05:00
2020-06-22 04:36:37 -04:00
_ , ok := posts . Posts [ post3 . Id ]
require . True ( t , ok , "missing comment" )
_ , ok = posts . Posts [ post1 . Id ]
require . True ( t , ok , "missing root post" )
2017-02-13 10:52:50 -05:00
2021-08-13 07:12:16 -04:00
posts , _ , err = c . GetPostsForChannel ( th . BasicChannel . Id , 1 , 1 , "" , false )
require . NoError ( t , err )
2020-06-22 04:36:37 -04:00
require . Equal ( t , post3 . Id , posts . Order [ 0 ] , "wrong order" )
2017-02-13 10:52:50 -05:00
2021-08-13 07:12:16 -04:00
posts , _ , err = c . GetPostsForChannel ( th . BasicChannel . Id , 10000 , 10000 , "" , false )
require . NoError ( t , err )
2020-06-22 04:36:37 -04:00
require . Empty ( t , posts . Order , "should be no posts" )
} )
2017-02-13 10:52:50 -05:00
2017-03-24 16:46:11 -04:00
post5 := th . CreatePost ( )
2020-06-22 04:36:37 -04:00
th . TestForAllClients ( t , func ( t * testing . T , c * model . Client4 ) {
2021-08-13 07:12:16 -04:00
posts , _ , err := c . GetPostsSince ( th . BasicChannel . Id , since , false )
require . NoError ( t , err )
2020-06-22 04:36:37 -04:00
require . Len ( t , posts . Posts , 2 , "should return 2 posts" )
2017-03-24 16:46:11 -04:00
2020-06-22 04:36:37 -04:00
// "since" query to return empty NextPostId and PrevPostId
require . Equal ( t , "" , posts . NextPostId , "should return an empty NextPostId" )
require . Equal ( t , "" , posts . PrevPostId , "should return an empty PrevPostId" )
2017-05-15 11:44:04 -04:00
2020-06-22 04:36:37 -04:00
found := make ( [ ] bool , 2 )
for _ , p := range posts . Posts {
require . LessOrEqual ( t , since , p . CreateAt , "bad create at for post returned" )
2019-11-28 17:41:51 -05:00
2020-06-22 04:36:37 -04:00
if p . Id == post4 . Id {
found [ 0 ] = true
} else if p . Id == post5 . Id {
found [ 1 ] = true
}
}
for _ , f := range found {
require . True ( t , f , "missing post" )
2017-03-24 16:46:11 -04:00
}
2021-08-13 07:12:16 -04:00
_ , resp , err := c . GetPostsForChannel ( "" , 0 , 60 , "" , false )
require . Error ( t , err )
2020-06-22 04:36:37 -04:00
CheckBadRequestStatus ( t , resp )
2017-02-13 10:52:50 -05:00
2021-08-13 07:12:16 -04:00
_ , resp , err = c . GetPostsForChannel ( "junk" , 0 , 60 , "" , false )
require . Error ( t , err )
2020-06-22 04:36:37 -04:00
CheckBadRequestStatus ( t , resp )
} )
2017-02-13 10:52:50 -05:00
2021-08-13 07:12:16 -04:00
_ , resp , err := client . GetPostsForChannel ( model . NewId ( ) , 0 , 60 , "" , false )
require . Error ( t , err )
2017-02-13 10:52:50 -05:00
CheckForbiddenStatus ( t , resp )
2021-08-13 07:12:16 -04:00
client . Logout ( )
_ , resp , err = client . GetPostsForChannel ( model . NewId ( ) , 0 , 60 , "" , false )
require . Error ( t , err )
2017-02-13 10:52:50 -05:00
CheckUnauthorizedStatus ( t , resp )
2019-07-03 17:23:04 -04:00
// more tests for next_post_id, prev_post_id, and order
// There are 12 posts composed of first 2 system messages and 10 created posts
2021-08-13 07:12:16 -04:00
client . Login ( th . BasicUser . Email , th . BasicUser . Password )
2019-07-03 17:23:04 -04:00
th . CreatePost ( ) // post6
post7 := th . CreatePost ( )
post8 := th . CreatePost ( )
th . CreatePost ( ) // post9
post10 := th . CreatePost ( )
2020-06-22 04:36:37 -04:00
var posts * model . PostList
th . TestForAllClients ( t , func ( t * testing . T , c * model . Client4 ) {
// get the system post IDs posted before the created posts above
2021-08-13 07:12:16 -04:00
posts , _ , err = c . GetPostsBefore ( th . BasicChannel . Id , post1 . Id , 0 , 2 , "" , false )
require . NoError ( t , err )
2020-06-22 04:36:37 -04:00
systemPostId1 := posts . Order [ 1 ]
2019-07-03 17:23:04 -04:00
2020-06-22 04:36:37 -04:00
// similar to '/posts'
2021-08-13 07:12:16 -04:00
posts , _ , err = c . GetPostsForChannel ( th . BasicChannel . Id , 0 , 60 , "" , false )
require . NoError ( t , err )
2020-06-22 04:36:37 -04:00
require . Len ( t , posts . Order , 12 , "expected 12 posts" )
require . Equal ( t , post10 . Id , posts . Order [ 0 ] , "posts not in order" )
require . Equal ( t , systemPostId1 , posts . Order [ 11 ] , "posts not in order" )
require . Equal ( t , "" , posts . NextPostId , "should return an empty NextPostId" )
require . Equal ( t , "" , posts . PrevPostId , "should return an empty PrevPostId" )
// similar to '/posts?per_page=3'
2021-08-13 07:12:16 -04:00
posts , _ , err = c . GetPostsForChannel ( th . BasicChannel . Id , 0 , 3 , "" , false )
require . NoError ( t , err )
2020-06-22 04:36:37 -04:00
require . Len ( t , posts . Order , 3 , "expected 3 posts" )
require . Equal ( t , post10 . Id , posts . Order [ 0 ] , "posts not in order" )
require . Equal ( t , post8 . Id , posts . Order [ 2 ] , "should return 3 posts and match order" )
require . Equal ( t , "" , posts . NextPostId , "should return an empty NextPostId" )
require . Equal ( t , post7 . Id , posts . PrevPostId , "should return post7.Id as PrevPostId" )
// similar to '/posts?per_page=3&page=1'
2021-08-13 07:12:16 -04:00
posts , _ , err = c . GetPostsForChannel ( th . BasicChannel . Id , 1 , 3 , "" , false )
require . NoError ( t , err )
2020-06-22 04:36:37 -04:00
require . Len ( t , posts . Order , 3 , "expected 3 posts" )
require . Equal ( t , post7 . Id , posts . Order [ 0 ] , "posts not in order" )
require . Equal ( t , post5 . Id , posts . Order [ 2 ] , "posts not in order" )
require . Equal ( t , post8 . Id , posts . NextPostId , "should return post8.Id as NextPostId" )
require . Equal ( t , post4 . Id , posts . PrevPostId , "should return post4.Id as PrevPostId" )
// similar to '/posts?per_page=3&page=2'
2021-08-13 07:12:16 -04:00
posts , _ , err = c . GetPostsForChannel ( th . BasicChannel . Id , 2 , 3 , "" , false )
require . NoError ( t , err )
2020-06-22 04:36:37 -04:00
require . Len ( t , posts . Order , 3 , "expected 3 posts" )
require . Equal ( t , post4 . Id , posts . Order [ 0 ] , "posts not in order" )
require . Equal ( t , post2 . Id , posts . Order [ 2 ] , "should return 3 posts and match order" )
require . Equal ( t , post5 . Id , posts . NextPostId , "should return post5.Id as NextPostId" )
require . Equal ( t , post1 . Id , posts . PrevPostId , "should return post1.Id as PrevPostId" )
// similar to '/posts?per_page=3&page=3'
2021-08-13 07:12:16 -04:00
posts , _ , err = c . GetPostsForChannel ( th . BasicChannel . Id , 3 , 3 , "" , false )
require . NoError ( t , err )
2020-06-22 04:36:37 -04:00
require . Len ( t , posts . Order , 3 , "expected 3 posts" )
require . Equal ( t , post1 . Id , posts . Order [ 0 ] , "posts not in order" )
require . Equal ( t , systemPostId1 , posts . Order [ 2 ] , "should return 3 posts and match order" )
require . Equal ( t , post2 . Id , posts . NextPostId , "should return post2.Id as NextPostId" )
require . Equal ( t , "" , posts . PrevPostId , "should return an empty PrevPostId" )
// similar to '/posts?per_page=3&page=4'
2021-08-13 07:12:16 -04:00
posts , _ , err = c . GetPostsForChannel ( th . BasicChannel . Id , 4 , 3 , "" , false )
require . NoError ( t , err )
2020-06-22 04:36:37 -04:00
require . Empty ( t , posts . Order , "should return 0 post" )
require . Equal ( t , "" , posts . NextPostId , "should return an empty NextPostId" )
require . Equal ( t , "" , posts . PrevPostId , "should return an empty PrevPostId" )
} )
2021-11-25 09:01:17 -05:00
th . TestForAllClients ( t , func ( t * testing . T , c * model . Client4 ) {
channel := th . CreatePublicChannel ( )
th . CreatePostWithClient ( th . SystemAdminClient , channel )
th . SystemAdminClient . DeleteChannel ( channel . Id )
experimentalViewArchivedChannels := * th . App . Config ( ) . TeamSettings . ExperimentalViewArchivedChannels
th . App . UpdateConfig ( func ( cfg * model . Config ) { * cfg . TeamSettings . ExperimentalViewArchivedChannels = true } )
defer th . App . UpdateConfig ( func ( cfg * model . Config ) {
* cfg . TeamSettings . ExperimentalViewArchivedChannels = experimentalViewArchivedChannels
} )
// the endpoint should work fine when viewing archived channels is enabled
_ , _ , err = c . GetPostsForChannel ( channel . Id , 0 , 10 , "" , false )
require . NoError ( t , err )
// the endpoint should return forbidden if viewing archived channels is disabled
th . App . UpdateConfig ( func ( cfg * model . Config ) { * cfg . TeamSettings . ExperimentalViewArchivedChannels = false } )
_ , resp , err = c . GetPostsForChannel ( channel . Id , 0 , 10 , "" , false )
require . Error ( t , err )
CheckForbiddenStatus ( t , resp )
} , "Should forbid to retrieve posts if the channel is archived and users are not allowed to view archived messages" )
2017-02-13 10:52:50 -05:00
}
2017-04-05 16:18:23 -04:00
func TestGetFlaggedPostsForUser ( t * testing . T ) {
2020-02-10 13:31:41 -05:00
th := Setup ( t ) . InitBasic ( )
2017-10-02 04:50:56 -04:00
defer th . TearDown ( )
2021-08-13 07:12:16 -04:00
client := th . Client
2017-04-05 16:18:23 -04:00
user := th . BasicUser
team1 := th . BasicTeam
channel1 := th . BasicChannel
post1 := th . CreatePost ( )
channel2 := th . CreatePublicChannel ( )
2021-08-13 07:12:16 -04:00
post2 := th . CreatePostWithClient ( client , channel2 )
2017-04-05 16:18:23 -04:00
preference := model . Preference {
UserId : user . Id ,
2021-07-12 14:05:36 -04:00
Category : model . PreferenceCategoryFlaggedPost ,
2017-04-05 16:18:23 -04:00
Name : post1 . Id ,
Value : "true" ,
}
2021-08-17 05:18:33 -04:00
_ , err := client . UpdatePreferences ( user . Id , model . Preferences { preference } )
2021-08-13 07:12:16 -04:00
require . NoError ( t , err )
2017-04-05 16:18:23 -04:00
preference . Name = post2 . Id
2021-08-17 05:18:33 -04:00
_ , err = client . UpdatePreferences ( user . Id , model . Preferences { preference } )
2021-08-13 07:12:16 -04:00
require . NoError ( t , err )
2017-04-05 16:18:23 -04:00
opl := model . NewPostList ( )
opl . AddPost ( post1 )
opl . AddOrder ( post1 . Id )
2021-08-13 07:12:16 -04:00
rpl , _ , err := client . GetFlaggedPostsForUserInChannel ( user . Id , channel1 . Id , 0 , 10 )
require . NoError ( t , err )
2017-04-05 16:18:23 -04:00
2019-11-28 17:41:51 -05:00
require . Len ( t , rpl . Posts , 1 , "should have returned 1 post" )
require . Equal ( t , opl . Posts , rpl . Posts , "posts should have matched" )
2017-04-05 16:18:23 -04:00
2021-08-13 07:12:16 -04:00
rpl , _ , err = client . GetFlaggedPostsForUserInChannel ( user . Id , channel1 . Id , 0 , 1 )
require . NoError ( t , err )
2019-11-28 17:41:51 -05:00
require . Len ( t , rpl . Posts , 1 , "should have returned 1 post" )
2017-04-05 16:18:23 -04:00
2021-08-13 07:12:16 -04:00
rpl , _ , err = client . GetFlaggedPostsForUserInChannel ( user . Id , channel1 . Id , 1 , 1 )
require . NoError ( t , err )
2019-12-22 06:35:31 -05:00
require . Empty ( t , rpl . Posts )
2017-04-05 16:18:23 -04:00
2021-08-13 07:12:16 -04:00
rpl , _ , err = client . GetFlaggedPostsForUserInChannel ( user . Id , GenerateTestId ( ) , 0 , 10 )
require . NoError ( t , err )
2019-12-22 06:35:31 -05:00
require . Empty ( t , rpl . Posts )
2017-04-05 16:18:23 -04:00
2021-08-13 07:12:16 -04:00
rpl , _ , err = client . GetFlaggedPostsForUserInChannel ( user . Id , "junk" , 0 , 10 )
require . Error ( t , err )
2019-11-28 17:41:51 -05:00
require . Nil ( t , rpl )
2017-04-05 16:18:23 -04:00
opl . AddPost ( post2 )
opl . AddOrder ( post2 . Id )
2021-08-13 07:12:16 -04:00
rpl , _ , err = client . GetFlaggedPostsForUserInTeam ( user . Id , team1 . Id , 0 , 10 )
require . NoError ( t , err )
2019-11-28 17:41:51 -05:00
require . Len ( t , rpl . Posts , 2 , "should have returned 2 posts" )
require . Equal ( t , opl . Posts , rpl . Posts , "posts should have matched" )
2017-04-05 16:18:23 -04:00
2021-08-13 07:12:16 -04:00
rpl , _ , err = client . GetFlaggedPostsForUserInTeam ( user . Id , team1 . Id , 0 , 1 )
require . NoError ( t , err )
2019-11-28 17:41:51 -05:00
require . Len ( t , rpl . Posts , 1 , "should have returned 1 post" )
2017-04-05 16:18:23 -04:00
2021-08-13 07:12:16 -04:00
rpl , _ , err = client . GetFlaggedPostsForUserInTeam ( user . Id , team1 . Id , 1 , 1 )
require . NoError ( t , err )
2019-11-28 17:41:51 -05:00
require . Len ( t , rpl . Posts , 1 , "should have returned 1 post" )
2017-04-05 16:18:23 -04:00
2021-08-13 07:12:16 -04:00
rpl , _ , err = client . GetFlaggedPostsForUserInTeam ( user . Id , team1 . Id , 1000 , 10 )
require . NoError ( t , err )
2019-12-22 06:35:31 -05:00
require . Empty ( t , rpl . Posts )
2017-04-05 16:18:23 -04:00
2021-08-13 07:12:16 -04:00
rpl , _ , err = client . GetFlaggedPostsForUserInTeam ( user . Id , GenerateTestId ( ) , 0 , 10 )
require . NoError ( t , err )
2019-12-22 06:35:31 -05:00
require . Empty ( t , rpl . Posts )
2017-04-05 16:18:23 -04:00
2021-08-13 07:12:16 -04:00
rpl , _ , err = client . GetFlaggedPostsForUserInTeam ( user . Id , "junk" , 0 , 10 )
require . Error ( t , err )
2019-11-28 17:41:51 -05:00
require . Nil ( t , rpl )
2017-04-05 16:18:23 -04:00
channel3 := th . CreatePrivateChannel ( )
2021-08-13 07:12:16 -04:00
post4 := th . CreatePostWithClient ( client , channel3 )
2017-04-05 16:18:23 -04:00
preference . Name = post4 . Id
2021-08-17 05:18:33 -04:00
client . UpdatePreferences ( user . Id , model . Preferences { preference } )
2017-04-05 16:18:23 -04:00
opl . AddPost ( post4 )
opl . AddOrder ( post4 . Id )
2021-08-13 07:12:16 -04:00
rpl , _ , err = client . GetFlaggedPostsForUser ( user . Id , 0 , 10 )
require . NoError ( t , err )
2019-11-28 17:41:51 -05:00
require . Len ( t , rpl . Posts , 3 , "should have returned 3 posts" )
require . Equal ( t , opl . Posts , rpl . Posts , "posts should have matched" )
2017-04-05 16:18:23 -04:00
2021-08-13 07:12:16 -04:00
rpl , _ , err = client . GetFlaggedPostsForUser ( user . Id , 0 , 2 )
require . NoError ( t , err )
2019-11-28 17:41:51 -05:00
require . Len ( t , rpl . Posts , 2 , "should have returned 2 posts" )
2017-04-05 16:18:23 -04:00
2021-08-13 07:12:16 -04:00
rpl , _ , err = client . GetFlaggedPostsForUser ( user . Id , 2 , 2 )
require . NoError ( t , err )
2019-11-28 17:41:51 -05:00
require . Len ( t , rpl . Posts , 1 , "should have returned 1 post" )
2017-04-05 16:18:23 -04:00
2021-08-13 07:12:16 -04:00
rpl , _ , err = client . GetFlaggedPostsForUser ( user . Id , 1000 , 10 )
require . NoError ( t , err )
2019-12-22 06:35:31 -05:00
require . Empty ( t , rpl . Posts )
2017-04-05 16:18:23 -04:00
2021-07-12 14:05:36 -04:00
channel4 := th . CreateChannelWithClient ( th . SystemAdminClient , model . ChannelTypePrivate )
2019-01-26 14:02:46 -05:00
post5 := th . CreatePostWithClient ( th . SystemAdminClient , channel4 )
preference . Name = post5 . Id
2021-08-17 05:18:33 -04:00
resp , err := client . UpdatePreferences ( user . Id , model . Preferences { preference } )
2021-08-13 07:12:16 -04:00
require . Error ( t , err )
2019-01-26 14:02:46 -05:00
CheckForbiddenStatus ( t , resp )
2021-08-13 07:12:16 -04:00
rpl , _ , err = client . GetFlaggedPostsForUser ( user . Id , 0 , 10 )
require . NoError ( t , err )
2019-11-28 17:41:51 -05:00
require . Len ( t , rpl . Posts , 3 , "should have returned 3 posts" )
require . Equal ( t , opl . Posts , rpl . Posts , "posts should have matched" )
2019-01-26 14:02:46 -05:00
th . AddUserToChannel ( user , channel4 )
2021-08-17 05:18:33 -04:00
_ , err = client . UpdatePreferences ( user . Id , model . Preferences { preference } )
2021-08-13 07:12:16 -04:00
require . NoError ( t , err )
2019-01-26 14:02:46 -05:00
2021-08-13 07:12:16 -04:00
rpl , _ , err = client . GetFlaggedPostsForUser ( user . Id , 0 , 10 )
require . NoError ( t , err )
2019-01-26 14:02:46 -05:00
opl . AddPost ( post5 )
opl . AddOrder ( post5 . Id )
2019-11-28 17:41:51 -05:00
require . Len ( t , rpl . Posts , 4 , "should have returned 4 posts" )
require . Equal ( t , opl . Posts , rpl . Posts , "posts should have matched" )
2019-01-26 14:02:46 -05:00
2021-08-13 07:12:16 -04:00
appErr := th . App . RemoveUserFromChannel ( th . Context , user . Id , "" , channel4 )
assert . Nil ( t , appErr , "unable to remove user from channel" )
2019-01-26 14:02:46 -05:00
2021-08-13 07:12:16 -04:00
rpl , _ , err = client . GetFlaggedPostsForUser ( user . Id , 0 , 10 )
require . NoError ( t , err )
2019-01-26 14:02:46 -05:00
opl2 := model . NewPostList ( )
opl2 . AddPost ( post1 )
opl2 . AddOrder ( post1 . Id )
opl2 . AddPost ( post2 )
opl2 . AddOrder ( post2 . Id )
opl2 . AddPost ( post4 )
opl2 . AddOrder ( post4 . Id )
2019-12-22 06:35:31 -05:00
require . Len ( t , rpl . Posts , 3 , "should have returned 3 posts" )
2019-11-28 17:41:51 -05:00
require . Equal ( t , opl2 . Posts , rpl . Posts , "posts should have matched" )
2019-01-26 14:02:46 -05:00
2021-08-13 07:12:16 -04:00
_ , resp , err = client . GetFlaggedPostsForUser ( "junk" , 0 , 10 )
require . Error ( t , err )
2017-04-05 16:18:23 -04:00
CheckBadRequestStatus ( t , resp )
2021-08-13 07:12:16 -04:00
_ , resp , err = client . GetFlaggedPostsForUser ( GenerateTestId ( ) , 0 , 10 )
require . Error ( t , err )
2017-04-05 16:18:23 -04:00
CheckForbiddenStatus ( t , resp )
2021-08-13 07:12:16 -04:00
client . Logout ( )
2017-04-05 16:18:23 -04:00
2021-08-13 07:12:16 -04:00
_ , resp , err = client . GetFlaggedPostsForUserInChannel ( user . Id , channel1 . Id , 0 , 10 )
require . Error ( t , err )
2017-04-05 16:18:23 -04:00
CheckUnauthorizedStatus ( t , resp )
2021-08-13 07:12:16 -04:00
_ , resp , err = client . GetFlaggedPostsForUserInTeam ( user . Id , team1 . Id , 0 , 10 )
require . Error ( t , err )
2017-04-05 16:18:23 -04:00
CheckUnauthorizedStatus ( t , resp )
2021-08-13 07:12:16 -04:00
_ , resp , err = client . GetFlaggedPostsForUser ( user . Id , 0 , 10 )
require . Error ( t , err )
2017-04-05 16:18:23 -04:00
CheckUnauthorizedStatus ( t , resp )
2021-08-13 07:12:16 -04:00
_ , _ , err = th . SystemAdminClient . GetFlaggedPostsForUserInChannel ( user . Id , channel1 . Id , 0 , 10 )
require . NoError ( t , err )
2017-04-05 16:18:23 -04:00
2021-08-13 07:12:16 -04:00
_ , _ , err = th . SystemAdminClient . GetFlaggedPostsForUserInTeam ( user . Id , team1 . Id , 0 , 10 )
require . NoError ( t , err )
2017-04-05 16:18:23 -04:00
2021-08-13 07:12:16 -04:00
_ , _ , err = th . SystemAdminClient . GetFlaggedPostsForUser ( user . Id , 0 , 10 )
require . NoError ( t , err )
2020-09-29 03:33:15 -04:00
mockStore := mocks . Store { }
mockPostStore := mocks . PostStore { }
mockPostStore . On ( "GetFlaggedPosts" , mock . AnythingOfType ( "string" ) , mock . AnythingOfType ( "int" ) , mock . AnythingOfType ( "int" ) ) . Return ( nil , errors . New ( "some-error" ) )
mockPostStore . On ( "ClearCaches" ) . Return ( )
mockStore . On ( "Team" ) . Return ( th . App . Srv ( ) . Store . Team ( ) )
mockStore . On ( "Channel" ) . Return ( th . App . Srv ( ) . Store . Channel ( ) )
mockStore . On ( "User" ) . Return ( th . App . Srv ( ) . Store . User ( ) )
mockStore . On ( "Scheme" ) . Return ( th . App . Srv ( ) . Store . Scheme ( ) )
mockStore . On ( "Post" ) . Return ( & mockPostStore )
mockStore . On ( "FileInfo" ) . Return ( th . App . Srv ( ) . Store . FileInfo ( ) )
mockStore . On ( "Webhook" ) . Return ( th . App . Srv ( ) . Store . Webhook ( ) )
mockStore . On ( "System" ) . Return ( th . App . Srv ( ) . Store . System ( ) )
mockStore . On ( "License" ) . Return ( th . App . Srv ( ) . Store . License ( ) )
mockStore . On ( "Role" ) . Return ( th . App . Srv ( ) . Store . Role ( ) )
mockStore . On ( "Close" ) . Return ( nil )
th . App . Srv ( ) . Store = & mockStore
2021-08-13 07:12:16 -04:00
_ , resp , err = th . SystemAdminClient . GetFlaggedPostsForUser ( user . Id , 0 , 10 )
require . Error ( t , err )
2020-09-29 03:33:15 -04:00
CheckInternalErrorStatus ( t , resp )
2017-04-05 16:18:23 -04:00
}
2019-07-03 17:23:04 -04:00
func TestGetPostsBefore ( t * testing . T ) {
2020-02-10 13:31:41 -05:00
th := Setup ( t ) . InitBasic ( )
2017-10-02 04:50:56 -04:00
defer th . TearDown ( )
2021-08-13 07:12:16 -04:00
client := th . Client
2017-03-24 16:46:11 -04:00
post1 := th . CreatePost ( )
post2 := th . CreatePost ( )
post3 := th . CreatePost ( )
post4 := th . CreatePost ( )
post5 := th . CreatePost ( )
2021-08-13 07:12:16 -04:00
posts , _ , err := client . GetPostsBefore ( th . BasicChannel . Id , post3 . Id , 0 , 100 , "" , false )
require . NoError ( t , err )
2017-03-24 16:46:11 -04:00
found := make ( [ ] bool , 2 )
for _ , p := range posts . Posts {
if p . Id == post1 . Id {
found [ 0 ] = true
} else if p . Id == post2 . Id {
found [ 1 ] = true
}
2019-11-28 17:41:51 -05:00
require . NotEqual ( t , post4 . Id , p . Id , "returned posts after" )
require . NotEqual ( t , post5 . Id , p . Id , "returned posts after" )
2017-03-24 16:46:11 -04:00
}
for _ , f := range found {
2019-11-28 17:41:51 -05:00
require . True ( t , f , "missing post" )
2017-03-24 16:46:11 -04:00
}
2019-11-28 17:41:51 -05:00
require . Equal ( t , post3 . Id , posts . NextPostId , "should match NextPostId" )
require . Equal ( t , "" , posts . PrevPostId , "should match empty PrevPostId" )
2019-07-03 17:23:04 -04:00
2021-08-13 07:12:16 -04:00
posts , _ , err = client . GetPostsBefore ( th . BasicChannel . Id , post4 . Id , 1 , 1 , "" , false )
require . NoError ( t , err )
2019-12-22 06:35:31 -05:00
require . Len ( t , posts . Posts , 1 , "too many posts returned" )
2019-11-28 17:41:51 -05:00
require . Equal ( t , post2 . Id , posts . Order [ 0 ] , "should match returned post" )
require . Equal ( t , post3 . Id , posts . NextPostId , "should match NextPostId" )
require . Equal ( t , post1 . Id , posts . PrevPostId , "should match PrevPostId" )
2017-03-24 16:46:11 -04:00
2021-08-13 07:12:16 -04:00
_ , resp , err := client . GetPostsBefore ( th . BasicChannel . Id , "junk" , 1 , 1 , "" , false )
require . Error ( t , err )
2019-07-03 17:23:04 -04:00
CheckBadRequestStatus ( t , resp )
2021-08-13 07:12:16 -04:00
posts , _ , err = client . GetPostsBefore ( th . BasicChannel . Id , post5 . Id , 0 , 3 , "" , false )
require . NoError ( t , err )
2019-12-22 06:35:31 -05:00
require . Len ( t , posts . Posts , 3 , "should match length of posts returned" )
2019-11-28 17:41:51 -05:00
require . Equal ( t , post4 . Id , posts . Order [ 0 ] , "should match returned post" )
require . Equal ( t , post2 . Id , posts . Order [ 2 ] , "should match returned post" )
require . Equal ( t , post5 . Id , posts . NextPostId , "should match NextPostId" )
require . Equal ( t , post1 . Id , posts . PrevPostId , "should match PrevPostId" )
2019-07-03 17:23:04 -04:00
// get the system post IDs posted before the created posts above
2021-08-13 07:12:16 -04:00
posts , _ , err = client . GetPostsBefore ( th . BasicChannel . Id , post1 . Id , 0 , 2 , "" , false )
require . NoError ( t , err )
2019-07-03 17:23:04 -04:00
systemPostId2 := posts . Order [ 0 ]
systemPostId1 := posts . Order [ 1 ]
2021-08-13 07:12:16 -04:00
posts , _ , err = client . GetPostsBefore ( th . BasicChannel . Id , post5 . Id , 1 , 3 , "" , false )
require . NoError ( t , err )
2019-12-22 06:35:31 -05:00
require . Len ( t , posts . Posts , 3 , "should match length of posts returned" )
2019-11-28 17:41:51 -05:00
require . Equal ( t , post1 . Id , posts . Order [ 0 ] , "should match returned post" )
require . Equal ( t , systemPostId2 , posts . Order [ 1 ] , "should match returned post" )
require . Equal ( t , systemPostId1 , posts . Order [ 2 ] , "should match returned post" )
require . Equal ( t , post2 . Id , posts . NextPostId , "should match NextPostId" )
require . Equal ( t , "" , posts . PrevPostId , "should return empty PrevPostId" )
2019-07-03 17:23:04 -04:00
// more tests for next_post_id, prev_post_id, and order
// There are 12 posts composed of first 2 system messages and 10 created posts
post6 := th . CreatePost ( )
th . CreatePost ( ) // post7
post8 := th . CreatePost ( )
post9 := th . CreatePost ( )
th . CreatePost ( ) // post10
// similar to '/posts?before=post9'
2021-08-13 07:12:16 -04:00
posts , _ , err = client . GetPostsBefore ( th . BasicChannel . Id , post9 . Id , 0 , 60 , "" , false )
require . NoError ( t , err )
2019-12-22 06:35:31 -05:00
require . Len ( t , posts . Order , 10 , "expected 10 posts" )
2019-11-28 17:41:51 -05:00
require . Equal ( t , post8 . Id , posts . Order [ 0 ] , "posts not in order" )
require . Equal ( t , systemPostId1 , posts . Order [ 9 ] , "posts not in order" )
require . Equal ( t , post9 . Id , posts . NextPostId , "should return post9.Id as NextPostId" )
require . Equal ( t , "" , posts . PrevPostId , "should return an empty PrevPostId" )
2017-03-24 16:46:11 -04:00
2019-07-03 17:23:04 -04:00
// similar to '/posts?before=post9&per_page=3'
2021-08-13 07:12:16 -04:00
posts , _ , err = client . GetPostsBefore ( th . BasicChannel . Id , post9 . Id , 0 , 3 , "" , false )
require . NoError ( t , err )
2019-12-22 06:35:31 -05:00
require . Len ( t , posts . Order , 3 , "expected 3 posts" )
2019-11-28 17:41:51 -05:00
require . Equal ( t , post8 . Id , posts . Order [ 0 ] , "posts not in order" )
require . Equal ( t , post6 . Id , posts . Order [ 2 ] , "should return 3 posts and match order" )
require . Equal ( t , post9 . Id , posts . NextPostId , "should return post9.Id as NextPostId" )
require . Equal ( t , post5 . Id , posts . PrevPostId , "should return post5.Id as PrevPostId" )
2019-07-03 17:23:04 -04:00
// similar to '/posts?before=post9&per_page=3&page=1'
2021-08-13 07:12:16 -04:00
posts , _ , err = client . GetPostsBefore ( th . BasicChannel . Id , post9 . Id , 1 , 3 , "" , false )
require . NoError ( t , err )
2019-12-22 06:35:31 -05:00
require . Len ( t , posts . Order , 3 , "expected 3 posts" )
2019-11-28 17:41:51 -05:00
require . Equal ( t , post5 . Id , posts . Order [ 0 ] , "posts not in order" )
require . Equal ( t , post3 . Id , posts . Order [ 2 ] , "posts not in order" )
require . Equal ( t , post6 . Id , posts . NextPostId , "should return post6.Id as NextPostId" )
require . Equal ( t , post2 . Id , posts . PrevPostId , "should return post2.Id as PrevPostId" )
2019-07-03 17:23:04 -04:00
// similar to '/posts?before=post9&per_page=3&page=2'
2021-08-13 07:12:16 -04:00
posts , _ , err = client . GetPostsBefore ( th . BasicChannel . Id , post9 . Id , 2 , 3 , "" , false )
require . NoError ( t , err )
2019-12-22 06:35:31 -05:00
require . Len ( t , posts . Order , 3 , "expected 3 posts" )
2019-11-28 17:41:51 -05:00
require . Equal ( t , post2 . Id , posts . Order [ 0 ] , "posts not in order" )
require . Equal ( t , systemPostId2 , posts . Order [ 2 ] , "posts not in order" )
require . Equal ( t , post3 . Id , posts . NextPostId , "should return post3.Id as NextPostId" )
require . Equal ( t , systemPostId1 , posts . PrevPostId , "should return systemPostId1 as PrevPostId" )
2019-07-03 17:23:04 -04:00
// similar to '/posts?before=post1&per_page=3'
2021-08-13 07:12:16 -04:00
posts , _ , err = client . GetPostsBefore ( th . BasicChannel . Id , post1 . Id , 0 , 3 , "" , false )
require . NoError ( t , err )
2019-12-22 06:35:31 -05:00
require . Len ( t , posts . Order , 2 , "expected 2 posts" )
2019-11-28 17:41:51 -05:00
require . Equal ( t , systemPostId2 , posts . Order [ 0 ] , "posts not in order" )
require . Equal ( t , systemPostId1 , posts . Order [ 1 ] , "posts not in order" )
require . Equal ( t , post1 . Id , posts . NextPostId , "should return post1.Id as NextPostId" )
require . Equal ( t , "" , posts . PrevPostId , "should return an empty PrevPostId" )
2019-07-03 17:23:04 -04:00
// similar to '/posts?before=systemPostId1'
2021-08-13 07:12:16 -04:00
posts , _ , err = client . GetPostsBefore ( th . BasicChannel . Id , systemPostId1 , 0 , 60 , "" , false )
require . NoError ( t , err )
2019-12-22 06:35:31 -05:00
require . Empty ( t , posts . Order , "should return 0 post" )
2019-11-28 17:41:51 -05:00
require . Equal ( t , systemPostId1 , posts . NextPostId , "should return systemPostId1 as NextPostId" )
require . Equal ( t , "" , posts . PrevPostId , "should return an empty PrevPostId" )
2019-07-03 17:23:04 -04:00
// similar to '/posts?before=systemPostId1&per_page=60&page=1'
2021-08-13 07:12:16 -04:00
posts , _ , err = client . GetPostsBefore ( th . BasicChannel . Id , systemPostId1 , 1 , 60 , "" , false )
require . NoError ( t , err )
2019-12-22 06:35:31 -05:00
require . Empty ( t , posts . Order , "should return 0 posts" )
2019-11-28 17:41:51 -05:00
require . Equal ( t , "" , posts . NextPostId , "should return an empty NextPostId" )
require . Equal ( t , "" , posts . PrevPostId , "should return an empty PrevPostId" )
2019-07-03 17:23:04 -04:00
// similar to '/posts?before=non-existent-post'
nonExistentPostId := model . NewId ( )
2021-08-13 07:12:16 -04:00
posts , _ , err = client . GetPostsBefore ( th . BasicChannel . Id , nonExistentPostId , 0 , 60 , "" , false )
require . NoError ( t , err )
2019-12-22 06:35:31 -05:00
require . Empty ( t , posts . Order , "should return 0 post" )
2019-11-28 17:41:51 -05:00
require . Equal ( t , nonExistentPostId , posts . NextPostId , "should return nonExistentPostId as NextPostId" )
require . Equal ( t , "" , posts . PrevPostId , "should return an empty PrevPostId" )
2019-07-03 17:23:04 -04:00
}
func TestGetPostsAfter ( t * testing . T ) {
2020-02-10 13:31:41 -05:00
th := Setup ( t ) . InitBasic ( )
2019-07-03 17:23:04 -04:00
defer th . TearDown ( )
2021-08-13 07:12:16 -04:00
client := th . Client
2019-07-03 17:23:04 -04:00
post1 := th . CreatePost ( )
post2 := th . CreatePost ( )
post3 := th . CreatePost ( )
post4 := th . CreatePost ( )
post5 := th . CreatePost ( )
2017-03-24 16:46:11 -04:00
2021-08-13 07:12:16 -04:00
posts , _ , err := client . GetPostsAfter ( th . BasicChannel . Id , post3 . Id , 0 , 100 , "" , false )
require . NoError ( t , err )
2017-03-24 16:46:11 -04:00
2019-07-03 17:23:04 -04:00
found := make ( [ ] bool , 2 )
2017-03-24 16:46:11 -04:00
for _ , p := range posts . Posts {
if p . Id == post4 . Id {
found [ 0 ] = true
} else if p . Id == post5 . Id {
found [ 1 ] = true
}
2019-11-28 17:41:51 -05:00
require . NotEqual ( t , post1 . Id , p . Id , "returned posts before" )
require . NotEqual ( t , post2 . Id , p . Id , "returned posts before" )
2017-03-24 16:46:11 -04:00
}
for _ , f := range found {
2019-11-28 17:41:51 -05:00
require . True ( t , f , "missing post" )
2019-07-03 17:23:04 -04:00
}
2019-11-28 17:41:51 -05:00
require . Equal ( t , "" , posts . NextPostId , "should match empty NextPostId" )
require . Equal ( t , post3 . Id , posts . PrevPostId , "should match PrevPostId" )
2019-07-03 17:23:04 -04:00
2021-08-13 07:12:16 -04:00
posts , _ , err = client . GetPostsAfter ( th . BasicChannel . Id , post2 . Id , 1 , 1 , "" , false )
require . NoError ( t , err )
2019-12-22 06:35:31 -05:00
require . Len ( t , posts . Posts , 1 , "too many posts returned" )
2019-11-28 17:41:51 -05:00
require . Equal ( t , post4 . Id , posts . Order [ 0 ] , "should match returned post" )
require . Equal ( t , post5 . Id , posts . NextPostId , "should match NextPostId" )
require . Equal ( t , post3 . Id , posts . PrevPostId , "should match PrevPostId" )
2017-03-24 16:46:11 -04:00
2021-08-13 07:12:16 -04:00
_ , resp , err := client . GetPostsAfter ( th . BasicChannel . Id , "junk" , 1 , 1 , "" , false )
require . Error ( t , err )
2019-07-03 17:23:04 -04:00
CheckBadRequestStatus ( t , resp )
2021-08-13 07:12:16 -04:00
posts , _ , err = client . GetPostsAfter ( th . BasicChannel . Id , post1 . Id , 0 , 3 , "" , false )
require . NoError ( t , err )
2019-12-22 06:35:31 -05:00
require . Len ( t , posts . Posts , 3 , "should match length of posts returned" )
2019-11-28 17:41:51 -05:00
require . Equal ( t , post4 . Id , posts . Order [ 0 ] , "should match returned post" )
require . Equal ( t , post2 . Id , posts . Order [ 2 ] , "should match returned post" )
require . Equal ( t , post5 . Id , posts . NextPostId , "should match NextPostId" )
require . Equal ( t , post1 . Id , posts . PrevPostId , "should match PrevPostId" )
2019-07-03 17:23:04 -04:00
2021-08-13 07:12:16 -04:00
posts , _ , err = client . GetPostsAfter ( th . BasicChannel . Id , post1 . Id , 1 , 3 , "" , false )
require . NoError ( t , err )
2019-12-22 06:35:31 -05:00
require . Len ( t , posts . Posts , 1 , "should match length of posts returned" )
2019-11-28 17:41:51 -05:00
require . Equal ( t , post5 . Id , posts . Order [ 0 ] , "should match returned post" )
require . Equal ( t , "" , posts . NextPostId , "should match NextPostId" )
require . Equal ( t , post4 . Id , posts . PrevPostId , "should match PrevPostId" )
2019-07-03 17:23:04 -04:00
// more tests for next_post_id, prev_post_id, and order
// There are 12 posts composed of first 2 system messages and 10 created posts
post6 := th . CreatePost ( )
th . CreatePost ( ) // post7
post8 := th . CreatePost ( )
post9 := th . CreatePost ( )
post10 := th . CreatePost ( )
// similar to '/posts?after=post2'
2021-08-13 07:12:16 -04:00
posts , _ , err = client . GetPostsAfter ( th . BasicChannel . Id , post2 . Id , 0 , 60 , "" , false )
require . NoError ( t , err )
2019-12-22 06:35:31 -05:00
require . Len ( t , posts . Order , 8 , "expected 8 posts" )
2019-11-28 17:41:51 -05:00
require . Equal ( t , post10 . Id , posts . Order [ 0 ] , "should match order" )
require . Equal ( t , post3 . Id , posts . Order [ 7 ] , "should match order" )
require . Equal ( t , "" , posts . NextPostId , "should return an empty NextPostId" )
require . Equal ( t , post2 . Id , posts . PrevPostId , "should return post2.Id as PrevPostId" )
2019-07-03 17:23:04 -04:00
// similar to '/posts?after=post2&per_page=3'
2021-08-13 07:12:16 -04:00
posts , _ , err = client . GetPostsAfter ( th . BasicChannel . Id , post2 . Id , 0 , 3 , "" , false )
require . NoError ( t , err )
2019-12-22 06:35:31 -05:00
require . Len ( t , posts . Order , 3 , "expected 3 posts" )
2019-11-28 17:41:51 -05:00
require . Equal ( t , post5 . Id , posts . Order [ 0 ] , "should match order" )
require . Equal ( t , post3 . Id , posts . Order [ 2 ] , "should return 3 posts and match order" )
require . Equal ( t , post6 . Id , posts . NextPostId , "should return post6.Id as NextPostId" )
require . Equal ( t , post2 . Id , posts . PrevPostId , "should return post2.Id as PrevPostId" )
2019-07-03 17:23:04 -04:00
// similar to '/posts?after=post2&per_page=3&page=1'
2021-08-13 07:12:16 -04:00
posts , _ , err = client . GetPostsAfter ( th . BasicChannel . Id , post2 . Id , 1 , 3 , "" , false )
require . NoError ( t , err )
2019-12-22 06:35:31 -05:00
require . Len ( t , posts . Order , 3 , "expected 3 posts" )
2019-11-28 17:41:51 -05:00
require . Equal ( t , post8 . Id , posts . Order [ 0 ] , "should match order" )
require . Equal ( t , post6 . Id , posts . Order [ 2 ] , "should match order" )
require . Equal ( t , post9 . Id , posts . NextPostId , "should return post9.Id as NextPostId" )
require . Equal ( t , post5 . Id , posts . PrevPostId , "should return post5.Id as PrevPostId" )
2019-07-03 17:23:04 -04:00
// similar to '/posts?after=post2&per_page=3&page=2'
2021-08-13 07:12:16 -04:00
posts , _ , err = client . GetPostsAfter ( th . BasicChannel . Id , post2 . Id , 2 , 3 , "" , false )
require . NoError ( t , err )
2019-12-22 06:35:31 -05:00
require . Len ( t , posts . Order , 2 , "expected 2 posts" )
2019-11-28 17:41:51 -05:00
require . Equal ( t , post10 . Id , posts . Order [ 0 ] , "should match order" )
require . Equal ( t , post9 . Id , posts . Order [ 1 ] , "should match order" )
require . Equal ( t , "" , posts . NextPostId , "should return an empty NextPostId" )
require . Equal ( t , post8 . Id , posts . PrevPostId , "should return post8.Id as PrevPostId" )
2019-07-03 17:23:04 -04:00
// similar to '/posts?after=post10'
2021-08-13 07:12:16 -04:00
posts , _ , err = client . GetPostsAfter ( th . BasicChannel . Id , post10 . Id , 0 , 60 , "" , false )
require . NoError ( t , err )
2019-12-22 06:35:31 -05:00
require . Empty ( t , posts . Order , "should return 0 post" )
2019-11-28 17:41:51 -05:00
require . Equal ( t , "" , posts . NextPostId , "should return an empty NextPostId" )
require . Equal ( t , post10 . Id , posts . PrevPostId , "should return post10.Id as PrevPostId" )
2019-07-03 17:23:04 -04:00
// similar to '/posts?after=post10&page=1'
2021-08-13 07:12:16 -04:00
posts , _ , err = client . GetPostsAfter ( th . BasicChannel . Id , post10 . Id , 1 , 60 , "" , false )
require . NoError ( t , err )
2019-12-22 06:35:31 -05:00
require . Empty ( t , posts . Order , "should return 0 post" )
2019-11-28 17:41:51 -05:00
require . Equal ( t , "" , posts . NextPostId , "should return an empty NextPostId" )
require . Equal ( t , "" , posts . PrevPostId , "should return an empty PrevPostId" )
2019-07-03 17:23:04 -04:00
// similar to '/posts?after=non-existent-post'
nonExistentPostId := model . NewId ( )
2021-08-13 07:12:16 -04:00
posts , _ , err = client . GetPostsAfter ( th . BasicChannel . Id , nonExistentPostId , 0 , 60 , "" , false )
require . NoError ( t , err )
2019-12-22 06:35:31 -05:00
require . Empty ( t , posts . Order , "should return 0 post" )
2019-11-28 17:41:51 -05:00
require . Equal ( t , "" , posts . NextPostId , "should return an empty NextPostId" )
require . Equal ( t , nonExistentPostId , posts . PrevPostId , "should return nonExistentPostId as PrevPostId" )
2019-07-03 17:23:04 -04:00
}
func TestGetPostsForChannelAroundLastUnread ( t * testing . T ) {
2020-02-10 13:31:41 -05:00
th := Setup ( t ) . InitBasic ( )
2019-07-03 17:23:04 -04:00
defer th . TearDown ( )
2021-08-13 07:12:16 -04:00
client := th . Client
2019-07-03 17:23:04 -04:00
userId := th . BasicUser . Id
channelId := th . BasicChannel . Id
// 12 posts = 2 systems posts + 10 created posts below
post1 := th . CreatePost ( )
post2 := th . CreatePost ( )
post3 := th . CreatePost ( )
post4 := th . CreatePost ( )
2019-07-30 05:27:18 -04:00
post5 := th . CreatePost ( )
2021-08-17 04:25:22 -04:00
replyPost := & model . Post { ChannelId : channelId , Message : model . NewId ( ) , RootId : post4 . Id }
2021-08-13 07:12:16 -04:00
post6 , _ , err := client . CreatePost ( replyPost )
require . NoError ( t , err )
post7 , _ , err := client . CreatePost ( replyPost )
require . NoError ( t , err )
post8 , _ , err := client . CreatePost ( replyPost )
require . NoError ( t , err )
post9 , _ , err := client . CreatePost ( replyPost )
require . NoError ( t , err )
post10 , _ , err := client . CreatePost ( replyPost )
require . NoError ( t , err )
2019-07-03 17:23:04 -04:00
2019-07-30 05:27:18 -04:00
postIdNames := map [ string ] string {
post1 . Id : "post1" ,
post2 . Id : "post2" ,
post3 . Id : "post3" ,
post4 . Id : "post4" ,
post5 . Id : "post5" ,
post6 . Id : "post6 (reply to post4)" ,
post7 . Id : "post7 (reply to post4)" ,
post8 . Id : "post8 (reply to post4)" ,
post9 . Id : "post9 (reply to post4)" ,
post10 . Id : "post10 (reply to post4)" ,
}
namePost := func ( postId string ) string {
name , ok := postIdNames [ postId ]
if ok {
return name
}
return fmt . Sprintf ( "unknown (%s)" , postId )
}
namePosts := func ( postIds [ ] string ) [ ] string {
namedPostIds := make ( [ ] string , 0 , len ( postIds ) )
for _ , postId := range postIds {
namedPostIds = append ( namedPostIds , namePost ( postId ) )
}
return namedPostIds
}
namePostsMap := func ( posts map [ string ] * model . Post ) [ ] string {
namedPostIds := make ( [ ] string , 0 , len ( posts ) )
for postId := range posts {
namedPostIds = append ( namedPostIds , namePost ( postId ) )
}
sort . Strings ( namedPostIds )
return namedPostIds
}
assertPostList := func ( t * testing . T , expected , actual * model . PostList ) {
t . Helper ( )
require . Equal ( t , namePosts ( expected . Order ) , namePosts ( actual . Order ) , "unexpected post order" )
require . Equal ( t , namePostsMap ( expected . Posts ) , namePostsMap ( actual . Posts ) , "unexpected posts" )
require . Equal ( t , namePost ( expected . NextPostId ) , namePost ( actual . NextPostId ) , "unexpected next post id" )
require . Equal ( t , namePost ( expected . PrevPostId ) , namePost ( actual . PrevPostId ) , "unexpected prev post id" )
}
2020-07-20 04:08:52 -04:00
// Setting limit_after to zero should fail with a 400 BadRequest.
2021-08-13 07:12:16 -04:00
posts , resp , err := client . GetPostsAroundLastUnread ( userId , channelId , 20 , 0 , false )
require . Error ( t , err )
CheckErrorID ( t , err , "api.context.invalid_url_param.app_error" )
2020-07-20 04:08:52 -04:00
require . Equal ( t , http . StatusBadRequest , resp . StatusCode )
2021-04-28 10:43:41 -04:00
require . Nil ( t , posts )
2020-07-20 04:08:52 -04:00
2019-07-03 17:23:04 -04:00
// All returned posts are all read by the user, since it's created by the user itself.
2021-08-13 07:12:16 -04:00
posts , _ , err = client . GetPostsAroundLastUnread ( userId , channelId , 20 , 20 , false )
require . NoError ( t , err )
2019-07-30 05:27:18 -04:00
require . Len ( t , posts . Order , 12 , "Should return 12 posts only since there's no unread post" )
2019-07-03 17:23:04 -04:00
// Set channel member's last viewed to 0.
// All returned posts are latest posts as if all previous posts were already read by the user.
2021-03-31 03:40:35 -04:00
channelMember , err := th . App . Srv ( ) . Store . Channel ( ) . GetMember ( context . Background ( ) , channelId , userId )
2021-02-17 03:52:18 -05:00
require . NoError ( t , err )
2019-07-03 17:23:04 -04:00
channelMember . LastViewedAt = 0
2020-02-13 07:26:58 -05:00
_ , err = th . App . Srv ( ) . Store . Channel ( ) . UpdateMember ( channelMember )
2021-02-17 03:52:18 -05:00
require . NoError ( t , err )
2020-02-13 07:26:58 -05:00
th . App . Srv ( ) . Store . Post ( ) . InvalidateLastPostTimeCache ( channelId )
2019-07-03 17:23:04 -04:00
2021-08-13 07:12:16 -04:00
posts , _ , err = client . GetPostsAroundLastUnread ( userId , channelId , 20 , 20 , false )
require . NoError ( t , err )
2019-07-03 17:23:04 -04:00
2019-07-30 05:27:18 -04:00
require . Len ( t , posts . Order , 12 , "Should return 12 posts only since there's no unread post" )
2017-03-24 16:46:11 -04:00
2019-07-03 17:23:04 -04:00
// get the first system post generated before the created posts above
2021-08-13 07:12:16 -04:00
posts , _ , err = client . GetPostsBefore ( th . BasicChannel . Id , post1 . Id , 0 , 2 , "" , false )
require . NoError ( t , err )
2019-07-30 05:27:18 -04:00
systemPost0 := posts . Posts [ posts . Order [ 0 ] ]
postIdNames [ systemPost0 . Id ] = "system post 0"
systemPost1 := posts . Posts [ posts . Order [ 1 ] ]
postIdNames [ systemPost1 . Id ] = "system post 1"
2019-07-03 17:23:04 -04:00
// Set channel member's last viewed before post1.
2021-03-31 03:40:35 -04:00
channelMember , err = th . App . Srv ( ) . Store . Channel ( ) . GetMember ( context . Background ( ) , channelId , userId )
2021-02-17 03:52:18 -05:00
require . NoError ( t , err )
2019-07-03 17:23:04 -04:00
channelMember . LastViewedAt = post1 . CreateAt - 1
2020-02-13 07:26:58 -05:00
_ , err = th . App . Srv ( ) . Store . Channel ( ) . UpdateMember ( channelMember )
2021-02-17 03:52:18 -05:00
require . NoError ( t , err )
2020-02-13 07:26:58 -05:00
th . App . Srv ( ) . Store . Post ( ) . InvalidateLastPostTimeCache ( channelId )
2019-07-03 17:23:04 -04:00
2021-08-13 07:12:16 -04:00
posts , _ , err = client . GetPostsAroundLastUnread ( userId , channelId , 3 , 3 , false )
require . NoError ( t , err )
2019-07-03 17:23:04 -04:00
2019-07-30 05:27:18 -04:00
assertPostList ( t , & model . PostList {
Order : [ ] string { post3 . Id , post2 . Id , post1 . Id , systemPost0 . Id , systemPost1 . Id } ,
Posts : map [ string ] * model . Post {
systemPost0 . Id : systemPost0 ,
systemPost1 . Id : systemPost1 ,
post1 . Id : post1 ,
post2 . Id : post2 ,
post3 . Id : post3 ,
} ,
NextPostId : post4 . Id ,
PrevPostId : "" ,
} , posts )
2019-07-03 17:23:04 -04:00
// Set channel member's last viewed before post6.
2021-03-31 03:40:35 -04:00
channelMember , err = th . App . Srv ( ) . Store . Channel ( ) . GetMember ( context . Background ( ) , channelId , userId )
2021-02-17 03:52:18 -05:00
require . NoError ( t , err )
2019-07-03 17:23:04 -04:00
channelMember . LastViewedAt = post6 . CreateAt - 1
2020-02-13 07:26:58 -05:00
_ , err = th . App . Srv ( ) . Store . Channel ( ) . UpdateMember ( channelMember )
2021-02-17 03:52:18 -05:00
require . NoError ( t , err )
2020-02-13 07:26:58 -05:00
th . App . Srv ( ) . Store . Post ( ) . InvalidateLastPostTimeCache ( channelId )
2019-07-03 17:23:04 -04:00
2021-08-13 07:12:16 -04:00
posts , _ , err = client . GetPostsAroundLastUnread ( userId , channelId , 3 , 3 , false )
require . NoError ( t , err )
2019-07-03 17:23:04 -04:00
2019-07-30 05:27:18 -04:00
assertPostList ( t , & model . PostList {
Order : [ ] string { post8 . Id , post7 . Id , post6 . Id , post5 . Id , post4 . Id , post3 . Id } ,
Posts : map [ string ] * model . Post {
post3 . Id : post3 ,
post4 . Id : post4 ,
post5 . Id : post5 ,
post6 . Id : post6 ,
post7 . Id : post7 ,
post8 . Id : post8 ,
post9 . Id : post9 ,
post10 . Id : post10 ,
} ,
NextPostId : post9 . Id ,
PrevPostId : post2 . Id ,
} , posts )
2019-07-03 17:23:04 -04:00
// Set channel member's last viewed before post10.
2021-03-31 03:40:35 -04:00
channelMember , err = th . App . Srv ( ) . Store . Channel ( ) . GetMember ( context . Background ( ) , channelId , userId )
2021-02-17 03:52:18 -05:00
require . NoError ( t , err )
2019-07-03 17:23:04 -04:00
channelMember . LastViewedAt = post10 . CreateAt - 1
2020-02-13 07:26:58 -05:00
_ , err = th . App . Srv ( ) . Store . Channel ( ) . UpdateMember ( channelMember )
2021-02-17 03:52:18 -05:00
require . NoError ( t , err )
2020-02-13 07:26:58 -05:00
th . App . Srv ( ) . Store . Post ( ) . InvalidateLastPostTimeCache ( channelId )
2019-07-03 17:23:04 -04:00
2021-08-13 07:12:16 -04:00
posts , _ , err = client . GetPostsAroundLastUnread ( userId , channelId , 3 , 3 , false )
require . NoError ( t , err )
2019-07-03 17:23:04 -04:00
2019-07-30 05:27:18 -04:00
assertPostList ( t , & model . PostList {
Order : [ ] string { post10 . Id , post9 . Id , post8 . Id , post7 . Id } ,
Posts : map [ string ] * model . Post {
post4 . Id : post4 ,
post6 . Id : post6 ,
post7 . Id : post7 ,
post8 . Id : post8 ,
post9 . Id : post9 ,
post10 . Id : post10 ,
} ,
NextPostId : "" ,
PrevPostId : post6 . Id ,
} , posts )
2019-07-03 17:23:04 -04:00
// Set channel member's last viewed equal to post10.
2021-03-31 03:40:35 -04:00
channelMember , err = th . App . Srv ( ) . Store . Channel ( ) . GetMember ( context . Background ( ) , channelId , userId )
2021-02-17 03:52:18 -05:00
require . NoError ( t , err )
2019-07-03 17:23:04 -04:00
channelMember . LastViewedAt = post10 . CreateAt
2020-02-13 07:26:58 -05:00
_ , err = th . App . Srv ( ) . Store . Channel ( ) . UpdateMember ( channelMember )
2021-02-17 03:52:18 -05:00
require . NoError ( t , err )
2020-02-13 07:26:58 -05:00
th . App . Srv ( ) . Store . Post ( ) . InvalidateLastPostTimeCache ( channelId )
2019-07-03 17:23:04 -04:00
2021-08-13 07:12:16 -04:00
posts , _ , err = client . GetPostsAroundLastUnread ( userId , channelId , 3 , 3 , false )
require . NoError ( t , err )
2019-07-03 17:23:04 -04:00
2019-07-30 05:27:18 -04:00
assertPostList ( t , & model . PostList {
Order : [ ] string { post10 . Id , post9 . Id , post8 . Id } ,
Posts : map [ string ] * model . Post {
post4 . Id : post4 ,
post6 . Id : post6 ,
post7 . Id : post7 ,
post8 . Id : post8 ,
post9 . Id : post9 ,
post10 . Id : post10 ,
} ,
NextPostId : "" ,
PrevPostId : post7 . Id ,
} , posts )
// Set channel member's last viewed to just before a new reply to a previous thread, not
// otherwise in the requested window.
post11 := th . CreatePost ( )
2021-08-13 07:12:16 -04:00
post12 , _ , err := client . CreatePost ( & model . Post {
2019-07-30 05:27:18 -04:00
ChannelId : channelId ,
Message : model . NewId ( ) ,
RootId : post4 . Id ,
} )
2021-08-13 07:12:16 -04:00
require . NoError ( t , err )
2019-07-30 05:27:18 -04:00
post13 := th . CreatePost ( )
postIdNames [ post11 . Id ] = "post11"
postIdNames [ post12 . Id ] = "post12 (reply to post4)"
postIdNames [ post13 . Id ] = "post13"
2021-03-31 03:40:35 -04:00
channelMember , err = th . App . Srv ( ) . Store . Channel ( ) . GetMember ( context . Background ( ) , channelId , userId )
2021-02-17 03:52:18 -05:00
require . NoError ( t , err )
2019-07-30 05:27:18 -04:00
channelMember . LastViewedAt = post12 . CreateAt - 1
2020-02-13 07:26:58 -05:00
_ , err = th . App . Srv ( ) . Store . Channel ( ) . UpdateMember ( channelMember )
2021-02-17 03:52:18 -05:00
require . NoError ( t , err )
2020-02-13 07:26:58 -05:00
th . App . Srv ( ) . Store . Post ( ) . InvalidateLastPostTimeCache ( channelId )
2019-07-30 05:27:18 -04:00
2021-08-13 07:12:16 -04:00
posts , _ , err = client . GetPostsAroundLastUnread ( userId , channelId , 1 , 2 , false )
require . NoError ( t , err )
2019-07-30 05:27:18 -04:00
assertPostList ( t , & model . PostList {
Order : [ ] string { post13 . Id , post12 . Id , post11 . Id } ,
Posts : map [ string ] * model . Post {
post4 . Id : post4 ,
post6 . Id : post6 ,
post7 . Id : post7 ,
post8 . Id : post8 ,
post9 . Id : post9 ,
post10 . Id : post10 ,
post11 . Id : post11 ,
post12 . Id : post12 ,
post13 . Id : post13 ,
} ,
NextPostId : "" ,
PrevPostId : post10 . Id ,
} , posts )
2017-03-24 16:46:11 -04:00
}
2017-02-13 10:52:50 -05:00
func TestGetPost ( t * testing . T ) {
2020-02-10 13:31:41 -05:00
th := Setup ( t ) . InitBasic ( )
2017-10-02 04:50:56 -04:00
defer th . TearDown ( )
2020-06-12 00:26:35 -04:00
// TODO: migrate this entirely to the subtest's client
// once the other methods are migrated too.
2021-08-13 07:12:16 -04:00
client := th . Client
2017-02-13 10:52:50 -05:00
2020-06-12 00:26:35 -04:00
var privatePost * model . Post
th . TestForAllClients ( t , func ( t * testing . T , c * model . Client4 ) {
t . Helper ( )
2017-02-13 10:52:50 -05:00
2021-08-13 07:12:16 -04:00
post , resp , err := c . GetPost ( th . BasicPost . Id , "" )
require . NoError ( t , err )
2017-02-13 10:52:50 -05:00
2020-06-12 00:26:35 -04:00
require . Equal ( t , th . BasicPost . Id , post . Id , "post ids don't match" )
2017-02-13 10:52:50 -05:00
2021-09-01 08:43:12 -04:00
post , resp , err = c . GetPost ( th . BasicPost . Id , resp . Etag )
require . NoError ( t , err )
2020-06-12 00:26:35 -04:00
CheckEtag ( t , post , resp )
2017-02-13 10:52:50 -05:00
2021-08-13 07:12:16 -04:00
_ , resp , err = c . GetPost ( "" , "" )
require . Error ( t , err )
2020-06-12 00:26:35 -04:00
CheckNotFoundStatus ( t , resp )
2017-02-13 10:52:50 -05:00
2021-08-13 07:12:16 -04:00
_ , resp , err = c . GetPost ( "junk" , "" )
require . Error ( t , err )
2020-06-12 00:26:35 -04:00
CheckBadRequestStatus ( t , resp )
2017-06-26 08:16:57 -04:00
2021-08-13 07:12:16 -04:00
_ , resp , err = c . GetPost ( model . NewId ( ) , "" )
require . Error ( t , err )
2020-06-12 00:26:35 -04:00
CheckNotFoundStatus ( t , resp )
2017-06-26 08:16:57 -04:00
2021-08-13 07:12:16 -04:00
client . RemoveUserFromChannel ( th . BasicChannel . Id , th . BasicUser . Id )
2017-06-26 08:16:57 -04:00
2020-06-12 00:26:35 -04:00
// Channel is public, should be able to read post
2021-08-13 07:12:16 -04:00
_ , _ , err = c . GetPost ( th . BasicPost . Id , "" )
require . NoError ( t , err )
2017-06-26 08:16:57 -04:00
2021-08-13 07:12:16 -04:00
privatePost = th . CreatePostWithClient ( client , th . BasicPrivateChannel )
2020-06-12 00:26:35 -04:00
2021-08-13 07:12:16 -04:00
_ , _ , err = c . GetPost ( privatePost . Id , "" )
require . NoError ( t , err )
2020-06-12 00:26:35 -04:00
} )
2017-06-26 08:16:57 -04:00
2021-08-13 07:12:16 -04:00
client . RemoveUserFromChannel ( th . BasicPrivateChannel . Id , th . BasicUser . Id )
2017-06-26 08:16:57 -04:00
// Channel is private, should not be able to read post
2021-08-13 07:12:16 -04:00
_ , resp , err := client . GetPost ( privatePost . Id , "" )
require . Error ( t , err )
2017-02-13 10:52:50 -05:00
CheckForbiddenStatus ( t , resp )
2020-06-12 00:26:35 -04:00
// But local client should.
2021-08-13 07:12:16 -04:00
_ , _ , err = th . LocalClient . GetPost ( privatePost . Id , "" )
require . NoError ( t , err )
2020-06-12 00:26:35 -04:00
2021-08-13 07:12:16 -04:00
client . Logout ( )
2020-06-12 00:26:35 -04:00
// Normal client should get unauthorized, but local client should get 404.
2021-08-13 07:12:16 -04:00
_ , resp , err = client . GetPost ( model . NewId ( ) , "" )
require . Error ( t , err )
2017-02-13 10:52:50 -05:00
CheckUnauthorizedStatus ( t , resp )
2021-08-13 07:12:16 -04:00
_ , resp , err = th . LocalClient . GetPost ( model . NewId ( ) , "" )
require . Error ( t , err )
2020-06-12 00:26:35 -04:00
CheckNotFoundStatus ( t , resp )
2017-02-13 10:52:50 -05:00
}
2017-02-21 07:36:52 -05:00
func TestDeletePost ( t * testing . T ) {
2020-02-10 13:31:41 -05:00
th := Setup ( t ) . InitBasic ( )
2017-10-02 04:50:56 -04:00
defer th . TearDown ( )
2021-08-13 07:12:16 -04:00
client := th . Client
2017-02-21 07:36:52 -05:00
2021-08-13 07:12:16 -04:00
resp , err := client . DeletePost ( "" )
require . Error ( t , err )
2017-02-21 07:36:52 -05:00
CheckNotFoundStatus ( t , resp )
2021-08-13 07:12:16 -04:00
resp , err = client . DeletePost ( "junk" )
require . Error ( t , err )
2017-02-21 07:36:52 -05:00
CheckBadRequestStatus ( t , resp )
2021-08-13 07:12:16 -04:00
resp , err = client . DeletePost ( th . BasicPost . Id )
require . Error ( t , err )
2017-02-21 07:36:52 -05:00
CheckForbiddenStatus ( t , resp )
2021-08-13 07:12:16 -04:00
client . Login ( th . TeamAdminUser . Email , th . TeamAdminUser . Password )
_ , err = client . DeletePost ( th . BasicPost . Id )
require . NoError ( t , err )
2017-02-21 07:36:52 -05:00
post := th . CreatePost ( )
user := th . CreateUser ( )
2021-08-13 07:12:16 -04:00
client . Logout ( )
client . Login ( user . Email , user . Password )
2017-02-21 07:36:52 -05:00
2021-08-13 07:12:16 -04:00
resp , err = client . DeletePost ( post . Id )
require . Error ( t , err )
2017-02-21 07:36:52 -05:00
CheckForbiddenStatus ( t , resp )
2021-08-13 07:12:16 -04:00
client . Logout ( )
resp , err = client . DeletePost ( model . NewId ( ) )
require . Error ( t , err )
2017-02-21 07:36:52 -05:00
CheckUnauthorizedStatus ( t , resp )
2021-08-13 07:12:16 -04:00
_ , err = th . SystemAdminClient . DeletePost ( post . Id )
require . NoError ( t , err )
2017-02-21 07:36:52 -05:00
}
2021-08-18 04:39:25 -04:00
func TestDeletePostEvent ( t * testing . T ) {
th := Setup ( t ) . InitBasic ( )
defer th . TearDown ( )
WebSocketClient , err := th . CreateWebSocketClient ( )
2021-08-18 06:28:57 -04:00
require . NoError ( t , err )
2021-08-18 04:39:25 -04:00
WebSocketClient . Listen ( )
defer WebSocketClient . Close ( )
2021-08-18 06:28:57 -04:00
_ , err = th . SystemAdminClient . DeletePost ( th . BasicPost . Id )
require . NoError ( t , err )
2021-08-18 04:39:25 -04:00
var received bool
for {
var exit bool
select {
case event := <- WebSocketClient . EventChannel :
if event . EventType ( ) == model . WebsocketEventPostDeleted {
var post model . Post
err := json . Unmarshal ( [ ] byte ( event . GetData ( ) [ "post" ] . ( string ) ) , & post )
require . NoError ( t , err )
received = true
}
case <- time . After ( 500 * time . Millisecond ) :
exit = true
}
if exit {
break
}
}
require . True ( t , received )
}
2020-11-16 05:56:29 -05:00
func TestDeletePostMessage ( t * testing . T ) {
th := Setup ( t ) . InitBasic ( )
th . LinkUserToTeam ( th . SystemAdminUser , th . BasicTeam )
2021-04-02 05:03:23 -04:00
th . App . AddUserToChannel ( th . SystemAdminUser , th . BasicChannel , false )
2020-11-16 05:56:29 -05:00
defer th . TearDown ( )
testCases := [ ] struct {
description string
client * model . Client4
delete_by interface { }
} {
{ "Do not send delete_by to regular user" , th . Client , nil } ,
{ "Send delete_by to system admin user" , th . SystemAdminClient , th . SystemAdminUser . Id } ,
}
for _ , tc := range testCases {
t . Run ( tc . description , func ( t * testing . T ) {
wsClient , err := th . CreateWebSocketClientWithClient ( tc . client )
2021-08-13 07:12:16 -04:00
require . NoError ( t , err )
2020-11-16 05:56:29 -05:00
defer wsClient . Close ( )
wsClient . Listen ( )
post := th . CreatePost ( )
2021-08-13 07:12:16 -04:00
_ , err = th . SystemAdminClient . DeletePost ( post . Id )
require . NoError ( t , err )
2020-11-16 05:56:29 -05:00
timeout := time . After ( 5 * time . Second )
for {
select {
case ev := <- wsClient . EventChannel :
2021-07-12 14:05:36 -04:00
if ev . EventType ( ) == model . WebsocketEventPostDeleted {
2020-11-16 05:56:29 -05:00
assert . Equal ( t , tc . delete_by , ev . GetData ( ) [ "delete_by" ] )
return
}
case <- timeout :
// We just skip the test instead of failing because waiting for more than 5 seconds
2021-04-01 13:44:56 -04:00
// to get a response does not make sense, and it will unnecessarily slow down
2020-11-16 05:56:29 -05:00
// the tests further in an already congested CI environment.
t . Skip ( "timed out waiting for event" )
}
}
} )
}
}
2017-02-13 10:52:50 -05:00
func TestGetPostThread ( t * testing . T ) {
2020-02-10 13:31:41 -05:00
th := Setup ( t ) . InitBasic ( )
2017-10-02 04:50:56 -04:00
defer th . TearDown ( )
2021-08-13 07:12:16 -04:00
client := th . Client
2017-02-13 10:52:50 -05:00
2017-06-19 12:08:52 -04:00
post := & model . Post { ChannelId : th . BasicChannel . Id , Message : "zz" + model . NewId ( ) + "a" , RootId : th . BasicPost . Id }
2021-08-13 07:12:16 -04:00
post , _ , _ = client . CreatePost ( post )
2017-02-13 10:52:50 -05:00
2021-08-13 07:12:16 -04:00
list , resp , err := client . GetPostThread ( th . BasicPost . Id , "" , false )
require . NoError ( t , err )
2017-02-13 10:52:50 -05:00
var list2 * model . PostList
2021-08-13 07:12:16 -04:00
list2 , resp , _ = client . GetPostThread ( th . BasicPost . Id , resp . Etag , false )
2017-02-13 10:52:50 -05:00
CheckEtag ( t , list2 , resp )
2019-11-28 17:41:51 -05:00
require . Equal ( t , th . BasicPost . Id , list . Order [ 0 ] , "wrong order" )
2017-02-13 10:52:50 -05:00
2019-11-28 17:41:51 -05:00
_ , ok := list . Posts [ th . BasicPost . Id ]
require . True ( t , ok , "should have had post" )
2017-02-13 10:52:50 -05:00
2019-11-28 17:41:51 -05:00
_ , ok = list . Posts [ post . Id ]
require . True ( t , ok , "should have had post" )
2017-02-13 10:52:50 -05:00
2021-08-13 07:12:16 -04:00
_ , resp , err = client . GetPostThread ( "junk" , "" , false )
require . Error ( t , err )
2017-02-13 10:52:50 -05:00
CheckBadRequestStatus ( t , resp )
2021-08-13 07:12:16 -04:00
_ , resp , err = client . GetPostThread ( model . NewId ( ) , "" , false )
require . Error ( t , err )
2017-06-26 08:16:57 -04:00
CheckNotFoundStatus ( t , resp )
2021-08-13 07:12:16 -04:00
client . RemoveUserFromChannel ( th . BasicChannel . Id , th . BasicUser . Id )
2017-06-26 08:16:57 -04:00
// Channel is public, should be able to read post
2021-08-13 07:12:16 -04:00
_ , _ , err = client . GetPostThread ( th . BasicPost . Id , "" , false )
require . NoError ( t , err )
2017-06-26 08:16:57 -04:00
2021-08-13 07:12:16 -04:00
privatePost := th . CreatePostWithClient ( client , th . BasicPrivateChannel )
2017-06-26 08:16:57 -04:00
2021-08-13 07:12:16 -04:00
_ , _ , err = client . GetPostThread ( privatePost . Id , "" , false )
require . NoError ( t , err )
2017-06-26 08:16:57 -04:00
2021-08-13 07:12:16 -04:00
client . RemoveUserFromChannel ( th . BasicPrivateChannel . Id , th . BasicUser . Id )
2017-06-26 08:16:57 -04:00
// Channel is private, should not be able to read post
2021-08-13 07:12:16 -04:00
_ , resp , err = client . GetPostThread ( privatePost . Id , "" , false )
require . Error ( t , err )
2017-02-13 10:52:50 -05:00
CheckForbiddenStatus ( t , resp )
2021-08-13 07:12:16 -04:00
client . Logout ( )
_ , resp , err = client . GetPostThread ( model . NewId ( ) , "" , false )
require . Error ( t , err )
2017-02-13 10:52:50 -05:00
CheckUnauthorizedStatus ( t , resp )
2021-08-13 07:12:16 -04:00
_ , _ , err = th . SystemAdminClient . GetPostThread ( th . BasicPost . Id , "" , false )
require . NoError ( t , err )
2017-02-13 10:52:50 -05:00
}
2017-02-21 07:36:52 -05:00
func TestSearchPosts ( t * testing . T ) {
2020-02-10 13:31:41 -05:00
th := Setup ( t ) . InitBasic ( )
2017-10-02 04:50:56 -04:00
defer th . TearDown ( )
2018-08-22 15:12:51 -04:00
experimentalViewArchivedChannels := * th . App . Config ( ) . TeamSettings . ExperimentalViewArchivedChannels
defer func ( ) {
th . App . UpdateConfig ( func ( cfg * model . Config ) {
cfg . TeamSettings . ExperimentalViewArchivedChannels = & experimentalViewArchivedChannels
} )
} ( )
th . App . UpdateConfig ( func ( cfg * model . Config ) {
* cfg . TeamSettings . ExperimentalViewArchivedChannels = true
} )
2017-02-21 07:36:52 -05:00
th . LoginBasic ( )
2021-08-13 07:12:16 -04:00
client := th . Client
2017-02-21 07:36:52 -05:00
message := "search for post1"
_ = th . CreateMessagePost ( message )
message = "search for post2"
post2 := th . CreateMessagePost ( message )
message = "#hashtag search for post3"
post3 := th . CreateMessagePost ( message )
message = "hashtag for post4"
_ = th . CreateMessagePost ( message )
2018-07-30 15:06:08 -04:00
archivedChannel := th . CreatePublicChannel ( )
_ = th . CreateMessagePostWithClient ( th . Client , archivedChannel , "#hashtag for post3" )
th . Client . DeleteChannel ( archivedChannel . Id )
2021-09-23 08:43:09 -04:00
otherTeam := th . CreateTeam ( )
channelInOtherTeam := th . CreateChannelWithClientAndTeam ( th . Client , model . ChannelTypeOpen , otherTeam . Id )
_ = th . AddUserToChannel ( th . BasicUser , channelInOtherTeam )
_ = th . CreateMessagePostWithClient ( th . Client , channelInOtherTeam , "search for post 5" )
2018-08-28 13:09:32 -04:00
terms := "search"
isOrSearch := false
timezoneOffset := 5
searchParams := model . SearchParameter {
Terms : & terms ,
IsOrSearch : & isOrSearch ,
TimeZoneOffset : & timezoneOffset ,
}
2021-09-23 08:43:09 -04:00
allTeamsPosts , _ , err := client . SearchPostsWithParams ( "" , & searchParams )
require . NoError ( t , err )
require . Len ( t , allTeamsPosts . Order , 4 , "wrong search along multiple teams" )
terms = "search"
isOrSearch = false
timezoneOffset = 5
searchParams = model . SearchParameter {
Terms : & terms ,
IsOrSearch : & isOrSearch ,
TimeZoneOffset : & timezoneOffset ,
}
2021-08-13 07:12:16 -04:00
posts , _ , err := client . SearchPostsWithParams ( th . BasicTeam . Id , & searchParams )
require . NoError ( t , err )
2019-11-28 17:41:51 -05:00
require . Len ( t , posts . Order , 3 , "wrong search" )
2018-08-28 13:09:32 -04:00
2018-09-26 10:27:04 -04:00
terms = "search"
page := 0
perPage := 2
searchParams = model . SearchParameter {
Terms : & terms ,
IsOrSearch : & isOrSearch ,
TimeZoneOffset : & timezoneOffset ,
Page : & page ,
PerPage : & perPage ,
}
2021-08-13 07:12:16 -04:00
posts2 , _ , err := client . SearchPostsWithParams ( th . BasicTeam . Id , & searchParams )
require . NoError ( t , err )
2019-11-28 17:41:51 -05:00
// We don't support paging for DB search yet, modify this when we do.
require . Len ( t , posts2 . Order , 3 , "Wrong number of posts" )
2018-09-26 10:27:04 -04:00
assert . Equal ( t , posts . Order [ 0 ] , posts2 . Order [ 0 ] )
assert . Equal ( t , posts . Order [ 1 ] , posts2 . Order [ 1 ] )
2018-09-27 15:11:19 -04:00
page = 1
searchParams = model . SearchParameter {
Terms : & terms ,
IsOrSearch : & isOrSearch ,
TimeZoneOffset : & timezoneOffset ,
Page : & page ,
PerPage : & perPage ,
}
2021-08-13 07:12:16 -04:00
posts2 , _ , err = client . SearchPostsWithParams ( th . BasicTeam . Id , & searchParams )
require . NoError ( t , err )
2019-11-28 17:41:51 -05:00
// We don't support paging for DB search yet, modify this when we do.
2019-12-22 06:35:31 -05:00
require . Empty ( t , posts2 . Order , "Wrong number of posts" )
2018-09-27 15:11:19 -04:00
2021-08-13 07:12:16 -04:00
posts , _ , err = client . SearchPosts ( th . BasicTeam . Id , "search" , false )
require . NoError ( t , err )
2019-11-28 17:41:51 -05:00
require . Len ( t , posts . Order , 3 , "wrong search" )
2017-02-21 07:36:52 -05:00
2021-08-13 07:12:16 -04:00
posts , _ , err = client . SearchPosts ( th . BasicTeam . Id , "post2" , false )
require . NoError ( t , err )
2019-11-28 17:41:51 -05:00
require . Len ( t , posts . Order , 1 , "wrong number of posts" )
require . Equal ( t , post2 . Id , posts . Order [ 0 ] , "wrong search" )
2017-02-21 07:36:52 -05:00
2021-08-13 07:12:16 -04:00
posts , _ , err = client . SearchPosts ( th . BasicTeam . Id , "#hashtag" , false )
require . NoError ( t , err )
2019-11-28 17:41:51 -05:00
require . Len ( t , posts . Order , 1 , "wrong number of posts" )
require . Equal ( t , post3 . Id , posts . Order [ 0 ] , "wrong search" )
2017-02-21 07:36:52 -05:00
2018-09-26 10:27:04 -04:00
terms = "#hashtag"
includeDeletedChannels := true
searchParams = model . SearchParameter {
Terms : & terms ,
IsOrSearch : & isOrSearch ,
TimeZoneOffset : & timezoneOffset ,
IncludeDeletedChannels : & includeDeletedChannels ,
}
2021-08-13 07:12:16 -04:00
posts , _ , err = client . SearchPostsWithParams ( th . BasicTeam . Id , & searchParams )
require . NoError ( t , err )
2019-11-28 17:41:51 -05:00
require . Len ( t , posts . Order , 2 , "wrong search" )
2018-07-30 15:06:08 -04:00
2018-08-22 15:12:51 -04:00
th . App . UpdateConfig ( func ( cfg * model . Config ) {
* cfg . TeamSettings . ExperimentalViewArchivedChannels = false
} )
2018-08-28 13:09:32 -04:00
2021-08-13 07:12:16 -04:00
posts , _ , err = client . SearchPostsWithParams ( th . BasicTeam . Id , & searchParams )
require . NoError ( t , err )
2019-11-28 17:41:51 -05:00
require . Len ( t , posts . Order , 1 , "wrong search" )
2018-08-22 15:12:51 -04:00
2021-08-13 07:12:16 -04:00
posts , _ , _ = client . SearchPosts ( th . BasicTeam . Id , "*" , false )
2019-12-22 06:35:31 -05:00
require . Empty ( t , posts . Order , "searching for just * shouldn't return any results" )
2017-02-21 07:36:52 -05:00
2021-08-13 07:12:16 -04:00
posts , _ , err = client . SearchPosts ( th . BasicTeam . Id , "post1 post2" , true )
require . NoError ( t , err )
2019-11-28 17:41:51 -05:00
require . Len ( t , posts . Order , 2 , "wrong search results" )
2017-02-21 07:36:52 -05:00
2021-08-13 07:12:16 -04:00
_ , resp , err := client . SearchPosts ( "junk" , "#sgtitlereview" , false )
require . Error ( t , err )
2017-02-21 07:36:52 -05:00
CheckBadRequestStatus ( t , resp )
2021-08-13 07:12:16 -04:00
_ , resp , err = client . SearchPosts ( model . NewId ( ) , "#sgtitlereview" , false )
require . Error ( t , err )
2017-02-21 07:36:52 -05:00
CheckForbiddenStatus ( t , resp )
2021-08-13 07:12:16 -04:00
_ , resp , err = client . SearchPosts ( th . BasicTeam . Id , "" , false )
require . Error ( t , err )
2017-02-21 07:36:52 -05:00
CheckBadRequestStatus ( t , resp )
2021-08-13 07:12:16 -04:00
client . Logout ( )
_ , resp , err = client . SearchPosts ( th . BasicTeam . Id , "#sgtitlereview" , false )
require . Error ( t , err )
2017-02-21 07:36:52 -05:00
CheckUnauthorizedStatus ( t , resp )
}
func TestSearchHashtagPosts ( t * testing . T ) {
2020-02-10 13:31:41 -05:00
th := Setup ( t ) . InitBasic ( )
2017-10-02 04:50:56 -04:00
defer th . TearDown ( )
2017-02-21 07:36:52 -05:00
th . LoginBasic ( )
2021-08-13 07:12:16 -04:00
client := th . Client
2017-02-21 07:36:52 -05:00
message := "#sgtitlereview with space"
2018-09-26 10:27:04 -04:00
assert . NotNil ( t , th . CreateMessagePost ( message ) )
2017-02-21 07:36:52 -05:00
message = "#sgtitlereview\n with return"
2018-09-26 10:27:04 -04:00
assert . NotNil ( t , th . CreateMessagePost ( message ) )
2017-02-21 07:36:52 -05:00
message = "no hashtag"
2018-09-26 10:27:04 -04:00
assert . NotNil ( t , th . CreateMessagePost ( message ) )
2017-02-21 07:36:52 -05:00
2021-08-13 07:12:16 -04:00
posts , _ , err := client . SearchPosts ( th . BasicTeam . Id , "#sgtitlereview" , false )
require . NoError ( t , err )
2019-11-28 17:41:51 -05:00
require . Len ( t , posts . Order , 2 , "wrong search results" )
2017-02-21 07:36:52 -05:00
2021-08-13 07:12:16 -04:00
client . Logout ( )
_ , resp , err := client . SearchPosts ( th . BasicTeam . Id , "#sgtitlereview" , false )
require . Error ( t , err )
2017-02-21 07:36:52 -05:00
CheckUnauthorizedStatus ( t , resp )
}
func TestSearchPostsInChannel ( t * testing . T ) {
2020-02-10 13:31:41 -05:00
th := Setup ( t ) . InitBasic ( )
2017-10-02 04:50:56 -04:00
defer th . TearDown ( )
2017-02-21 07:36:52 -05:00
th . LoginBasic ( )
2021-08-13 07:12:16 -04:00
client := th . Client
2017-02-21 07:36:52 -05:00
channel := th . CreatePublicChannel ( )
message := "sgtitlereview with space"
_ = th . CreateMessagePost ( message )
message = "sgtitlereview\n with return"
2021-08-13 07:12:16 -04:00
_ = th . CreateMessagePostWithClient ( client , th . BasicChannel2 , message )
2017-02-21 07:36:52 -05:00
message = "other message with no return"
2021-08-13 07:12:16 -04:00
_ = th . CreateMessagePostWithClient ( client , th . BasicChannel2 , message )
2017-02-21 07:36:52 -05:00
message = "other message with no return"
2021-08-13 07:12:16 -04:00
_ = th . CreateMessagePostWithClient ( client , channel , message )
2017-02-21 07:36:52 -05:00
2021-08-13 07:12:16 -04:00
posts , _ , _ := client . SearchPosts ( th . BasicTeam . Id , "channel:" , false )
2019-12-22 06:35:31 -05:00
require . Empty ( t , posts . Order , "wrong number of posts for search 'channel:'" )
2017-02-21 07:36:52 -05:00
2021-08-13 07:12:16 -04:00
posts , _ , _ = client . SearchPosts ( th . BasicTeam . Id , "in:" , false )
2019-12-22 06:35:31 -05:00
require . Empty ( t , posts . Order , "wrong number of posts for search 'in:'" )
2017-02-21 07:36:52 -05:00
2021-08-13 07:12:16 -04:00
posts , _ , _ = client . SearchPosts ( th . BasicTeam . Id , "channel:" + th . BasicChannel . Name , false )
2019-11-28 17:41:51 -05:00
require . Lenf ( t , posts . Order , 2 , "wrong number of posts returned for search 'channel:%v'" , th . BasicChannel . Name )
2017-02-21 07:36:52 -05:00
2021-08-13 07:12:16 -04:00
posts , _ , _ = client . SearchPosts ( th . BasicTeam . Id , "in:" + th . BasicChannel2 . Name , false )
2019-11-28 17:41:51 -05:00
require . Lenf ( t , posts . Order , 2 , "wrong number of posts returned for search 'in:%v'" , th . BasicChannel2 . Name )
2017-02-21 07:36:52 -05:00
2021-08-13 07:12:16 -04:00
posts , _ , _ = client . SearchPosts ( th . BasicTeam . Id , "channel:" + th . BasicChannel2 . Name , false )
2019-11-28 17:41:51 -05:00
require . Lenf ( t , posts . Order , 2 , "wrong number of posts for search 'channel:%v'" , th . BasicChannel2 . Name )
2017-02-21 07:36:52 -05:00
2021-08-13 07:12:16 -04:00
posts , _ , _ = client . SearchPosts ( th . BasicTeam . Id , "ChAnNeL:" + th . BasicChannel2 . Name , false )
2019-11-28 17:41:51 -05:00
require . Lenf ( t , posts . Order , 2 , "wrong number of posts for search 'ChAnNeL:%v'" , th . BasicChannel2 . Name )
2017-02-21 07:36:52 -05:00
2021-08-13 07:12:16 -04:00
posts , _ , _ = client . SearchPosts ( th . BasicTeam . Id , "sgtitlereview" , false )
2019-11-28 17:41:51 -05:00
require . Lenf ( t , posts . Order , 2 , "wrong number of posts for search 'sgtitlereview'" )
2017-02-21 07:36:52 -05:00
2021-08-13 07:12:16 -04:00
posts , _ , _ = client . SearchPosts ( th . BasicTeam . Id , "sgtitlereview channel:" + th . BasicChannel . Name , false )
2019-11-28 17:41:51 -05:00
require . Lenf ( t , posts . Order , 1 , "wrong number of posts for search 'sgtitlereview channel:%v'" , th . BasicChannel . Name )
2017-02-21 07:36:52 -05:00
2021-08-13 07:12:16 -04:00
posts , _ , _ = client . SearchPosts ( th . BasicTeam . Id , "sgtitlereview in: " + th . BasicChannel2 . Name , false )
2019-11-28 17:41:51 -05:00
require . Lenf ( t , posts . Order , 1 , "wrong number of posts for search 'sgtitlereview in: %v'" , th . BasicChannel2 . Name )
2017-02-21 07:36:52 -05:00
2021-08-13 07:12:16 -04:00
posts , _ , _ = client . SearchPosts ( th . BasicTeam . Id , "sgtitlereview channel: " + th . BasicChannel2 . Name , false )
2019-11-28 17:41:51 -05:00
require . Lenf ( t , posts . Order , 1 , "wrong number of posts for search 'sgtitlereview channel: %v'" , th . BasicChannel2 . Name )
2017-02-21 07:36:52 -05:00
2021-08-13 07:12:16 -04:00
posts , _ , _ = client . SearchPosts ( th . BasicTeam . Id , "channel: " + th . BasicChannel2 . Name + " channel: " + channel . Name , false )
2019-11-28 17:41:51 -05:00
require . Lenf ( t , posts . Order , 3 , "wrong number of posts for 'channel: %v channel: %v'" , th . BasicChannel2 . Name , channel . Name )
2017-02-21 07:36:52 -05:00
}
func TestSearchPostsFromUser ( t * testing . T ) {
2020-02-10 13:31:41 -05:00
th := Setup ( t ) . InitBasic ( )
2017-10-02 04:50:56 -04:00
defer th . TearDown ( )
2021-08-13 07:12:16 -04:00
client := th . Client
2017-02-21 07:36:52 -05:00
th . LoginTeamAdmin ( )
user := th . CreateUser ( )
2017-10-02 04:50:56 -04:00
th . LinkUserToTeam ( user , th . BasicTeam )
2021-04-02 05:03:23 -04:00
th . App . AddUserToChannel ( user , th . BasicChannel , false )
th . App . AddUserToChannel ( user , th . BasicChannel2 , false )
2017-02-21 07:36:52 -05:00
message := "sgtitlereview with space"
_ = th . CreateMessagePost ( message )
2021-08-13 07:12:16 -04:00
client . Logout ( )
2017-02-21 07:36:52 -05:00
th . LoginBasic2 ( )
message = "sgtitlereview\n with return"
2021-08-13 07:12:16 -04:00
_ = th . CreateMessagePostWithClient ( client , th . BasicChannel2 , message )
2017-02-21 07:36:52 -05:00
2021-08-13 07:12:16 -04:00
posts , _ , _ := client . SearchPosts ( th . BasicTeam . Id , "from: " + th . TeamAdminUser . Username , false )
2019-11-28 17:41:51 -05:00
require . Lenf ( t , posts . Order , 2 , "wrong number of posts for search 'from: %v'" , th . TeamAdminUser . Username )
2017-02-21 07:36:52 -05:00
2021-08-13 07:12:16 -04:00
posts , _ , _ = client . SearchPosts ( th . BasicTeam . Id , "from: " + th . BasicUser2 . Username , false )
2019-11-28 17:41:51 -05:00
require . Lenf ( t , posts . Order , 1 , "wrong number of posts for search 'from: %v" , th . BasicUser2 . Username )
2017-02-21 07:36:52 -05:00
2021-08-13 07:12:16 -04:00
posts , _ , _ = client . SearchPosts ( th . BasicTeam . Id , "from: " + th . BasicUser2 . Username + " sgtitlereview" , false )
2019-11-28 17:41:51 -05:00
require . Lenf ( t , posts . Order , 1 , "wrong number of posts for search 'from: %v'" , th . BasicUser2 . Username )
2017-02-21 07:36:52 -05:00
message = "hullo"
_ = th . CreateMessagePost ( message )
2021-08-13 07:12:16 -04:00
posts , _ , _ = client . SearchPosts ( th . BasicTeam . Id , "from: " + th . BasicUser2 . Username + " in:" + th . BasicChannel . Name , false )
2019-11-28 17:41:51 -05:00
require . Len ( t , posts . Order , 1 , "wrong number of posts for search 'from: %v in:" , th . BasicUser2 . Username , th . BasicChannel . Name )
2017-02-21 07:36:52 -05:00
2021-08-13 07:12:16 -04:00
client . Login ( user . Email , user . Password )
2017-02-21 07:36:52 -05:00
// wait for the join/leave messages to be created for user3 since they're done asynchronously
time . Sleep ( 100 * time . Millisecond )
2021-08-13 07:12:16 -04:00
posts , _ , _ = client . SearchPosts ( th . BasicTeam . Id , "from: " + th . BasicUser2 . Username , false )
2019-11-28 17:41:51 -05:00
require . Lenf ( t , posts . Order , 2 , "wrong number of posts for search 'from: %v'" , th . BasicUser2 . Username )
2017-02-21 07:36:52 -05:00
2021-08-13 07:12:16 -04:00
posts , _ , _ = client . SearchPosts ( th . BasicTeam . Id , "from: " + th . BasicUser2 . Username + " from: " + user . Username , false )
2019-11-28 17:41:51 -05:00
require . Lenf ( t , posts . Order , 2 , "wrong number of posts for search 'from: %v from: %v'" , th . BasicUser2 . Username , user . Username )
2017-02-21 07:36:52 -05:00
2021-08-13 07:12:16 -04:00
posts , _ , _ = client . SearchPosts ( th . BasicTeam . Id , "from: " + th . BasicUser2 . Username + " from: " + user . Username + " in:" + th . BasicChannel2 . Name , false )
2019-11-28 17:41:51 -05:00
require . Len ( t , posts . Order , 1 , "wrong number of posts" )
2017-02-21 07:36:52 -05:00
message = "coconut"
2021-08-13 07:12:16 -04:00
_ = th . CreateMessagePostWithClient ( client , th . BasicChannel2 , message )
2017-02-21 07:36:52 -05:00
2021-08-13 07:12:16 -04:00
posts , _ , _ = client . SearchPosts ( th . BasicTeam . Id , "from: " + th . BasicUser2 . Username + " from: " + user . Username + " in:" + th . BasicChannel2 . Name + " coconut" , false )
2019-11-28 17:41:51 -05:00
require . Len ( t , posts . Order , 1 , "wrong number of posts" )
2017-02-21 07:36:52 -05:00
}
2017-02-24 06:15:13 -05:00
2018-08-28 13:09:32 -04:00
func TestSearchPostsWithDateFlags ( t * testing . T ) {
2020-02-10 13:31:41 -05:00
th := Setup ( t ) . InitBasic ( )
2018-08-28 13:09:32 -04:00
defer th . TearDown ( )
th . LoginBasic ( )
2021-08-13 07:12:16 -04:00
client := th . Client
2018-08-28 13:09:32 -04:00
message := "sgtitlereview\n with return"
createDate := time . Date ( 2018 , 8 , 1 , 5 , 0 , 0 , 0 , time . UTC )
_ = th . CreateMessagePostNoClient ( th . BasicChannel , message , utils . MillisFromTime ( createDate ) )
message = "other message with no return"
createDate = time . Date ( 2018 , 8 , 2 , 5 , 0 , 0 , 0 , time . UTC )
_ = th . CreateMessagePostNoClient ( th . BasicChannel , message , utils . MillisFromTime ( createDate ) )
message = "other message with no return"
createDate = time . Date ( 2018 , 8 , 3 , 5 , 0 , 0 , 0 , time . UTC )
_ = th . CreateMessagePostNoClient ( th . BasicChannel , message , utils . MillisFromTime ( createDate ) )
2021-08-13 07:12:16 -04:00
posts , _ , _ := client . SearchPosts ( th . BasicTeam . Id , "return" , false )
2019-11-28 17:41:51 -05:00
require . Len ( t , posts . Order , 3 , "wrong number of posts" )
2018-08-28 13:09:32 -04:00
2021-08-13 07:12:16 -04:00
posts , _ , _ = client . SearchPosts ( th . BasicTeam . Id , "on:" , false )
2019-12-22 06:35:31 -05:00
require . Empty ( t , posts . Order , "wrong number of posts" )
2018-08-28 13:09:32 -04:00
2021-08-13 07:12:16 -04:00
posts , _ , _ = client . SearchPosts ( th . BasicTeam . Id , "after:" , false )
2019-12-22 06:35:31 -05:00
require . Empty ( t , posts . Order , "wrong number of posts" )
2018-08-28 13:09:32 -04:00
2021-08-13 07:12:16 -04:00
posts , _ , _ = client . SearchPosts ( th . BasicTeam . Id , "before:" , false )
2019-12-22 06:35:31 -05:00
require . Empty ( t , posts . Order , "wrong number of posts" )
2018-08-28 13:09:32 -04:00
2021-08-13 07:12:16 -04:00
posts , _ , _ = client . SearchPosts ( th . BasicTeam . Id , "on:2018-08-01" , false )
2019-11-28 17:41:51 -05:00
require . Len ( t , posts . Order , 1 , "wrong number of posts" )
2018-08-28 13:09:32 -04:00
2021-08-13 07:12:16 -04:00
posts , _ , _ = client . SearchPosts ( th . BasicTeam . Id , "after:2018-08-01" , false )
2018-08-28 13:09:32 -04:00
resultCount := 0
for _ , post := range posts . Posts {
if post . UserId == th . BasicUser . Id {
resultCount = resultCount + 1
}
}
2019-11-28 17:41:51 -05:00
require . Equal ( t , 2 , resultCount , "wrong number of posts" )
2018-08-28 13:09:32 -04:00
2021-08-13 07:12:16 -04:00
posts , _ , _ = client . SearchPosts ( th . BasicTeam . Id , "before:2018-08-02" , false )
2019-11-28 17:41:51 -05:00
require . Len ( t , posts . Order , 1 , "wrong number of posts" )
2018-08-28 13:09:32 -04:00
2021-08-13 07:12:16 -04:00
posts , _ , _ = client . SearchPosts ( th . BasicTeam . Id , "before:2018-08-03 after:2018-08-02" , false )
2019-12-22 06:35:31 -05:00
require . Empty ( t , posts . Order , "wrong number of posts" )
2018-08-29 18:44:00 -04:00
2021-08-13 07:12:16 -04:00
posts , _ , _ = client . SearchPosts ( th . BasicTeam . Id , "before:2018-08-03 after:2018-08-01" , false )
2019-11-28 17:41:51 -05:00
require . Len ( t , posts . Order , 1 , "wrong number of posts" )
2018-08-28 13:09:32 -04:00
}
2017-02-24 06:15:13 -05:00
func TestGetFileInfosForPost ( t * testing . T ) {
2020-02-10 13:31:41 -05:00
th := Setup ( t ) . InitBasic ( )
2017-10-02 04:50:56 -04:00
defer th . TearDown ( )
2021-08-13 07:12:16 -04:00
client := th . Client
2017-02-24 06:15:13 -05:00
2017-10-30 12:57:24 -04:00
fileIds := make ( [ ] string , 3 )
2019-11-28 17:41:51 -05:00
data , err := testutils . ReadTestFile ( "test.png" )
require . NoError ( t , err )
for i := 0 ; i < 3 ; i ++ {
2021-08-13 07:12:16 -04:00
fileResp , _ , _ := client . UploadFile ( data , th . BasicChannel . Id , "test.png" )
2019-11-28 17:41:51 -05:00
fileIds [ i ] = fileResp . FileInfos [ 0 ] . Id
2017-02-24 06:15:13 -05:00
}
2017-06-19 12:08:52 -04:00
post := & model . Post { ChannelId : th . BasicChannel . Id , Message : "zz" + model . NewId ( ) + "a" , FileIds : fileIds }
2021-08-13 07:12:16 -04:00
post , _ , _ = client . CreatePost ( post )
2017-02-24 06:15:13 -05:00
2021-08-13 07:12:16 -04:00
infos , resp , err := client . GetFileInfosForPost ( post . Id , "" )
require . NoError ( t , err )
2017-02-24 06:15:13 -05:00
2019-11-28 17:41:51 -05:00
require . Len ( t , infos , 3 , "missing file infos" )
2017-02-24 06:15:13 -05:00
found := false
for _ , info := range infos {
if info . Id == fileIds [ 0 ] {
found = true
}
}
2019-11-28 17:41:51 -05:00
require . True ( t , found , "missing file info" )
2017-02-24 06:15:13 -05:00
2021-08-13 07:12:16 -04:00
infos , resp , _ = client . GetFileInfosForPost ( post . Id , resp . Etag )
2017-02-24 06:15:13 -05:00
CheckEtag ( t , infos , resp )
2021-08-13 07:12:16 -04:00
infos , _ , err = client . GetFileInfosForPost ( th . BasicPost . Id , "" )
require . NoError ( t , err )
2017-02-24 06:15:13 -05:00
2019-12-22 06:35:31 -05:00
require . Empty ( t , infos , "should have no file infos" )
2017-02-24 06:15:13 -05:00
2021-08-13 07:12:16 -04:00
_ , resp , err = client . GetFileInfosForPost ( "junk" , "" )
require . Error ( t , err )
2017-02-24 06:15:13 -05:00
CheckBadRequestStatus ( t , resp )
2021-08-13 07:12:16 -04:00
_ , resp , err = client . GetFileInfosForPost ( model . NewId ( ) , "" )
require . Error ( t , err )
2017-02-24 06:15:13 -05:00
CheckForbiddenStatus ( t , resp )
2021-08-13 07:12:16 -04:00
client . Logout ( )
_ , resp , err = client . GetFileInfosForPost ( model . NewId ( ) , "" )
require . Error ( t , err )
2017-02-24 06:15:13 -05:00
CheckUnauthorizedStatus ( t , resp )
2021-08-13 07:12:16 -04:00
_ , _ , err = th . SystemAdminClient . GetFileInfosForPost ( th . BasicPost . Id , "" )
require . NoError ( t , err )
2017-02-24 06:15:13 -05:00
}
2019-08-21 08:48:25 -04:00
func TestSetChannelUnread ( t * testing . T ) {
2020-02-10 13:31:41 -05:00
th := Setup ( t ) . InitBasic ( )
2019-08-21 08:48:25 -04:00
defer th . TearDown ( )
u1 := th . BasicUser
u2 := th . BasicUser2
s2 , _ := th . App . GetSession ( th . Client . AuthToken )
th . Client . Login ( u1 . Email , u1 . Password )
c1 := th . BasicChannel
c1toc2 := & model . ChannelView { ChannelId : th . BasicChannel2 . Id , PrevChannelId : c1 . Id }
now := utils . MillisFromTime ( time . Now ( ) )
th . CreateMessagePostNoClient ( c1 , "AAA" , now )
p2 := th . CreateMessagePostNoClient ( c1 , "BBB" , now + 10 )
th . CreateMessagePostNoClient ( c1 , "CCC" , now + 20 )
pp1 := th . CreateMessagePostNoClient ( th . BasicPrivateChannel , "Sssh!" , now )
pp2 := th . CreateMessagePostNoClient ( th . BasicPrivateChannel , "You Sssh!" , now + 10 )
require . NotNil ( t , pp1 )
require . NotNil ( t , pp2 )
// Ensure that post have been read
unread , err := th . App . GetChannelUnread ( c1 . Id , u1 . Id )
require . Nil ( t , err )
require . Equal ( t , int64 ( 4 ) , unread . MsgCount )
2021-08-13 07:12:16 -04:00
unread , appErr := th . App . GetChannelUnread ( c1 . Id , u2 . Id )
require . Nil ( t , appErr )
2019-08-21 08:48:25 -04:00
require . Equal ( t , int64 ( 4 ) , unread . MsgCount )
2021-08-13 07:12:16 -04:00
_ , appErr = th . App . ViewChannel ( c1toc2 , u2 . Id , s2 . Id , false )
require . Nil ( t , appErr )
unread , appErr = th . App . GetChannelUnread ( c1 . Id , u2 . Id )
require . Nil ( t , appErr )
2019-08-21 08:48:25 -04:00
require . Equal ( t , int64 ( 0 ) , unread . MsgCount )
t . Run ( "Unread last one" , func ( t * testing . T ) {
2021-08-13 07:12:16 -04:00
r , err := th . Client . SetPostUnread ( u1 . Id , p2 . Id , true )
require . NoError ( t , err )
CheckOKStatus ( t , r )
unread , appErr := th . App . GetChannelUnread ( c1 . Id , u1 . Id )
require . Nil ( t , appErr )
2019-09-02 04:00:38 -04:00
assert . Equal ( t , int64 ( 2 ) , unread . MsgCount )
2019-08-21 08:48:25 -04:00
} )
t . Run ( "Unread on a private channel" , func ( t * testing . T ) {
2021-08-13 07:12:16 -04:00
r , _ := th . Client . SetPostUnread ( u1 . Id , pp2 . Id , true )
2019-08-21 08:48:25 -04:00
assert . Equal ( t , 200 , r . StatusCode )
2021-08-13 07:12:16 -04:00
unread , appErr := th . App . GetChannelUnread ( th . BasicPrivateChannel . Id , u1 . Id )
require . Nil ( t , appErr )
2019-09-02 04:00:38 -04:00
assert . Equal ( t , int64 ( 1 ) , unread . MsgCount )
2021-08-13 07:12:16 -04:00
r , _ = th . Client . SetPostUnread ( u1 . Id , pp1 . Id , true )
2019-08-21 08:48:25 -04:00
assert . Equal ( t , 200 , r . StatusCode )
2021-08-13 07:12:16 -04:00
unread , appErr = th . App . GetChannelUnread ( th . BasicPrivateChannel . Id , u1 . Id )
require . Nil ( t , appErr )
2019-09-02 04:00:38 -04:00
assert . Equal ( t , int64 ( 2 ) , unread . MsgCount )
2019-08-21 08:48:25 -04:00
} )
t . Run ( "Can't unread an imaginary post" , func ( t * testing . T ) {
2021-08-13 07:12:16 -04:00
r , _ := th . Client . SetPostUnread ( u1 . Id , "invalid4ofngungryquinj976y" , true )
2019-08-21 08:48:25 -04:00
assert . Equal ( t , http . StatusForbidden , r . StatusCode )
} )
// let's create another user to test permissions
u3 := th . CreateUser ( )
c3 := th . CreateClient ( )
c3 . Login ( u3 . Email , u3 . Password )
t . Run ( "Can't unread channels you don't belong to" , func ( t * testing . T ) {
2021-08-13 07:12:16 -04:00
r , _ := c3 . SetPostUnread ( u3 . Id , pp1 . Id , true )
2019-08-21 08:48:25 -04:00
assert . Equal ( t , http . StatusForbidden , r . StatusCode )
} )
t . Run ( "Can't unread users you don't have permission to edit" , func ( t * testing . T ) {
2021-08-13 07:12:16 -04:00
r , _ := c3 . SetPostUnread ( u1 . Id , pp1 . Id , true )
2019-08-21 08:48:25 -04:00
assert . Equal ( t , http . StatusForbidden , r . StatusCode )
} )
t . Run ( "Can't unread if user is not logged in" , func ( t * testing . T ) {
th . Client . Logout ( )
2021-08-13 07:12:16 -04:00
response , err := th . Client . SetPostUnread ( u1 . Id , p2 . Id , true )
require . Error ( t , err )
CheckUnauthorizedStatus ( t , response )
2019-08-21 08:48:25 -04:00
} )
}
2021-04-16 03:26:08 -04:00
2021-05-26 11:10:25 -04:00
func TestSetPostUnreadWithoutCollapsedThreads ( t * testing . T ) {
os . Setenv ( "MM_FEATUREFLAGS_COLLAPSEDTHREADS" , "true" )
defer os . Unsetenv ( "MM_FEATUREFLAGS_COLLAPSEDTHREADS" )
th := Setup ( t ) . InitBasic ( )
defer th . TearDown ( )
th . App . UpdateConfig ( func ( cfg * model . Config ) {
* cfg . ServiceSettings . ThreadAutoFollow = true
2021-07-12 14:05:36 -04:00
* cfg . ServiceSettings . CollapsedThreads = model . CollapsedThreadsDefaultOn
2021-05-26 11:10:25 -04:00
} )
// user2: first root mention @user1
// - user1: hello
// - user2: mention @u1
2022-01-19 23:37:27 -05:00
// - user1: another reply
2021-05-26 11:10:25 -04:00
// - user2: another mention @u1
// user1: a root post
// user2: Another root mention @u1
user1Mention := " @" + th . BasicUser . Username
rootPost1 , appErr := th . App . CreatePost ( th . Context , & model . Post { UserId : th . BasicUser2 . Id , CreateAt : model . GetMillis ( ) , ChannelId : th . BasicChannel . Id , Message : "first root mention" + user1Mention } , th . BasicChannel , false , false )
require . Nil ( t , appErr )
_ , appErr = th . App . CreatePost ( th . Context , & model . Post { RootId : rootPost1 . Id , UserId : th . BasicUser . Id , CreateAt : model . GetMillis ( ) , ChannelId : th . BasicChannel . Id , Message : "hello" } , th . BasicChannel , false , false )
require . Nil ( t , appErr )
replyPost1 , appErr := th . App . CreatePost ( th . Context , & model . Post { RootId : rootPost1 . Id , UserId : th . BasicUser2 . Id , CreateAt : model . GetMillis ( ) , ChannelId : th . BasicChannel . Id , Message : "mention" + user1Mention } , th . BasicChannel , false , false )
require . Nil ( t , appErr )
_ , appErr = th . App . CreatePost ( th . Context , & model . Post { RootId : rootPost1 . Id , UserId : th . BasicUser . Id , CreateAt : model . GetMillis ( ) , ChannelId : th . BasicChannel . Id , Message : "another reply" } , th . BasicChannel , false , false )
require . Nil ( t , appErr )
_ , appErr = th . App . CreatePost ( th . Context , & model . Post { RootId : rootPost1 . Id , UserId : th . BasicUser2 . Id , CreateAt : model . GetMillis ( ) , ChannelId : th . BasicChannel . Id , Message : "another mention" + user1Mention } , th . BasicChannel , false , false )
require . Nil ( t , appErr )
_ , appErr = th . App . CreatePost ( th . Context , & model . Post { UserId : th . BasicUser . Id , CreateAt : model . GetMillis ( ) , ChannelId : th . BasicChannel . Id , Message : "a root post" } , th . BasicChannel , false , false )
require . Nil ( t , appErr )
_ , appErr = th . App . CreatePost ( th . Context , & model . Post { UserId : th . BasicUser2 . Id , CreateAt : model . GetMillis ( ) , ChannelId : th . BasicChannel . Id , Message : "another root mention" + user1Mention } , th . BasicChannel , false , false )
require . Nil ( t , appErr )
t . Run ( "Mark reply post as unread" , func ( t * testing . T ) {
2021-08-13 07:12:16 -04:00
_ , err := th . Client . SetPostUnread ( th . BasicUser . Id , replyPost1 . Id , false )
require . NoError ( t , err )
2021-05-26 11:10:25 -04:00
channelUnread , appErr := th . App . GetChannelUnread ( th . BasicChannel . Id , th . BasicUser . Id )
require . Nil ( t , appErr )
require . Equal ( t , int64 ( 3 ) , channelUnread . MentionCount )
// MentionCountRoot should be zero so that supported clients don't show a mention badge for the channel
require . Equal ( t , int64 ( 0 ) , channelUnread . MentionCountRoot )
require . Equal ( t , int64 ( 5 ) , channelUnread . MsgCount )
// MentionCountRoot should be zero so that supported clients don't show the channel as unread
require . Equal ( t , channelUnread . MsgCountRoot , int64 ( 0 ) )
2021-08-13 07:12:16 -04:00
threadMembership , appErr := th . App . GetThreadMembershipForUser ( th . BasicUser . Id , rootPost1 . Id )
require . Nil ( t , appErr )
thread , appErr := th . App . GetThreadForUser ( th . BasicTeam . Id , threadMembership , false )
require . Nil ( t , appErr )
2021-05-26 11:10:25 -04:00
require . Equal ( t , int64 ( 2 ) , thread . UnreadMentions )
require . Equal ( t , int64 ( 3 ) , thread . UnreadReplies )
} )
t . Run ( "Mark root post as unread" , func ( t * testing . T ) {
2021-08-13 07:12:16 -04:00
_ , err := th . Client . SetPostUnread ( th . BasicUser . Id , rootPost1 . Id , false )
require . NoError ( t , err )
2021-05-26 11:10:25 -04:00
channelUnread , appErr := th . App . GetChannelUnread ( th . BasicChannel . Id , th . BasicUser . Id )
require . Nil ( t , appErr )
require . Equal ( t , int64 ( 4 ) , channelUnread . MentionCount )
require . Equal ( t , int64 ( 2 ) , channelUnread . MentionCountRoot )
require . Equal ( t , int64 ( 7 ) , channelUnread . MsgCount )
require . Equal ( t , int64 ( 3 ) , channelUnread . MsgCountRoot )
} )
}
2021-11-26 11:51:32 -05:00
func TestGetPostsByIds ( t * testing . T ) {
th := Setup ( t ) . InitBasic ( )
defer th . TearDown ( )
client := th . Client
post1 := th . CreatePost ( )
post2 := th . CreatePost ( )
posts , response , err := client . GetPostsByIds ( [ ] string { post1 . Id , post2 . Id } )
require . NoError ( t , err )
CheckOKStatus ( t , response )
require . Len ( t , posts , 2 , "wrong number returned" )
require . Equal ( t , posts [ 0 ] . Id , post2 . Id )
require . Equal ( t , posts [ 1 ] . Id , post1 . Id )
_ , response , err = client . GetPostsByIds ( [ ] string { } )
require . Error ( t , err )
CheckBadRequestStatus ( t , response )
_ , response , err = client . GetPostsByIds ( [ ] string { "abc123" } )
require . Error ( t , err )
CheckNotFoundStatus ( t , response )
}
2022-01-21 11:25:33 -05:00
2022-01-31 10:47:18 -05:00
func TestCreatePostNotificationsWithCRT ( t * testing . T ) {
th := Setup ( t ) . InitBasic ( )
rpost := th . CreatePost ( )
th . App . UpdateConfig ( func ( cfg * model . Config ) {
* cfg . ServiceSettings . ThreadAutoFollow = true
* cfg . ServiceSettings . CollapsedThreads = model . CollapsedThreadsDefaultOn
} )
testCases := [ ] struct {
name string
post * model . Post
notifyProps model . StringMap
mentions bool
followers bool
} {
{
name : "When default is NONE, comments is NEVER, desktop threads is ALL, and has no mentions" ,
post : & model . Post {
ChannelId : th . BasicChannel . Id ,
Message : "reply" ,
UserId : th . BasicUser2 . Id ,
RootId : rpost . Id ,
} ,
notifyProps : model . StringMap {
model . DesktopNotifyProp : model . UserNotifyNone ,
model . CommentsNotifyProp : model . CommentsNotifyNever ,
model . DesktopThreadsNotifyProp : model . UserNotifyAll ,
} ,
mentions : false ,
followers : false ,
} ,
{
name : "When default is NONE, comments is NEVER, desktop threads is ALL, and has mentions" ,
post : & model . Post {
ChannelId : th . BasicChannel . Id ,
Message : "mention @" + th . BasicUser . Username ,
UserId : th . BasicUser2 . Id ,
RootId : rpost . Id ,
} ,
notifyProps : model . StringMap {
model . DesktopNotifyProp : model . UserNotifyNone ,
model . CommentsNotifyProp : model . CommentsNotifyNever ,
model . DesktopThreadsNotifyProp : model . UserNotifyAll ,
} ,
mentions : true ,
followers : false ,
} ,
{
name : "When default is MENTION, comments is NEVER, desktop threads is ALL, and has no mentions" ,
post : & model . Post {
ChannelId : th . BasicChannel . Id ,
Message : "reply" ,
UserId : th . BasicUser2 . Id ,
RootId : rpost . Id ,
} ,
notifyProps : model . StringMap {
model . DesktopNotifyProp : model . UserNotifyMention ,
model . CommentsNotifyProp : model . CommentsNotifyNever ,
model . DesktopThreadsNotifyProp : model . UserNotifyAll ,
} ,
mentions : false ,
followers : true ,
} ,
{
name : "When default is MENTION, comments is ANY, desktop threads is MENTION, and has no mentions" ,
post : & model . Post {
ChannelId : th . BasicChannel . Id ,
Message : "reply" ,
UserId : th . BasicUser2 . Id ,
RootId : rpost . Id ,
} ,
notifyProps : model . StringMap {
model . DesktopNotifyProp : model . UserNotifyMention ,
model . CommentsNotifyProp : model . CommentsNotifyAny ,
model . DesktopThreadsNotifyProp : model . UserNotifyMention ,
} ,
mentions : false ,
followers : false ,
} ,
{
name : "When default is MENTION, comments is NEVER, desktop threads is MENTION, and has mentions" ,
post : & model . Post {
ChannelId : th . BasicChannel . Id ,
Message : "reply @" + th . BasicUser . Username ,
UserId : th . BasicUser2 . Id ,
RootId : rpost . Id ,
} ,
notifyProps : model . StringMap {
model . DesktopNotifyProp : model . UserNotifyMention ,
model . CommentsNotifyProp : model . CommentsNotifyNever ,
model . DesktopThreadsNotifyProp : model . UserNotifyMention ,
} ,
mentions : true ,
followers : true ,
} ,
}
// reset the cache so that channel member notify props includes all users
th . App . Srv ( ) . Store . Channel ( ) . ClearCaches ( )
for _ , tc := range testCases {
t . Run ( tc . name , func ( t * testing . T ) {
userWSClient , err := th . CreateWebSocketClient ( )
require . NoError ( t , err )
defer userWSClient . Close ( )
userWSClient . Listen ( )
patch := & model . UserPatch { }
patch . NotifyProps = model . CopyStringMap ( th . BasicUser . NotifyProps )
for k , v := range tc . notifyProps {
patch . NotifyProps [ k ] = v
}
// update user's notify props
_ , _ , err = th . Client . PatchUser ( th . BasicUser . Id , patch )
require . NoError ( t , err )
// post a reply on the thread
_ , appErr := th . App . CreatePostAsUser ( th . Context , tc . post , th . Context . Session ( ) . Id , false )
require . Nil ( t , appErr )
var caught bool
func ( ) {
for {
select {
case ev := <- userWSClient . EventChannel :
if ev . EventType ( ) == model . WebsocketEventPosted {
caught = true
data := ev . GetData ( )
users , ok := data [ "mentions" ]
require . Equal ( t , tc . mentions , ok )
if ok {
require . EqualValues ( t , "[\"" + th . BasicUser . Id + "\"]" , users )
}
users , ok = data [ "followers" ]
require . Equal ( t , tc . followers , ok )
if ok {
require . EqualValues ( t , "[\"" + th . BasicUser . Id + "\"]" , users )
}
}
case <- time . After ( 1 * time . Second ) :
return
}
}
} ( )
require . Truef ( t , caught , "User should have received %s event" , model . WebsocketEventPosted )
} )
}
}
2022-01-21 11:25:33 -05:00
func TestGetPostStripActionIntegrations ( t * testing . T ) {
th := Setup ( t ) . InitBasic ( )
defer th . TearDown ( )
client := th . Client
post := & model . Post {
ChannelId : th . BasicChannel . Id ,
Message : "with slack attachment action" ,
}
post . AddProp ( "attachments" , [ ] * model . SlackAttachment {
{
Text : "Slack Attachment Text" ,
Fields : [ ] * model . SlackAttachmentField {
{
Title : "Test Field" ,
Value : "test value" ,
Short : true ,
} ,
} ,
Actions : [ ] * model . PostAction {
{
Type : "button" ,
Name : "test-name" ,
Integration : & model . PostActionIntegration {
URL : "https://test.test/action" ,
Context : map [ string ] interface { } {
"test-ctx" : "some-value" ,
} ,
} ,
} ,
} ,
} ,
} )
rpost , resp , err2 := client . CreatePost ( post )
require . NoError ( t , err2 )
CheckCreatedStatus ( t , resp )
actualPost , _ , err := client . GetPost ( rpost . Id , "" )
require . NoError ( t , err )
attachments , _ := actualPost . Props [ "attachments" ] . ( [ ] interface { } )
require . Equal ( t , 1 , len ( attachments ) )
att , _ := attachments [ 0 ] . ( map [ string ] interface { } )
require . NotNil ( t , att )
actions , _ := att [ "actions" ] . ( [ ] interface { } )
require . Equal ( t , 1 , len ( actions ) )
action , _ := actions [ 0 ] . ( map [ string ] interface { } )
require . NotNil ( t , action )
// integration must be omitted
require . Nil ( t , action [ "integration" ] )
}