Skip to content

Commit c59eb6d

Browse files
authored
Merge pull request #506 from rusq/i501
add a test for invalid json
2 parents b0f0fd2 + d7167b6 commit c59eb6d

File tree

2 files changed

+97
-5
lines changed

2 files changed

+97
-5
lines changed

internal/chunk/directory.go

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -150,11 +150,6 @@ func collectAll[T any](ctx context.Context, d *Directory, numwrk int, fn func(na
150150
defer close(errC)
151151
errC <- d.Walk(func(name string, f *File, err error) error {
152152
if err != nil {
153-
var jsonErr *json.SyntaxError
154-
if errors.As(err, &jsonErr) {
155-
slog.Warn("invalid JSON", "file", name, "error", err.Error())
156-
return nil
157-
}
158153
return fmt.Errorf("collectAll: error in %s: %w", name, err)
159154
}
160155
fileC <- collectedFile{name, f}

internal/chunk/directory_test.go

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
11
package chunk
22

33
import (
4+
"bytes"
5+
"compress/gzip"
6+
"encoding/json"
7+
"io/fs"
8+
"os"
49
"testing"
10+
"testing/fstest"
511

612
"github.com/rusq/slack"
13+
714
"github.com/rusq/slackdump/v3/internal/fixtures"
815
)
916

@@ -64,5 +71,95 @@ var (
6471
)
6572

6673
func TestOpenDir(t *testing.T) {
74+
}
75+
76+
func TestDirectory_Walk(t *testing.T) {
77+
var (
78+
// prepDir prepares a temporary directory for testing and populates it with
79+
// files from fsys. It returns the path to the directory.
80+
prepDir = func(t *testing.T, fsys fs.FS) string {
81+
t.Helper()
82+
dir := t.TempDir()
83+
if err := os.CopyFS(dir, fsys); err != nil {
84+
t.Fatal(err)
85+
}
86+
return dir
87+
}
88+
89+
compress = func(t *testing.T, data []byte) []byte {
90+
t.Helper()
91+
var buf bytes.Buffer
92+
gz := gzip.NewWriter(&buf)
93+
defer gz.Close()
94+
if _, err := gz.Write(data); err != nil {
95+
t.Fatal(err)
96+
}
97+
if err := gz.Close(); err != nil {
98+
t.Fatal(err)
99+
}
100+
return buf.Bytes()
101+
}
102+
103+
marshal = func(t *testing.T, v any) []byte {
104+
t.Helper()
105+
data, err := json.Marshal(v)
106+
if err != nil {
107+
t.Fatal(err)
108+
}
109+
return data
110+
}
111+
)
112+
113+
testChannels := fixtures.Load[[]slack.Channel](fixtures.TestChannelsJSON)
114+
channelInfos := make([]Chunk, len(testChannels))
115+
for _, ch := range testChannels {
116+
channelInfos = append(channelInfos, Chunk{
117+
Type: CChannelInfo,
118+
ChannelID: ch.ID,
119+
Channel: &ch,
120+
})
121+
}
122+
if len(channelInfos) == 0 {
123+
t.Fatal("fixture has no channels")
124+
}
125+
126+
t.Run("doesn't fail on invalid json", func(t *testing.T) {
127+
testdir := fstest.MapFS{
128+
"C123VALID.json.gz": &fstest.MapFile{
129+
Data: compress(t, marshal(t, channelInfos[0])),
130+
},
131+
"C123INVALID.json.gz": &fstest.MapFile{
132+
Data: compress(t, []byte("invalid json")),
133+
},
134+
"C123VALID2.json.gz": &fstest.MapFile{
135+
Data: compress(t, marshal(t, channelInfos[1])),
136+
},
137+
}
67138

139+
dir := prepDir(t, testdir)
140+
d, err := OpenDir(dir)
141+
if err != nil {
142+
t.Fatalf("OpenDir() error = %v", err)
143+
}
144+
defer d.Close()
145+
var seen []string
146+
if err := d.Walk(func(name string, f *File, err error) error {
147+
if err != nil {
148+
t.Fatalf("Walk() error = %v", err)
149+
}
150+
if name == "C123INVALID.json.gz" {
151+
t.Fatal("should not be called for invalid json")
152+
}
153+
if f == nil {
154+
t.Fatalf("Walk() file is nil")
155+
}
156+
seen = append(seen, name)
157+
return nil
158+
}); err != nil {
159+
t.Fatalf("Walk() error = %v", err)
160+
}
161+
if len(seen) != 2 {
162+
t.Fatalf("Walk() = %v, want 2", len(seen))
163+
}
164+
})
68165
}

0 commit comments

Comments
 (0)