Skip to content

Commit a7b9753

Browse files
committed
1. Unifying work with FS via VFS
2. Unifying work with FS via VFS
1 parent a2b2d60 commit a7b9753

File tree

8 files changed

+184
-106
lines changed

8 files changed

+184
-106
lines changed

README.adoc

Lines changed: 5 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
= test utils
1+
= Test utils
22
:toc: macro
33
---
44

@@ -14,94 +14,12 @@ toc::[]
1414

1515
== Install module
1616

17-
```
18-
go get -u github.com/github.com/itbasis/go-test-utils/v4
19-
```
20-
21-
== File utils
22-
23-
* link:files/files.go[] - Reads the contents of a file and checks that there was no error while reading.
24-
25-
Real file system:
26-
[source,go]
27-
----
28-
package demo_test
29-
30-
import (
31-
"os"
32-
33-
"github.com/itbasis/go-test-utils/v4/files"
34-
35-
"github.com/onsi/ginkgo/v2"
36-
)
37-
38-
var _ = ginkgo.Describe("Real OS", func(){
39-
content := files.ReadFile(os.ReadFile, "example.txt")
40-
})
4117
----
42-
43-
Embedded File System:
44-
[source,go]
45-
----
46-
package demo_test
47-
48-
import (
49-
"embed"
50-
51-
"github.com/itbasis/go-test-utils/v4/files"
52-
53-
"github.com/onsi/ginkgo/v2"
54-
)
55-
56-
//go:embed example.txt
57-
var testData embed.FS
58-
59-
var _ = ginkgo.Describe("Embedded FS", func(){
60-
content := files.ReadFile(testData.ReadFile, "example.txt")
61-
})
18+
go get -u github.com/github.com/itbasis/go-test-utils/v5
6219
----
6320

64-
== Database utils
21+
include::files/README.adoc[]
6522

