dkforest

A forum and chat platform (onion)
git clone https://git.dasho.dev/n0tr1v/dkforest.git
Log | Files | Refs | LICENSE

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 }