github.com/ngocphuongnb/tetua@v0.0.7-alpha/app/entities/entities_test.go (about) 1 package entities_test 2 3 import ( 4 "context" 5 "errors" 6 "fmt" 7 "testing" 8 "time" 9 10 "github.com/ngocphuongnb/tetua/app/config" 11 "github.com/ngocphuongnb/tetua/app/entities" 12 "github.com/ngocphuongnb/tetua/app/fs" 13 "github.com/ngocphuongnb/tetua/app/mock" 14 "github.com/ngocphuongnb/tetua/app/utils" 15 "github.com/stretchr/testify/assert" 16 ) 17 18 func TestEntities(t *testing.T) { 19 notfoundErr := &entities.NotFoundError{Message: "Not found"} 20 assert.Equal(t, "Not found", notfoundErr.Error()) 21 assert.Equal(t, true, entities.IsNotFound(notfoundErr)) 22 assert.Equal(t, false, entities.IsNotFound(nil)) 23 24 messages := &entities.Messages{} 25 assert.Equal(t, false, messages.HasError()) 26 assert.Equal(t, 0, messages.Length()) 27 messages.Append(&entities.Message{Type: "info", Message: "Info message"}) 28 messages.AppendError("Error message") 29 30 assert.Equal(t, 2, len(*messages)) 31 assert.Equal(t, 2, messages.Length()) 32 assert.Equal(t, true, messages.HasError()) 33 34 assert.Equal(t, []*entities.Message{{ 35 Type: "info", 36 Message: "Info message", 37 }, { 38 Type: "error", 39 Message: "Error message", 40 }}, messages.Get()) 41 42 sort := []*entities.Sort{{ 43 Field: "id", 44 Order: "asc", 45 }} 46 filter := &entities.Filter{ 47 BaseUrl: "/test", 48 Search: "search", 49 Limit: 10, 50 Page: 2, 51 IgnoreUrlParams: []string{"some"}, 52 ExcludeIDs: []int{1, 2}, 53 Sorts: sort, 54 } 55 56 assert.Equal(t, "search", filter.GetSearch()) 57 assert.Equal(t, 10, filter.GetLimit()) 58 assert.Equal(t, 2, filter.GetPage()) 59 assert.Equal(t, sort, filter.GetSorts()) 60 assert.Equal(t, []string{"some"}, filter.GetIgnoreUrlParams()) 61 assert.Equal(t, []int{1, 2}, filter.GetExcludeIDs()) 62 assert.Equal(t, "/test?q=search", filter.Base()) 63 filter.BaseUrl = "" 64 assert.Equal(t, "/?q=search", filter.Base()) 65 66 filterEmpty := &entities.Filter{ 67 BaseUrl: "/test", 68 } 69 assert.Equal(t, "/test", filterEmpty.Base()) 70 71 meta1 := &entities.Meta{} 72 assert.Equal(t, config.Setting("app_name"), meta1.GetTitle()) 73 74 meta2 := &entities.Meta{Title: "Test"} 75 assert.Equal(t, fmt.Sprintf("Test - %s", config.Setting("app_name")), meta2.GetTitle()) 76 77 paginate := &entities.Paginate[entities.Post]{ 78 Total: 100, 79 PageSize: 10, 80 PageCurrent: 2, 81 Data: utils.Repeat(&entities.Post{}, 10), 82 } 83 84 links := paginate.Links() 85 86 for i, link := range links { 87 page := i + 1 88 expect := &entities.PaginateLink{Link: fmt.Sprintf("?page=%d", page), Label: fmt.Sprint(page), Class: ""} 89 90 if page == 1 { 91 expect = &entities.PaginateLink{Link: fmt.Sprintf("?page=%d", page), Label: fmt.Sprint(page), Class: "first"} 92 } 93 if page == 2 { 94 expect = &entities.PaginateLink{Link: fmt.Sprintf("?page=%d", page), Label: fmt.Sprint(page), Class: "active"} 95 } 96 if page == len(links) { 97 expect = &entities.PaginateLink{Link: fmt.Sprintf("?page=%d", page), Label: fmt.Sprint(page), Class: "last"} 98 } 99 100 assert.Equal(t, expect, link) 101 } 102 103 paginate.BaseUrl = "/test?tab=home" 104 links = paginate.Links() 105 106 for i, link := range links { 107 page := i + 1 108 expect := &entities.PaginateLink{Link: fmt.Sprintf("/test?tab=home&page=%d", page), Label: fmt.Sprint(page), Class: ""} 109 110 if page == 1 { 111 expect = &entities.PaginateLink{Link: fmt.Sprintf("/test?tab=home&page=%d", page), Label: fmt.Sprint(page), Class: "first"} 112 } 113 if page == 2 { 114 expect = &entities.PaginateLink{Link: fmt.Sprintf("/test?tab=home&page=%d", page), Label: fmt.Sprint(page), Class: "active"} 115 } 116 if page == len(links) { 117 expect = &entities.PaginateLink{Link: fmt.Sprintf("/test?tab=home&page=%d", page), Label: fmt.Sprint(page), Class: "last"} 118 } 119 120 assert.Equal(t, expect, link) 121 } 122 } 123 124 func TestComment(t *testing.T) { 125 commentFilter := &entities.CommentFilter{ 126 Filter: &entities.Filter{ 127 BaseUrl: "/comment", 128 Search: "test", 129 Page: 2, 130 Limit: 10, 131 Sorts: []*entities.Sort{{"created_at", "desc"}}, 132 IgnoreUrlParams: []string{}, 133 ExcludeIDs: []int{1, 2}, 134 }, 135 PostIDs: []int{1, 2}, 136 UserIDs: []int{1, 2}, 137 ParentIDs: []int{1, 2}, 138 } 139 140 assert.Equal(t, "/comment?parent=1&post=1&q=test&user=1", commentFilter.Base()) 141 commentFilter.IgnoreUrlParams = []string{"parent", "user"} 142 assert.Equal(t, "/comment?post=1&q=test", commentFilter.Base()) 143 144 commentFilterEmpty := &entities.CommentFilter{ 145 Filter: &entities.Filter{ 146 BaseUrl: "/comment", 147 }, 148 } 149 assert.Equal(t, "/comment", commentFilterEmpty.Base()) 150 } 151 152 func TestFile(t *testing.T) { 153 fileFilter := &entities.FileFilter{ 154 Filter: &entities.Filter{ 155 BaseUrl: "/file", 156 Search: "test", 157 Page: 2, 158 Limit: 10, 159 Sorts: []*entities.Sort{{"created_at", "desc"}}, 160 IgnoreUrlParams: []string{}, 161 ExcludeIDs: []int{1, 2}, 162 }, 163 UserIDs: []int{1, 2}, 164 } 165 assert.Equal(t, "/file?q=test&user=1", fileFilter.Base()) 166 167 fileFilterEmpty := &entities.FileFilter{ 168 Filter: &entities.Filter{ 169 BaseUrl: "/file", 170 }, 171 } 172 assert.Equal(t, "/file", fileFilterEmpty.Base()) 173 174 fs.New("disk_mock", []fs.FSDisk{&mock.Disk{}}) 175 file := &entities.File{ 176 ID: 1, 177 Disk: "disk_mock", 178 Path: "test/file.jpg", 179 } 180 assert.Equal(t, "/disk_mock/test/file.jpg", file.Url()) 181 assert.Equal(t, nil, file.Delete(context.Background())) 182 file.Path = "/delete/error" 183 assert.Equal(t, errors.New("Delete file error"), file.Delete(context.Background())) 184 185 fileInvalidDisk := &entities.File{ 186 ID: 1, 187 Disk: "invalid_disk", 188 Path: "test/file.jpg", 189 } 190 assert.Equal(t, "", fileInvalidDisk.Url()) 191 assert.Equal(t, errors.New("disk not found"), fileInvalidDisk.Delete(context.Background())) 192 193 file.Disk = "" 194 assert.Equal(t, "", file.Url()) 195 assert.Equal(t, errors.New("disk or path is empty"), file.Delete(context.Background())) 196 197 } 198 199 func TestPermission(t *testing.T) { 200 permissionFilter := &entities.PermissionFilter{ 201 Filter: &entities.Filter{ 202 BaseUrl: "/permission", 203 Search: "test", 204 Page: 2, 205 Limit: 10, 206 Sorts: []*entities.Sort{{"created_at", "desc"}}, 207 IgnoreUrlParams: []string{}, 208 ExcludeIDs: []int{1, 2}, 209 }, 210 RoleIDs: []int{1, 2}, 211 } 212 assert.Equal(t, "/permission?q=test&role=1", permissionFilter.Base()) 213 214 permissionFilterEmpty := &entities.PermissionFilter{ 215 Filter: &entities.Filter{ 216 BaseUrl: "/permission", 217 }, 218 } 219 assert.Equal(t, "/permission", permissionFilterEmpty.Base()) 220 } 221 222 func TestPost(t *testing.T) { 223 post := &entities.Post{ID: 1, Slug: "test-post"} 224 assert.Equal(t, utils.Url("/test-post-1.html"), post.Url()) 225 postFilter := &entities.PostFilter{ 226 Filter: &entities.Filter{ 227 BaseUrl: "/post", 228 Search: "test", 229 Page: 2, 230 Limit: 10, 231 Sorts: []*entities.Sort{{"created_at", "desc"}}, 232 IgnoreUrlParams: []string{}, 233 ExcludeIDs: []int{1, 2}, 234 }, 235 Publish: "draft", 236 Approve: "pending", 237 TopicIDs: []int{1, 2}, 238 UserIDs: []int{1, 2}, 239 } 240 assert.Equal(t, "/post?approve=pending&publish=draft&q=test&topic=1&user=1", postFilter.Base()) 241 242 postFilterEmpty := &entities.PostFilter{ 243 Filter: &entities.Filter{ 244 BaseUrl: "/post", 245 }, 246 } 247 assert.Equal(t, "/post", postFilterEmpty.Base()) 248 } 249 250 func TestPage(t *testing.T) { 251 page := &entities.Page{ID: 1, Slug: "about"} 252 assert.Equal(t, utils.Url("/about.html"), page.Url()) 253 pageFilter := &entities.PageFilter{ 254 Filter: &entities.Filter{ 255 BaseUrl: "/page", 256 Search: "test", 257 Page: 2, 258 Limit: 10, 259 Sorts: []*entities.Sort{{"created_at", "desc"}}, 260 IgnoreUrlParams: []string{}, 261 ExcludeIDs: []int{1, 2}, 262 }, 263 Publish: "draft", 264 } 265 assert.Equal(t, "/page?publish=draft&q=test", pageFilter.Base()) 266 267 pageFilterEmpty := &entities.PageFilter{ 268 Filter: &entities.Filter{ 269 BaseUrl: "/page", 270 }, 271 } 272 assert.Equal(t, "/page", pageFilterEmpty.Base()) 273 } 274 275 func TestRole(t *testing.T) { 276 assert.Equal(t, "all", entities.PERM_ALL.String()) 277 assert.Equal(t, "own", entities.PERM_OWN.String()) 278 assert.Equal(t, "none", entities.PERM_NONE.String()) 279 280 var PERM_TEST entities.PermType = "test" 281 assert.Equal(t, "none", PERM_TEST.String()) 282 283 assert.Equal(t, entities.PERM_ALL, entities.GetPermTypeValue("all")) 284 assert.Equal(t, entities.PERM_OWN, entities.GetPermTypeValue("own")) 285 assert.Equal(t, entities.PERM_NONE, entities.GetPermTypeValue("none")) 286 assert.Equal(t, entities.PERM_NONE, entities.GetPermTypeValue("test")) 287 288 roleFilter := &entities.RoleFilter{ 289 Filter: &entities.Filter{ 290 BaseUrl: "/role", 291 Search: "test", 292 Page: 2, 293 Limit: 10, 294 Sorts: []*entities.Sort{{"created_at", "desc"}}, 295 IgnoreUrlParams: []string{}, 296 ExcludeIDs: []int{1, 2}, 297 }, 298 } 299 assert.Equal(t, "/role?q=test", roleFilter.Base()) 300 301 roleFilterEmpty := &entities.RoleFilter{ 302 Filter: &entities.Filter{ 303 BaseUrl: "/role", 304 }, 305 } 306 assert.Equal(t, "/role", roleFilterEmpty.Base()) 307 } 308 309 func TestTopic(t *testing.T) { 310 topic := &entities.Topic{ID: 1, Slug: "test-topic"} 311 assert.Equal(t, utils.Url("/test-topic"), topic.Url()) 312 assert.Equal(t, utils.Url("/test-topic/feed"), topic.FeedUrl()) 313 314 topic1 := &entities.Topic{ID: 1, Name: "Topic 1", Slug: "test-topic-1"} 315 topic2 := &entities.Topic{ID: 2, Name: "Topic 2", Slug: "test-topic-2"} 316 topic3 := &entities.Topic{ID: 3, Name: "Topic 3", Slug: "test-topic-3"} 317 topic4 := &entities.Topic{ID: 4, Name: "Topic 4", Slug: "test-topic-4"} 318 topic5 := &entities.Topic{ID: 5, Name: "Topic 5", Slug: "test-topic-5"} 319 320 topics := []*entities.Topic{topic1, topic2, topic3, topic4, topic5} 321 assert.Equal(t, topics, entities.PrintTopicsTree(topics, []int{0})) 322 assert.Equal(t, topics[:4], entities.PrintTopicsTree(topics, []int{5})) 323 324 topic5.ParentID = 4 325 topic5.Parent = topic4 326 topic4.ParentID = 3 327 topic4.Parent = topic3 328 329 topic3.Children = []*entities.Topic{topic4} 330 topic4.Children = []*entities.Topic{topic5} 331 topicTreePrint := []*entities.Topic{ 332 topic1, 333 topic2, 334 topic3, 335 topic4, 336 topic5, 337 } 338 339 print := entities.PrintTopicsTree(topicTreePrint, []int{0}) 340 assert.Equal(t, print[3].Name, "--Topic 4") 341 assert.Equal(t, print[4].Name, "----Topic 5") 342 343 assert.Equal(t, []*entities.Topic{ 344 topic1, 345 topic2, 346 topic3, 347 }, entities.GetTopicsTree(topics, 0, 0, []int{4})) 348 349 topicFilter := &entities.TopicFilter{ 350 Filter: &entities.Filter{ 351 BaseUrl: "/topic", 352 Search: "test", 353 Page: 2, 354 Limit: 10, 355 Sorts: []*entities.Sort{{"created_at", "desc"}}, 356 IgnoreUrlParams: []string{}, 357 ExcludeIDs: []int{1, 2}, 358 }, 359 } 360 assert.Equal(t, "/topic?q=test", topicFilter.Base()) 361 362 topicFilterEmpty := &entities.TopicFilter{ 363 Filter: &entities.Filter{ 364 BaseUrl: "/topic", 365 }, 366 } 367 assert.Equal(t, "/topic", topicFilterEmpty.Base()) 368 } 369 370 func TestUser(t *testing.T) { 371 user := &entities.User{ID: 1, Username: "test-user"} 372 assert.Equal(t, utils.Url("/u/test-user"), user.Url()) 373 assert.Equal(t, "", user.Avatar()) 374 user.ProviderAvatar = "http://provider.local/avatar.png" 375 assert.Equal(t, "http://provider.local/avatar.png", user.Avatar()) 376 user.AvatarImage = &entities.File{ 377 ID: 1, 378 Disk: "disk_mock", 379 Path: "test/file.jpg", 380 } 381 assert.Equal(t, "/disk_mock/test/file.jpg", user.Avatar()) 382 assert.Equal(t, false, user.IsRoot()) 383 user.Roles = []*entities.Role{{ 384 ID: 2, 385 Name: "User", 386 Root: false, 387 }} 388 assert.Equal(t, false, user.IsRoot()) 389 user.Roles = []*entities.Role{{ 390 ID: 1, 391 Name: "Admin", 392 Root: true, 393 }} 394 assert.Equal(t, true, user.IsRoot()) 395 assert.Equal(t, "test-user", user.Name()) 396 user.DisplayName = "Test User" 397 assert.Equal(t, "Test User", user.Name()) 398 assert.Equal(t, `<a class="avatar" href="/u/test-user" title="Test User" target="_blank"><img src="/disk_mock/test/file.jpg" width="50" height="50" alt="Test User" /></a>`, user.AvatarElm("50", "50", false)) 399 assert.Equal(t, `<img src="/disk_mock/test/file.jpg" width="50" height="50" alt="Test User" />`, user.AvatarElm("50", "50", true)) 400 401 token, err := user.JwtClaim(time.Now().Add(time.Hour*24*7), map[string]interface{}{ 402 "test": "test", 403 }) 404 assert.Equal(t, nil, err) 405 assert.Equal(t, true, token != "") 406 407 var nilUser *entities.User 408 409 assert.Equal(t, false, nilUser.IsRoot()) 410 assert.Equal(t, "", nilUser.Name()) 411 assert.Equal(t, "", nilUser.Url()) 412 assert.Equal(t, "", nilUser.Avatar()) 413 assert.Equal(t, `<span class="avatar none"></span>`, nilUser.AvatarElm("50", "50", false)) 414 415 userFilter := &entities.UserFilter{ 416 Filter: &entities.Filter{ 417 BaseUrl: "/user", 418 Search: "test", 419 Page: 2, 420 Limit: 10, 421 Sorts: []*entities.Sort{{"created_at", "desc"}}, 422 IgnoreUrlParams: []string{}, 423 ExcludeIDs: []int{1, 2}, 424 }, 425 } 426 assert.Equal(t, "/user?q=test", userFilter.Base()) 427 428 userFilterEmpty := &entities.UserFilter{ 429 Filter: &entities.Filter{ 430 BaseUrl: "/user", 431 }, 432 } 433 assert.Equal(t, "/user", userFilterEmpty.Base()) 434 }