66-
* link:db/sql.go[] - Getting a DB mock and SqlMock without SqlMock options (example option: link:https://github.com/DATA-DOG/go-sqlmock?tab=readme-ov-file#customize-sql-query-matching[QueryMatcherOptions])
67-
* link:db/gorm.go[] - Getting a GORM and SqlMock instances
23+
include::db/README.adoc[]
6824

69-
== Ginkgo utils
70-
71-
* link:ginkgo/ginkgo.go[] - Adds slog support to tests and code under test
72-
73-
[source,go]
74-
----
75-
package demo_test
76-
77-
import (
78-
"testing"
79-
80-
"github.com/itbasis/go-test-utils/v4/ginkgo"
81-
)
82-
83-
func TestSuite(t *testing.T) {
84-
ginkgo.InitGinkgoSuite(t, "Sample Suite")
85-
}
86-
----
87-
88-
Custom slog options
89-
90-
[source,go]
91-
----
92-
package demo_test
93-
94-
import (
95-
"log/slog"
96-
"testing"
97-
98-
"github.com/itbasis/go-test-utils/v4/ginkgo"
99-
)
100-
101-
func TestDemoSuite(t *testing.T) {
102-
ginkgo.InitGinkgoSuiteWithSlogOptions(t, "Sample Suite", &slog.HandlerOptions{
103-
Level: slog.LevelDebug,
104-
AddSource: false,
105-
})
106-
}
107-
----
25+
include::ginkgo/README.adoc[]

db/README.adoc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
== Database utils
2+
3+
* link:sql.go[] - Getting a DB mock and SqlMock without SqlMock options (example option: link:https://github.com/DATA-DOG/go-sqlmock?tab=readme-ov-file#customize-sql-query-matching[QueryMatcherOptions])
4+
* link:gorm.go[] - Getting a GORM and SqlMock instances

files/README.adoc

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
== File utils
2+
3+
* link:files.go[] - Reads the contents of a file and checks that there was no error while reading.
4+
5+
OS file system (link:files_test.go[]):
6+
7+
[source,go]
8+
----
9+
include::files_test.go[tag=snippet]
10+
include::files_test.go[tag=snippet_os]
11+
include::files_test.go[tag=snippet_reader_os]
12+
----
13+
14+
For any `fs.FS` implementation, for example - Embedded FS (link:files_test.go[]):
15+
16+
[source,go]
17+
----
18+
include::files_test.go[tag=snippet]
19+
include::files_test.go[tag=snippet_embedded]
20+
include::files_test.go[tag=snippet_reader_embedded]
21+
----

files/files.go

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,39 @@
11
package files
22

33
import (
4+
"io"
45
"log/slog"
56

67
. "github.com/onsi/gomega"
8+
"golang.org/x/tools/godoc/vfs"
79
)
810

9-
type ReadFileFn func(filename string) ([]byte, error)
11+
func Close(closer io.Closer) {
12+
if closer == nil {
13+
slog.Warn("closer is nil")
1014

11-
func ReadFile(readFileFn ReadFileFn, filePath string) []byte {
12-
slog.Info("reading file", slog.String("file", filePath))
15+
return
16+
}
17+
18+
Expect(closer.Close()).To(Succeed())
19+
}
1320

14-
bytes, err := readFileFn(filePath)
21+
func ReadFile(fs vfs.Opener, filePath string) []byte {
22+
fileReader := FileReader(fs, filePath)
23+
24+
defer Close(fileReader)
25+
26+
bytes, err := io.ReadAll(fileReader)
1527
Expect(err).To(Succeed())
1628

1729
return bytes
1830
}
31+
32+
func FileReader(fs vfs.Opener, filePath string) vfs.ReadSeekCloser {
33+
slog.Info("reading file", slog.String("file", filePath))
34+
35+
rsc, err := fs.Open(filePath)
36+
Expect(err).To(Succeed())
37+
38+
return rsc
39+
}

files/files_suite_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package files_test
33
import (
44
"testing"
55

6-
"github.com/itbasis/go-test-utils/v4/ginkgo"
6+
"github.com/itbasis/go-test-utils/v5/ginkgo"
77
)
88

99
func TestFiles(t *testing.T) {

files/files_test.go

Lines changed: 86 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,108 @@
11
package files_test
22

3+
// tag::snippet[]
34
import (
45
"embed"
5-
"os"
6+
"io"
7+
"io/fs"
68

7-
"github.com/itbasis/go-test-utils/v4/files"
9+
"github.com/itbasis/go-test-utils/v5/files"
10+
"golang.org/x/tools/godoc/vfs"
811

912
"github.com/onsi/ginkgo/v2"
1013
"github.com/onsi/gomega"
1114
)
1215

16+
var _entries = []ginkgo.TableEntry{
17+
ginkgo.Entry(nil, "testdata/001.txt", "test 001\n"),
18+
ginkgo.Entry(nil, "testdata/002.txt", "test 002\n"),
19+
}
20+
21+
// end::snippet[]
22+
23+
// tag::snippet_os[]
24+
var _ = ginkgo.DescribeTable(
25+
"ReadFile :: OS", func(fileName, wantContent string) {
26+
gomega.Expect(fileName).To(gomega.BeARegularFile())
27+
28+
gomega.Expect(files.ReadFile(vfs.OS("."), fileName)).To(gomega.BeEquivalentTo(wantContent))
29+
},
30+
_entries,
31+
)
32+
33+
// end::snippet_os[]
34+
35+
// tag::snippet_reader_os[]
36+
var _ = ginkgo.DescribeTable(
37+
"FileReader :: OS", func(fileName, wantContent string) {
38+
var reader = files.FileReader(vfs.OS("."), fileName)
39+
40+
defer files.Close(reader)
41+
42+
gomega.Expect(io.ReadAll(reader)).To(gomega.BeEquivalentTo(wantContent))
43+
},
44+
_entries,
45+
)
46+
47+
// end::snippet_reader_os[]
48+
49+
// tag::snippet_embedded[]
50+
1351
//go:embed testdata/*
1452
var testData embed.FS
1553

16-
var _ = ginkgo.DescribeTableSubtree(
17-
"ReadFile", func(fileName, wantContent string) {
54+
var _ = ginkgo.DescribeTable(
55+
"ReadFile :: Embedded FS", func(fileName, wantContent string) {
56+
gomega.Expect(files.ReadFile(vfs.FromFS(testData), fileName)).To(gomega.BeEquivalentTo(wantContent))
57+
},
58+
_entries,
59+
)
60+
61+
// end::snippet_embedded[]
62+
63+
// tag::snippet_reader_embedded[]
64+
var _ = ginkgo.DescribeTable(
65+
"FileReader :: Embedded FS", func(fileName, wantContent string) {
66+
var reader = files.FileReader(vfs.FromFS(testData), fileName)
67+
68+
defer files.Close(reader)
69+
70+
gomega.Expect(io.ReadAll(reader)).To(gomega.BeEquivalentTo(wantContent))
71+
},
72+
_entries,
73+
)
74+
75+
// end::snippet_reader_embedded[]
76+
77+
var _ = ginkgo.Describe(
78+
"Close", func() {
79+
defer ginkgo.GinkgoRecover()
80+
1881
ginkgo.It(
19-
"Real OS", func() {
20-
gomega.Expect(fileName).To(gomega.BeARegularFile())
21-
gomega.Expect(files.ReadFile(os.ReadFile, fileName)).To(gomega.BeEquivalentTo(wantContent))
82+
"Close nil", func() {
83+
gomega.Expect(
84+
gomega.InterceptGomegaFailure(
85+
func() {
86+
files.Close(io.Closer(nil))
87+
},
88+
),
89+
).To(gomega.Succeed())
2290
},
2391
)
2492

2593
ginkgo.It(
26-
"Embedded FS", func() {
27-
gomega.Expect(files.ReadFile(testData.ReadFile, fileName)).To(gomega.BeEquivalentTo(wantContent))
94+
"Fail close", func() {
95+
var reader = files.FileReader(vfs.OS("."), "testdata/001.txt")
96+
97+
gomega.Expect(reader.Close()).To(gomega.Succeed())
98+
gomega.Expect(
99+
gomega.InterceptGomegaFailure(
100+
func() {
101+
files.Close(reader)
102+
},
103+
),
104+
).Error().To(gomega.MatchError(gomega.ContainSubstring(fs.ErrClosed.Error())))
28105
},
29106
)
30107
},
31-
ginkgo.Entry(nil, "testdata/001.txt", "test 001\n"),
32-
ginkgo.Entry(nil, "testdata/002.txt", "test 002\n"),
33108
)

ginkgo/README.adoc

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
== Ginkgo utils
2+
3+
* link:ginkgo/ginkgo.go[] - Adds slog support to tests and code under test
4+
5+
[source,go]
6+
----
7+
package demo_test
8+
9+
import (
10+
"testing"
11+
12+
"github.com/itbasis/go-test-utils/v5/ginkgo"
13+
)
14+
15+
func TestSuite(t *testing.T) {
16+
ginkgo.InitGinkgoSuite(t, "Sample Suite")
17+
}
18+
----
19+
20+
Custom slog options
21+
22+
[source,go]
23+
----
24+
package demo_test
25+
26+
import (
27+
"log/slog"
28+
"testing"
29+
30+
"github.com/itbasis/go-test-utils/v5/ginkgo"
31+
)
32+
33+
func TestDemoSuite(t *testing.T) {
34+
ginkgo.InitGinkgoSuiteWithSlogOptions(t, "Sample Suite", &slog.HandlerOptions{
35+
Level: slog.LevelDebug,
36+
AddSource: false,
37+
})
38+
}
39+
----

go.mod

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
1-
module github.com/itbasis/go-test-utils/v4
1+
module github.com/itbasis/go-test-utils/v5
22

3-
go 1.22.10
3+
go 1.22.11
44

55
require (
66
github.com/DATA-DOG/go-sqlmock v1.5.2
77
github.com/dusted-go/logging v1.3.0
88
github.com/onsi/ginkgo/v2 v2.22.2
99
github.com/onsi/gomega v1.36.2
1010
github.com/orandin/slog-gorm v1.4.0
11+
golang.org/x/tools v0.29.0
1112
gorm.io/driver/postgres v1.5.11
1213
gorm.io/gorm v1.25.12
1314
)
@@ -30,6 +31,5 @@ require (
3031
golang.org/x/sync v0.10.0 // indirect
3132
golang.org/x/sys v0.29.0 // indirect
3233
golang.org/x/text v0.21.0 // indirect
33-
golang.org/x/tools v0.29.0 // indirect
3434
gopkg.in/yaml.v3 v3.0.1 // indirect
3535
)

0 commit comments

Comments
 (0)