processMessage_test.go (7139B)
1 package utils 2 3 import ( 4 "dkforest/pkg/database" 5 "errors" 6 "github.com/stretchr/testify/assert" 7 "strings" 8 "testing" 9 "time" 10 ) 11 12 func TestConvertMarkdown(t *testing.T) { 13 // Convert markdown will not remove dangerous html 14 msg := `<noscript>` 15 out := convertMarkdown(msg, false, false) 16 expected := "<p><noscript></p>\n" 17 assert.Equal(t, expected, out) 18 19 // Testing censored feature 20 msg = `This #is censored# text` 21 out = convertMarkdown(msg, false, false) 22 expected = "<p>This <span class=\"censored\">is censored</span> text</p>\n" 23 assert.Equal(t, expected, out) 24 } 25 26 func TestGetQuoteTxt(t *testing.T) { 27 // Quotes do not include original message quote if any 28 txt := GetQuoteTxt(nil, "", database.ChatMessage{RawMessage: `“[00:00:01] user1 - this is a test” another one`, User: database.User{Username: "user1"}, CreatedAt: time.Date(0, 0, 0, 0, 0, 2, 0, time.UTC)}) 29 expected := "“[00:00:02] user1 - another one”" 30 assert.Equal(t, expected, txt) 31 32 // Quoted should inline a multiline message 33 txt = GetQuoteTxt(nil, "", database.ChatMessage{RawMessage: "line1\nline2\nline3", User: database.User{Username: "user1"}, CreatedAt: time.Date(0, 0, 0, 0, 0, 2, 0, time.UTC)}) 34 expected = "“[00:00:02] user1 - line1 line2 line3”" 35 assert.Equal(t, expected, txt) 36 37 // Quoted should replace "special double quotes" to normal "double quote" 38 txt = GetQuoteTxt(nil, "", database.ChatMessage{RawMessage: `instead of showing 39 “[00:00:01] user2 - an article about HHVM... 40 https://www.zapbuild.com/bitsntricks/hiphop-…” that looks perfect for my chat 41 i think it would be better if it shows 42 “[00:00:01] user2 - an article about HHVM...” that looks perfect for my chat`, User: database.User{Username: "user1"}, CreatedAt: time.Date(0, 0, 0, 0, 0, 2, 0, time.UTC)}) 43 expected = "“[00:00:02] user1 - instead of showing \"[00:00:01] user2 - an article about HHVM...…”" 44 assert.Equal(t, expected, txt) 45 } 46 47 func TestConvertPGPPublicKey(t *testing.T) { 48 // Test public key with comment 49 originPKey := `-----BEGIN PGP PUBLIC KEY BLOCK----- 50 Comment: User-ID: SOME COMMENT 51 Comment: Fingerprint: 140A9010B54795FCF10F4DC43B2D5AEC63C059D5 52 53 mDMEYjY6NhYJKwYBBAHaRw8BAQdAf6Csr2KO/xS45wIATAE2ReVclrl54qP6+1GO 54 EsRtZTXRbbiR809TVRcFOn5iro5Ez6Q6K1d7fRwtfwEAz7cX1RUfG0r5cwM03/RG 55 1mQYZZz6Qapo73bGygjx7AI= 56 =XmRh 57 -----END PGP PUBLIC KEY BLOCK-----` 58 inlinePKey := strings.Join(strings.Split(originPKey, "\n"), " ") 59 converted := convertInlinePGPPublicKey(inlinePKey) 60 assert.Equal(t, originPKey, converted) 61 62 // Test public key without comment 63 originPKey = `-----BEGIN PGP PUBLIC KEY BLOCK----- 64 65 mQINBGEeQ0kBEADUTVcGuD1sY4Lsn0Bep/T1XZeOeOdT0ZCMJr9Giksb4yhcNPIL 66 uhnpGDkYIH5ZJdLq1IiEAbctPcitmwNQcSiDS23iSdino8draQ1YrPLHiNx6RZk0 67 FoEVD2av5BES9MvnPsQulj9bU2lUokhBjM1+LERxbqfVfZ2ddAYRIMGF 68 =G+E+ 69 -----END PGP PUBLIC KEY BLOCK-----` 70 inlinePKey = strings.Join(strings.Split(originPKey, "\n"), " ") 71 converted = convertInlinePGPPublicKey(inlinePKey) 72 assert.Equal(t, originPKey, converted) 73 74 originPKey = `-----BEGIN PGP PUBLIC KEY BLOCK----- 75 Comment: EMAIL: <email@email.com> 76 Comment: Fingerprint: 140A9010B54795FCF10F4DC43B2D5AEC63C059D5 77 78 mDMEYjY6NhYJKwYBBAHaRw8BAQdAf6Csr2KO/xS45wIATAE2ReVclrl54qP6+1GO 79 EsRtZTXRbbiR809TVRcFOn5iro5Ez6Q6K1d7fRwtfwEAz7cX1RUfG0r5cwM03/RG 80 1mQYZZz6Qapo73bGygjx7AI= 81 =XmRh 82 -----END PGP PUBLIC KEY BLOCK-----` 83 inlinePKey = strings.Join(strings.Split(originPKey, "\n"), " ") 84 converted = convertInlinePGPPublicKey(inlinePKey) 85 assert.Equal(t, originPKey, converted) 86 } 87 88 func TestConvertLinks(t *testing.T) { 89 getUserByUsername := func(username database.Username) (database.User, error) { 90 if strings.ToLower(string(username)) == "username" { 91 return database.User{Username: "username"}, nil 92 } 93 return database.User{}, errors.New("not exists") 94 } 95 getLinkByShorthand := func(shorthand string) (database.Link, error) { 96 return database.Link{}, nil 97 } 98 getChatMessageByUUID := func(uuid string) (database.ChatMessage, error) { 99 return database.ChatMessage{}, nil 100 } 101 102 // Replace /u/username to link when user exists 103 actual := convertLinks("this is /u/username a test", 0, getUserByUsername, getLinkByShorthand, getChatMessageByUUID) 104 expected := `this is <a href="/u/username" rel="noopener noreferrer" target="_blank">/u/username</a> a test` 105 assert.Equal(t, expected, actual) 106 107 // Does not replace /u/notExist to link when user does not exist 108 actual = convertLinks("this is /u/notExist a test", 0, getUserByUsername, getLinkByShorthand, getChatMessageByUUID) 109 expected = `this is /u/notExist a test` 110 assert.Equal(t, expected, actual) 111 112 // Fix case errors 113 actual = convertLinks("this is /u/uSerNaMe a test", 0, getUserByUsername, getLinkByShorthand, getChatMessageByUUID) 114 expected = `this is <a href="/u/username" rel="noopener noreferrer" target="_blank">/u/username</a> a test` 115 assert.Equal(t, expected, actual) 116 117 // Convert long dkf url 118 actual = convertLinks("this is http://dkforestseeaaq2dqz2uflmlsybvnq2irzn4ygyvu53oazyorednviid.onion/u/username a test", 0, getUserByUsername, getLinkByShorthand, getChatMessageByUUID) 119 expected = `this is <a href="/u/username" rel="noopener noreferrer" target="_blank">/u/username</a> a test` 120 assert.Equal(t, expected, actual) 121 122 // Shorten dkf url but keep the short form since the user does not exist 123 actual = convertLinks("this is http://dkforestseeaaq2dqz2uflmlsybvnq2irzn4ygyvu53oazyorednviid.onion/u/notExist a test", 0, getUserByUsername, getLinkByShorthand, getChatMessageByUUID) 124 expected = `this is <a href="/u/notExist" rel="noopener noreferrer" target="_blank">http://dkf.onion/u/notExist</a> a test` 125 assert.Equal(t, expected, actual) 126 } 127 128 func TestColorifyTaggedUsers(t *testing.T) { 129 getUsersByUsername := func(usernames []string) ([]database.User, error) { 130 out := []database.User{ 131 {ID: 1, Username: "username1", ChatColor: "#001"}, 132 {ID: 2, Username: "username2", ChatColor: "#002"}, 133 } 134 return out, nil 135 } 136 msg := "@username1 @username1 @username2 @username3" 137 html, taggedUsersIDsMap := ColorifyTaggedUsers(msg, getUsersByUsername) 138 expected := `` + 139 `<span style="color: #001; font-weight: normal; font-style: normal; font-family: Arial,Helvetica,sans-serif;">@username1</span> ` + 140 `<span style="color: #001; font-weight: normal; font-style: normal; font-family: Arial,Helvetica,sans-serif;">@username1</span> ` + 141 `<span style="color: #002; font-weight: normal; font-style: normal; font-family: Arial,Helvetica,sans-serif;">@username2</span> ` + 142 `@username3` 143 assert.Equal(t, expected, html) 144 assert.Equal(t, 2, len(taggedUsersIDsMap)) 145 assert.Equal(t, database.Username("username1"), taggedUsersIDsMap[1].Username) 146 assert.Equal(t, database.Username("username2"), taggedUsersIDsMap[2].Username) 147 } 148 149 func BenchmarkColorifyTaggedUsers(b *testing.B) { 150 getUsersByUsername := func(usernames []string) ([]database.User, error) { 151 out := []database.User{ 152 {ID: 1, Username: "username1", ChatColor: "#000"}, 153 {ID: 2, Username: "username2", ChatColor: "#001"}, 154 } 155 return out, nil 156 } 157 msg := "@username1 @username1 @username2 @username3" 158 for n := 0; n < b.N; n++ { 159 _, _ = ColorifyTaggedUsers(msg, getUsersByUsername) 160 } 161 }