Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
223 changes: 135 additions & 88 deletions internal/importing/filepath_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,43 @@ package importing

import (
"fmt"
"go/build"
"os"
"path/filepath"
"testing"

"github.com/avito-tech/go-mutesting/internal/models"

"github.com/stretchr/testify/assert"
)

// fixtureDir returns the absolute path to filepathfixtures on this machine.
func fixtureDir(t *testing.T) string {
t.Helper()
pkg, err := build.Import("github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures", ".", 0)
if err != nil {
t.Skipf("cannot resolve filepathfixtures: %v", err)
}
return pkg.Dir
}

// skipIfNoWildcard skips if wildcard package resolution (which walks $GOPATH/src)
// is unavailable — this is the case in module-mode checkouts that lack a $GOPATH/src
// layout. Checks SrcDirs directly to avoid the stderr warning emitted by allPackages.
func skipIfNoWildcard(t *testing.T) {
t.Helper()
for _, src := range build.Default.SrcDirs() {
candidate := filepath.Join(src, "github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures")
if _, err := os.Stat(candidate); err == nil {
return
}
}
t.Skip("wildcard package resolution requires $GOPATH/src layout; skipping in module mode")
}

func TestFilesOfArgs(t *testing.T) {
p := os.Getenv("GOPATH") + "/src/"
dir := fixtureDir(t)
sub := filepath.Join(dir, "secondfixturespackage")

for _, test := range []struct {
args []string
Expand Down Expand Up @@ -41,24 +68,14 @@ func TestFilesOfArgs(t *testing.T) {
"../importing/filepathfixtures/third.go",
},
},
// packages
// single package (non-wildcard)
{
[]string{"github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures"},
[]string{
p + "github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures/fifth.go",
p + "github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures/first.go",
p + "github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures/second.go",
p + "github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures/third.go",
},
},
{
[]string{"github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures/..."},
[]string{
p + "github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures/fifth.go",
p + "github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures/first.go",
p + "github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures/second.go",
p + "github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures/third.go",
p + "github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures/secondfixturespackage/fourth.go",
filepath.Join(dir, "fifth.go"),
filepath.Join(dir, "first.go"),
filepath.Join(dir, "second.go"),
filepath.Join(dir, "third.go"),
},
},
} {
Expand All @@ -67,10 +84,25 @@ func TestFilesOfArgs(t *testing.T) {

assert.Equal(t, test.expect, got, fmt.Sprintf("With args: %#v", test.args))
}

// Wildcard package resolution walks $GOPATH/src and is broken in module mode.
t.Run("wildcard package", func(t *testing.T) {
skipIfNoWildcard(t)
var opts = &models.Options{}
got := FilesOfArgs([]string{"github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures/..."}, opts)
assert.Equal(t, []string{
filepath.Join(dir, "fifth.go"),
filepath.Join(dir, "first.go"),
filepath.Join(dir, "second.go"),
filepath.Join(dir, "third.go"),
filepath.Join(sub, "fourth.go"),
}, got)
})
}

func TestPackagesWithFilesOfArgs(t *testing.T) {
p := os.Getenv("GOPATH") + "/src/"
dir := fixtureDir(t)
sub := filepath.Join(dir, "secondfixturespackage")

for _, test := range []struct {
args []string
Expand Down Expand Up @@ -105,50 +137,50 @@ func TestPackagesWithFilesOfArgs(t *testing.T) {
"../importing/filepathfixtures/third.go",
}}},
},
// packages
// single package (non-wildcard)
{
[]string{"github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures"},
[]Package{{
Name: p + "github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures",
Name: dir,
Files: []string{
p + "github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures/fifth.go",
p + "github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures/first.go",
p + "github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures/second.go",
p + "github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures/third.go",
filepath.Join(dir, "fifth.go"),
filepath.Join(dir, "first.go"),
filepath.Join(dir, "second.go"),
filepath.Join(dir, "third.go"),
},
}},
},
{
[]string{"github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures/..."},
[]Package{
{
Name: p + "github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures",
Files: []string{
p + "github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures/fifth.go",
p + "github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures/first.go",
p + "github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures/second.go",
p + "github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures/third.go",
},
},
{
Name: p + "github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures/secondfixturespackage",
Files: []string{
p + "github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures/secondfixturespackage/fourth.go",
},
},
},
},
} {
var opts = &models.Options{}
got := PackagesWithFilesOfArgs(test.args, opts)

assert.Equal(t, test.expect, got, fmt.Sprintf("With args: %#v", test.args))
}

// Wildcard package resolution walks $GOPATH/src and is broken in module mode.
t.Run("wildcard package", func(t *testing.T) {
skipIfNoWildcard(t)
var opts = &models.Options{}
got := PackagesWithFilesOfArgs([]string{"github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures/..."}, opts)
assert.Equal(t, []Package{
{
Name: dir,
Files: []string{
filepath.Join(dir, "fifth.go"),
filepath.Join(dir, "first.go"),
filepath.Join(dir, "second.go"),
filepath.Join(dir, "third.go"),
},
},
{
Name: sub,
Files: []string{filepath.Join(sub, "fourth.go")},
},
}, got)
})
}

