github.com/demisto/mattermost-server@v4.9.0-rc3+incompatible/store/storetest/file_info_store.go (about)

     1  // Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved.
     2  // See License.txt for license information.
     3  
     4  package storetest
     5  
     6  import (
     7  	"fmt"
     8  	"testing"
     9  
    10  	"github.com/mattermost/mattermost-server/model"
    11  	"github.com/mattermost/mattermost-server/store"
    12  )
    13  
    14  func TestFileInfoStore(t *testing.T, ss store.Store) {
    15  	t.Run("FileInfoSaveGet", func(t *testing.T) { testFileInfoSaveGet(t, ss) })
    16  	t.Run("FileInfoSaveGetByPath", func(t *testing.T) { testFileInfoSaveGetByPath(t, ss) })
    17  	t.Run("FileInfoGetForPost", func(t *testing.T) { testFileInfoGetForPost(t, ss) })
    18  	t.Run("FileInfoAttachToPost", func(t *testing.T) { testFileInfoAttachToPost(t, ss) })
    19  	t.Run("FileInfoDeleteForPost", func(t *testing.T) { testFileInfoDeleteForPost(t, ss) })
    20  	t.Run("FileInfoPermanentDelete", func(t *testing.T) { testFileInfoPermanentDelete(t, ss) })
    21  	t.Run("FileInfoPermanentDeleteBatch", func(t *testing.T) { testFileInfoPermanentDeleteBatch(t, ss) })
    22  }
    23  
    24  func testFileInfoSaveGet(t *testing.T, ss store.Store) {
    25  	info := &model.FileInfo{
    26  		CreatorId: model.NewId(),
    27  		Path:      "file.txt",
    28  	}
    29  
    30  	if result := <-ss.FileInfo().Save(info); result.Err != nil {
    31  		t.Fatal(result.Err)
    32  	} else if returned := result.Data.(*model.FileInfo); len(returned.Id) == 0 {
    33  		t.Fatal("should've assigned an id to FileInfo")
    34  	} else {
    35  		info = returned
    36  	}
    37  	defer func() {
    38  		<-ss.FileInfo().PermanentDelete(info.Id)
    39  	}()
    40  
    41  	if result := <-ss.FileInfo().Get(info.Id); result.Err != nil {
    42  		t.Fatal(result.Err)
    43  	} else if returned := result.Data.(*model.FileInfo); returned.Id != info.Id {
    44  		t.Log(info)
    45  		t.Log(returned)
    46  		t.Fatal("should've returned correct FileInfo")
    47  	}
    48  
    49  	info2 := store.Must(ss.FileInfo().Save(&model.FileInfo{
    50  		CreatorId: model.NewId(),
    51  		Path:      "file.txt",
    52  		DeleteAt:  123,
    53  	})).(*model.FileInfo)
    54  
    55  	if result := <-ss.FileInfo().Get(info2.Id); result.Err == nil {
    56  		t.Fatal("shouldn't have gotten deleted file")
    57  	}
    58  	defer func() {
    59  		<-ss.FileInfo().PermanentDelete(info2.Id)
    60  	}()
    61  }
    62  
    63  func testFileInfoSaveGetByPath(t *testing.T, ss store.Store) {
    64  	info := &model.FileInfo{
    65  		CreatorId: model.NewId(),
    66  		Path:      fmt.Sprintf("%v/file.txt", model.NewId()),
    67  	}
    68  
    69  	if result := <-ss.FileInfo().Save(info); result.Err != nil {
    70  		t.Fatal(result.Err)
    71  	} else if returned := result.Data.(*model.FileInfo); len(returned.Id) == 0 {
    72  		t.Fatal("should've assigned an id to FileInfo")
    73  	} else {
    74  		info = returned
    75  	}
    76  	defer func() {
    77  		<-ss.FileInfo().PermanentDelete(info.Id)
    78  	}()
    79  
    80  	if result := <-ss.FileInfo().GetByPath(info.Path); result.Err != nil {
    81  		t.Fatal(result.Err)
    82  	} else if returned := result.Data.(*model.FileInfo); returned.Id != info.Id {
    83  		t.Log(info)
    84  		t.Log(returned)
    85  		t.Fatal("should've returned correct FileInfo")
    86  	}
    87  
    88  	info2 := store.Must(ss.FileInfo().Save(&model.FileInfo{
    89  		CreatorId: model.NewId(),
    90  		Path:      "file.txt",
    91  		DeleteAt:  123,
    92  	})).(*model.FileInfo)
    93  
    94  	if result := <-ss.FileInfo().GetByPath(info2.Id); result.Err == nil {
    95  		t.Fatal("shouldn't have gotten deleted file")
    96  	}
    97  	defer func() {
    98  		<-ss.FileInfo().PermanentDelete(info2.Id)
    99  	}()
   100  }
   101  
   102  func testFileInfoGetForPost(t *testing.T, ss store.Store) {
   103  	userId := model.NewId()
   104  	postId := model.NewId()
   105  
   106  	infos := []*model.FileInfo{
   107  		{
   108  			PostId:    postId,
   109  			CreatorId: userId,
   110  			Path:      "file.txt",
   111  		},
   112  		{
   113  			PostId:    postId,
   114  			CreatorId: userId,
   115  			Path:      "file.txt",
   116  		},
   117  		{
   118  			PostId:    postId,
   119  			CreatorId: userId,
   120  			Path:      "file.txt",
   121  			DeleteAt:  123,
   122  		},
   123  		{
   124  			PostId:    model.NewId(),
   125  			CreatorId: userId,
   126  			Path:      "file.txt",
   127  		},
   128  	}
   129  
   130  	for i, info := range infos {
   131  		infos[i] = store.Must(ss.FileInfo().Save(info)).(*model.FileInfo)
   132  		defer func(id string) {
   133  			<-ss.FileInfo().PermanentDelete(id)
   134  		}(infos[i].Id)
   135  	}
   136  
   137  	if result := <-ss.FileInfo().GetForPost(postId, true, false); result.Err != nil {
   138  		t.Fatal(result.Err)
   139  	} else if returned := result.Data.([]*model.FileInfo); len(returned) != 2 {
   140  		t.Fatal("should've returned exactly 2 file infos")
   141  	}
   142  
   143  	if result := <-ss.FileInfo().GetForPost(postId, false, false); result.Err != nil {
   144  		t.Fatal(result.Err)
   145  	} else if returned := result.Data.([]*model.FileInfo); len(returned) != 2 {
   146  		t.Fatal("should've returned exactly 2 file infos")
   147  	}
   148  
   149  	if result := <-ss.FileInfo().GetForPost(postId, true, true); result.Err != nil {
   150  		t.Fatal(result.Err)
   151  	} else if returned := result.Data.([]*model.FileInfo); len(returned) != 2 {
   152  		t.Fatal("should've returned exactly 2 file infos")
   153  	}
   154  }
   155  
   156  func testFileInfoAttachToPost(t *testing.T, ss store.Store) {
   157  	userId := model.NewId()
   158  	postId := model.NewId()
   159  
   160  	info1 := store.Must(ss.FileInfo().Save(&model.FileInfo{
   161  		CreatorId: userId,
   162  		Path:      "file.txt",
   163  	})).(*model.FileInfo)
   164  	defer func() {
   165  		<-ss.FileInfo().PermanentDelete(info1.Id)
   166  	}()
   167  
   168  	if len(info1.PostId) != 0 {
   169  		t.Fatal("file shouldn't have a PostId")
   170  	}
   171  
   172  	if result := <-ss.FileInfo().AttachToPost(info1.Id, postId); result.Err != nil {
   173  		t.Fatal(result.Err)
   174  	} else {
   175  		info1 = store.Must(ss.FileInfo().Get(info1.Id)).(*model.FileInfo)
   176  	}
   177  
   178  	if len(info1.PostId) == 0 {
   179  		t.Fatal("file should now have a PostId")
   180  	}
   181  
   182  	info2 := store.Must(ss.FileInfo().Save(&model.FileInfo{
   183  		CreatorId: userId,
   184  		Path:      "file.txt",
   185  	})).(*model.FileInfo)
   186  	defer func() {
   187  		<-ss.FileInfo().PermanentDelete(info2.Id)
   188  	}()
   189  
   190  	if result := <-ss.FileInfo().AttachToPost(info2.Id, postId); result.Err != nil {
   191  		t.Fatal(result.Err)
   192  	} else {
   193  		info2 = store.Must(ss.FileInfo().Get(info2.Id)).(*model.FileInfo)
   194  	}
   195  
   196  	if result := <-ss.FileInfo().GetForPost(postId, true, false); result.Err != nil {
   197  		t.Fatal(result.Err)
   198  	} else if infos := result.Data.([]*model.FileInfo); len(infos) != 2 {
   199  		t.Fatal("should've returned exactly 2 file infos")
   200  	}
   201  }
   202  
   203  func testFileInfoDeleteForPost(t *testing.T, ss store.Store) {
   204  	userId := model.NewId()
   205  	postId := model.NewId()
   206  
   207  	infos := []*model.FileInfo{
   208  		{
   209  			PostId:    postId,
   210  			CreatorId: userId,
   211  			Path:      "file.txt",
   212  		},
   213  		{
   214  			PostId:    postId,
   215  			CreatorId: userId,
   216  			Path:      "file.txt",
   217  		},
   218  		{
   219  			PostId:    postId,
   220  			CreatorId: userId,
   221  			Path:      "file.txt",
   222  			DeleteAt:  123,
   223  		},
   224  		{
   225  			PostId:    model.NewId(),
   226  			CreatorId: userId,
   227  			Path:      "file.txt",
   228  		},
   229  	}
   230  
   231  	for i, info := range infos {
   232  		infos[i] = store.Must(ss.FileInfo().Save(info)).(*model.FileInfo)
   233  		defer func(id string) {
   234  			<-ss.FileInfo().PermanentDelete(id)
   235  		}(infos[i].Id)
   236  	}
   237  
   238  	if result := <-ss.FileInfo().DeleteForPost(postId); result.Err != nil {
   239  		t.Fatal(result.Err)
   240  	}
   241  
   242  	if infos := store.Must(ss.FileInfo().GetForPost(postId, true, false)).([]*model.FileInfo); len(infos) != 0 {
   243  		t.Fatal("shouldn't have returned any file infos")
   244  	}
   245  }
   246  
   247  func testFileInfoPermanentDelete(t *testing.T, ss store.Store) {
   248  	info := store.Must(ss.FileInfo().Save(&model.FileInfo{
   249  		PostId:    model.NewId(),
   250  		CreatorId: model.NewId(),
   251  		Path:      "file.txt",
   252  	})).(*model.FileInfo)
   253  
   254  	if result := <-ss.FileInfo().PermanentDelete(info.Id); result.Err != nil {
   255  		t.Fatal(result.Err)
   256  	}
   257  }
   258  
   259  func testFileInfoPermanentDeleteBatch(t *testing.T, ss store.Store) {
   260  	postId := model.NewId()
   261  
   262  	store.Must(ss.FileInfo().Save(&model.FileInfo{
   263  		PostId:    postId,
   264  		CreatorId: model.NewId(),
   265  		Path:      "file.txt",
   266  		CreateAt:  1000,
   267  	}))
   268  
   269  	store.Must(ss.FileInfo().Save(&model.FileInfo{
   270  		PostId:    postId,
   271  		CreatorId: model.NewId(),
   272  		Path:      "file.txt",
   273  		CreateAt:  1200,
   274  	}))
   275  
   276  	store.Must(ss.FileInfo().Save(&model.FileInfo{
   277  		PostId:    postId,
   278  		CreatorId: model.NewId(),
   279  		Path:      "file.txt",
   280  		CreateAt:  2000,
   281  	}))
   282  
   283  	if result := <-ss.FileInfo().GetForPost(postId, true, false); result.Err != nil {
   284  		t.Fatal(result.Err)
   285  	} else if len(result.Data.([]*model.FileInfo)) != 3 {
   286  		t.Fatal("Expected 3 fileInfos")
   287  	}
   288  
   289  	store.Must(ss.FileInfo().PermanentDeleteBatch(1500, 1000))
   290  
   291  	if result := <-ss.FileInfo().GetForPost(postId, true, false); result.Err != nil {
   292  		t.Fatal(result.Err)
   293  	} else if len(result.Data.([]*model.FileInfo)) != 1 {
   294  		t.Fatal("Expected 3 fileInfos")
   295  	}
   296  }