(t *testing.T, datastore storage.OpenFGADatastore)
| 622 | } |
| 623 | |
| 624 | func TupleWritingAndReadingTest(t *testing.T, datastore storage.OpenFGADatastore) { |
| 625 | ctx := context.Background() |
| 626 | |
| 627 | t.Run("lots_of_writes_and_read_returns_everything", func(t *testing.T) { |
| 628 | storeID := ulid.Make().String() |
| 629 | |
| 630 | var writtenTuples []*openfgav1.TupleKey |
| 631 | for i := 0; i < storage.DefaultPageSize*50; i++ { |
| 632 | newTuple := tuple.NewTupleKey(fmt.Sprintf("document:%d", i), "viewer", "user:jon") |
| 633 | err := datastore.Write(context.Background(), storeID, nil, []*openfgav1.TupleKey{newTuple}) |
| 634 | require.NoError(t, err) |
| 635 | writtenTuples = append(writtenTuples, newTuple) |
| 636 | } |
| 637 | |
| 638 | t.Run("read_returns_everything", func(t *testing.T) { |
| 639 | tupleIterator, err := datastore.Read(ctx, storeID, storage.ReadFilter{}, storage.ReadOptions{}) |
| 640 | require.NoError(t, err) |
| 641 | defer tupleIterator.Stop() |
| 642 | |
| 643 | seenTuples := iterateThroughAllTuples(t, tupleIterator) |
| 644 | if diff := cmp.Diff(writtenTuples, seenTuples, cmpSortTupleKeys...); diff != "" { |
| 645 | t.Fatalf("mismatch (-want +got):\n%s", diff) |
| 646 | } |
| 647 | }) |
| 648 | |
| 649 | t.Run("read_page_size_1_returns_everything", func(t *testing.T) { |
| 650 | seenTuples := testutils.ConvertTuplesToTupleKeys(readWithPageSize(t, datastore, storeID, 1, storage.ReadFilter{})) |
| 651 | if diff := cmp.Diff(writtenTuples, seenTuples, cmpSortTupleKeys...); diff != "" { |
| 652 | t.Fatalf("mismatch (-want +got):\n%s", diff) |
| 653 | } |
| 654 | }) |
| 655 | |
| 656 | t.Run("read_page_size_2_returns_everything", func(t *testing.T) { |
| 657 | seenTuples := testutils.ConvertTuplesToTupleKeys(readWithPageSize(t, datastore, storeID, 2, storage.ReadFilter{})) |
| 658 | if diff := cmp.Diff(writtenTuples, seenTuples, cmpSortTupleKeys...); diff != "" { |
| 659 | t.Fatalf("mismatch (-want +got):\n%s", diff) |
| 660 | } |
| 661 | }) |
| 662 | |
| 663 | t.Run("read_page_size_default_returns_everything", func(t *testing.T) { |
| 664 | seenTuples := testutils.ConvertTuplesToTupleKeys(readWithPageSize(t, datastore, storeID, storage.DefaultPageSize, storage.ReadFilter{})) |
| 665 | if diff := cmp.Diff(writtenTuples, seenTuples, cmpSortTupleKeys...); diff != "" { |
| 666 | t.Fatalf("mismatch (-want +got):\n%s", diff) |
| 667 | } |
| 668 | }) |
| 669 | |
| 670 | t.Run("read_page_size_infinite_returns_everything", func(t *testing.T) { |
| 671 | seenTuples := testutils.ConvertTuplesToTupleKeys(readWithPageSize(t, datastore, storeID, storage.DefaultPageSize*50000, storage.ReadFilter{})) |
| 672 | if diff := cmp.Diff(writtenTuples, seenTuples, cmpSortTupleKeys...); diff != "" { |
| 673 | t.Fatalf("mismatch (-want +got):\n%s", diff) |
| 674 | } |
| 675 | }) |
| 676 | }) |
| 677 | |
| 678 | t.Run("deletes_would_succeed_and_write_would_fail,_fails_and_introduces_no_changes", func(t *testing.T) { |
| 679 | storeID := ulid.Make().String() |
| 680 | tks := []*openfgav1.TupleKey{ |
| 681 | { |
no test coverage detected
searching dependent graphs…