| 
									
										
										
										
											2022-10-26 22:15:14 +08:00
										 |  |  | package folderimpl | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | import ( | 
					
						
							|  |  |  | 	"context" | 
					
						
							|  |  |  | 	"fmt" | 
					
						
							| 
									
										
										
										
											2023-11-08 22:28:49 +08:00
										 |  |  | 	"slices" | 
					
						
							| 
									
										
										
										
											2023-04-27 22:24:47 +08:00
										 |  |  | 	"sort" | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 	"testing" | 
					
						
							| 
									
										
										
										
											2022-10-26 22:15:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 	"github.com/google/go-cmp/cmp" | 
					
						
							| 
									
										
										
										
											2024-01-25 15:27:13 +08:00
										 |  |  | 	"github.com/google/uuid" | 
					
						
							| 
									
										
										
										
											2022-11-08 21:59:55 +08:00
										 |  |  | 	"github.com/stretchr/testify/assert" | 
					
						
							|  |  |  | 	"github.com/stretchr/testify/require" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/folder" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/services/org" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/services/org/orgimpl" | 
					
						
							| 
									
										
										
										
											2022-11-15 03:08:10 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/quota/quotatest" | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/sqlstore" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/util" | 
					
						
							|  |  |  | ) | 
					
						
							| 
									
										
										
										
											2022-10-26 22:15:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-08 21:49:17 +08:00
										 |  |  | var folderTitle string = "folder1" | 
					
						
							|  |  |  | var folderDsc string = "folder desc" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | func TestIntegrationCreate(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2022-11-04 22:14:21 +08:00
										 |  |  | 	if testing.Short() { | 
					
						
							|  |  |  | 		t.Skip("skipping integration test") | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2022-10-26 22:15:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 	db := sqlstore.InitTestDB(t) | 
					
						
							| 
									
										
										
										
											2024-01-23 00:03:30 +08:00
										 |  |  | 	folderStore := ProvideStore(db, db.Cfg) | 
					
						
							| 
									
										
										
										
											2022-10-26 22:15:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 	orgID := CreateOrg(t, db) | 
					
						
							| 
									
										
										
										
											2022-10-26 22:15:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 	t.Run("creating a folder without providing a UID should fail", func(t *testing.T) { | 
					
						
							|  |  |  | 		_, err := folderStore.Create(context.Background(), folder.CreateFolderCommand{ | 
					
						
							| 
									
										
										
										
											2022-12-08 21:49:17 +08:00
										 |  |  | 			Title:       folderTitle, | 
					
						
							|  |  |  | 			Description: folderDsc, | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 			OrgID:       orgID, | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 		require.Error(t, err) | 
					
						
							|  |  |  | 	}) | 
					
						
							| 
									
										
										
										
											2022-10-26 22:15:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 	t.Run("creating a folder with unknown parent should fail", func(t *testing.T) { | 
					
						
							|  |  |  | 		_, err := folderStore.Create(context.Background(), folder.CreateFolderCommand{ | 
					
						
							| 
									
										
										
										
											2022-12-08 21:49:17 +08:00
										 |  |  | 			Title:       folderTitle, | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 			OrgID:       orgID, | 
					
						
							|  |  |  | 			ParentUID:   "unknown", | 
					
						
							| 
									
										
										
										
											2022-12-08 21:49:17 +08:00
										 |  |  | 			Description: folderDsc, | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 			UID:         util.GenerateShortUID(), | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 		require.Error(t, err) | 
					
						
							|  |  |  | 	}) | 
					
						
							| 
									
										
										
										
											2022-10-26 22:15:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-28 23:48:44 +08:00
										 |  |  | 	t.Run("creating a folder without providing a parent should default to the empty parent folder", func(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 		uid := util.GenerateShortUID() | 
					
						
							|  |  |  | 		f, err := folderStore.Create(context.Background(), folder.CreateFolderCommand{ | 
					
						
							| 
									
										
										
										
											2022-12-08 21:49:17 +08:00
										 |  |  | 			Title:       folderTitle, | 
					
						
							|  |  |  | 			Description: folderDsc, | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 			OrgID:       orgID, | 
					
						
							|  |  |  | 			UID:         uid, | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 		require.NoError(t, err) | 
					
						
							| 
									
										
										
										
											2022-10-26 22:15:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 		t.Cleanup(func() { | 
					
						
							|  |  |  | 			err := folderStore.Delete(context.Background(), f.UID, orgID) | 
					
						
							|  |  |  | 			require.NoError(t, err) | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-08 21:49:17 +08:00
										 |  |  | 		assert.Equal(t, folderTitle, f.Title) | 
					
						
							|  |  |  | 		assert.Equal(t, folderDsc, f.Description) | 
					
						
							| 
									
										
										
										
											2024-01-12 23:43:39 +08:00
										 |  |  | 		assert.NotEmpty(t, f.UID) | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 		assert.Equal(t, uid, f.UID) | 
					
						
							| 
									
										
										
										
											2022-11-28 23:48:44 +08:00
										 |  |  | 		assert.Empty(t, f.ParentUID) | 
					
						
							| 
									
										
										
										
											2023-05-10 21:20:16 +08:00
										 |  |  | 		assert.NotEmpty(t, f.URL) | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		ff, err := folderStore.Get(context.Background(), folder.GetFolderQuery{ | 
					
						
							|  |  |  | 			UID:   &f.UID, | 
					
						
							|  |  |  | 			OrgID: orgID, | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 		assert.NoError(t, err) | 
					
						
							| 
									
										
										
										
											2022-12-08 21:49:17 +08:00
										 |  |  | 		assert.Equal(t, folderTitle, ff.Title) | 
					
						
							|  |  |  | 		assert.Equal(t, folderDsc, ff.Description) | 
					
						
							| 
									
										
										
										
											2022-11-28 23:48:44 +08:00
										 |  |  | 		assert.Empty(t, ff.ParentUID) | 
					
						
							| 
									
										
										
										
											2023-05-10 21:20:16 +08:00
										 |  |  | 		assert.NotEmpty(t, ff.URL) | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		assertAncestorUIDs(t, folderStore, f, []string{folder.GeneralFolderUID}) | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	t.Run("creating a folder with a known parent should succeed", func(t *testing.T) { | 
					
						
							|  |  |  | 		parentUID := util.GenerateShortUID() | 
					
						
							|  |  |  | 		parent, err := folderStore.Create(context.Background(), folder.CreateFolderCommand{ | 
					
						
							|  |  |  | 			Title: "parent", | 
					
						
							|  |  |  | 			OrgID: orgID, | 
					
						
							|  |  |  | 			UID:   parentUID, | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 		require.NoError(t, err) | 
					
						
							|  |  |  | 		require.Equal(t, "parent", parent.Title) | 
					
						
							| 
									
										
										
										
											2024-01-12 23:43:39 +08:00
										 |  |  | 		require.NotEmpty(t, parent.UID) | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 		assert.Equal(t, parentUID, parent.UID) | 
					
						
							| 
									
										
										
										
											2023-05-10 21:20:16 +08:00
										 |  |  | 		assert.NotEmpty(t, parent.URL) | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		t.Cleanup(func() { | 
					
						
							|  |  |  | 			err := folderStore.Delete(context.Background(), parent.UID, orgID) | 
					
						
							|  |  |  | 			require.NoError(t, err) | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 		assertAncestorUIDs(t, folderStore, parent, []string{folder.GeneralFolderUID}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		uid := util.GenerateShortUID() | 
					
						
							|  |  |  | 		f, err := folderStore.Create(context.Background(), folder.CreateFolderCommand{ | 
					
						
							| 
									
										
										
										
											2022-12-08 21:49:17 +08:00
										 |  |  | 			Title:       folderTitle, | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 			OrgID:       orgID, | 
					
						
							|  |  |  | 			ParentUID:   parent.UID, | 
					
						
							| 
									
										
										
										
											2022-12-08 21:49:17 +08:00
										 |  |  | 			Description: folderDsc, | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 			UID:         uid, | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 		require.NoError(t, err) | 
					
						
							|  |  |  | 		t.Cleanup(func() { | 
					
						
							|  |  |  | 			err := folderStore.Delete(context.Background(), f.UID, orgID) | 
					
						
							|  |  |  | 			require.NoError(t, err) | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-08 21:49:17 +08:00
										 |  |  | 		assert.Equal(t, folderTitle, f.Title) | 
					
						
							|  |  |  | 		assert.Equal(t, folderDsc, f.Description) | 
					
						
							| 
									
										
										
										
											2024-01-12 23:43:39 +08:00
										 |  |  | 		assert.NotEmpty(t, f.UID) | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 		assert.Equal(t, uid, f.UID) | 
					
						
							|  |  |  | 		assert.Equal(t, parentUID, f.ParentUID) | 
					
						
							| 
									
										
										
										
											2023-05-10 21:20:16 +08:00
										 |  |  | 		assert.NotEmpty(t, f.URL) | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		assertAncestorUIDs(t, folderStore, f, []string{folder.GeneralFolderUID, parent.UID}) | 
					
						
							|  |  |  | 		assertChildrenUIDs(t, folderStore, parent, []string{f.UID}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		ff, err := folderStore.Get(context.Background(), folder.GetFolderQuery{ | 
					
						
							|  |  |  | 			UID:   &f.UID, | 
					
						
							|  |  |  | 			OrgID: f.OrgID, | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 		assert.NoError(t, err) | 
					
						
							| 
									
										
										
										
											2022-12-08 21:49:17 +08:00
										 |  |  | 		assert.Equal(t, folderTitle, ff.Title) | 
					
						
							|  |  |  | 		assert.Equal(t, folderDsc, ff.Description) | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 		assert.Equal(t, parentUID, ff.ParentUID) | 
					
						
							| 
									
										
										
										
											2023-05-10 21:20:16 +08:00
										 |  |  | 		assert.NotEmpty(t, ff.URL) | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 	}) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestIntegrationDelete(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2022-11-04 22:14:21 +08:00
										 |  |  | 	if testing.Short() { | 
					
						
							|  |  |  | 		t.Skip("skipping integration test") | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	db := sqlstore.InitTestDB(t) | 
					
						
							| 
									
										
										
										
											2024-01-23 00:03:30 +08:00
										 |  |  | 	folderStore := ProvideStore(db, db.Cfg) | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	orgID := CreateOrg(t, db) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* | 
					
						
							|  |  |  | 		t.Run("attempt to delete unknown folder should fail", func(t *testing.T) { | 
					
						
							|  |  |  | 			err := folderSrore.Delete(context.Background(), "unknown", orgID) | 
					
						
							|  |  |  | 			assert.Error(t, err) | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 	*/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-15 16:51:37 +08:00
										 |  |  | 	ancestorUIDs := CreateSubtree(t, folderStore, orgID, "", folder.MaxNestedFolderDepth, "") | 
					
						
							| 
									
										
										
										
											2022-11-28 23:48:44 +08:00
										 |  |  | 	require.Len(t, ancestorUIDs, folder.MaxNestedFolderDepth) | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	t.Cleanup(func() { | 
					
						
							|  |  |  | 		for _, uid := range ancestorUIDs[1:] { | 
					
						
							|  |  |  | 			err := folderStore.Delete(context.Background(), uid, orgID) | 
					
						
							|  |  |  | 			require.NoError(t, err) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* | 
					
						
							|  |  |  | 		t.Run("deleting folder with children should fail", func(t *testing.T) { | 
					
						
							|  |  |  | 			err = folderSrore.Delete(context.Background(), ancestorUIDs[2], orgID) | 
					
						
							|  |  |  | 			require.Error(t, err) | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 	*/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	t.Run("deleting a leaf folder should succeed", func(t *testing.T) { | 
					
						
							|  |  |  | 		err := folderStore.Delete(context.Background(), ancestorUIDs[len(ancestorUIDs)-1], orgID) | 
					
						
							|  |  |  | 		require.NoError(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-19 16:52:04 +08:00
										 |  |  | 		children, err := folderStore.GetChildren(context.Background(), folder.GetChildrenQuery{ | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 			UID:   ancestorUIDs[len(ancestorUIDs)-2], | 
					
						
							|  |  |  | 			OrgID: orgID, | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 		require.NoError(t, err) | 
					
						
							|  |  |  | 		assert.Len(t, children, 0) | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestIntegrationUpdate(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2022-11-04 22:14:21 +08:00
										 |  |  | 	if testing.Short() { | 
					
						
							|  |  |  | 		t.Skip("skipping integration test") | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	db := sqlstore.InitTestDB(t) | 
					
						
							| 
									
										
										
										
											2024-01-23 00:03:30 +08:00
										 |  |  | 	folderStore := ProvideStore(db, db.Cfg) | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	orgID := CreateOrg(t, db) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-04 02:24:36 +08:00
										 |  |  | 	// create parent folder
 | 
					
						
							|  |  |  | 	parent, err := folderStore.Create(context.Background(), folder.CreateFolderCommand{ | 
					
						
							|  |  |  | 		Title:       folderTitle, | 
					
						
							|  |  |  | 		Description: folderDsc, | 
					
						
							|  |  |  | 		OrgID:       orgID, | 
					
						
							|  |  |  | 		UID:         util.GenerateShortUID(), | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 	require.NoError(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// create subfolder
 | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 	f, err := folderStore.Create(context.Background(), folder.CreateFolderCommand{ | 
					
						
							| 
									
										
										
										
											2022-12-08 21:49:17 +08:00
										 |  |  | 		Title:       folderTitle, | 
					
						
							|  |  |  | 		Description: folderDsc, | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 		OrgID:       orgID, | 
					
						
							|  |  |  | 		UID:         util.GenerateShortUID(), | 
					
						
							| 
									
										
										
										
											2023-04-04 02:24:36 +08:00
										 |  |  | 		ParentUID:   parent.UID, | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 	}) | 
					
						
							| 
									
										
										
										
											2023-04-04 02:24:36 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 	require.NoError(t, err) | 
					
						
							| 
									
										
										
										
											2023-04-04 02:24:36 +08:00
										 |  |  | 	require.Equal(t, f.ParentUID, parent.UID) | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 	t.Cleanup(func() { | 
					
						
							|  |  |  | 		err := folderStore.Delete(context.Background(), f.UID, orgID) | 
					
						
							|  |  |  | 		require.NoError(t, err) | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* | 
					
						
							|  |  |  | 		t.Run("updating an unknown folder should fail", func(t *testing.T) { | 
					
						
							|  |  |  | 			newTitle := "new title" | 
					
						
							|  |  |  | 			newDesc := "new desc" | 
					
						
							|  |  |  | 			_, err := folderSrore.Update(context.Background(), &folder.UpdateFolderCommand{ | 
					
						
							|  |  |  | 				Folder:         f, | 
					
						
							|  |  |  | 				NewTitle:       &newTitle, | 
					
						
							|  |  |  | 				NewDescription: &newDesc, | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 			require.NoError(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			ff, err := folderSrore.Get(context.Background(), &folder.GetFolderQuery{ | 
					
						
							|  |  |  | 				UID: &f.UID, | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 			require.NoError(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			assert.Equal(t, origTitle, ff.Title) | 
					
						
							|  |  |  | 			assert.Equal(t, origDesc, ff.Description) | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 	*/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	t.Run("should not panic in case of bad requests", func(t *testing.T) { | 
					
						
							|  |  |  | 		_, err = folderStore.Update(context.Background(), folder.UpdateFolderCommand{}) | 
					
						
							|  |  |  | 		require.Error(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-20 21:00:33 +08:00
										 |  |  | 		_, err = folderStore.Update(context.Background(), folder.UpdateFolderCommand{}) | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 		require.Error(t, err) | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	t.Run("updating a folder should succeed", func(t *testing.T) { | 
					
						
							|  |  |  | 		newTitle := "new title" | 
					
						
							|  |  |  | 		newDesc := "new desc" | 
					
						
							| 
									
										
										
										
											2022-11-28 23:48:44 +08:00
										 |  |  | 		// existingUpdated := f.Updated
 | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 		updated, err := folderStore.Update(context.Background(), folder.UpdateFolderCommand{ | 
					
						
							| 
									
										
										
										
											2022-12-20 21:00:33 +08:00
										 |  |  | 			UID:            f.UID, | 
					
						
							|  |  |  | 			OrgID:          f.OrgID, | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 			NewTitle:       &newTitle, | 
					
						
							|  |  |  | 			NewDescription: &newDesc, | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 		require.NoError(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		assert.Equal(t, f.UID, updated.UID) | 
					
						
							|  |  |  | 		assert.Equal(t, newTitle, updated.Title) | 
					
						
							|  |  |  | 		assert.Equal(t, newDesc, updated.Description) | 
					
						
							| 
									
										
										
										
											2023-04-04 02:24:36 +08:00
										 |  |  | 		assert.Equal(t, parent.UID, updated.ParentUID) | 
					
						
							| 
									
										
										
										
											2023-05-10 21:20:16 +08:00
										 |  |  | 		assert.NotEmpty(t, updated.URL) | 
					
						
							| 
									
										
										
										
											2022-11-28 23:48:44 +08:00
										 |  |  | 		// assert.GreaterOrEqual(t, updated.Updated.UnixNano(), existingUpdated.UnixNano())
 | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		updated, err = folderStore.Get(context.Background(), folder.GetFolderQuery{ | 
					
						
							|  |  |  | 			UID:   &updated.UID, | 
					
						
							|  |  |  | 			OrgID: orgID, | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 		require.NoError(t, err) | 
					
						
							|  |  |  | 		assert.Equal(t, newTitle, updated.Title) | 
					
						
							|  |  |  | 		assert.Equal(t, newDesc, updated.Description) | 
					
						
							| 
									
										
										
										
											2023-04-04 02:24:36 +08:00
										 |  |  | 		// parent should not change
 | 
					
						
							|  |  |  | 		assert.Equal(t, parent.UID, updated.ParentUID) | 
					
						
							| 
									
										
										
										
											2023-05-10 21:20:16 +08:00
										 |  |  | 		assert.NotEmpty(t, updated.URL) | 
					
						
							| 
									
										
										
										
											2022-12-20 21:00:33 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		f = updated | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-04 02:24:36 +08:00
										 |  |  | 	t.Run("updating folder parent UID", func(t *testing.T) { | 
					
						
							|  |  |  | 		testCases := []struct { | 
					
						
							|  |  |  | 			desc                  string | 
					
						
							|  |  |  | 			reqNewParentUID       *string | 
					
						
							|  |  |  | 			expectedError         error | 
					
						
							|  |  |  | 			expectedParentUIDFunc func(existing string) string | 
					
						
							|  |  |  | 		}{ | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				desc:                  "should succeed when moving to other folder", | 
					
						
							|  |  |  | 				reqNewParentUID:       util.Pointer("new"), | 
					
						
							|  |  |  | 				expectedParentUIDFunc: func(_ string) string { return "new" }, | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				desc:                  "should succeed when moving to root folder (NewParentUID is empty)", | 
					
						
							|  |  |  | 				reqNewParentUID:       util.Pointer(""), | 
					
						
							|  |  |  | 				expectedParentUIDFunc: func(_ string) string { return "" }, | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				desc:                  "should do nothing when NewParentUID is nil", | 
					
						
							|  |  |  | 				reqNewParentUID:       nil, | 
					
						
							|  |  |  | 				expectedError:         folder.ErrBadRequest, | 
					
						
							|  |  |  | 				expectedParentUIDFunc: func(existingParentUID string) string { return existingParentUID }, | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		for _, tc := range testCases { | 
					
						
							|  |  |  | 			t.Run(tc.desc, func(t *testing.T) { | 
					
						
							|  |  |  | 				// create parent folder
 | 
					
						
							|  |  |  | 				parentUID := util.GenerateShortUID() | 
					
						
							|  |  |  | 				_, err := folderStore.Create(context.Background(), folder.CreateFolderCommand{ | 
					
						
							|  |  |  | 					Title:       "parent", | 
					
						
							|  |  |  | 					Description: "parent", | 
					
						
							|  |  |  | 					OrgID:       orgID, | 
					
						
							|  |  |  | 					UID:         parentUID, | 
					
						
							|  |  |  | 				}) | 
					
						
							|  |  |  | 				require.NoError(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				// create subfolder
 | 
					
						
							|  |  |  | 				UID := util.GenerateShortUID() | 
					
						
							|  |  |  | 				f, err = folderStore.Create(context.Background(), folder.CreateFolderCommand{ | 
					
						
							|  |  |  | 					Title:       "subfolder", | 
					
						
							|  |  |  | 					Description: "subfolder", | 
					
						
							|  |  |  | 					OrgID:       orgID, | 
					
						
							|  |  |  | 					UID:         UID, | 
					
						
							|  |  |  | 					ParentUID:   parentUID, | 
					
						
							|  |  |  | 				}) | 
					
						
							|  |  |  | 				require.NoError(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				existingTitle := f.Title | 
					
						
							|  |  |  | 				existingDesc := f.Description | 
					
						
							|  |  |  | 				existingUID := f.UID | 
					
						
							|  |  |  | 				updated, err := folderStore.Update(context.Background(), folder.UpdateFolderCommand{ | 
					
						
							|  |  |  | 					UID:          f.UID, | 
					
						
							|  |  |  | 					OrgID:        f.OrgID, | 
					
						
							|  |  |  | 					NewParentUID: tc.reqNewParentUID, | 
					
						
							|  |  |  | 				}) | 
					
						
							|  |  |  | 				if tc.expectedError == nil { | 
					
						
							|  |  |  | 					require.NoError(t, err) | 
					
						
							|  |  |  | 					assert.Equal(t, tc.expectedParentUIDFunc(parentUID), updated.ParentUID) | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					assert.ErrorIs(t, err, tc.expectedError) | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				updated, err = folderStore.Get(context.Background(), folder.GetFolderQuery{ | 
					
						
							|  |  |  | 					UID:   &f.UID, | 
					
						
							|  |  |  | 					OrgID: orgID, | 
					
						
							|  |  |  | 				}) | 
					
						
							|  |  |  | 				require.NoError(t, err) | 
					
						
							|  |  |  | 				assert.Equal(t, tc.expectedParentUIDFunc(parentUID), updated.ParentUID) | 
					
						
							|  |  |  | 				assert.Equal(t, existingTitle, updated.Title) | 
					
						
							|  |  |  | 				assert.Equal(t, existingDesc, updated.Description) | 
					
						
							|  |  |  | 				assert.Equal(t, existingUID, updated.UID) | 
					
						
							| 
									
										
										
										
											2023-05-10 21:20:16 +08:00
										 |  |  | 				assert.NotEmpty(t, updated.URL) | 
					
						
							| 
									
										
										
										
											2023-04-04 02:24:36 +08:00
										 |  |  | 			}) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}) | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestIntegrationGet(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2022-11-04 22:14:21 +08:00
										 |  |  | 	if testing.Short() { | 
					
						
							|  |  |  | 		t.Skip("skipping integration test") | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	db := sqlstore.InitTestDB(t) | 
					
						
							| 
									
										
										
										
											2024-01-23 00:03:30 +08:00
										 |  |  | 	folderStore := ProvideStore(db, db.Cfg) | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	orgID := CreateOrg(t, db) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// create folder
 | 
					
						
							|  |  |  | 	uid1 := util.GenerateShortUID() | 
					
						
							|  |  |  | 	f, err := folderStore.Create(context.Background(), folder.CreateFolderCommand{ | 
					
						
							| 
									
										
										
										
											2022-12-08 21:49:17 +08:00
										 |  |  | 		Title:       folderTitle, | 
					
						
							|  |  |  | 		Description: folderDsc, | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 		OrgID:       orgID, | 
					
						
							|  |  |  | 		UID:         uid1, | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 	require.NoError(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	t.Cleanup(func() { | 
					
						
							|  |  |  | 		err := folderStore.Delete(context.Background(), f.UID, orgID) | 
					
						
							|  |  |  | 		require.NoError(t, err) | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	t.Run("should gently fail in case of bad request", func(t *testing.T) { | 
					
						
							|  |  |  | 		_, err = folderStore.Get(context.Background(), folder.GetFolderQuery{}) | 
					
						
							|  |  |  | 		require.Error(t, err) | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	t.Run("get folder by UID should succeed", func(t *testing.T) { | 
					
						
							|  |  |  | 		ff, err := folderStore.Get(context.Background(), folder.GetFolderQuery{ | 
					
						
							|  |  |  | 			UID:   &f.UID, | 
					
						
							|  |  |  | 			OrgID: orgID, | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 		require.NoError(t, err) | 
					
						
							|  |  |  | 		assert.Equal(t, f.UID, ff.UID) | 
					
						
							|  |  |  | 		assert.Equal(t, f.OrgID, ff.OrgID) | 
					
						
							|  |  |  | 		assert.Equal(t, f.Title, ff.Title) | 
					
						
							|  |  |  | 		assert.Equal(t, f.Description, ff.Description) | 
					
						
							| 
									
										
										
										
											2023-10-12 23:31:49 +08:00
										 |  |  | 		//assert.Equal(t, folder.GeneralFolderUID, ff.ParentUID)
 | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 		assert.NotEmpty(t, ff.Created) | 
					
						
							|  |  |  | 		assert.NotEmpty(t, ff.Updated) | 
					
						
							| 
									
										
										
										
											2023-05-10 21:20:16 +08:00
										 |  |  | 		assert.NotEmpty(t, ff.URL) | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-12 23:31:49 +08:00
										 |  |  | 	t.Run("get folder by title should succeed", func(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 		ff, err := folderStore.Get(context.Background(), folder.GetFolderQuery{ | 
					
						
							| 
									
										
										
										
											2023-10-12 23:31:49 +08:00
										 |  |  | 			Title: &f.Title, | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 			OrgID: orgID, | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 		require.NoError(t, err) | 
					
						
							|  |  |  | 		assert.Equal(t, f.UID, ff.UID) | 
					
						
							|  |  |  | 		assert.Equal(t, f.OrgID, ff.OrgID) | 
					
						
							|  |  |  | 		assert.Equal(t, f.Title, ff.Title) | 
					
						
							|  |  |  | 		assert.Equal(t, f.Description, ff.Description) | 
					
						
							| 
									
										
										
										
											2023-10-12 23:31:49 +08:00
										 |  |  | 		//assert.Equal(t, folder.GeneralFolderUID, ff.ParentUID)
 | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 		assert.NotEmpty(t, ff.Created) | 
					
						
							|  |  |  | 		assert.NotEmpty(t, ff.Updated) | 
					
						
							| 
									
										
										
										
											2023-05-10 21:20:16 +08:00
										 |  |  | 		assert.NotEmpty(t, ff.URL) | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-12 23:31:49 +08:00
										 |  |  | 	t.Run("get folder by title should succeed", func(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 		ff, err := folderStore.Get(context.Background(), folder.GetFolderQuery{ | 
					
						
							| 
									
										
										
										
											2024-01-12 23:43:39 +08:00
										 |  |  | 			UID:   &f.UID, | 
					
						
							|  |  |  | 			OrgID: orgID, | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 		}) | 
					
						
							|  |  |  | 		require.NoError(t, err) | 
					
						
							|  |  |  | 		assert.Equal(t, f.UID, ff.UID) | 
					
						
							|  |  |  | 		assert.Equal(t, f.OrgID, ff.OrgID) | 
					
						
							|  |  |  | 		assert.Equal(t, f.Title, ff.Title) | 
					
						
							|  |  |  | 		assert.Equal(t, f.Description, ff.Description) | 
					
						
							| 
									
										
										
										
											2023-10-12 23:31:49 +08:00
										 |  |  | 		//assert.Equal(t, folder.GeneralFolderUID, ff.ParentUID)
 | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 		assert.NotEmpty(t, ff.Created) | 
					
						
							|  |  |  | 		assert.NotEmpty(t, ff.Updated) | 
					
						
							| 
									
										
										
										
											2023-05-10 21:20:16 +08:00
										 |  |  | 		assert.NotEmpty(t, ff.URL) | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 	}) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestIntegrationGetParents(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2022-11-04 22:14:21 +08:00
										 |  |  | 	if testing.Short() { | 
					
						
							|  |  |  | 		t.Skip("skipping integration test") | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	db := sqlstore.InitTestDB(t) | 
					
						
							| 
									
										
										
										
											2024-01-23 00:03:30 +08:00
										 |  |  | 	folderStore := ProvideStore(db, db.Cfg) | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	orgID := CreateOrg(t, db) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// create folder
 | 
					
						
							|  |  |  | 	uid1 := util.GenerateShortUID() | 
					
						
							|  |  |  | 	f, err := folderStore.Create(context.Background(), folder.CreateFolderCommand{ | 
					
						
							| 
									
										
										
										
											2022-12-08 21:49:17 +08:00
										 |  |  | 		Title:       folderTitle, | 
					
						
							|  |  |  | 		Description: folderDsc, | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 		OrgID:       orgID, | 
					
						
							|  |  |  | 		UID:         uid1, | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 	require.NoError(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	t.Cleanup(func() { | 
					
						
							|  |  |  | 		err := folderStore.Delete(context.Background(), f.UID, orgID) | 
					
						
							|  |  |  | 		require.NoError(t, err) | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-04 02:24:36 +08:00
										 |  |  | 	t.Run("get parents of root folder should be empty", func(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2023-03-30 16:46:11 +08:00
										 |  |  | 		parents, err := folderStore.GetParents(context.Background(), folder.GetParentsQuery{}) | 
					
						
							|  |  |  | 		require.NoError(t, err) | 
					
						
							|  |  |  | 		require.Empty(t, parents) | 
					
						
							| 
									
										
										
										
											2022-11-25 02:28:53 +08:00
										 |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 	t.Run("get parents of 1-st level folder should be empty", func(t *testing.T) { | 
					
						
							|  |  |  | 		parents, err := folderStore.GetParents(context.Background(), folder.GetParentsQuery{ | 
					
						
							|  |  |  | 			UID:   f.UID, | 
					
						
							|  |  |  | 			OrgID: orgID, | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 		require.NoError(t, err) | 
					
						
							|  |  |  | 		require.Empty(t, parents) | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	t.Run("get parents of 2-st level folder should not be empty", func(t *testing.T) { | 
					
						
							|  |  |  | 		title2 := "folder2" | 
					
						
							|  |  |  | 		desc2 := "folder2 desc" | 
					
						
							|  |  |  | 		uid2 := util.GenerateShortUID() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		f, err := folderStore.Create(context.Background(), folder.CreateFolderCommand{ | 
					
						
							|  |  |  | 			Title:       title2, | 
					
						
							|  |  |  | 			Description: desc2, | 
					
						
							|  |  |  | 			OrgID:       orgID, | 
					
						
							|  |  |  | 			UID:         uid2, | 
					
						
							|  |  |  | 			ParentUID:   f.UID, | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 		require.NoError(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		parents, err := folderStore.GetParents(context.Background(), folder.GetParentsQuery{ | 
					
						
							|  |  |  | 			UID:   f.UID, | 
					
						
							|  |  |  | 			OrgID: orgID, | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 		require.NoError(t, err) | 
					
						
							|  |  |  | 		parentUIDs := make([]string, 0) | 
					
						
							|  |  |  | 		for _, p := range parents { | 
					
						
							| 
									
										
										
										
											2023-05-10 21:20:16 +08:00
										 |  |  | 			assert.NotEmpty(t, p.URL) | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 			parentUIDs = append(parentUIDs, p.UID) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		require.Equal(t, []string{uid1}, parentUIDs) | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestIntegrationGetChildren(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2022-11-04 22:14:21 +08:00
										 |  |  | 	if testing.Short() { | 
					
						
							|  |  |  | 		t.Skip("skipping integration test") | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	db := sqlstore.InitTestDB(t) | 
					
						
							| 
									
										
										
										
											2024-01-23 00:03:30 +08:00
										 |  |  | 	folderStore := ProvideStore(db, db.Cfg) | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	orgID := CreateOrg(t, db) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// create folder
 | 
					
						
							|  |  |  | 	uid1 := util.GenerateShortUID() | 
					
						
							|  |  |  | 	parent, err := folderStore.Create(context.Background(), folder.CreateFolderCommand{ | 
					
						
							| 
									
										
										
										
											2022-12-08 21:49:17 +08:00
										 |  |  | 		Title:       folderTitle, | 
					
						
							|  |  |  | 		Description: folderDsc, | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 		OrgID:       orgID, | 
					
						
							|  |  |  | 		UID:         uid1, | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 	require.NoError(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-19 16:52:04 +08:00
										 |  |  | 	treeLeaves := CreateLeaves(t, folderStore, parent, 8) | 
					
						
							| 
									
										
										
										
											2023-04-27 22:24:47 +08:00
										 |  |  | 	sort.Strings(treeLeaves) | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	t.Cleanup(func() { | 
					
						
							|  |  |  | 		for _, uid := range treeLeaves { | 
					
						
							|  |  |  | 			err := folderStore.Delete(context.Background(), uid, orgID) | 
					
						
							|  |  |  | 			require.NoError(t, err) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* | 
					
						
							|  |  |  | 		t.Run("should gently fail in case of bad request", func(t *testing.T) { | 
					
						
							|  |  |  | 			_, err := folderStore.GetChildren(context.Background(), folder.GetTreeQuery{}) | 
					
						
							|  |  |  | 			require.Error(t, err) | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 	*/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	t.Run("should successfully get all children", func(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2022-12-19 16:52:04 +08:00
										 |  |  | 		children, err := folderStore.GetChildren(context.Background(), folder.GetChildrenQuery{ | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 			UID:   parent.UID, | 
					
						
							|  |  |  | 			OrgID: orgID, | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 		require.NoError(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		childrenUIDs := make([]string, 0, len(children)) | 
					
						
							|  |  |  | 		for _, c := range children { | 
					
						
							| 
									
										
										
										
											2023-05-10 21:20:16 +08:00
										 |  |  | 			assert.NotEmpty(t, c.URL) | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 			childrenUIDs = append(childrenUIDs, c.UID) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if diff := cmp.Diff(treeLeaves, childrenUIDs); diff != "" { | 
					
						
							|  |  |  | 			t.Errorf("Result mismatch (-want +got):\n%s", diff) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-19 16:52:04 +08:00
										 |  |  | 	t.Run("should default to general folder if UID is missing", func(t *testing.T) { | 
					
						
							|  |  |  | 		children, err := folderStore.GetChildren(context.Background(), folder.GetChildrenQuery{ | 
					
						
							|  |  |  | 			OrgID: orgID, | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 		require.NoError(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		childrenUIDs := make([]string, 0, len(children)) | 
					
						
							|  |  |  | 		for _, c := range children { | 
					
						
							| 
									
										
										
										
											2023-05-10 21:20:16 +08:00
										 |  |  | 			assert.NotEmpty(t, c.URL) | 
					
						
							| 
									
										
										
										
											2022-12-19 16:52:04 +08:00
										 |  |  | 			childrenUIDs = append(childrenUIDs, c.UID) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		assert.Equal(t, []string{parent.UID}, childrenUIDs) | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 	t.Run("query with pagination should work as expected", func(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2022-12-19 16:52:04 +08:00
										 |  |  | 		children, err := folderStore.GetChildren(context.Background(), folder.GetChildrenQuery{ | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 			UID:   parent.UID, | 
					
						
							|  |  |  | 			OrgID: orgID, | 
					
						
							| 
									
										
										
										
											2022-12-19 16:52:04 +08:00
										 |  |  | 			Limit: 2, | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 		}) | 
					
						
							|  |  |  | 		require.NoError(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		childrenUIDs := make([]string, 0, len(children)) | 
					
						
							|  |  |  | 		for _, c := range children { | 
					
						
							|  |  |  | 			childrenUIDs = append(childrenUIDs, c.UID) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-19 16:52:04 +08:00
										 |  |  | 		if diff := cmp.Diff(treeLeaves[:2], childrenUIDs); diff != "" { | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 			t.Errorf("Result mismatch (-want +got):\n%s", diff) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-19 16:52:04 +08:00
										 |  |  | 		children, err = folderStore.GetChildren(context.Background(), folder.GetChildrenQuery{ | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 			UID:   parent.UID, | 
					
						
							|  |  |  | 			OrgID: orgID, | 
					
						
							| 
									
										
										
										
											2022-12-19 16:52:04 +08:00
										 |  |  | 			Limit: 2, | 
					
						
							|  |  |  | 			Page:  1, | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 		require.NoError(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		childrenUIDs = make([]string, 0, len(children)) | 
					
						
							|  |  |  | 		for _, c := range children { | 
					
						
							| 
									
										
										
										
											2023-05-10 21:20:16 +08:00
										 |  |  | 			assert.NotEmpty(t, c.URL) | 
					
						
							| 
									
										
										
										
											2022-12-19 16:52:04 +08:00
										 |  |  | 			childrenUIDs = append(childrenUIDs, c.UID) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if diff := cmp.Diff(treeLeaves[:2], childrenUIDs); diff != "" { | 
					
						
							|  |  |  | 			t.Errorf("Result mismatch (-want +got):\n%s", diff) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		children, err = folderStore.GetChildren(context.Background(), folder.GetChildrenQuery{ | 
					
						
							|  |  |  | 			UID:   parent.UID, | 
					
						
							|  |  |  | 			OrgID: orgID, | 
					
						
							|  |  |  | 			Limit: 2, | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 			Page:  2, | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 		require.NoError(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		childrenUIDs = make([]string, 0, len(children)) | 
					
						
							|  |  |  | 		for _, c := range children { | 
					
						
							| 
									
										
										
										
											2023-05-10 21:20:16 +08:00
										 |  |  | 			assert.NotEmpty(t, c.URL) | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 			childrenUIDs = append(childrenUIDs, c.UID) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-19 16:52:04 +08:00
										 |  |  | 		if diff := cmp.Diff(treeLeaves[2:4], childrenUIDs); diff != "" { | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 			t.Errorf("Result mismatch (-want +got):\n%s", diff) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-16 01:34:08 +08:00
										 |  |  | 		// fetch folder with specific UIDs and pagination
 | 
					
						
							|  |  |  | 		children, err = folderStore.GetChildren(context.Background(), folder.GetChildrenQuery{ | 
					
						
							|  |  |  | 			UID:        parent.UID, | 
					
						
							|  |  |  | 			OrgID:      orgID, | 
					
						
							|  |  |  | 			Limit:      2, | 
					
						
							|  |  |  | 			Page:       1, | 
					
						
							|  |  |  | 			FolderUIDs: treeLeaves[3:4], | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 		require.NoError(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		childrenUIDs = make([]string, 0, len(children)) | 
					
						
							|  |  |  | 		for _, c := range children { | 
					
						
							|  |  |  | 			assert.NotEmpty(t, c.URL) | 
					
						
							|  |  |  | 			childrenUIDs = append(childrenUIDs, c.UID) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if diff := cmp.Diff(treeLeaves[3:4], childrenUIDs); diff != "" { | 
					
						
							|  |  |  | 			t.Errorf("Result mismatch (-want +got):\n%s", diff) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 		// no page is set
 | 
					
						
							| 
									
										
										
										
											2022-12-19 16:52:04 +08:00
										 |  |  | 		children, err = folderStore.GetChildren(context.Background(), folder.GetChildrenQuery{ | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 			UID:   parent.UID, | 
					
						
							|  |  |  | 			OrgID: orgID, | 
					
						
							|  |  |  | 			Limit: 1, | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 		require.NoError(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		childrenUIDs = make([]string, 0, len(children)) | 
					
						
							|  |  |  | 		for _, c := range children { | 
					
						
							| 
									
										
										
										
											2023-05-10 21:20:16 +08:00
										 |  |  | 			assert.NotEmpty(t, c.URL) | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 			childrenUIDs = append(childrenUIDs, c.UID) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-19 16:52:04 +08:00
										 |  |  | 		if diff := cmp.Diff(treeLeaves[:1], childrenUIDs); diff != "" { | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 			t.Errorf("Result mismatch (-want +got):\n%s", diff) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// page is set but limit is not set, it should return them all
 | 
					
						
							| 
									
										
										
										
											2022-12-19 16:52:04 +08:00
										 |  |  | 		children, err = folderStore.GetChildren(context.Background(), folder.GetChildrenQuery{ | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 			UID:   parent.UID, | 
					
						
							|  |  |  | 			OrgID: orgID, | 
					
						
							|  |  |  | 			Page:  1, | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 		require.NoError(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		childrenUIDs = make([]string, 0, len(children)) | 
					
						
							|  |  |  | 		for _, c := range children { | 
					
						
							| 
									
										
										
										
											2023-05-10 21:20:16 +08:00
										 |  |  | 			assert.NotEmpty(t, c.URL) | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 			childrenUIDs = append(childrenUIDs, c.UID) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if diff := cmp.Diff(treeLeaves, childrenUIDs); diff != "" { | 
					
						
							|  |  |  | 			t.Errorf("Result mismatch (-want +got):\n%s", diff) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-08 21:49:17 +08:00
										 |  |  | func TestIntegrationGetHeight(t *testing.T) { | 
					
						
							|  |  |  | 	if testing.Short() { | 
					
						
							|  |  |  | 		t.Skip("skipping integration test") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	db := sqlstore.InitTestDB(t) | 
					
						
							| 
									
										
										
										
											2024-01-23 00:03:30 +08:00
										 |  |  | 	folderStore := ProvideStore(db, db.Cfg) | 
					
						
							| 
									
										
										
										
											2022-12-08 21:49:17 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	orgID := CreateOrg(t, db) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// create folder
 | 
					
						
							|  |  |  | 	uid1 := util.GenerateShortUID() | 
					
						
							|  |  |  | 	parent, err := folderStore.Create(context.Background(), folder.CreateFolderCommand{ | 
					
						
							|  |  |  | 		Title:       folderTitle, | 
					
						
							|  |  |  | 		Description: folderDsc, | 
					
						
							|  |  |  | 		OrgID:       orgID, | 
					
						
							|  |  |  | 		UID:         uid1, | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 	require.NoError(t, err) | 
					
						
							| 
									
										
										
										
											2023-03-15 16:51:37 +08:00
										 |  |  | 	subTree := CreateSubtree(t, folderStore, orgID, parent.UID, 4, "sub") | 
					
						
							| 
									
										
										
										
											2022-12-08 21:49:17 +08:00
										 |  |  | 	t.Run("should successfully get height", func(t *testing.T) { | 
					
						
							|  |  |  | 		height, err := folderStore.GetHeight(context.Background(), parent.UID, orgID, nil) | 
					
						
							|  |  |  | 		require.NoError(t, err) | 
					
						
							|  |  |  | 		require.Equal(t, 4, height) | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	t.Run("should failed when the parent folder exist in the subtree", func(t *testing.T) { | 
					
						
							|  |  |  | 		_, err = folderStore.GetHeight(context.Background(), parent.UID, orgID, &subTree[0]) | 
					
						
							|  |  |  | 		require.Error(t, err, folder.ErrCircularReference) | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-08 22:28:49 +08:00
										 |  |  | func TestIntegrationGetFolders(t *testing.T) { | 
					
						
							|  |  |  | 	if testing.Short() { | 
					
						
							|  |  |  | 		t.Skip("skipping integration test") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	foldersNum := 10 | 
					
						
							|  |  |  | 	db := sqlstore.InitTestDB(t) | 
					
						
							| 
									
										
										
										
											2024-01-23 00:03:30 +08:00
										 |  |  | 	folderStore := ProvideStore(db, db.Cfg) | 
					
						
							| 
									
										
										
										
											2023-11-08 22:28:49 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	orgID := CreateOrg(t, db) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// create folders
 | 
					
						
							|  |  |  | 	uids := make([]string, 0) | 
					
						
							|  |  |  | 	folders := make([]*folder.Folder, 0) | 
					
						
							|  |  |  | 	for i := 0; i < foldersNum; i++ { | 
					
						
							|  |  |  | 		uid := util.GenerateShortUID() | 
					
						
							|  |  |  | 		f, err := folderStore.Create(context.Background(), folder.CreateFolderCommand{ | 
					
						
							|  |  |  | 			Title:       folderTitle, | 
					
						
							|  |  |  | 			Description: folderDsc, | 
					
						
							|  |  |  | 			OrgID:       orgID, | 
					
						
							|  |  |  | 			UID:         uid, | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 		require.NoError(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		uids = append(uids, uid) | 
					
						
							|  |  |  | 		folders = append(folders, f) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	t.Cleanup(func() { | 
					
						
							|  |  |  | 		for _, uid := range uids { | 
					
						
							|  |  |  | 			err := folderStore.Delete(context.Background(), uid, orgID) | 
					
						
							|  |  |  | 			require.NoError(t, err) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	t.Run("get folders by UIDs should succeed", func(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2024-01-25 15:27:13 +08:00
										 |  |  | 		actualFolders, err := folderStore.GetFolders(context.Background(), NewGetFoldersQuery(folder.GetFoldersQuery{OrgID: orgID, UIDs: uids[1:]})) | 
					
						
							| 
									
										
										
										
											2023-11-08 22:28:49 +08:00
										 |  |  | 		require.NoError(t, err) | 
					
						
							| 
									
										
										
										
											2024-01-25 15:27:13 +08:00
										 |  |  | 		assert.Equal(t, len(uids[1:]), len(actualFolders)) | 
					
						
							|  |  |  | 		for _, f := range folders[1:] { | 
					
						
							|  |  |  | 			folderInResponseIdx := slices.IndexFunc(actualFolders, func(rf *folder.Folder) bool { | 
					
						
							| 
									
										
										
										
											2023-11-08 22:28:49 +08:00
										 |  |  | 				return rf.UID == f.UID | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 			assert.NotEqual(t, -1, folderInResponseIdx) | 
					
						
							| 
									
										
										
										
											2024-01-25 15:27:13 +08:00
										 |  |  | 			actualFolder := actualFolders[folderInResponseIdx] | 
					
						
							|  |  |  | 			assert.Equal(t, f.UID, actualFolder.UID) | 
					
						
							|  |  |  | 			assert.Equal(t, f.OrgID, actualFolder.OrgID) | 
					
						
							|  |  |  | 			assert.Equal(t, f.Title, actualFolder.Title) | 
					
						
							|  |  |  | 			assert.Equal(t, f.Description, actualFolder.Description) | 
					
						
							|  |  |  | 			assert.NotEmpty(t, actualFolder.Created) | 
					
						
							|  |  |  | 			assert.NotEmpty(t, actualFolder.Updated) | 
					
						
							|  |  |  | 			assert.NotEmpty(t, actualFolder.URL) | 
					
						
							| 
									
										
										
										
											2023-11-08 22:28:49 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	}) | 
					
						
							| 
									
										
										
										
											2024-01-25 15:27:13 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	t.Run("get folders by UIDs batching should work as expected", func(t *testing.T) { | 
					
						
							|  |  |  | 		q := NewGetFoldersQuery(folder.GetFoldersQuery{OrgID: orgID, UIDs: uids[1:], BatchSize: 3}) | 
					
						
							|  |  |  | 		actualFolders, err := folderStore.GetFolders(context.Background(), q) | 
					
						
							|  |  |  | 		require.NoError(t, err) | 
					
						
							|  |  |  | 		assert.Equal(t, len(uids[1:]), len(actualFolders)) | 
					
						
							|  |  |  | 		for _, f := range folders[1:] { | 
					
						
							|  |  |  | 			folderInResponseIdx := slices.IndexFunc(actualFolders, func(rf *folder.Folder) bool { | 
					
						
							|  |  |  | 				return rf.UID == f.UID | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 			assert.NotEqual(t, -1, folderInResponseIdx) | 
					
						
							|  |  |  | 			actualFolder := actualFolders[folderInResponseIdx] | 
					
						
							|  |  |  | 			assert.Equal(t, f.UID, actualFolder.UID) | 
					
						
							|  |  |  | 			assert.Equal(t, f.OrgID, actualFolder.OrgID) | 
					
						
							|  |  |  | 			assert.Equal(t, f.Title, actualFolder.Title) | 
					
						
							|  |  |  | 			assert.Equal(t, f.Description, actualFolder.Description) | 
					
						
							|  |  |  | 			assert.NotEmpty(t, actualFolder.Created) | 
					
						
							|  |  |  | 			assert.NotEmpty(t, actualFolder.Updated) | 
					
						
							|  |  |  | 			assert.NotEmpty(t, actualFolder.URL) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	t.Run("get folders by UIDs with fullpath should succeed", func(t *testing.T) { | 
					
						
							|  |  |  | 		q := NewGetFoldersQuery(folder.GetFoldersQuery{OrgID: orgID, UIDs: uids[1:], WithFullpath: true}) | 
					
						
							|  |  |  | 		q.BatchSize = 3 | 
					
						
							|  |  |  | 		actualFolders, err := folderStore.GetFolders(context.Background(), q) | 
					
						
							|  |  |  | 		require.NoError(t, err) | 
					
						
							|  |  |  | 		assert.Equal(t, len(uids[1:]), len(actualFolders)) | 
					
						
							|  |  |  | 		for _, f := range folders[1:] { | 
					
						
							|  |  |  | 			folderInResponseIdx := slices.IndexFunc(actualFolders, func(rf *folder.Folder) bool { | 
					
						
							|  |  |  | 				return rf.UID == f.UID | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 			assert.NotEqual(t, -1, folderInResponseIdx) | 
					
						
							|  |  |  | 			actualFolder := actualFolders[folderInResponseIdx] | 
					
						
							|  |  |  | 			assert.Equal(t, f.UID, actualFolder.UID) | 
					
						
							|  |  |  | 			assert.Equal(t, f.OrgID, actualFolder.OrgID) | 
					
						
							|  |  |  | 			assert.Equal(t, f.Title, actualFolder.Title) | 
					
						
							|  |  |  | 			assert.Equal(t, f.Description, actualFolder.Description) | 
					
						
							|  |  |  | 			assert.NotEmpty(t, actualFolder.Created) | 
					
						
							|  |  |  | 			assert.NotEmpty(t, actualFolder.Updated) | 
					
						
							|  |  |  | 			assert.NotEmpty(t, actualFolder.URL) | 
					
						
							|  |  |  | 			assert.NotEmpty(t, actualFolder.Fullpath) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	t.Run("get folders by UIDs and ancestor UIDs should work as expected", func(t *testing.T) { | 
					
						
							|  |  |  | 		q := NewGetFoldersQuery(folder.GetFoldersQuery{OrgID: orgID, UIDs: uids[1:], BatchSize: 3}) | 
					
						
							|  |  |  | 		q.ancestorUIDs = make([]string, 0, int(q.BatchSize)+1) | 
					
						
							|  |  |  | 		for i := 0; i < int(q.BatchSize); i++ { | 
					
						
							|  |  |  | 			q.ancestorUIDs = append(q.ancestorUIDs, uuid.New().String()) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		q.ancestorUIDs = append(q.ancestorUIDs, folders[len(folders)-1].UID) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		actualFolders, err := folderStore.GetFolders(context.Background(), q) | 
					
						
							|  |  |  | 		require.NoError(t, err) | 
					
						
							|  |  |  | 		assert.Equal(t, 1, len(actualFolders)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		f := folders[len(folders)-1] | 
					
						
							|  |  |  | 		actualFolder := actualFolders[0] | 
					
						
							|  |  |  | 		assert.Equal(t, f.UID, actualFolder.UID) | 
					
						
							|  |  |  | 		assert.Equal(t, f.OrgID, actualFolder.OrgID) | 
					
						
							|  |  |  | 		assert.Equal(t, f.Title, actualFolder.Title) | 
					
						
							|  |  |  | 		assert.Equal(t, f.Description, actualFolder.Description) | 
					
						
							|  |  |  | 		assert.NotEmpty(t, actualFolder.Created) | 
					
						
							|  |  |  | 		assert.NotEmpty(t, actualFolder.Updated) | 
					
						
							|  |  |  | 		assert.NotEmpty(t, actualFolder.URL) | 
					
						
							|  |  |  | 	}) | 
					
						
							| 
									
										
										
										
											2023-11-08 22:28:49 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | func CreateOrg(t *testing.T, db *sqlstore.SQLStore) int64 { | 
					
						
							|  |  |  | 	t.Helper() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-15 03:08:10 +08:00
										 |  |  | 	orgService, err := orgimpl.ProvideService(db, db.Cfg, quotatest.New(false, nil)) | 
					
						
							|  |  |  | 	require.NoError(t, err) | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 	orgID, err := orgService.GetOrCreate(context.Background(), "test-org") | 
					
						
							|  |  |  | 	require.NoError(t, err) | 
					
						
							|  |  |  | 	t.Cleanup(func() { | 
					
						
							|  |  |  | 		err = orgService.Delete(context.Background(), &org.DeleteOrgCommand{ID: orgID}) | 
					
						
							|  |  |  | 		require.NoError(t, err) | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return orgID | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-15 16:51:37 +08:00
										 |  |  | func CreateSubtree(t *testing.T, store *sqlStore, orgID int64, parentUID string, depth int, prefix string) []string { | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 	t.Helper() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-20 21:00:33 +08:00
										 |  |  | 	ancestorUIDs := []string{} | 
					
						
							|  |  |  | 	if parentUID != "" { | 
					
						
							|  |  |  | 		ancestorUIDs = append(ancestorUIDs, parentUID) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 	for i := 0; i < depth; i++ { | 
					
						
							|  |  |  | 		title := fmt.Sprintf("%sfolder-%d", prefix, i) | 
					
						
							| 
									
										
										
										
											2022-11-28 23:48:44 +08:00
										 |  |  | 		cmd := folder.CreateFolderCommand{ | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 			Title:     title, | 
					
						
							|  |  |  | 			OrgID:     orgID, | 
					
						
							| 
									
										
										
										
											2022-12-20 21:00:33 +08:00
										 |  |  | 			ParentUID: parentUID, | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 			UID:       util.GenerateShortUID(), | 
					
						
							| 
									
										
										
										
											2022-11-28 23:48:44 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		f, err := store.Create(context.Background(), cmd) | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 		require.NoError(t, err) | 
					
						
							|  |  |  | 		require.Equal(t, title, f.Title) | 
					
						
							|  |  |  | 		require.NotEmpty(t, f.UID) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		parents, err := store.GetParents(context.Background(), folder.GetParentsQuery{ | 
					
						
							|  |  |  | 			UID:   f.UID, | 
					
						
							|  |  |  | 			OrgID: orgID, | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 		require.NoError(t, err) | 
					
						
							| 
									
										
										
										
											2022-11-28 23:48:44 +08:00
										 |  |  | 		parentUIDs := []string{} | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 		for _, p := range parents { | 
					
						
							|  |  |  | 			parentUIDs = append(parentUIDs, p.UID) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		require.Equal(t, ancestorUIDs, parentUIDs) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		ancestorUIDs = append(ancestorUIDs, f.UID) | 
					
						
							| 
									
										
										
										
											2022-12-20 21:00:33 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		parentUID = f.UID | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return ancestorUIDs | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func CreateLeaves(t *testing.T, store *sqlStore, parent *folder.Folder, num int) []string { | 
					
						
							|  |  |  | 	t.Helper() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	leaves := make([]string, 0) | 
					
						
							|  |  |  | 	for i := 0; i < num; i++ { | 
					
						
							| 
									
										
										
										
											2023-04-27 22:24:47 +08:00
										 |  |  | 		uid := util.GenerateShortUID() | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 		f, err := store.Create(context.Background(), folder.CreateFolderCommand{ | 
					
						
							| 
									
										
										
										
											2023-04-27 22:24:47 +08:00
										 |  |  | 			Title:     fmt.Sprintf("folder-%s", uid), | 
					
						
							|  |  |  | 			UID:       uid, | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 			OrgID:     parent.OrgID, | 
					
						
							|  |  |  | 			ParentUID: parent.UID, | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 		require.NoError(t, err) | 
					
						
							|  |  |  | 		leaves = append(leaves, f.UID) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return leaves | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func assertAncestorUIDs(t *testing.T, store *sqlStore, f *folder.Folder, expected []string) { | 
					
						
							|  |  |  | 	t.Helper() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ancestors, err := store.GetParents(context.Background(), folder.GetParentsQuery{ | 
					
						
							|  |  |  | 		UID:   f.UID, | 
					
						
							|  |  |  | 		OrgID: f.OrgID, | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 	require.NoError(t, err) | 
					
						
							|  |  |  | 	actualAncestorsUIDs := []string{folder.GeneralFolderUID} | 
					
						
							|  |  |  | 	for _, f := range ancestors { | 
					
						
							|  |  |  | 		actualAncestorsUIDs = append(actualAncestorsUIDs, f.UID) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	assert.Equal(t, expected, actualAncestorsUIDs) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func assertChildrenUIDs(t *testing.T, store *sqlStore, f *folder.Folder, expected []string) { | 
					
						
							|  |  |  | 	t.Helper() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-19 16:52:04 +08:00
										 |  |  | 	ancestors, err := store.GetChildren(context.Background(), folder.GetChildrenQuery{ | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 		UID:   f.UID, | 
					
						
							|  |  |  | 		OrgID: f.OrgID, | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 	require.NoError(t, err) | 
					
						
							|  |  |  | 	actualChildrenUIDs := make([]string, 0) | 
					
						
							|  |  |  | 	for _, f := range ancestors { | 
					
						
							|  |  |  | 		actualChildrenUIDs = append(actualChildrenUIDs, f.UID) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	assert.Equal(t, expected, actualChildrenUIDs) | 
					
						
							|  |  |  | } |