-
Notifications
You must be signed in to change notification settings - Fork 29
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Added testing for delete csv functionality
- Loading branch information
1 parent
4f6b139
commit e4cc8a4
Showing
3 changed files
with
197 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,193 @@ | ||
package tuple | ||
|
||
import ( | ||
"testing" | ||
|
||
openfga "github.com/openfga/go-sdk" | ||
"github.com/stretchr/testify/assert" | ||
"github.com/stretchr/testify/require" | ||
|
||
"github.com/openfga/cli/internal/tuplefile" | ||
) | ||
|
||
func TestDeleteTuplesFileData(t *testing.T) { //nolint:funlen | ||
t.Parallel() | ||
|
||
tests := []struct { | ||
name string | ||
file string | ||
expectedTuples []openfga.TupleKeyWithoutCondition | ||
expectedError string | ||
}{ | ||
{ | ||
name: "it can correctly parse a csv file", | ||
file: "testdata/tuples.csv", | ||
expectedTuples: []openfga.TupleKeyWithoutCondition{ | ||
{ | ||
User: "user:anne", | ||
Relation: "owner", | ||
Object: "folder:product", | ||
}, | ||
{ | ||
User: "folder:product", | ||
Relation: "parent", | ||
Object: "folder:product-2021", | ||
}, | ||
{ | ||
User: "team:fga#member", | ||
Relation: "viewer", | ||
Object: "folder:product-2021", | ||
}, | ||
}, | ||
}, | ||
{ | ||
name: "it can correctly parse a csv file regardless of columns order", | ||
file: "testdata/tuples_other_columns_order.csv", | ||
expectedTuples: []openfga.TupleKeyWithoutCondition{ | ||
{ | ||
User: "user:anne", | ||
Relation: "owner", | ||
Object: "folder:product", | ||
}, | ||
{ | ||
User: "folder:product", | ||
Relation: "parent", | ||
Object: "folder:product-2021", | ||
}, | ||
{ | ||
User: "team:fga#member", | ||
Relation: "viewer", | ||
Object: "folder:product-2021", | ||
}, | ||
}, | ||
}, | ||
{ | ||
name: "it can correctly parse a csv file without optional fields", | ||
file: "testdata/tuples_without_optional_fields.csv", | ||
expectedTuples: []openfga.TupleKeyWithoutCondition{ | ||
{ | ||
User: "user:anne", | ||
Relation: "owner", | ||
Object: "folder:product", | ||
}, | ||
{ | ||
User: "folder:product", | ||
Relation: "parent", | ||
Object: "folder:product-2021", | ||
}, | ||
}, | ||
}, | ||
{ | ||
name: "it can correctly parse a csv file with condition_name header but no condition_context header", | ||
file: "testdata/tuples_with_condition_name_but_no_condition_context.csv", | ||
expectedTuples: []openfga.TupleKeyWithoutCondition{ | ||
{ | ||
User: "user:anne", | ||
Relation: "owner", | ||
Object: "folder:product", | ||
}, | ||
{ | ||
User: "folder:product", | ||
Relation: "parent", | ||
Object: "folder:product-2021", | ||
}, | ||
{ | ||
User: "team:fga#member", | ||
Relation: "viewer", | ||
Object: "folder:product-2021", | ||
}, | ||
}, | ||
}, | ||
{ | ||
name: "it can correctly parse a json file", | ||
file: "testdata/tuples.json", | ||
expectedTuples: []openfga.TupleKeyWithoutCondition{ | ||
{ | ||
User: "user:anne", | ||
Relation: "owner", | ||
Object: "folder:product", | ||
}, | ||
{ | ||
User: "folder:product", | ||
Relation: "parent", | ||
Object: "folder:product-2021", | ||
}, | ||
{ | ||
User: "user:beth", | ||
Relation: "viewer", | ||
Object: "folder:product-2021", | ||
}, | ||
}, | ||
}, | ||
{ | ||
name: "it can correctly parse a yaml file", | ||
file: "testdata/tuples.yaml", | ||
expectedTuples: []openfga.TupleKeyWithoutCondition{ | ||
{ | ||
User: "user:anne", | ||
Relation: "owner", | ||
Object: "folder:product", | ||
}, | ||
{ | ||
User: "folder:product", | ||
Relation: "parent", | ||
Object: "folder:product-2021", | ||
}, | ||
{ | ||
User: "user:beth", | ||
Relation: "viewer", | ||
Object: "folder:product-2021", | ||
}, | ||
}, | ||
}, | ||
{ | ||
name: "it fails to parse a non-supported file format", | ||
file: "testdata/tuples.toml", | ||
expectedError: "failed to parse input tuples: unsupported file format \".toml\"", | ||
}, | ||
{ | ||
name: "it fails to parse a csv file with wrong headers", | ||
file: "testdata/tuples_wrong_headers.csv", | ||
expectedError: "failed to parse input tuples: invalid header \"a\", valid headers are user_type,user_id,user_relation,relation,object_type,object_id,condition_name,condition_context", | ||
}, | ||
{ | ||
name: "it fails to parse a csv file with missing required headers", | ||
file: "testdata/tuples_missing_required_headers.csv", | ||
expectedError: "failed to parse input tuples: csv header missing (\"object_id\")", | ||
}, | ||
{ | ||
name: "it fails to parse a csv file with missing condition_name header when condition_context is present", | ||
file: "testdata/tuples_missing_condition_name_header.csv", | ||
expectedError: "failed to parse input tuples: missing \"condition_name\" header which is required when \"condition_context\" is present", | ||
}, | ||
{ | ||
name: "it fails to parse an empty csv file", | ||
file: "testdata/tuples_empty.csv", | ||
expectedError: "failed to parse input tuples: failed to read csv headers: EOF", | ||
}, | ||
{ | ||
name: "it fails to parse a csv file with invalid rows", | ||
file: "testdata/tuples_with_invalid_rows.csv", | ||
expectedError: "failed to parse input tuples: failed to read tuple from csv file: record on line 2: wrong number of fields", | ||
}, | ||
} | ||
|
||
for _, test := range tests { | ||
test := test | ||
t.Run(test.name, func(t *testing.T) { | ||
t.Parallel() | ||
|
||
actualTuples, err := tuplefile.ReadTupleFile(test.file) | ||
deleteTuples := tuplefile.ClientTupleKeyToTupleKeyWithoutCondition(actualTuples) | ||
|
||
if test.expectedError != "" { | ||
require.EqualError(t, err, test.expectedError) | ||
|
||
return | ||
} | ||
|
||
require.NoError(t, err) | ||
assert.Equal(t, test.expectedTuples, deleteTuples) | ||
}) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,4 @@ | ||
user_type,user_id,user_relation,relation,object_type,object_id,condition_name,condition_context | ||
user,chris,,owner,folder,product,inOfficeIP, | ||
user,anne,,owner,folder,product,inOfficeIP, | ||
folder,product,,parent,folder,product-2021,inOfficeIP,"{""ip_addr"":""10.0.0.1""}" | ||
team,fga,member,viewer,folder,product-2021,, |