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  }