Skip to content

Commit 6852e09

Browse files
committed
better reporting on failing official tests
and allow running from a local JSON file
1 parent cfec081 commit 6852e09

2 files changed

Lines changed: 42 additions & 24 deletions

File tree

internal/testing.go

Lines changed: 32 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,20 @@ package internal
33
import (
44
"bytes"
55
"encoding/json"
6+
"flag"
7+
"fmt"
68
"io"
79
"log"
810
"net/http"
11+
"os"
912
"reflect"
1013
)
1114

1215
type (
1316
Test struct {
14-
Rule io.Reader
15-
Data io.Reader
16-
Expected io.Reader
17+
Rule any
18+
Data any
19+
Expected any
1720
}
1821

1922
Tests []Test
@@ -31,27 +34,39 @@ func convertInterfaceToReader(i any) io.Reader {
3134
return &result
3235
}
3336

37+
var testFile = flag.String("jsonlogic-test-file", "", "tests.json file to use instead of http://jsonlogic.com/tests.json")
38+
3439
func GetScenariosFromOfficialTestSuite() Tests {
3540
var tests Tests
3641

37-
response, err := http.Get("http://jsonlogic.com/tests.json")
38-
if err != nil {
39-
log.Fatal(err)
42+
var buffer []byte
43+
if *testFile != "" {
44+
fmt.Printf("reading from local file\n")
45+
var err error
46+
buffer, err = os.ReadFile(*testFile)
47+
if err != nil {
48+
log.Fatal(err)
49+
}
50+
} else {
51+
response, err := http.Get("http://jsonlogic.com/tests.json")
52+
if err != nil {
53+
log.Fatal(err)
4054

41-
return tests
42-
}
55+
return tests
56+
}
4357

44-
buffer, _ := io.ReadAll(response.Body)
58+
buffer, err = io.ReadAll(response.Body)
59+
if err != nil {
60+
log.Fatal(err)
61+
}
4562

46-
response.Body.Close()
63+
response.Body.Close()
64+
}
4765

4866
var scenarios []any
49-
50-
err = json.Unmarshal(buffer, &scenarios)
67+
var err = json.Unmarshal(buffer, &scenarios)
5168
if err != nil {
5269
log.Fatal(err)
53-
54-
return tests
5570
}
5671

5772
// add missing but relevant scenarios
@@ -69,9 +84,9 @@ func GetScenariosFromOfficialTestSuite() Tests {
6984
}
7085

7186
tests = append(tests, Test{
72-
Rule: convertInterfaceToReader(scenario.([]any)[0]),
73-
Data: convertInterfaceToReader(scenario.([]any)[1]),
74-
Expected: convertInterfaceToReader(scenario.([]any)[2]),
87+
Rule: scenario.([]any)[0],
88+
Data: scenario.([]any)[1],
89+
Expected: scenario.([]any)[2],
7590
})
7691
}
7792

jsonlogic_test.go

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"bytes"
55
"encoding/json"
66
"fmt"
7-
"io"
87
"strings"
98
"testing"
109

@@ -19,20 +18,24 @@ func TestRulesFromJsonLogic(t *testing.T) {
1918

2019
for i, test := range tests {
2120
t.Run(fmt.Sprintf("Scenario_%d", i), func(t *testing.T) {
22-
var result bytes.Buffer
23-
24-
err := jsonlogic.Apply(test.Rule, test.Data, &result)
21+
result, err := jsonlogic.ApplyInterface(test.Rule, test.Data)
2522
if err != nil {
2623
t.Fatal(err)
2724
}
2825

29-
if b, err := io.ReadAll(test.Expected); err == nil {
30-
assert.JSONEq(t, string(b), result.String())
31-
}
26+
assert.Equal(t, test.Expected, result, "Applying rule %v to data %v", toJSON(test.Rule), toJSON(test.Data))
3227
})
3328
}
3429
}
3530

31+
func toJSON(val any) string {
32+
res, err := json.Marshal(val)
33+
if err != nil {
34+
panic(err)
35+
}
36+
return string(res)
37+
}
38+
3639
func TestDivWithOnlyOneValue(t *testing.T) {
3740
rule := strings.NewReader(`{"/":[4]}`)
3841
data := strings.NewReader(`null`)

0 commit comments

Comments
 (0)