Skip to content

Commit

Permalink
Validation: test Extension
Browse files Browse the repository at this point in the history
  • Loading branch information
System-Glitch committed Jun 9, 2023
1 parent 33e0d3d commit 7c4230b
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 2 deletions.
4 changes: 2 additions & 2 deletions validation/extension.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ func (v *ExtensionValidator) Validate(ctx *ContextV5) bool {

for _, file := range files {
i := strings.Index(file.Header.Filename, ".")
if i == -1 || !lo.ContainsBy(v.Extensions, func(ext string) bool { return strings.HasSuffix(file.Header.Filename[i+1:], ext) }) {
if i == -1 || !lo.ContainsBy(v.Extensions, func(ext string) bool { return strings.HasSuffix(file.Header.Filename[i:], "."+ext) }) {
return false
}
}
Expand All @@ -47,6 +47,6 @@ func (v *ExtensionValidator) MessagePlaceholders(_ *ContextV5) []string {
// Composite extensions (e.g. "tar.gz") are supported.
//
// Multi-files are supported (all files must satisfy the criteria).
func Extension(extensions []string) *ExtensionValidator {
func Extension(extensions ...string) *ExtensionValidator {
return &ExtensionValidator{Extensions: extensions}
}
75 changes: 75 additions & 0 deletions validation/extension_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package validation

import (
"fmt"
"mime/multipart"
"strings"
"testing"

"github.com/samber/lo"
"github.com/stretchr/testify/assert"
"goyave.dev/goyave/v4/util/fsutil"
)

func TestExtensionValidator(t *testing.T) {
t.Run("Constructor", func(t *testing.T) {
v := Extension("pdf", "png", "jpeg")
assert.NotNil(t, v)
assert.Equal(t, "extension", v.Name())
assert.False(t, v.IsType())
assert.False(t, v.IsTypeDependent())
assert.Equal(t, []string{":values", "pdf, png, jpeg"}, v.MessagePlaceholders(&ContextV5{}))
})

cases := []struct {
value any
allowed []string
want bool
}{
{value: makeExtTestFiles("test.txt"), allowed: []string{"docx", "txt"}, want: true},
{value: makeExtTestFiles("test.txt", "doc.docx"), allowed: []string{"docx", "txt"}, want: true},
{value: makeExtTestFiles("test.txt", "doc.docx", "doc.pdf"), allowed: []string{"docx", "txt"}, want: false},
{value: makeExtTestFiles("test.pdf"), allowed: []string{"docx", "txt"}, want: false},
{value: makeExtTestFiles("archive.tar.gz"), allowed: []string{"tar.gz", "zip"}, want: true},
{value: makeExtTestFiles("archive.atar.gz"), allowed: []string{"tar.gz", "zip"}, want: false},
{value: makeExtTestFiles("noext"), allowed: []string{"tar.gz", "zip", "noext"}, want: false},
{value: makeExtTestFiles("noext."), allowed: []string{"tar.gz", "zip", "noext"}, want: false},
{value: "string", want: false},
{value: "", want: false},
{value: 'a', want: false},
{value: 2, want: false},
{value: 2.5, want: false},
{value: []string{"string"}, want: false},
{value: map[string]any{"a": 1}, want: false},
{value: true, want: false},
{value: nil, want: false},
}

for _, c := range cases {
c := c
t.Run(fmt.Sprintf("Validate_%s_%t", extTestFilesNames(c.value), c.want), func(t *testing.T) {
v := Extension(c.allowed...)
assert.Equal(t, c.want, v.Validate(&ContextV5{
Value: c.value,
}))
})
}
}

func makeExtTestFiles(filename ...string) []fsutil.File {
return lo.Map(filename, func(f string, _ int) fsutil.File {
return fsutil.File{
Header: &multipart.FileHeader{
Filename: f,
},
}
})
}

func extTestFilesNames(value any) string {
if files, ok := value.([]fsutil.File); ok {
return "[" + strings.Join(lo.Map(files, func(f fsutil.File, _ int) string { return f.Header.Filename }), "_") + "]"
}
return fmt.Sprintf("%v", value)

}

0 comments on commit 7c4230b

Please sign in to comment.