func TestFilesWithSkipWithoutTests(t *testing.T) {
p := os.Getenv("GOPATH") + "/src/"

for _, test := range []struct {
args []string
expect []string
Expand All @@ -167,27 +199,30 @@ func TestFilesWithSkipWithoutTests(t *testing.T) {
[]string{"./filepathfixtures"},
[]string{"filepathfixtures/fifth.go", "filepathfixtures/second.go", "filepathfixtures/third.go"},
},
// packages
{
[]string{"github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures/..."},
[]string{
p + "github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures/fifth.go",
p + "github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures/second.go",
p + "github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures/third.go",
},
},
} {
var opts = &models.Options{}
opts.Config.SkipFileWithoutTest = true
got := FilesOfArgs(test.args, opts)

assert.Equal(t, test.expect, got, fmt.Sprintf("With args: %#v", test.args))
}

// Wildcard package resolution walks $GOPATH/src and is broken in module mode.
t.Run("wildcard package", func(t *testing.T) {
skipIfNoWildcard(t)
dir := fixtureDir(t)
var opts = &models.Options{}
opts.Config.SkipFileWithoutTest = true
got := FilesOfArgs([]string{"github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures/..."}, opts)
assert.Equal(t, []string{
filepath.Join(dir, "fifth.go"),
filepath.Join(dir, "second.go"),
filepath.Join(dir, "third.go"),
}, got)
})
}

func TestFilesWithSkipWithBuildTagsTests(t *testing.T) {
p := os.Getenv("GOPATH") + "/src/"

for _, test := range []struct {
args []string
expect []string
Expand All @@ -214,25 +249,28 @@ func TestFilesWithSkipWithBuildTagsTests(t *testing.T) {
[]string{"./filepathfixtures"},
[]string{"filepathfixtures/second.go"},
},
// packages
{
[]string{"github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures/..."},
[]string{
p + "github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures/second.go",
},
},
} {
var opts = &models.Options{}
opts.Config.SkipFileWithBuildTag = true
got := FilesOfArgs(test.args, opts)

assert.Equal(t, test.expect, got, fmt.Sprintf("With args: %#v", test.args))
}

// Wildcard package resolution walks $GOPATH/src and is broken in module mode.
t.Run("wildcard package", func(t *testing.T) {
skipIfNoWildcard(t)
dir := fixtureDir(t)
var opts = &models.Options{}
opts.Config.SkipFileWithBuildTag = true
got := FilesOfArgs([]string{"github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures/..."}, opts)
assert.Equal(t, []string{
filepath.Join(dir, "second.go"),
}, got)
})
}

func TestFilesWithExcludedDirs(t *testing.T) {
p := os.Getenv("GOPATH") + "/src/"

for _, test := range []struct {
args []string
expect []string
Expand Down Expand Up @@ -290,29 +328,6 @@ func TestFilesWithExcludedDirs(t *testing.T) {
},
[]string(nil),
},

//packages
{
[]string{"github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures/..."},
[]string{
p + "github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures/fifth.go",
p + "github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures/first.go",
p + "github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures/second.go",
p + "github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures/third.go",
p + "github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures/secondfixturespackage/fourth.go",
},
[]string{"filepathfixtures"},
},
{
[]string{"github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures/..."},
[]string{
p + "github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures/fifth.go",
p + "github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures/first.go",
p + "github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures/second.go",
p + "github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures/third.go",
},
[]string{p + "github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures/secondfixturespackage/"},
},
} {
var opts = &models.Options{}
opts.Config.ExcludeDirs = test.config
Expand All @@ -321,4 +336,36 @@ func TestFilesWithExcludedDirs(t *testing.T) {

assert.Equal(t, test.expect, got, fmt.Sprintf("With args: %#v", test.args))
}

// Wildcard package resolution walks $GOPATH/src and is broken in module mode.
t.Run("wildcard package no exclusion", func(t *testing.T) {
skipIfNoWildcard(t)
dir := fixtureDir(t)
sub := filepath.Join(dir, "secondfixturespackage")
var opts = &models.Options{}
opts.Config.ExcludeDirs = []string{"filepathfixtures"}
got := FilesOfArgs([]string{"github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures/..."}, opts)
assert.Equal(t, []string{
filepath.Join(dir, "fifth.go"),
filepath.Join(dir, "first.go"),
filepath.Join(dir, "second.go"),
filepath.Join(dir, "third.go"),
filepath.Join(sub, "fourth.go"),
}, got)
})

t.Run("wildcard package exclude subpackage", func(t *testing.T) {
skipIfNoWildcard(t)
dir := fixtureDir(t)
sub := filepath.Join(dir, "secondfixturespackage")
var opts = &models.Options{}
opts.Config.ExcludeDirs = []string{sub + "/"}
got := FilesOfArgs([]string{"github.com/avito-tech/go-mutesting/internal/importing/filepathfixtures/..."}, opts)
assert.Equal(t, []string{
filepath.Join(dir, "fifth.go"),
filepath.Join(dir, "first.go"),
filepath.Join(dir, "second.go"),
filepath.Join(dir, "third.go"),
}, got)
})
}