Skip to content

Commit 6068172

Browse files
committed
Move code out of main and add tests for encoding
1 parent d64216e commit 6068172

File tree

5 files changed

+130
-28
lines changed

5 files changed

+130
-28
lines changed

cmd/mmdbinspect/main.go

Lines changed: 8 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,11 @@
33
package main
44

55
import (
6-
"encoding/json"
76
"flag"
87
"fmt"
98
"log"
109
"os"
1110
"strings"
12-
13-
"github.com/goccy/go-yaml"
1411
)
1512

1613
type arrayFlags []string
@@ -53,9 +50,9 @@ func main() {
5350
flag.Parse()
5451

5552
// Any remaining arguments (not passed via flags) should be networks
56-
network := flag.Args()
53+
networks := flag.Args()
5754

58-
if len(network) == 0 {
55+
if len(networks) == 0 {
5956
fmt.Println("You must provide at least one network address")
6057
usage()
6158
os.Exit(1)
@@ -69,34 +66,17 @@ func main() {
6966

7067
w := os.Stdout
7168

72-
var encoder interface {
73-
Encode(any) error
74-
}
75-
if *useJSONL {
76-
enc := json.NewEncoder(w)
77-
enc.SetEscapeHTML(false) // don't escape ampersands and angle brackets
78-
encoder = enc
79-
} else {
80-
encoder = yaml.NewEncoder(w)
81-
}
82-
83-
iterator := records(
84-
network,
69+
err := process(
70+
w,
71+
*useJSONL,
72+
networks,
8573
mmdb,
8674
*includeAliasedNetworks,
8775
*includeBuildTime,
8876
*includeNetworksWithoutData,
8977
)
90-
91-
for r, err := range iterator {
92-
if err != nil {
93-
log.Fatal(err)
94-
}
95-
96-
err = encoder.Encode(r)
97-
if err != nil {
98-
log.Fatal(fmt.Errorf("encoding record: %w", err))
99-
}
78+
if err != nil {
79+
log.Fatal(err)
10080
}
10181
}
10282

cmd/mmdbinspect/process.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package main
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
"io"
7+
8+
"github.com/goccy/go-yaml"
9+
)
10+
11+
func process(
12+
w io.Writer,
13+
useJSONL bool,
14+
networks, databases []string,
15+
includeAliasedNetworks,
16+
includeBuildTime,
17+
includeNetworksWithoutData bool,
18+
) error {
19+
var encoder interface {
20+
Encode(any) error
21+
}
22+
23+
if useJSONL {
24+
enc := json.NewEncoder(w)
25+
enc.SetEscapeHTML(false) // don't escape ampersands and angle brackets
26+
encoder = enc
27+
} else {
28+
encoder = yaml.NewEncoder(w)
29+
}
30+
31+
iterator := records(
32+
networks,
33+
databases,
34+
includeAliasedNetworks,
35+
includeBuildTime,
36+
includeNetworksWithoutData,
37+
)
38+
39+
for r, err := range iterator {
40+
if err != nil {
41+
return err
42+
}
43+
44+
if err := encoder.Encode(r); err != nil {
45+
return fmt.Errorf("encoding record: %w", err)
46+
}
47+
}
48+
49+
return nil
50+
}

cmd/mmdbinspect/process_test.go

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package main
2+
3+
import (
4+
"bytes"
5+
"os"
6+
"testing"
7+
8+
"github.com/stretchr/testify/assert"
9+
"github.com/stretchr/testify/require"
10+
)
11+
12+
func TestProcess(t *testing.T) {
13+
// We switch directories so that we don't have to deal with path separator
14+
// differences in the output.
15+
// TODO: after we switch to Go 1.24, this can just be t.Chdir
16+
originalDir, err := os.Getwd()
17+
require.NoError(t, err)
18+
19+
defer func() {
20+
require.NoError(t, os.Chdir(originalDir))
21+
}()
22+
23+
require.NoError(t, os.Chdir(testDataDir))
24+
25+
tests := []struct {
26+
name string
27+
useJSONL bool
28+
networks []string
29+
databases []string
30+
expected string
31+
}{
32+
{
33+
name: "single record YAML",
34+
useJSONL: false,
35+
networks: []string{"81.2.69.142"},
36+
databases: []string{"GeoIP2-Country-Test.mmdb"},
37+
expected: "database_path:.*\nrequested_lookup: 81.2.69.142\nnetwork: 81.2.69.142/31\nrecord:\n",
38+
},
39+
{
40+
name: "Single record JSONL",
41+
useJSONL: true,
42+
networks: []string{"81.2.69.142"},
43+
databases: []string{"GeoIP2-Country-Test.mmdb"},
44+
//nolint:lll
45+
expected: `{"database_path":"GeoIP2-Country-Test.mmdb","requested_lookup":"81.2.69.142","network":"81.2.69.142/31","record":{"continent":{"code":"EU","geoname_id":6255148,"names":{"de":"Europa","en":"Europe","es":"Europa","fr":"Europe","ja":"ヨーロッパ","pt-BR":"Europa","ru":"Европа","zh-CN":"欧洲"}},"country":{"geoname_id":2635167,"is_in_european_union":true,"iso_code":"GB","names":{"de":"Vereinigtes Königreich","en":"United Kingdom","es":"Reino Unido","fr":"Royaume-Uni","ja":"イギリス","pt-BR":"Reino Unido","ru":"Великобритания","zh-CN":"英国"}},"registered_country":{"geoname_id":6252001,"iso_code":"US","names":{"de":"USA","en":"United States","es":"Estados Unidos","fr":"États-Unis","ja":"アメリカ合衆国","pt-BR":"Estados Unidos","ru":"США","zh-CN":"美国"}}}}`,
46+
},
47+
}
48+
49+
for _, test := range tests {
50+
t.Run(test.name, func(t *testing.T) {
51+
var buf bytes.Buffer
52+
53+
err := process(
54+
&buf,
55+
test.useJSONL,
56+
test.networks,
57+
test.databases,
58+
false,
59+
false,
60+
false,
61+
)
62+
63+
require.NoError(t, err)
64+
65+
if test.useJSONL {
66+
assert.JSONEq(t, test.expected, buf.String())
67+
} else {
68+
assert.Regexp(t, test.expected, buf.String())
69+
}
70+
})
71+
}
72+
}

0 commit comments

Comments
 (0)