Skip to content

Commit b255245

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

File tree

5 files changed

+117
-28
lines changed

5 files changed

+117
-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: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package main
2+
3+
import (
4+
"bytes"
5+
"fmt"
6+
"testing"
7+
8+
"github.com/stretchr/testify/assert"
9+
"github.com/stretchr/testify/require"
10+
)
11+
12+
func TestProcess(t *testing.T) {
13+
tests := []struct {
14+
name string
15+
useJSONL bool
16+
networks []string
17+
databases []string
18+
expected string
19+
}{
20+
{
21+
name: "single record YAML",
22+
useJSONL: false,
23+
networks: []string{"81.2.69.142"},
24+
databases: []string{CountryDBPath},
25+
expected: "database_path:.*\nrequested_lookup: 81.2.69.142\nnetwork: 81.2.69.142/31\nrecord:\n",
26+
},
27+
{
28+
name: "Single record JSONL",
29+
useJSONL: true,
30+
networks: []string{"81.2.69.142"},
31+
databases: []string{CountryDBPath},
32+
expected: `{"database_path":"../../test/data/test-data/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":"美国"}}}}`,
33+
},
34+
}
35+
36+
for _, test := range tests {
37+
t.Run(test.name, func(t *testing.T) {
38+
var buf bytes.Buffer
39+
40+
err := process(
41+
&buf,
42+
test.useJSONL,
43+
test.networks,
44+
test.databases,
45+
false,
46+
false,
47+
false,
48+
)
49+
50+
require.NoError(t, err)
51+
52+
if test.useJSONL {
53+
assert.JSONEq(t, test.expected, buf.String())
54+
} else {
55+
assert.Regexp(t, test.expected, buf.String())
56+
}
57+
})
58+
}
59+
}

0 commit comments

Comments
 (0)