Skip to content

Commit 31603bd

Browse files
committed
Add tests for tuple logger outputs
1 parent 82441c3 commit 31603bd

1 file changed

Lines changed: 82 additions & 0 deletions

File tree

internal/tuple/logger_test.go

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,14 @@ package tuple
33
import (
44
"bytes"
55
"encoding/csv"
6+
"encoding/json"
67
"os"
78
"testing"
89

10+
openfga "github.com/openfga/go-sdk"
911
"github.com/openfga/go-sdk/client"
1012
"github.com/stretchr/testify/require"
13+
"gopkg.in/yaml.v3"
1114
)
1215

1316
func TestTupleLoggerCSVIncludesAllColumns(t *testing.T) {
@@ -44,3 +47,82 @@ func TestTupleLoggerCSVIncludesAllColumns(t *testing.T) {
4447
expected := []string{"user", "anne", "", "viewer", "document", "1", "", ""}
4548
require.Equal(t, expected, records[1])
4649
}
50+
51+
func TestTupleLoggerFormatsSuccessAndFailure(t *testing.T) {
52+
t.Parallel()
53+
54+
condCtx := map[string]interface{}{"ip_addr": "10.0.0.1"}
55+
key := client.ClientTupleKey{
56+
User: "user:anne10",
57+
Relation: "owner",
58+
Object: "group:foo",
59+
Condition: &openfga.RelationshipCondition{
60+
Name: "inOfficeIP",
61+
Context: &condCtx,
62+
},
63+
}
64+
65+
formats := []string{".csv", ".json", ".jsonl", ".yaml"}
66+
for _, ext := range formats {
67+
ext := ext
68+
t.Run("success"+ext, func(t *testing.T) {
69+
tmp, err := os.CreateTemp(t.TempDir(), "success*"+ext)
70+
require.NoError(t, err)
71+
tmp.Close()
72+
73+
logger, err := NewTupleLogger(tmp.Name())
74+
require.NoError(t, err)
75+
logger.LogSuccess(key)
76+
require.NoError(t, logger.Close())
77+
78+
verifyLoggedTuple(t, tmp.Name(), ext, key)
79+
})
80+
81+
t.Run("failure"+ext, func(t *testing.T) {
82+
tmp, err := os.CreateTemp(t.TempDir(), "failure*"+ext)
83+
require.NoError(t, err)
84+
tmp.Close()
85+
86+
logger, err := NewTupleLogger(tmp.Name())
87+
require.NoError(t, err)
88+
logger.LogFailure(key)
89+
require.NoError(t, logger.Close())
90+
91+
verifyLoggedTuple(t, tmp.Name(), ext, key)
92+
})
93+
}
94+
}
95+
96+
func verifyLoggedTuple(t *testing.T, path, ext string, expected client.ClientTupleKey) {
97+
t.Helper()
98+
99+
data, err := os.ReadFile(path)
100+
require.NoError(t, err)
101+
102+
switch ext {
103+
case ".csv":
104+
r := csv.NewReader(bytes.NewReader(data))
105+
records, err := r.ReadAll()
106+
require.NoError(t, err)
107+
require.Len(t, records, 2)
108+
header := []string{"user_type", "user_id", "user_relation", "relation", "object_type", "object_id", "condition_name", "condition_context"}
109+
require.Equal(t, header, records[0])
110+
expectedRow := []string{"user", "anne10", "", "owner", "group", "foo", "inOfficeIP", "{\"ip_addr\":\"10.0.0.1\"}"}
111+
require.Equal(t, expectedRow, records[1])
112+
case ".json":
113+
var got client.ClientTupleKey
114+
require.NoError(t, json.Unmarshal(data, &got))
115+
require.Equal(t, expected, got)
116+
case ".jsonl":
117+
var got client.ClientTupleKey
118+
require.NoError(t, json.Unmarshal(bytes.TrimSpace(data), &got))
119+
require.Equal(t, expected, got)
120+
case ".yaml", ".yml":
121+
var got []client.ClientTupleKey
122+
require.NoError(t, yaml.Unmarshal(data, &got))
123+
require.Len(t, got, 1)
124+
require.Equal(t, expected, got[0])
125+
default:
126+
t.Fatalf("unknown extension %s", ext)
127+
}
128+
}

0 commit comments

Comments
 (0)