diff options
Diffstat (limited to 'api/post_test.go')
-rw-r--r-- | api/post_test.go | 1510 |
1 files changed, 0 insertions, 1510 deletions
diff --git a/api/post_test.go b/api/post_test.go deleted file mode 100644 index 7a2367312..000000000 --- a/api/post_test.go +++ /dev/null @@ -1,1510 +0,0 @@ -// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. -// See License.txt for license information. - -package api - -import ( - "encoding/json" - "fmt" - "net/http" - "net/http/httptest" - "net/url" - "reflect" - "strings" - - "testing" - "time" - - "github.com/mattermost/mattermost-server/app" - "github.com/mattermost/mattermost-server/model" - "github.com/mattermost/mattermost-server/store" - "github.com/mattermost/mattermost-server/utils" -) - -func TestCreatePost(t *testing.T) { - th := Setup().InitBasic() - defer th.TearDown() - - Client := th.BasicClient - team := th.BasicTeam - team2 := th.CreateTeam(th.BasicClient) - user3 := th.CreateUser(th.BasicClient) - th.LinkUserToTeam(user3, team2) - channel1 := th.BasicChannel - channel2 := th.CreateChannel(Client, team) - - th.InitSystemAdmin() - AdminClient := th.SystemAdminClient - adminTeam := th.SystemAdminTeam - adminUser := th.CreateUser(th.SystemAdminClient) - th.LinkUserToTeam(adminUser, adminTeam) - - post1 := &model.Post{ChannelId: channel1.Id, Message: "#hashtag a" + model.NewId() + "a", Props: model.StringInterface{model.PROPS_ADD_CHANNEL_MEMBER: "no good"}} - rpost1, err := Client.CreatePost(post1) - if err != nil { - t.Fatal(err) - } - - if rpost1.Data.(*model.Post).Message != post1.Message { - t.Fatal("message didn't match") - } - - if rpost1.Data.(*model.Post).Hashtags != "#hashtag" { - t.Fatal("hashtag didn't match") - } - - if len(rpost1.Data.(*model.Post).FileIds) != 0 { - t.Fatal("shouldn't have files") - } - - if rpost1.Data.(*model.Post).EditAt != 0 { - t.Fatal("Newly craeted post shouldn't have EditAt set") - } - - if rpost1.Data.(*model.Post).Props[model.PROPS_ADD_CHANNEL_MEMBER] != nil { - t.Fatal("newly created post shouldn't have Props['add_channel_member'] set") - } - - _, err = Client.CreatePost(&model.Post{ChannelId: channel1.Id, Message: "#hashtag a" + model.NewId() + "a", Type: model.POST_SYSTEM_GENERIC}) - if err == nil { - t.Fatal("should have failed - bad post type") - } - - post2 := &model.Post{ChannelId: channel1.Id, Message: "zz" + model.NewId() + "a", RootId: rpost1.Data.(*model.Post).Id} - rpost2, err := Client.CreatePost(post2) - if err != nil { - t.Fatal(err) - } - - post3 := &model.Post{ChannelId: channel1.Id, Message: "zz" + model.NewId() + "a", RootId: rpost1.Data.(*model.Post).Id, ParentId: rpost2.Data.(*model.Post).Id} - _, err = Client.CreatePost(post3) - if err != nil { - t.Fatal(err) - } - - post4 := &model.Post{ChannelId: channel1.Id, Message: "zz" + model.NewId() + "a", RootId: "junk"} - _, err = Client.CreatePost(post4) - if err.StatusCode != http.StatusBadRequest { - t.Fatal("Should have been invalid param") - } - - post5 := &model.Post{ChannelId: channel1.Id, Message: "zz" + model.NewId() + "a", RootId: rpost1.Data.(*model.Post).Id, ParentId: "junk"} - _, err = Client.CreatePost(post5) - if err.StatusCode != http.StatusBadRequest { - t.Fatal("Should have been invalid param") - } - - post1c2 := &model.Post{ChannelId: channel2.Id, Message: "zz" + model.NewId() + "a"} - rpost1c2, err := Client.CreatePost(post1c2) - - post2c2 := &model.Post{ChannelId: channel1.Id, Message: "zz" + model.NewId() + "a", RootId: rpost1c2.Data.(*model.Post).Id} - _, err = Client.CreatePost(post2c2) - if err.StatusCode != http.StatusBadRequest { - t.Fatal("Should have been invalid param") - } - - post6 := &model.Post{ChannelId: "junk", Message: "zz" + model.NewId() + "a"} - _, err = Client.CreatePost(post6) - if err.StatusCode != http.StatusForbidden { - t.Fatal("Should have been forbidden") - } - - th.LoginBasic2() - - post7 := &model.Post{ChannelId: channel1.Id, Message: "zz" + model.NewId() + "a"} - _, err = Client.CreatePost(post7) - if err.StatusCode != http.StatusForbidden { - t.Fatal("Should have been forbidden") - } - - Client.Login(user3.Email, user3.Password) - Client.SetTeamId(team2.Id) - channel3 := th.CreateChannel(Client, team2) - - post8 := &model.Post{ChannelId: channel1.Id, Message: "zz" + model.NewId() + "a"} - _, err = Client.CreatePost(post8) - if err.StatusCode != http.StatusForbidden { - t.Fatal("Should have been forbidden") - } - - if _, err = Client.DoApiPost("/channels/"+channel3.Id+"/create", "garbage"); err == nil { - t.Fatal("should have been an error") - } - - fileIds := make([]string, 4) - if data, err := readTestFile("test.png"); err != nil { - t.Fatal(err) - } else { - for i := 0; i < 3; i++ { - fileIds[i] = Client.MustGeneric(Client.UploadPostAttachment(data, channel3.Id, "test.png")).(*model.FileUploadResponse).FileInfos[0].Id - } - } - - // Make sure duplicated file ids are removed - fileIds[3] = fileIds[0] - - post9 := &model.Post{ - ChannelId: channel3.Id, - Message: "test", - FileIds: fileIds, - } - if resp, err := Client.CreatePost(post9); err != nil { - t.Fatal(err) - } else if rpost9 := resp.Data.(*model.Post); len(rpost9.FileIds) != 3 { - t.Fatal("post should have 3 files") - } else { - infos := store.Must(th.App.Srv.Store.FileInfo().GetForPost(rpost9.Id, true, true)).([]*model.FileInfo) - - if len(infos) != 3 { - t.Fatal("should've attached all 3 files to post") - } - } - - th.App.UpdateConfig(func(cfg *model.Config) { *cfg.TeamSettings.ExperimentalTownSquareIsReadOnly = true }) - th.App.SetLicense(model.NewTestLicense()) - - defaultChannel := store.Must(th.App.Srv.Store.Channel().GetByName(team.Id, model.DEFAULT_CHANNEL, true)).(*model.Channel) - defaultPost := &model.Post{ - ChannelId: defaultChannel.Id, - Message: "Default Channel Post", - } - if _, err = Client.CreatePost(defaultPost); err == nil { - t.Fatal("should have failed -- ExperimentalTownSquareIsReadOnly is true and it's a read only channel") - } - - adminDefaultChannel := store.Must(th.App.Srv.Store.Channel().GetByName(adminTeam.Id, model.DEFAULT_CHANNEL, true)).(*model.Channel) - adminDefaultPost := &model.Post{ - ChannelId: adminDefaultChannel.Id, - Message: "Admin Default Channel Post", - } - if _, err = AdminClient.CreatePost(adminDefaultPost); err != nil { - t.Fatal("should not have failed -- ExperimentalTownSquareIsReadOnly is true and admin can post to channel") - } -} - -func TestCreatePostWithCreateAt(t *testing.T) { - - // An ordinary user cannot use CreateAt - - th := Setup().InitBasic() - defer th.TearDown() - - Client := th.BasicClient - channel1 := th.BasicChannel - - post := &model.Post{ - ChannelId: channel1.Id, - Message: "PLT-4349", - CreateAt: 1234, - } - if resp, err := Client.CreatePost(post); err != nil { - t.Fatal(err) - } else if rpost := resp.Data.(*model.Post); rpost.CreateAt == post.CreateAt { - t.Fatal("post should be created with default CreateAt timestamp for ordinary user") - } - - // But a System Admin user can - - th.InitSystemAdmin() - SysClient := th.SystemAdminClient - - if resp, err := SysClient.CreatePost(post); err != nil { - t.Fatal(err) - } else if rpost := resp.Data.(*model.Post); rpost.CreateAt != post.CreateAt { - t.Fatal("post should be created with provided CreateAt timestamp for System Admin user") - } -} - -func testCreatePostWithOutgoingHook( - t *testing.T, - hookContentType, expectedContentType, message, triggerWord string, - fileIds []string, - triggerWhen int, -) { - th := Setup().InitSystemAdmin() - defer th.TearDown() - - Client := th.SystemAdminClient - team := th.SystemAdminTeam - user := th.SystemAdminUser - channel := th.CreateChannel(Client, team) - - th.App.UpdateConfig(func(cfg *model.Config) { - cfg.ServiceSettings.EnableOutgoingWebhooks = true - *cfg.ServiceSettings.AllowedUntrustedInternalConnections = "localhost 127.0.0.1" - }) - - 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()) - if !reflect.DeepEqual(expectedFormValues, r.Form) { - t.Logf("Form values are %q, should be %q", r.Form, expectedFormValues) - success <- false - return - } - } - - resp := &model.OutgoingWebhookResponse{} - resp.Text = model.NewString("some test text") - resp.Username = "testusername" - resp.IconURL = "http://www.mattermost.org/wp-content/uploads/2016/04/icon.png" - resp.Props = map[string]interface{}{"someprop": "somevalue"} - resp.Type = "custom_test" - - w.Write([]byte(resp.ToJson())) - - success <- true - })) - defer ts.Close() - - // create an outgoing webhook, passing it the test server URL - var triggerWords []string - if triggerWord != "" { - triggerWords = []string{triggerWord} - } - - hook = &model.OutgoingWebhook{ - ChannelId: channel.Id, - TeamId: team.Id, - ContentType: hookContentType, - TriggerWords: triggerWords, - TriggerWhen: triggerWhen, - CallbackURLs: []string{ts.URL}, - } - - if result, err := Client.CreateOutgoingWebhook(hook); err != nil { - t.Fatal(err) - } else { - hook = result.Data.(*model.OutgoingWebhook) - } - - // create a post to trigger the webhook - post = &model.Post{ - ChannelId: channel.Id, - Message: message, - FileIds: fileIds, - } - - if result, err := Client.CreatePost(post); err != nil { - t.Fatal(err) - } else { - post = result.Data.(*model.Post) - } - - 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: - if !ok { - t.Fatal("Test server did send an invalid webhook.") - } - case <-time.After(time.Second): - t.Fatal("Timeout, test server did not send the webhook.") - } -} - -func TestCreatePostWithOutgoingHook_form_urlencoded(t *testing.T) { - testCreatePostWithOutgoingHook(t, "application/x-www-form-urlencoded", "application/x-www-form-urlencoded", "triggerword lorem ipsum", "triggerword", []string{"file_id_1"}, app.TRIGGERWORDS_EXACT_MATCH) - testCreatePostWithOutgoingHook(t, "application/x-www-form-urlencoded", "application/x-www-form-urlencoded", "triggerwordaaazzz lorem ipsum", "triggerword", []string{"file_id_1"}, app.TRIGGERWORDS_STARTS_WITH) - testCreatePostWithOutgoingHook(t, "application/x-www-form-urlencoded", "application/x-www-form-urlencoded", "", "", []string{"file_id_1"}, app.TRIGGERWORDS_EXACT_MATCH) - testCreatePostWithOutgoingHook(t, "application/x-www-form-urlencoded", "application/x-www-form-urlencoded", "", "", []string{"file_id_1"}, app.TRIGGERWORDS_STARTS_WITH) -} - -func TestCreatePostWithOutgoingHook_json(t *testing.T) { - testCreatePostWithOutgoingHook(t, "application/json", "application/json", "triggerword lorem ipsum", "triggerword", []string{"file_id_1, file_id_2"}, app.TRIGGERWORDS_EXACT_MATCH) - testCreatePostWithOutgoingHook(t, "application/json", "application/json", "triggerwordaaazzz lorem ipsum", "triggerword", []string{"file_id_1, file_id_2"}, app.TRIGGERWORDS_STARTS_WITH) - testCreatePostWithOutgoingHook(t, "application/json", "application/json", "triggerword lorem ipsum", "", []string{"file_id_1"}, app.TRIGGERWORDS_EXACT_MATCH) - testCreatePostWithOutgoingHook(t, "application/json", "application/json", "triggerwordaaazzz lorem ipsum", "", []string{"file_id_1"}, app.TRIGGERWORDS_STARTS_WITH) -} - -// 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) { - testCreatePostWithOutgoingHook(t, "", "application/x-www-form-urlencoded", "triggerword lorem ipsum", "triggerword", []string{"file_id_1"}, app.TRIGGERWORDS_EXACT_MATCH) - testCreatePostWithOutgoingHook(t, "", "application/x-www-form-urlencoded", "triggerwordaaazzz lorem ipsum", "triggerword", []string{"file_id_1"}, app.TRIGGERWORDS_STARTS_WITH) - testCreatePostWithOutgoingHook(t, "", "application/x-www-form-urlencoded", "triggerword lorem ipsum", "", []string{"file_id_1, file_id_2"}, app.TRIGGERWORDS_EXACT_MATCH) - testCreatePostWithOutgoingHook(t, "", "application/x-www-form-urlencoded", "triggerwordaaazzz lorem ipsum", "", []string{"file_id_1, file_id_2"}, app.TRIGGERWORDS_STARTS_WITH) -} - -func TestUpdatePost(t *testing.T) { - th := Setup().InitBasic() - defer th.TearDown() - - Client := th.BasicClient - channel1 := th.BasicChannel - - // Check the appropriate permissions are enforced. - defaultRolePermissions := th.SaveDefaultRolePermissions() - defer func() { - th.RestoreDefaultRolePermissions(defaultRolePermissions) - }() - th.App.SetLicense(model.NewTestLicense()) - - th.AddPermissionToRole(model.PERMISSION_EDIT_POST.Id, model.CHANNEL_USER_ROLE_ID) - - post1 := &model.Post{ChannelId: channel1.Id, Message: "zz" + model.NewId() + "a"} - rpost1, err := Client.CreatePost(post1) - if err != nil { - t.Fatal(err) - } - - if rpost1.Data.(*model.Post).Message != post1.Message { - t.Fatal("full name didn't match") - } - - post2 := &model.Post{ChannelId: channel1.Id, Message: "zz" + model.NewId() + "a", RootId: rpost1.Data.(*model.Post).Id} - rpost2, err := Client.CreatePost(post2) - if err != nil { - t.Fatal(err) - } - - if rpost2.Data.(*model.Post).EditAt != 0 { - t.Fatal("Newly craeted post shouldn't have EditAt set") - } - - msg2 := "zz" + model.NewId() + " update post 1" - rpost2.Data.(*model.Post).Message = msg2 - rpost2.Data.(*model.Post).Props[model.PROPS_ADD_CHANNEL_MEMBER] = "no good" - if rupost2, err := Client.UpdatePost(rpost2.Data.(*model.Post)); err != nil { - t.Fatal(err) - } else { - if rupost2.Data.(*model.Post).Message != msg2 { - t.Fatal("failed to updates") - } - if rupost2.Data.(*model.Post).EditAt == 0 { - t.Fatal("EditAt not updated for post") - } - if rupost2.Data.(*model.Post).Props[model.PROPS_ADD_CHANNEL_MEMBER] != nil { - t.Fatal("failed to sanitize Props['add_channel_member'], should be nil") - } - } - - msg1 := "#hashtag a" + model.NewId() + " update post 2" - rpost1.Data.(*model.Post).Message = msg1 - if rupost1, err := Client.UpdatePost(rpost1.Data.(*model.Post)); err != nil { - t.Fatal(err) - } else { - if rupost1.Data.(*model.Post).Message != msg1 && rupost1.Data.(*model.Post).Hashtags != "#hashtag" { - t.Fatal("failed to updates") - } - } - - up12 := &model.Post{Id: rpost1.Data.(*model.Post).Id, ChannelId: channel1.Id, Message: "zz" + model.NewId() + " updaet post 1 update 2"} - if rup12, err := Client.UpdatePost(up12); err != nil { - t.Fatal(err) - } else { - if rup12.Data.(*model.Post).Message != up12.Message { - t.Fatal("failed to updates") - } - } - - rpost3, err := th.App.CreatePost(&model.Post{ChannelId: channel1.Id, Message: "zz" + model.NewId() + "a", Type: model.POST_JOIN_LEAVE, UserId: th.BasicUser.Id}, channel1, false) - if err != nil { - t.Fatal(err) - } - - up3 := &model.Post{Id: rpost3.Id, ChannelId: channel1.Id, Message: "zz" + model.NewId() + " update post 3"} - if _, err := Client.UpdatePost(up3); err == nil { - t.Fatal("shouldn't have been able to update system message") - } - - // Test licensed policy controls for edit post - th.RemovePermissionFromRole(model.PERMISSION_EDIT_POST.Id, model.CHANNEL_USER_ROLE_ID) - - post4 := &model.Post{ChannelId: channel1.Id, Message: "zz" + model.NewId() + "a", RootId: rpost1.Data.(*model.Post).Id} - rpost4, err := Client.CreatePost(post4) - if err != nil { - t.Fatal(err) - } - - up4 := &model.Post{Id: rpost4.Data.(*model.Post).Id, ChannelId: channel1.Id, Message: "zz" + model.NewId() + " update post 4"} - if _, err := Client.UpdatePost(up4); err == nil { - t.Fatal("shouldn't have been able to update a message when not allowed") - } - - th.AddPermissionToRole(model.PERMISSION_EDIT_POST.Id, model.CHANNEL_USER_ROLE_ID) - th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.PostEditTimeLimit = 1 }) //seconds - - post5 := &model.Post{ChannelId: channel1.Id, Message: "zz" + model.NewId() + "a", RootId: rpost1.Data.(*model.Post).Id} - rpost5, err := Client.CreatePost(post5) - if err != nil { - t.Fatal(err) - } - - msg5 := "zz" + model.NewId() + " update post 5" - up5 := &model.Post{Id: rpost5.Data.(*model.Post).Id, ChannelId: channel1.Id, Message: msg5} - if rup5, err := Client.UpdatePost(up5); err != nil { - t.Fatal(err) - } else { - if rup5.Data.(*model.Post).Message != up5.Message { - t.Fatal("failed to updates") - } - } - - time.Sleep(1000 * time.Millisecond) - - up6 := &model.Post{Id: rpost5.Data.(*model.Post).Id, ChannelId: channel1.Id, Message: "zz" + model.NewId() + " update post 5"} - if _, err := Client.UpdatePost(up6); err == nil { - t.Fatal("shouldn't have been able to update a message after time limit") - } -} - -func TestGetPosts(t *testing.T) { - th := Setup().InitBasic() - defer th.TearDown() - - Client := th.BasicClient - channel1 := th.BasicChannel - - time.Sleep(10 * time.Millisecond) - post1 := &model.Post{ChannelId: channel1.Id, Message: "zz" + model.NewId() + "a"} - post1 = Client.Must(Client.CreatePost(post1)).Data.(*model.Post) - - time.Sleep(10 * time.Millisecond) - post1a1 := &model.Post{ChannelId: channel1.Id, Message: "zz" + model.NewId() + "a", RootId: post1.Id} - post1a1 = Client.Must(Client.CreatePost(post1a1)).Data.(*model.Post) - - time.Sleep(10 * time.Millisecond) - post2 := &model.Post{ChannelId: channel1.Id, Message: "zz" + model.NewId() + "a"} - post2 = Client.Must(Client.CreatePost(post2)).Data.(*model.Post) - - time.Sleep(10 * time.Millisecond) - post3 := &model.Post{ChannelId: channel1.Id, Message: "zz" + model.NewId() + "a"} - post3 = Client.Must(Client.CreatePost(post3)).Data.(*model.Post) - - time.Sleep(10 * time.Millisecond) - post3a1 := &model.Post{ChannelId: channel1.Id, Message: "zz" + model.NewId() + "a", RootId: post3.Id} - post3a1 = Client.Must(Client.CreatePost(post3a1)).Data.(*model.Post) - - r1 := Client.Must(Client.GetPosts(channel1.Id, 0, 2, "")).Data.(*model.PostList) - - if r1.Order[0] != post3a1.Id { - t.Fatal("wrong order") - } - - if r1.Order[1] != post3.Id { - t.Fatal("wrong order") - } - - if len(r1.Posts) != 2 { // 3a1 and 3; 3a1's parent already there - t.Fatal("wrong size") - } - - r2 := Client.Must(Client.GetPosts(channel1.Id, 2, 2, "")).Data.(*model.PostList) - - if r2.Order[0] != post2.Id { - t.Fatal("wrong order") - } - - if r2.Order[1] != post1a1.Id { - t.Fatal("wrong order") - } - - if len(r2.Posts) != 3 { // 2 and 1a1; + 1a1's parent - t.Log(r2.Posts) - t.Fatal("wrong size") - } -} - -func TestGetPostsSince(t *testing.T) { - th := Setup().InitBasic() - defer th.TearDown() - - Client := th.BasicClient - channel1 := th.BasicChannel - - time.Sleep(10 * time.Millisecond) - post0 := &model.Post{ChannelId: channel1.Id, Message: "zz" + model.NewId() + "a"} - post0 = Client.Must(Client.CreatePost(post0)).Data.(*model.Post) - - time.Sleep(10 * time.Millisecond) - post1 := &model.Post{ChannelId: channel1.Id, Message: "zz" + model.NewId() + "a"} - post1 = Client.Must(Client.CreatePost(post1)).Data.(*model.Post) - - time.Sleep(10 * time.Millisecond) - post1a1 := &model.Post{ChannelId: channel1.Id, Message: "zz" + model.NewId() + "a", RootId: post1.Id} - post1a1 = Client.Must(Client.CreatePost(post1a1)).Data.(*model.Post) - - time.Sleep(10 * time.Millisecond) - post2 := &model.Post{ChannelId: channel1.Id, Message: "zz" + model.NewId() + "a"} - post2 = Client.Must(Client.CreatePost(post2)).Data.(*model.Post) - - time.Sleep(10 * time.Millisecond) - post3 := &model.Post{ChannelId: channel1.Id, Message: "zz" + model.NewId() + "a"} - post3 = Client.Must(Client.CreatePost(post3)).Data.(*model.Post) - - time.Sleep(10 * time.Millisecond) - post3a1 := &model.Post{ChannelId: channel1.Id, Message: "zz" + model.NewId() + "a", RootId: post3.Id} - post3a1 = Client.Must(Client.CreatePost(post3a1)).Data.(*model.Post) - - r1 := Client.Must(Client.GetPostsSince(channel1.Id, post1.CreateAt)).Data.(*model.PostList) - - if r1.Order[0] != post3a1.Id { - t.Fatal("wrong order") - } - - if r1.Order[1] != post3.Id { - t.Fatal("wrong order") - } - - if len(r1.Posts) != 5 { - t.Fatal("wrong size") - } - - now := model.GetMillis() - r2 := Client.Must(Client.GetPostsSince(channel1.Id, now)).Data.(*model.PostList) - - if len(r2.Posts) != 0 { - t.Fatal("should have been empty") - } - - post2.Message = "new message" - Client.Must(Client.UpdatePost(post2)) - - r3 := Client.Must(Client.GetPostsSince(channel1.Id, now)).Data.(*model.PostList) - - if len(r3.Order) != 2 { // 2 because deleted post is returned as well - t.Fatal("missing post update") - } -} - -func TestGetPostsBeforeAfter(t *testing.T) { - th := Setup().InitBasic() - defer th.TearDown() - - Client := th.BasicClient - channel1 := th.BasicChannel - - time.Sleep(10 * time.Millisecond) - post0 := &model.Post{ChannelId: channel1.Id, Message: "zz" + model.NewId() + "a"} - post0 = Client.Must(Client.CreatePost(post0)).Data.(*model.Post) - - time.Sleep(10 * time.Millisecond) - post1 := &model.Post{ChannelId: channel1.Id, Message: "zz" + model.NewId() + "a"} - post1 = Client.Must(Client.CreatePost(post1)).Data.(*model.Post) - - time.Sleep(10 * time.Millisecond) - post1a1 := &model.Post{ChannelId: channel1.Id, Message: "zz" + model.NewId() + "a", RootId: post1.Id} - post1a1 = Client.Must(Client.CreatePost(post1a1)).Data.(*model.Post) - - time.Sleep(10 * time.Millisecond) - post2 := &model.Post{ChannelId: channel1.Id, Message: "zz" + model.NewId() + "a"} - post2 = Client.Must(Client.CreatePost(post2)).Data.(*model.Post) - - time.Sleep(10 * time.Millisecond) - post3 := &model.Post{ChannelId: channel1.Id, Message: "zz" + model.NewId() + "a"} - post3 = Client.Must(Client.CreatePost(post3)).Data.(*model.Post) - - time.Sleep(10 * time.Millisecond) - post3a1 := &model.Post{ChannelId: channel1.Id, Message: "zz" + model.NewId() + "a", RootId: post3.Id} - post3a1 = Client.Must(Client.CreatePost(post3a1)).Data.(*model.Post) - - r1 := Client.Must(Client.GetPostsBefore(channel1.Id, post1a1.Id, 0, 10, "")).Data.(*model.PostList) - - if r1.Order[0] != post1.Id { - t.Fatal("wrong order") - } - - if r1.Order[1] != post0.Id { - t.Fatal("wrong order") - } - - // including created post from test helper and system 'joined' message - if len(r1.Posts) != 4 { - t.Fatal("wrong size") - } - - r2 := Client.Must(Client.GetPostsAfter(channel1.Id, post3a1.Id, 0, 3, "")).Data.(*model.PostList) - - if len(r2.Posts) != 0 { - t.Fatal("should have been empty") - } - - post2.Message = "new message" - Client.Must(Client.UpdatePost(post2)) - - r3 := Client.Must(Client.GetPostsAfter(channel1.Id, post1a1.Id, 0, 2, "")).Data.(*model.PostList) - - if r3.Order[0] != post3.Id { - t.Fatal("wrong order") - } - - if r3.Order[1] != post2.Id { - t.Fatal("wrong order") - } - - if len(r3.Order) != 2 { - t.Fatal("missing post update") - } -} - -func TestSearchPosts(t *testing.T) { - th := Setup().InitBasic() - defer th.TearDown() - - Client := th.BasicClient - channel1 := th.BasicChannel - - post1 := &model.Post{ChannelId: channel1.Id, Message: "search for post1"} - post1 = Client.Must(Client.CreatePost(post1)).Data.(*model.Post) - - post2 := &model.Post{ChannelId: channel1.Id, Message: "search for post2"} - post2 = Client.Must(Client.CreatePost(post2)).Data.(*model.Post) - - post3 := &model.Post{ChannelId: channel1.Id, Message: "#hashtag search for post3"} - post3 = Client.Must(Client.CreatePost(post3)).Data.(*model.Post) - - post4 := &model.Post{ChannelId: channel1.Id, Message: "hashtag for post4"} - post4 = Client.Must(Client.CreatePost(post4)).Data.(*model.Post) - - r1 := Client.Must(Client.SearchPosts("search", false)).Data.(*model.PostList) - - if len(r1.Order) != 3 { - t.Fatal("wrong search") - } - - r2 := Client.Must(Client.SearchPosts("post2", false)).Data.(*model.PostList) - - if len(r2.Order) != 1 && r2.Order[0] == post2.Id { - t.Fatal("wrong search") - } - - r3 := Client.Must(Client.SearchPosts("#hashtag", false)).Data.(*model.PostList) - - if len(r3.Order) != 1 && r3.Order[0] == post3.Id { - t.Fatal("wrong search") - } - - if r4 := Client.Must(Client.SearchPosts("*", false)).Data.(*model.PostList); len(r4.Order) != 0 { - t.Fatal("searching for just * shouldn't return any results") - } - - r5 := Client.Must(Client.SearchPosts("post1 post2", true)).Data.(*model.PostList) - - if len(r5.Order) != 2 { - t.Fatal("wrong search results") - } -} - -func TestSearchHashtagPosts(t *testing.T) { - th := Setup().InitBasic() - defer th.TearDown() - - Client := th.BasicClient - channel1 := th.BasicChannel - - post1 := &model.Post{ChannelId: channel1.Id, Message: "#sgtitlereview with space"} - post1 = Client.Must(Client.CreatePost(post1)).Data.(*model.Post) - - post2 := &model.Post{ChannelId: channel1.Id, Message: "#sgtitlereview\n with return"} - post2 = Client.Must(Client.CreatePost(post2)).Data.(*model.Post) - - post3 := &model.Post{ChannelId: channel1.Id, Message: "no hashtag"} - post3 = Client.Must(Client.CreatePost(post3)).Data.(*model.Post) - - r1 := Client.Must(Client.SearchPosts("#sgtitlereview", false)).Data.(*model.PostList) - - if len(r1.Order) != 2 { - t.Fatal("wrong search") - } -} - -func TestSearchPostsInChannel(t *testing.T) { - th := Setup().InitBasic() - defer th.TearDown() - - Client := th.BasicClient - channel1 := th.BasicChannel - team := th.BasicTeam - - post1 := &model.Post{ChannelId: channel1.Id, Message: "sgtitlereview with space"} - post1 = Client.Must(Client.CreatePost(post1)).Data.(*model.Post) - - channel2 := &model.Channel{DisplayName: "TestGetPosts", Name: "zz" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id} - channel2 = Client.Must(Client.CreateChannel(channel2)).Data.(*model.Channel) - - channel3 := &model.Channel{DisplayName: "TestGetPosts", Name: "zz" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id} - channel3 = Client.Must(Client.CreateChannel(channel3)).Data.(*model.Channel) - - post2 := &model.Post{ChannelId: channel2.Id, Message: "sgtitlereview\n with return"} - post2 = Client.Must(Client.CreatePost(post2)).Data.(*model.Post) - - post3 := &model.Post{ChannelId: channel2.Id, Message: "other message with no return"} - post3 = Client.Must(Client.CreatePost(post3)).Data.(*model.Post) - - post4 := &model.Post{ChannelId: channel3.Id, Message: "other message with no return"} - post4 = Client.Must(Client.CreatePost(post4)).Data.(*model.Post) - - if result := Client.Must(Client.SearchPosts("channel:", false)).Data.(*model.PostList); len(result.Order) != 0 { - t.Fatalf("wrong number of posts returned %v", len(result.Order)) - } - - if result := Client.Must(Client.SearchPosts("in:", false)).Data.(*model.PostList); len(result.Order) != 0 { - t.Fatalf("wrong number of posts returned %v", len(result.Order)) - } - - if result := Client.Must(Client.SearchPosts("channel:"+channel1.Name, false)).Data.(*model.PostList); len(result.Order) != 2 { - t.Fatalf("wrong number of posts returned %v", len(result.Order)) - } - - if result := Client.Must(Client.SearchPosts("in: "+channel2.Name, false)).Data.(*model.PostList); len(result.Order) != 2 { - t.Fatalf("wrong number of posts returned %v", len(result.Order)) - } - - if result := Client.Must(Client.SearchPosts("channel: "+channel2.Name, false)).Data.(*model.PostList); len(result.Order) != 2 { - t.Fatalf("wrong number of posts returned %v", len(result.Order)) - } - - if result := Client.Must(Client.SearchPosts("ChAnNeL: "+channel2.Name, false)).Data.(*model.PostList); len(result.Order) != 2 { - t.Fatalf("wrong number of posts returned %v", len(result.Order)) - } - - if result := Client.Must(Client.SearchPosts("sgtitlereview", false)).Data.(*model.PostList); len(result.Order) != 2 { - t.Fatalf("wrong number of posts returned %v", len(result.Order)) - } - - if result := Client.Must(Client.SearchPosts("sgtitlereview channel:"+channel1.Name, false)).Data.(*model.PostList); len(result.Order) != 1 { - t.Fatalf("wrong number of posts returned %v", len(result.Order)) - } - - if result := Client.Must(Client.SearchPosts("sgtitlereview in: "+channel2.Name, false)).Data.(*model.PostList); len(result.Order) != 1 { - t.Fatalf("wrong number of posts returned %v", len(result.Order)) - } - - if result := Client.Must(Client.SearchPosts("sgtitlereview channel: "+channel2.Name, false)).Data.(*model.PostList); len(result.Order) != 1 { - t.Fatalf("wrong number of posts returned %v", len(result.Order)) - } - - if result := Client.Must(Client.SearchPosts("channel: "+channel2.Name+" channel: "+channel3.Name, false)).Data.(*model.PostList); len(result.Order) != 3 { - t.Fatalf("wrong number of posts returned :) %v :) %v", result.Posts, result.Order) - } -} - -func TestSearchPostsFromUser(t *testing.T) { - th := Setup().InitBasic() - defer th.TearDown() - - Client := th.BasicClient - channel1 := th.BasicChannel - team := th.BasicTeam - user1 := th.BasicUser - user2 := th.BasicUser2 - channel2 := th.CreateChannel(Client, team) - Client.Must(Client.AddChannelMember(channel1.Id, th.BasicUser2.Id)) - Client.Must(Client.AddChannelMember(channel2.Id, th.BasicUser2.Id)) - user3 := th.CreateUser(Client) - th.LinkUserToTeam(user3, team) - Client.Must(Client.AddChannelMember(channel1.Id, user3.Id)) - Client.Must(Client.AddChannelMember(channel2.Id, user3.Id)) - - post1 := &model.Post{ChannelId: channel1.Id, Message: "sgtitlereview with space"} - post1 = Client.Must(Client.CreatePost(post1)).Data.(*model.Post) - - th.LoginBasic2() - - post2 := &model.Post{ChannelId: channel2.Id, Message: "sgtitlereview\n with return"} - post2 = Client.Must(Client.CreatePost(post2)).Data.(*model.Post) - - if result := Client.Must(Client.SearchPosts("from: "+user1.Username, false)).Data.(*model.PostList); len(result.Order) != 2 { - t.Fatalf("wrong number of posts returned %v", len(result.Order)) - } - - if result := Client.Must(Client.SearchPosts("from: "+user2.Username, false)).Data.(*model.PostList); len(result.Order) != 1 { - t.Fatalf("wrong number of posts returned %v", len(result.Order)) - } - - if result := Client.Must(Client.SearchPosts("from: "+user2.Username+" sgtitlereview", false)).Data.(*model.PostList); len(result.Order) != 1 { - t.Fatalf("wrong number of posts returned %v", len(result.Order)) - } - - post3 := &model.Post{ChannelId: channel1.Id, Message: "hullo"} - post3 = Client.Must(Client.CreatePost(post3)).Data.(*model.Post) - - if result := Client.Must(Client.SearchPosts("from: "+user2.Username+" in:"+channel1.Name, false)).Data.(*model.PostList); len(result.Order) != 1 { - t.Fatalf("wrong number of posts returned %v", len(result.Order)) - } - - Client.Login(user3.Email, user3.Password) - - // wait for the join/leave messages to be created for user3 since they're done asynchronously - time.Sleep(100 * time.Millisecond) - - if result := Client.Must(Client.SearchPosts("from: "+user2.Username, false)).Data.(*model.PostList); len(result.Order) != 2 { - t.Fatalf("wrong number of posts returned %v", len(result.Order)) - } - - if result := Client.Must(Client.SearchPosts("from: "+user2.Username+" from: "+user3.Username, false)).Data.(*model.PostList); len(result.Order) != 2 { - t.Fatalf("wrong number of posts returned %v", len(result.Order)) - } - - if result := Client.Must(Client.SearchPosts("from: "+user2.Username+" from: "+user3.Username+" in:"+channel2.Name, false)).Data.(*model.PostList); len(result.Order) != 1 { - t.Fatalf("wrong number of posts returned %v", len(result.Order)) - } - - post4 := &model.Post{ChannelId: channel2.Id, Message: "coconut"} - post4 = Client.Must(Client.CreatePost(post4)).Data.(*model.Post) - - if result := Client.Must(Client.SearchPosts("from: "+user2.Username+" from: "+user3.Username+" in:"+channel2.Name+" coconut", false)).Data.(*model.PostList); len(result.Order) != 1 { - t.Fatalf("wrong number of posts returned %v", len(result.Order)) - } -} - -func TestGetPostsCache(t *testing.T) { - th := Setup().InitBasic() - defer th.TearDown() - - Client := th.BasicClient - channel1 := th.BasicChannel - - time.Sleep(10 * time.Millisecond) - post1 := &model.Post{ChannelId: channel1.Id, Message: "zz" + model.NewId() + "a"} - post1 = Client.Must(Client.CreatePost(post1)).Data.(*model.Post) - - time.Sleep(10 * time.Millisecond) - post2 := &model.Post{ChannelId: channel1.Id, Message: "zz" + model.NewId() + "a"} - post2 = Client.Must(Client.CreatePost(post2)).Data.(*model.Post) - - time.Sleep(10 * time.Millisecond) - post3 := &model.Post{ChannelId: channel1.Id, Message: "zz" + model.NewId() + "a"} - post3 = Client.Must(Client.CreatePost(post3)).Data.(*model.Post) - - etag := Client.Must(Client.GetPosts(channel1.Id, 0, 2, "")).Etag - - // test etag caching - if cache_result, err := Client.GetPosts(channel1.Id, 0, 2, etag); err != nil { - t.Fatal(err) - } else if cache_result.Data.(*model.PostList) != nil { - t.Log(cache_result.Data) - t.Fatal("cache should be empty") - } - - etag = Client.Must(Client.GetPost(channel1.Id, post1.Id, "")).Etag - - // test etag caching - if cache_result, err := Client.GetPost(channel1.Id, post1.Id, etag); err != nil { - t.Fatal(err) - } else if cache_result.Data.(*model.PostList) != nil { - t.Log(cache_result.Data) - t.Fatal("cache should be empty") - } - -} - -func TestDeletePosts(t *testing.T) { - th := Setup().InitBasic().InitSystemAdmin() - defer th.TearDown() - - Client := th.BasicClient - channel1 := th.BasicChannel - team1 := th.BasicTeam - - time.Sleep(10 * time.Millisecond) - post1 := &model.Post{ChannelId: channel1.Id, Message: "zz" + model.NewId() + "a"} - post1 = Client.Must(Client.CreatePost(post1)).Data.(*model.Post) - - time.Sleep(10 * time.Millisecond) - post1a1 := &model.Post{ChannelId: channel1.Id, Message: "zz" + model.NewId() + "a", RootId: post1.Id} - post1a1 = Client.Must(Client.CreatePost(post1a1)).Data.(*model.Post) - - time.Sleep(10 * time.Millisecond) - post1a2 := &model.Post{ChannelId: channel1.Id, Message: "zz" + model.NewId() + "a", RootId: post1.Id, ParentId: post1a1.Id} - post1a2 = Client.Must(Client.CreatePost(post1a2)).Data.(*model.Post) - - time.Sleep(10 * time.Millisecond) - post2 := &model.Post{ChannelId: channel1.Id, Message: "zz" + model.NewId() + "a"} - post2 = Client.Must(Client.CreatePost(post2)).Data.(*model.Post) - - time.Sleep(10 * time.Millisecond) - post3 := &model.Post{ChannelId: channel1.Id, Message: "zz" + model.NewId() + "a"} - post3 = Client.Must(Client.CreatePost(post3)).Data.(*model.Post) - - time.Sleep(10 * time.Millisecond) - post3a1 := &model.Post{ChannelId: channel1.Id, Message: "zz" + model.NewId() + "a", RootId: post3.Id} - post3a1 = Client.Must(Client.CreatePost(post3a1)).Data.(*model.Post) - - time.Sleep(10 * time.Millisecond) - Client.Must(Client.DeletePost(channel1.Id, post3.Id)) - - r2 := Client.Must(Client.GetPosts(channel1.Id, 0, 10, "")).Data.(*model.PostList) - - if post := r2.Posts[post3.Id]; post != nil { - t.Fatal("should have not returned deleted post") - } - - time.Sleep(10 * time.Millisecond) - post4a := &model.Post{ChannelId: channel1.Id, Message: "zz" + model.NewId() + "a"} - post4a = Client.Must(Client.CreatePost(post4a)).Data.(*model.Post) - - time.Sleep(10 * time.Millisecond) - post4b := &model.Post{ChannelId: channel1.Id, Message: "zz" + model.NewId() + "a"} - post4b = Client.Must(Client.CreatePost(post4b)).Data.(*model.Post) - - SystemAdminClient := th.SystemAdminClient - th.LinkUserToTeam(th.SystemAdminUser, th.BasicTeam) - SystemAdminClient.Must(SystemAdminClient.JoinChannel(channel1.Id)) - - th.LoginBasic2() - Client.Must(Client.JoinChannel(channel1.Id)) - - if _, err := Client.DeletePost(channel1.Id, post4a.Id); err == nil { - t.Fatal(err) - } - - // Check the appropriate permissions are enforced. - defaultRolePermissions := th.SaveDefaultRolePermissions() - defer func() { - th.RestoreDefaultRolePermissions(defaultRolePermissions) - }() - - th.UpdateUserToTeamAdmin(th.BasicUser2, th.BasicTeam) - - Client.Logout() - th.LoginBasic2() - Client.SetTeamId(team1.Id) - - Client.Must(Client.DeletePost(channel1.Id, post4a.Id)) - - SystemAdminClient.Must(SystemAdminClient.DeletePost(channel1.Id, post4b.Id)) - - th.RemovePermissionFromRole(model.PERMISSION_DELETE_POST.Id, model.CHANNEL_USER_ROLE_ID) - th.AddPermissionToRole(model.PERMISSION_DELETE_POST.Id, model.TEAM_ADMIN_ROLE_ID) - - th.LoginBasic() - - time.Sleep(10 * time.Millisecond) - post5a := &model.Post{ChannelId: channel1.Id, Message: "zz" + model.NewId() + "a"} - post5a = Client.Must(Client.CreatePost(post5a)).Data.(*model.Post) - - time.Sleep(10 * time.Millisecond) - post5b := &model.Post{ChannelId: channel1.Id, Message: "zz" + model.NewId() + "a"} - post5b = Client.Must(Client.CreatePost(post5b)).Data.(*model.Post) - - if _, err := Client.DeletePost(channel1.Id, post5a.Id); err == nil { - t.Fatal(err) - } - - th.LoginBasic2() - - Client.Must(Client.DeletePost(channel1.Id, post5a.Id)) - - SystemAdminClient.Must(SystemAdminClient.DeletePost(channel1.Id, post5b.Id)) -} - -func TestEmailMention(t *testing.T) { - th := Setup().InitBasic() - defer th.TearDown() - - Client := th.BasicClient - channel1 := th.BasicChannel - Client.Must(Client.AddChannelMember(channel1.Id, th.BasicUser2.Id)) - - th.LoginBasic2() - //Set the notification properties - data := make(map[string]string) - data["user_id"] = th.BasicUser2.Id - data["email"] = "true" - data["desktop"] = "all" - data["desktop_sound"] = "false" - data["comments"] = "any" - Client.Must(Client.UpdateUserNotify(data)) - - store.Must(th.App.Srv.Store.Preference().Save(&model.Preferences{{ - UserId: th.BasicUser2.Id, - Category: model.PREFERENCE_CATEGORY_NOTIFICATIONS, - Name: model.PREFERENCE_NAME_EMAIL_INTERVAL, - Value: "0", - }})) - - //Delete all the messages before create a mention post - utils.DeleteMailBox(th.BasicUser2.Email) - - //Send a mention message from user1 to user2 - th.LoginBasic() - time.Sleep(10 * time.Millisecond) - post1 := &model.Post{ChannelId: channel1.Id, Message: "@" + th.BasicUser2.Username + " this is a test"} - post1 = Client.Must(Client.CreatePost(post1)).Data.(*model.Post) - - var resultsMailbox utils.JSONMessageHeaderInbucket - err := utils.RetryInbucket(5, func() error { - var err error - resultsMailbox, err = utils.GetMailBox(th.BasicUser2.Email) - return err - }) - if err != nil { - t.Log(err) - t.Log("No email was received, maybe due load on the server. Disabling this verification") - } - if err == nil && len(resultsMailbox) > 0 { - if !strings.ContainsAny(resultsMailbox[len(resultsMailbox)-1].To[0], th.BasicUser2.Email) { - t.Fatal("Wrong To recipient") - } else { - for i := 0; i < 30; i++ { - for j := len(resultsMailbox) - 1; j >= 0; j-- { - isUser := false - for _, to := range resultsMailbox[j].To { - if to == "<"+th.BasicUser2.Email+">" { - isUser = true - } - } - if !isUser { - continue - } - if resultsEmail, err := utils.GetMessageFromMailbox(th.BasicUser2.Email, resultsMailbox[j].ID); err == nil { - if strings.Contains(resultsEmail.Body.Text, post1.Message) { - return - } else if i == 4 { - t.Log(resultsEmail.Body.Text) - t.Fatal("Received wrong Message") - } - } - } - time.Sleep(100 * time.Millisecond) - } - t.Fatal("Didn't receive message") - } - } -} - -func TestFuzzyPosts(t *testing.T) { - th := Setup().InitBasic() - defer th.TearDown() - - Client := th.BasicClient - channel1 := th.BasicChannel - - for i := 0; i < len(utils.FUZZY_STRINGS_POSTS); i++ { - post := &model.Post{ChannelId: channel1.Id, Message: utils.FUZZY_STRINGS_POSTS[i]} - - _, err := Client.CreatePost(post) - if err != nil { - t.Fatal(err) - } - } -} - -func TestGetFlaggedPosts(t *testing.T) { - th := Setup().InitBasic() - defer th.TearDown() - - Client := th.BasicClient - user1 := th.BasicUser - post1 := th.BasicPost - - preferences := &model.Preferences{ - { - UserId: user1.Id, - Category: model.PREFERENCE_CATEGORY_FLAGGED_POST, - Name: post1.Id, - Value: "true", - }, - } - Client.Must(Client.SetPreferences(preferences)) - - r1 := Client.Must(Client.GetFlaggedPosts(0, 2)).Data.(*model.PostList) - - if len(r1.Order) == 0 { - t.Fatal("should have gotten a flagged post") - } - - if _, ok := r1.Posts[post1.Id]; !ok { - t.Fatal("missing flagged post") - } - - Client.DeletePreferences(preferences) - - r2 := Client.Must(Client.GetFlaggedPosts(0, 2)).Data.(*model.PostList) - - if len(r2.Order) != 0 { - t.Fatal("should not have gotten a flagged post") - } - - Client.SetTeamId(model.NewId()) - if _, err := Client.GetFlaggedPosts(0, 2); err == nil { - t.Fatal("should have failed - bad team id") - } -} - -func TestGetMessageForNotification(t *testing.T) { - th := Setup().InitBasic() - defer th.TearDown() - - testPng := store.Must(th.App.Srv.Store.FileInfo().Save(&model.FileInfo{ - CreatorId: model.NewId(), - Path: "test1.png", - Name: "test1.png", - MimeType: "image/png", - })).(*model.FileInfo) - - testJpg1 := store.Must(th.App.Srv.Store.FileInfo().Save(&model.FileInfo{ - CreatorId: model.NewId(), - Path: "test2.jpg", - Name: "test2.jpg", - MimeType: "image/jpeg", - })).(*model.FileInfo) - - testFile := store.Must(th.App.Srv.Store.FileInfo().Save(&model.FileInfo{ - CreatorId: model.NewId(), - Path: "test1.go", - Name: "test1.go", - MimeType: "text/plain", - })).(*model.FileInfo) - - testJpg2 := store.Must(th.App.Srv.Store.FileInfo().Save(&model.FileInfo{ - CreatorId: model.NewId(), - Path: "test3.jpg", - Name: "test3.jpg", - MimeType: "image/jpeg", - })).(*model.FileInfo) - - translateFunc := utils.GetUserTranslations("en") - - post := &model.Post{ - Id: model.NewId(), - Message: "test", - } - - if th.App.GetMessageForNotification(post, translateFunc) != "test" { - t.Fatal("should've returned message text") - } - - post.FileIds = model.StringArray{testPng.Id} - store.Must(th.App.Srv.Store.FileInfo().AttachToPost(testPng.Id, post.Id)) - if th.App.GetMessageForNotification(post, translateFunc) != "test" { - t.Fatal("should've returned message text, even with attachments") - } - - post.Message = "" - if message := th.App.GetMessageForNotification(post, translateFunc); message != "1 image sent: test1.png" { - t.Fatal("should've returned number of images:", message) - } - - post.FileIds = model.StringArray{testPng.Id, testJpg1.Id} - store.Must(th.App.Srv.Store.FileInfo().AttachToPost(testJpg1.Id, post.Id)) - th.App.Srv.Store.FileInfo().InvalidateFileInfosForPostCache(post.Id) - if message := th.App.GetMessageForNotification(post, translateFunc); message != "2 images sent: test1.png, test2.jpg" && message != "2 images sent: test2.jpg, test1.png" { - t.Fatal("should've returned number of images:", message) - } - - post.Id = model.NewId() - post.FileIds = model.StringArray{testFile.Id} - store.Must(th.App.Srv.Store.FileInfo().AttachToPost(testFile.Id, post.Id)) - if message := th.App.GetMessageForNotification(post, translateFunc); message != "1 file sent: test1.go" { - t.Fatal("should've returned number of files:", message) - } - - store.Must(th.App.Srv.Store.FileInfo().AttachToPost(testJpg2.Id, post.Id)) - th.App.Srv.Store.FileInfo().InvalidateFileInfosForPostCache(post.Id) - post.FileIds = model.StringArray{testFile.Id, testJpg2.Id} - if message := th.App.GetMessageForNotification(post, translateFunc); message != "2 files sent: test1.go, test3.jpg" && message != "2 files sent: test3.jpg, test1.go" { - t.Fatal("should've returned number of mixed files:", message) - } -} - -func TestGetFileInfosForPost(t *testing.T) { - th := Setup().InitBasic() - defer th.TearDown() - - Client := th.BasicClient - channel1 := th.BasicChannel - - fileIds := make([]string, 3) - if data, err := readTestFile("test.png"); err != nil { - t.Fatal(err) - } else { - for i := 0; i < 3; i++ { - fileIds[i] = Client.MustGeneric(Client.UploadPostAttachment(data, channel1.Id, "test.png")).(*model.FileUploadResponse).FileInfos[0].Id - } - } - - post1 := Client.Must(Client.CreatePost(&model.Post{ - ChannelId: channel1.Id, - Message: "test", - FileIds: fileIds, - })).Data.(*model.Post) - - var etag string - if infos, err := Client.GetFileInfosForPost(channel1.Id, post1.Id, ""); err != nil { - t.Fatal(err) - } else if len(infos) != 3 { - t.Fatal("should've received 3 files") - } else if Client.Etag == "" { - t.Fatal("should've received etag") - } else { - etag = Client.Etag - } - - if infos, err := Client.GetFileInfosForPost(channel1.Id, post1.Id, etag); err != nil { - t.Fatal(err) - } else if len(infos) != 0 { - t.Fatal("should've returned nothing because of etag") - } -} - -func TestGetPostById(t *testing.T) { - th := Setup().InitBasic() - defer th.TearDown() - - Client := th.BasicClient - channel1 := th.BasicChannel - - time.Sleep(10 * time.Millisecond) - post1 := &model.Post{ChannelId: channel1.Id, Message: "yommamma" + model.NewId() + "a"} - post1 = Client.Must(Client.CreatePost(post1)).Data.(*model.Post) - - if post, respMetadata := Client.GetPostById(post1.Id, ""); respMetadata.Error != nil { - t.Fatal(respMetadata.Error) - } else { - if len(post.Order) != 1 { - t.Fatal("should be just one post") - } - - if post.Order[0] != post1.Id { - t.Fatal("wrong order") - } - - if post.Posts[post.Order[0]].Message != post1.Message { - t.Fatal("wrong message from post") - } - } - - if _, respMetadata := Client.GetPostById("45345435345345", ""); respMetadata.Error == nil { - t.Fatal(respMetadata.Error) - } -} - -func TestGetPermalinkTmp(t *testing.T) { - th := Setup().InitBasic().InitSystemAdmin() - defer th.TearDown() - - Client := th.BasicClient - channel1 := th.BasicChannel - team := th.BasicTeam - - th.LoginBasic() - - time.Sleep(10 * time.Millisecond) - post1 := &model.Post{ChannelId: channel1.Id, Message: "zz" + model.NewId() + "a"} - post1 = Client.Must(Client.CreatePost(post1)).Data.(*model.Post) - - time.Sleep(10 * time.Millisecond) - post2 := &model.Post{ChannelId: channel1.Id, Message: "zz" + model.NewId() + "a"} - post2 = Client.Must(Client.CreatePost(post2)).Data.(*model.Post) - - etag := Client.Must(Client.GetPost(channel1.Id, post1.Id, "")).Etag - - // test etag caching - if cache_result, respMetadata := Client.GetPermalink(channel1.Id, post1.Id, etag); respMetadata.Error != nil { - t.Fatal(respMetadata.Error) - } else if cache_result != nil { - t.Log(cache_result) - t.Fatal("cache should be empty") - } - - if results, respMetadata := Client.GetPermalink(channel1.Id, post1.Id, ""); respMetadata.Error != nil { - t.Fatal(respMetadata.Error) - } else if results == nil { - t.Fatal("should not be empty") - } - - // Test permalink to private channels. - channel2 := &model.Channel{DisplayName: "TestGetPermalinkPriv", Name: "zz" + model.NewId() + "a", Type: model.CHANNEL_PRIVATE, TeamId: team.Id} - channel2 = Client.Must(Client.CreateChannel(channel2)).Data.(*model.Channel) - time.Sleep(10 * time.Millisecond) - post3 := &model.Post{ChannelId: channel2.Id, Message: "zz" + model.NewId() + "a"} - post3 = Client.Must(Client.CreatePost(post3)).Data.(*model.Post) - - if _, md := Client.GetPermalink(channel2.Id, post3.Id, ""); md.Error != nil { - t.Fatal(md.Error) - } - - th.LoginBasic2() - - if _, md := Client.GetPermalink(channel2.Id, post3.Id, ""); md.Error == nil { - t.Fatal("Expected 403 error") - } - - // Test direct channels. - th.LoginBasic() - channel3 := Client.Must(Client.CreateDirectChannel(th.SystemAdminUser.Id)).Data.(*model.Channel) - time.Sleep(10 * time.Millisecond) - post4 := &model.Post{ChannelId: channel3.Id, Message: "zz" + model.NewId() + "a"} - post4 = Client.Must(Client.CreatePost(post4)).Data.(*model.Post) - - if _, md := Client.GetPermalink(channel3.Id, post4.Id, ""); md.Error != nil { - t.Fatal(md.Error) - } - - th.LoginBasic2() - - if _, md := Client.GetPermalink(channel3.Id, post4.Id, ""); md.Error == nil { - t.Fatal("Expected 403 error") - } -} - -func TestGetOpenGraphMetadata(t *testing.T) { - th := Setup().InitBasic() - defer th.TearDown() - - Client := th.BasicClient - - th.App.UpdateConfig(func(cfg *model.Config) { - *cfg.ServiceSettings.EnableLinkPreviews = true - *cfg.ServiceSettings.AllowedUntrustedInternalConnections = "localhost 127.0.0.1" - }) - - ogDataCacheMissCount := 0 - - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - ogDataCacheMissCount++ - - if r.URL.Path == "/og-data/" { - fmt.Fprintln(w, ` - <html><head><meta property="og:type" content="article" /> - <meta property="og:title" content="Test Title" /> - <meta property="og:url" content="http://example.com/" /> - </head><body></body></html> - `) - } else if r.URL.Path == "/no-og-data/" { - fmt.Fprintln(w, `<html><head></head><body></body></html>`) - } - })) - - for _, data := range [](map[string]interface{}){ - {"path": "/og-data/", "title": "Test Title", "cacheMissCount": 1}, - {"path": "/no-og-data/", "title": "", "cacheMissCount": 2}, - - // Data should be cached for following - {"path": "/og-data/", "title": "Test Title", "cacheMissCount": 2}, - {"path": "/no-og-data/", "title": "", "cacheMissCount": 2}, - } { - res, err := Client.DoApiPost( - "/get_opengraph_metadata", - fmt.Sprintf("{\"url\":\"%s\"}", ts.URL+data["path"].(string)), - ) - if err != nil { - t.Fatal(err) - } - - ogData := model.StringInterfaceFromJson(res.Body) - if strings.Compare(ogData["title"].(string), data["title"].(string)) != 0 { - t.Fatal(fmt.Sprintf( - "OG data title mismatch for path \"%s\". Expected title: \"%s\". Actual title: \"%s\"", - data["path"].(string), data["title"].(string), ogData["title"].(string), - )) - } - - if ogDataCacheMissCount != data["cacheMissCount"].(int) { - t.Fatal(fmt.Sprintf( - "Cache miss count didn't match. Expected value %d. Actual value %d.", - data["cacheMissCount"].(int), ogDataCacheMissCount, - )) - } - } - - th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableLinkPreviews = false }) - if _, err := Client.DoApiPost("/get_opengraph_metadata", "{\"url\":\"/og-data/\"}"); err == nil || err.StatusCode != http.StatusNotImplemented { - t.Fatal("should have failed with 501 - disabled link previews") - } -} - -func TestPinPost(t *testing.T) { - th := Setup().InitBasic() - defer th.TearDown() - - Client := th.BasicClient - - post := th.BasicPost - if rupost1, err := Client.PinPost(post.ChannelId, post.Id); err != nil { - t.Fatal(err) - } else { - if !rupost1.Data.(*model.Post).IsPinned { - t.Fatal("failed to pin post") - } - } - - pinnedPost := th.PinnedPost - if rupost2, err := Client.PinPost(pinnedPost.ChannelId, pinnedPost.Id); err != nil { - t.Fatal(err) - } else { - if !rupost2.Data.(*model.Post).IsPinned { - t.Fatal("pinning a post should be idempotent") - } - } -} - -func TestUnpinPost(t *testing.T) { - th := Setup().InitBasic() - defer th.TearDown() - - Client := th.BasicClient - - pinnedPost := th.PinnedPost - if rupost1, err := Client.UnpinPost(pinnedPost.ChannelId, pinnedPost.Id); err != nil { - t.Fatal(err) - } else { - if rupost1.Data.(*model.Post).IsPinned { - t.Fatal("failed to unpin post") - } - } - - post := th.BasicPost - if rupost2, err := Client.UnpinPost(post.ChannelId, post.Id); err != nil { - t.Fatal(err) - } else { - if rupost2.Data.(*model.Post).IsPinned { - t.Fatal("unpinning a post should be idempotent") - } - } -} |