@@ -3,11 +3,14 @@ package tuple
33import (
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
1316func 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