Skip to content

Start to add tests for modules/base/tool #90

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 13 commits into from
Nov 8, 2016
Merged
45 changes: 20 additions & 25 deletions modules/base/tool.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,18 +16,17 @@ import (
"html/template"
"math"
"net/http"
"strconv"
"strings"
"time"
"unicode"
"unicode/utf8"

"github.com/Unknwon/com"
"github.com/Unknwon/i18n"

"github.com/gogits/chardet"

"github.com/go-gitea/gitea/modules/log"
"github.com/go-gitea/gitea/modules/setting"
"github.com/gogits/chardet"
)

// EncodeMD5 encodes string to md5 hex value.
Expand All @@ -44,11 +43,10 @@ func EncodeSha1(str string) string {
return hex.EncodeToString(h.Sum(nil))
}

// ShortSha is basically just truncating.
// It is DEPRECATED and will be removed in the future.
func ShortSha(sha1 string) string {
if len(sha1) > 10 {
return sha1[:10]
}
return sha1
return TruncateString(sha1, 10)
}

func DetectEncoding(content []byte) (string, error) {
Expand Down Expand Up @@ -198,30 +196,24 @@ func CreateTimeLimitCode(data string, minutes int, startInf interface{}) string
// HashEmail hashes email address to MD5 string.
// https://en.gravatar.com/site/implement/hash/
func HashEmail(email string) string {
email = strings.ToLower(strings.TrimSpace(email))
h := md5.New()
h.Write([]byte(email))
return hex.EncodeToString(h.Sum(nil))
return EncodeMD5(strings.ToLower(strings.TrimSpace(email)))
}

// AvatarLink returns relative avatar link to the site domain by given email,
// which includes app sub-url as prefix. However, it is possible
// to return full URL if user enables Gravatar-like service.
func AvatarLink(email string) (url string) {
func AvatarLink(email string) string {
if setting.EnableFederatedAvatar && setting.LibravatarService != nil {
var err error
url, err = setting.LibravatarService.FromEmail(email)
if err != nil {
log.Error(1, "LibravatarService.FromEmail: %v", err)
}
}
if len(url) == 0 && !setting.DisableGravatar {
url = setting.GravatarSource + HashEmail(email)
// TODO: This doesn't check any error. AvatarLink should return (string, error)
url, _ := setting.LibravatarService.FromEmail(email)
return url
}
if len(url) == 0 {
url = setting.AppSubUrl + "/img/avatar_default.png"

if !setting.DisableGravatar {
return setting.GravatarSource + HashEmail(email)
}
return url

return setting.AppSubUrl + "/img/avatar_default.png"
}

// Seconds-based time units
Expand Down Expand Up @@ -470,7 +462,10 @@ func Subtract(left interface{}, right interface{}) interface{} {
// EllipsisString returns a truncated short string,
// it appends '...' in the end of the length of string is too large.
func EllipsisString(str string, length int) string {
if len(str) < length {
if length <= 3 {
return "..."
}
if len(str) <= length {
return str
}
return str[:length-3] + "..."
Expand Down Expand Up @@ -498,7 +493,7 @@ func StringsToInt64s(strs []string) []int64 {
func Int64sToStrings(ints []int64) []string {
strs := make([]string, len(ints))
for i := range ints {
strs[i] = com.ToStr(ints[i])
strs[i] = strconv.FormatInt(ints[i], 10)
}
return strs
}
Expand Down
185 changes: 185 additions & 0 deletions modules/base/tool_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
package base

import (
"testing"

"github.com/go-gitea/gitea/modules/setting"
"github.com/stretchr/testify/assert"
"strk.kbt.io/projects/go/libravatar"
)

func TestEncodeMD5(t *testing.T) {
assert.Equal(t,
"3858f62230ac3c915f300c664312c63f",
EncodeMD5("foobar"),
)
}

func TestEncodeSha1(t *testing.T) {
assert.Equal(t,
"8843d7f92416211de9ebb963ff4ce28125932878",
EncodeSha1("foobar"),
)
}

func TestShortSha(t *testing.T) {
assert.Equal(t, "veryverylo", ShortSha("veryverylong"))
}

// TODO: Test DetectEncoding()

func TestBasicAuthDecode(t *testing.T) {
_, _, err := BasicAuthDecode("?")
assert.Equal(t, "illegal base64 data at input byte 0", err.Error())

user, pass, err := BasicAuthDecode("Zm9vOmJhcg==")
assert.NoError(t, err)
assert.Equal(t, "foo", user)
assert.Equal(t, "bar", pass)
}

func TestBasicAuthEncode(t *testing.T) {
assert.Equal(t, "Zm9vOmJhcg==", BasicAuthEncode("foo", "bar"))
}

func TestGetRandomString(t *testing.T) {
assert.Len(t, GetRandomString(4), 4)
}

// TODO: Test PBKDF2()
// TODO: Test VerifyTimeLimitCode()
// TODO: Test CreateTimeLimitCode()

func TestHashEmail(t *testing.T) {
assert.Equal(t,
"d41d8cd98f00b204e9800998ecf8427e",
HashEmail(""),
)
assert.Equal(t,
"353cbad9b58e69c96154ad99f92bedc7",
HashEmail("[email protected]"),
)
}

func TestAvatarLink(t *testing.T) {
setting.EnableFederatedAvatar = false
setting.LibravatarService = nil
setting.DisableGravatar = true

assert.Equal(t, "/img/avatar_default.png", AvatarLink(""))

setting.DisableGravatar = false
assert.Equal(t,
"353cbad9b58e69c96154ad99f92bedc7",
AvatarLink("[email protected]"),
)

setting.EnableFederatedAvatar = true
assert.Equal(t,
"353cbad9b58e69c96154ad99f92bedc7",
AvatarLink("[email protected]"),
)
setting.LibravatarService = libravatar.New()
assert.Equal(t,
"http://cdn.libravatar.org/avatar/353cbad9b58e69c96154ad99f92bedc7",
AvatarLink("[email protected]"),
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If you need a test for a really federated avatar, try [email protected]

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Doesn't make a difference for the test. right?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

well, this one isn't really testing the federated part (I've seen packages just prefixing the hash with "cdn.libravatar.org" and be happy with it, it's not our case, we're actually doing the DNS lookups)

)
}

// TODO: computeTimeDiff()
// TODO: TimeSincePro()
// TODO: timeSince()
// TODO: RawTimeSince()
// TODO: TimeSince()

func TestFileSize(t *testing.T) {
var size int64
size = 512
assert.Equal(t, "512B", FileSize(size))
size = size * 1024
assert.Equal(t, "512KB", FileSize(size))
size = size * 1024
assert.Equal(t, "512MB", FileSize(size))
size = size * 1024
assert.Equal(t, "512GB", FileSize(size))
size = size * 1024
assert.Equal(t, "512TB", FileSize(size))
size = size * 1024
assert.Equal(t, "512PB", FileSize(size))
//size = size * 1024 TODO: Fix bug for EB
//assert.Equal(t, "512EB", FileSize(size))
}

// TODO: Subtract()

func TestEllipsisString(t *testing.T) {
assert.Equal(t, "...", EllipsisString("foobar", 0))
assert.Equal(t, "...", EllipsisString("foobar", 1))
assert.Equal(t, "...", EllipsisString("foobar", 2))
assert.Equal(t, "...", EllipsisString("foobar", 3))
assert.Equal(t, "f...", EllipsisString("foobar", 4))
assert.Equal(t, "fo...", EllipsisString("foobar", 5))
assert.Equal(t, "foobar", EllipsisString("foobar", 6))
assert.Equal(t, "foobar", EllipsisString("foobar", 10))
}

func TestTruncateString(t *testing.T) {
assert.Equal(t, "", TruncateString("foobar", 0))
assert.Equal(t, "f", TruncateString("foobar", 1))
assert.Equal(t, "fo", TruncateString("foobar", 2))
assert.Equal(t, "foo", TruncateString("foobar", 3))
assert.Equal(t, "foob", TruncateString("foobar", 4))
assert.Equal(t, "fooba", TruncateString("foobar", 5))
assert.Equal(t, "foobar", TruncateString("foobar", 6))
assert.Equal(t, "foobar", TruncateString("foobar", 7))
}

func TestStringsToInt64s(t *testing.T) {
assert.Equal(t, []int64{}, StringsToInt64s([]string{}))
assert.Equal(t,
[]int64{1, 4, 16, 64, 256},
StringsToInt64s([]string{"1", "4", "16", "64", "256"}),
)

// TODO: StringsToInt64s should return ([]int64, error)
assert.Equal(t, []int64{-1, 0, 0}, StringsToInt64s([]string{"-1", "a", "$"}))
}

func TestInt64sToStrings(t *testing.T) {
assert.Equal(t, []string{}, Int64sToStrings([]int64{}))
assert.Equal(t,
[]string{"1", "4", "16", "64", "256"},
Int64sToStrings([]int64{1, 4, 16, 64, 256}),
)
}

func TestInt64sToMap(t *testing.T) {
assert.Equal(t, map[int64]bool{}, Int64sToMap([]int64{}))
assert.Equal(t,
map[int64]bool{1: true, 4: true, 16: true},
Int64sToMap([]int64{1, 4, 16}),
)
}

func TestIsLetter(t *testing.T) {
assert.True(t, IsLetter('a'))
assert.True(t, IsLetter('e'))
assert.True(t, IsLetter('q'))
assert.True(t, IsLetter('z'))
assert.True(t, IsLetter('A'))
assert.True(t, IsLetter('E'))
assert.True(t, IsLetter('Q'))
assert.True(t, IsLetter('Z'))
assert.True(t, IsLetter('_'))
assert.False(t, IsLetter('-'))
assert.False(t, IsLetter('1'))
assert.False(t, IsLetter('$'))
}

func TestIsTextFile(t *testing.T) {
assert.True(t, IsTextFile([]byte{}))
assert.True(t, IsTextFile([]byte("lorem ipsum")))
}

// TODO: IsImageFile(), currently no idea how to test
// TODO: IsPDFFile(), currently no idea how to test
15 changes: 15 additions & 0 deletions vendor/github.com/davecgh/go-spew/LICENSE

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading