diff --git a/models/file.go b/models/file.go index f37ee11..d842e22 100644 --- a/models/file.go +++ b/models/file.go @@ -17,7 +17,6 @@ type File struct { PicInfo string FolderID uint `gorm:"index:folder_id;unique_index:idx_only_one"` PolicyID uint - Dir string `gorm:"size:65536"` // 关联模型 Policy Policy `gorm:"PRELOAD:false,association_autoupdate:false"` diff --git a/models/folder.go b/models/folder.go index 189b292..4d89cf2 100644 --- a/models/folder.go +++ b/models/folder.go @@ -11,11 +11,9 @@ import ( type Folder struct { // 表字段 gorm.Model - Name string `gorm:"unique_index:idx_only_one_name"` - ParentID uint `gorm:"index:parent_id;unique_index:idx_only_one_name"` - Position string `gorm:"size:65536"` - OwnerID uint `gorm:"index:owner_id"` - PositionAbsolute string `gorm:"size:65536"` + Name string `gorm:"unique_index:idx_only_one_name"` + ParentID uint `gorm:"index:parent_id;unique_index:idx_only_one_name"` + OwnerID uint `gorm:"index:owner_id"` // 数据库忽略字段 PositionTemp string `gorm:"-"` diff --git a/models/folder_test.go b/models/folder_test.go index cc10784..4416ad9 100644 --- a/models/folder_test.go +++ b/models/folder_test.go @@ -187,519 +187,319 @@ func TestGetFoldersByIDs(t *testing.T) { } } -//func TestFolder_MoveOrCopyFileTo(t *testing.T) { -// asserts := assert.New(t) -// // 当前目录 -// folder := Folder{ -// OwnerID: 1, -// PositionAbsolute: "/test", -// } -// // 目标目录 -// dstFolder := Folder{ -// Model: gorm.Model{ID: 10}, -// PositionAbsolute: "/dst", -// } -// -// // 复制文件 -// { -// mock.ExpectQuery("SELECT(.+)"). -// WithArgs( -// "1.txt", -// "2.txt", -// 1, -// "/test", -// ).WillReturnRows( -// sqlmock.NewRows([]string{"id", "size"}). -// AddRow(1, 10). -// AddRow(2, 20), -// ) -// mock.ExpectBegin() -// mock.ExpectExec("INSERT(.+)").WillReturnResult(sqlmock.NewResult(1, 1)) -// mock.ExpectCommit() -// mock.ExpectBegin() -// mock.ExpectExec("INSERT(.+)").WillReturnResult(sqlmock.NewResult(1, 1)) -// mock.ExpectCommit() -// storage, err := folder.MoveOrCopyFileTo( -// []string{"1.txt", "2.txt"}, -// &dstFolder, -// true, -// ) -// asserts.NoError(err) -// asserts.NoError(mock.ExpectationsWereMet()) -// asserts.Equal(uint64(30), storage) -// } -// -// // 复制文件, 检索文件出错 -// { -// mock.ExpectQuery("SELECT(.+)"). -// WithArgs( -// "1.txt", -// "2.txt", -// 1, -// "/test", -// ).WillReturnError(errors.New("error")) -// -// storage, err := folder.MoveOrCopyFileTo( -// []string{"1.txt", "2.txt"}, -// &dstFolder, -// true, -// ) -// asserts.Error(err) -// asserts.NoError(mock.ExpectationsWereMet()) -// asserts.Equal(uint64(0), storage) -// } -// -// // 复制文件,第二个文件插入出错 -// { -// mock.ExpectQuery("SELECT(.+)"). -// WithArgs( -// "1.txt", -// "2.txt", -// 1, -// "/test", -// ).WillReturnRows( -// sqlmock.NewRows([]string{"id", "size"}). -// AddRow(1, 10). -// AddRow(2, 20), -// ) -// mock.ExpectBegin() -// mock.ExpectExec("INSERT(.+)").WillReturnResult(sqlmock.NewResult(1, 1)) -// mock.ExpectCommit() -// mock.ExpectBegin() -// mock.ExpectExec("INSERT(.+)").WillReturnError(errors.New("error")) -// mock.ExpectRollback() -// storage, err := folder.MoveOrCopyFileTo( -// []string{"1.txt", "2.txt"}, -// &dstFolder, -// true, -// ) -// asserts.Error(err) -// asserts.NoError(mock.ExpectationsWereMet()) -// asserts.Equal(uint64(10), storage) -// } -// -// // 移动文件 成功 -// { -// mock.ExpectBegin() -// mock.ExpectExec("UPDATE(.+)"). -// WithArgs("/dst", 10, sqlmock.AnyArg(), "1.txt", "2.txt", 1, "/test"). -// WillReturnResult(sqlmock.NewResult(1, 2)) -// mock.ExpectCommit() -// storage, err := folder.MoveOrCopyFileTo( -// []string{"1.txt", "2.txt"}, -// &dstFolder, -// false, -// ) -// asserts.NoError(mock.ExpectationsWereMet()) -// asserts.NoError(err) -// asserts.Equal(uint64(0), storage) -// } -// -// // 移动文件 出错 -// { -// mock.ExpectBegin() -// mock.ExpectExec("UPDATE(.+)"). -// WithArgs("/dst", 10, sqlmock.AnyArg(), "1.txt", "2.txt", 1, "/test"). -// WillReturnError(errors.New("error")) -// mock.ExpectRollback() -// storage, err := folder.MoveOrCopyFileTo( -// []string{"1.txt", "2.txt"}, -// &dstFolder, -// false, -// ) -// asserts.NoError(mock.ExpectationsWereMet()) -// asserts.Error(err) -// asserts.Equal(uint64(0), storage) -// } -//} -// -//func TestFolder_MoveOrCopyFolderTo_Copy(t *testing.T) { -// conf.DatabaseConfig.Type = "mysql" -// asserts := assert.New(t) -// // 父目录 -// parFolder := Folder{ -// OwnerID: 1, -// PositionAbsolute: "/", -// } -// // 目标目录 -// dstFolder := Folder{ -// Model: gorm.Model{ID: 10}, -// PositionAbsolute: "/dst", -// } -// -// // 测试复制目录结构 -// // test(2) -// // 1(3) 2.txt -// // 3(4) 4.txt -// -// // 正常情况 成功 -// { -// // 查找所有递归子目录,包括自身 -// mock.ExpectQuery("SELECT(.+)"). -// WithArgs(1, sqlmock.AnyArg(), 1, "/test"). -// WillReturnRows( -// sqlmock.NewRows([]string{"id", "parent_id", "name", "position", "position_absolute"}). -// AddRow(3, 2, "1", "/test", "/test/1"). -// AddRow(2, 1, "test", "/", "/test"). -// AddRow(4, 3, "3", "/test/1", "/test/1/3"), -// ) -// // 查找顶级待复制目录 -// mock.ExpectQuery("SELECT(.+)"). -// WithArgs("/test", 1). -// WillReturnRows( -// sqlmock.NewRows( -// []string{"id", "parent_id", "name", "position", "position_absolute"}). -// AddRow(2, 1, "test", "/", "/test"), -// ) -// -// // 更新顶级目录 -// mock.ExpectBegin() -// mock.ExpectExec("INSERT(.+)"). -// WillReturnResult(sqlmock.NewResult(5, 1)) -// mock.ExpectCommit() -// // 更新子目录 -// mock.ExpectBegin() -// mock.ExpectExec("INSERT(.+)"). -// WillReturnResult(sqlmock.NewResult(6, 1)) -// mock.ExpectCommit() -// mock.ExpectBegin() -// mock.ExpectExec("INSERT(.+)"). -// WillReturnResult(sqlmock.NewResult(7, 1)) -// mock.ExpectCommit() -// -// // 获取子目录下的所有子文件 -// mock.ExpectQuery("SELECT(.+)"). -// WithArgs(1, 3, 2, 4). -// WillReturnRows( -// sqlmock.NewRows([]string{"id", "folder_id", "dir", "size"}). -// AddRow(1, 2, "/test", 10). -// AddRow(2, 3, "/test/1", 20), -// ) -// -// // 更新子文件记录 -// mock.ExpectBegin() -// mock.ExpectExec("INSERT(.+)").WillReturnResult(sqlmock.NewResult(1, 1)) -// mock.ExpectCommit() -// mock.ExpectBegin() -// mock.ExpectExec("INSERT(.+)").WillReturnResult(sqlmock.NewResult(1, 1)) -// mock.ExpectCommit() -// -// storage, err := parFolder.MoveFolderTo([]string{"/test"}, &dstFolder, true) -// asserts.NoError(mock.ExpectationsWereMet()) -// asserts.NoError(err) -// asserts.Equal(uint64(30), storage) -// -// } -// -// // 处理子目录时死循环避免 -// { -// // 查找所有递归子目录,包括自身 -// mock.ExpectQuery("SELECT(.+)"). -// WithArgs(1, sqlmock.AnyArg(), 1, "/test"). -// WillReturnRows( -// sqlmock.NewRows([]string{"id", "parent_id", "name", "position", "position_absolute"}). -// AddRow(3, 2, "1", "/test", "/test/1"). -// AddRow(2, 1, "test", "/", "/1"). -// AddRow(4, 3, "3", "/test/1", "/test/1/3"), -// ) -// // 查找顶级待复制目录 -// mock.ExpectQuery("SELECT(.+)"). -// WithArgs("/test", 1). -// WillReturnRows( -// sqlmock.NewRows( -// []string{"id", "parent_id", "name", "position", "position_absolute"}). -// AddRow(2, 1, "test", "/", "/test"), -// ) -// -// // 更新顶级目录 -// mock.ExpectBegin() -// mock.ExpectExec("INSERT(.+)"). -// WillReturnResult(sqlmock.NewResult(5, 1)) -// mock.ExpectCommit() -// // 更新子目录 -// mock.ExpectBegin() -// mock.ExpectExec("INSERT(.+)"). -// WillReturnResult(sqlmock.NewResult(6, 1)) -// mock.ExpectCommit() -// mock.ExpectBegin() -// mock.ExpectExec("INSERT(.+)"). -// WillReturnResult(sqlmock.NewResult(6, 1)) -// mock.ExpectCommit() -// -// storage, err := parFolder.MoveFolderTo([]string{"/test"}, &dstFolder, true) -// asserts.NoError(mock.ExpectationsWereMet()) -// asserts.Error(err) -// asserts.Equal(uint64(0), storage) -// -// } -// -// // 检索子目录出错 -// { -// // 查找所有递归子目录,包括自身 -// mock.ExpectQuery("SELECT(.+)"). -// WithArgs(1, sqlmock.AnyArg(), 1, "/test"). -// WillReturnError(errors.New("error")) -// -// storage, err := parFolder.MoveFolderTo([]string{"/test"}, &dstFolder, true) -// asserts.NoError(mock.ExpectationsWereMet()) -// asserts.Error(err) -// asserts.Equal(uint64(0), storage) -// -// } -// -// // 寻找原始目录出错 -// { -// // 查找所有递归子目录,包括自身 -// mock.ExpectQuery("SELECT(.+)"). -// WithArgs(1, sqlmock.AnyArg(), 1, "/test"). -// WillReturnRows( -// sqlmock.NewRows([]string{"id", "parent_id", "name", "position", "position_absolute"}). -// AddRow(3, 2, "1", "/test", "/test/1"). -// AddRow(2, 1, "test", "/", "/test"). -// AddRow(4, 3, "3", "/test/1", "/test/1/3"), -// ) -// // 查找顶级待复制目录 -// mock.ExpectQuery("SELECT(.+)"). -// WithArgs("/test", 1). -// WillReturnError(errors.New("error")) -// -// storage, err := parFolder.MoveFolderTo([]string{"/test"}, &dstFolder, true) -// asserts.NoError(mock.ExpectationsWereMet()) -// asserts.Error(err) -// asserts.Equal(uint64(0), storage) -// -// } -// -// // 更新顶级目录出错 -// { -// // 查找所有递归子目录,包括自身 -// mock.ExpectQuery("SELECT(.+)"). -// WithArgs(1, sqlmock.AnyArg(), 1, "/test"). -// WillReturnRows( -// sqlmock.NewRows([]string{"id", "parent_id", "name", "position", "position_absolute"}). -// AddRow(3, 2, "1", "/test", "/test/1"). -// AddRow(2, 1, "test", "/", "/test"). -// AddRow(4, 3, "3", "/test/1", "/test/1/3"), -// ) -// // 查找顶级待复制目录 -// mock.ExpectQuery("SELECT(.+)"). -// WithArgs("/test", 1). -// WillReturnRows( -// sqlmock.NewRows( -// []string{"id", "parent_id", "name", "position", "position_absolute"}). -// AddRow(2, 1, "test", "/", "/test"), -// ) -// -// // 更新顶级目录 -// mock.ExpectBegin() -// mock.ExpectExec("INSERT(.+)"). -// WillReturnError(errors.New("error")) -// mock.ExpectRollback() -// -// storage, err := parFolder.MoveFolderTo([]string{"/test"}, &dstFolder, true) -// asserts.NoError(mock.ExpectationsWereMet()) -// asserts.Error(err) -// asserts.Equal(uint64(0), storage) -// -// } -// -// // 复制子目录,一个成功一个失败 -// { -// // 查找所有递归子目录,包括自身 -// mock.ExpectQuery("SELECT(.+)"). -// WithArgs(1, sqlmock.AnyArg(), 1, "/test"). -// WillReturnRows( -// sqlmock.NewRows([]string{"id", "parent_id", "name", "position", "position_absolute"}). -// AddRow(3, 2, "1", "/test", "/test/1"). -// AddRow(2, 1, "test", "/", "/test"). -// AddRow(4, 3, "3", "/test/1", "/test/1/3"), -// ) -// // 查找顶级待复制目录 -// mock.ExpectQuery("SELECT(.+)"). -// WithArgs("/test", 1). -// WillReturnRows( -// sqlmock.NewRows( -// []string{"id", "parent_id", "name", "position", "position_absolute"}). -// AddRow(2, 1, "test", "/", "/test"), -// ) -// -// // 更新顶级目录 -// mock.ExpectBegin() -// mock.ExpectExec("INSERT(.+)"). -// WillReturnResult(sqlmock.NewResult(5, 1)) -// mock.ExpectCommit() -// // 更新子目录 -// mock.ExpectBegin() -// mock.ExpectExec("INSERT(.+)"). -// WillReturnResult(sqlmock.NewResult(6, 1)) -// mock.ExpectCommit() -// mock.ExpectBegin() -// mock.ExpectExec("INSERT(.+)"). -// WillReturnError(errors.New("error")) -// mock.ExpectRollback() -// -// storage, err := parFolder.MoveFolderTo([]string{"/test"}, &dstFolder, true) -// asserts.NoError(mock.ExpectationsWereMet()) -// asserts.Error(err) -// asserts.Equal(uint64(0), storage) -// -// } -// -// // 复制文件,一个成功一个失败 -// { -// // 查找所有递归子目录,包括自身 -// mock.ExpectQuery("SELECT(.+)"). -// WithArgs(1, sqlmock.AnyArg(), 1, "/test"). -// WillReturnRows( -// sqlmock.NewRows([]string{"id", "parent_id", "name", "position", "position_absolute"}). -// AddRow(3, 2, "1", "/test", "/test/1"). -// AddRow(2, 1, "test", "/", "/test"). -// AddRow(4, 3, "3", "/test/1", "/test/1/3"), -// ) -// // 查找顶级待复制目录 -// mock.ExpectQuery("SELECT(.+)"). -// WithArgs("/test", 1). -// WillReturnRows( -// sqlmock.NewRows( -// []string{"id", "parent_id", "name", "position", "position_absolute"}). -// AddRow(2, 1, "test", "/", "/test"), -// ) -// -// // 更新顶级目录 -// mock.ExpectBegin() -// mock.ExpectExec("INSERT(.+)"). -// WillReturnResult(sqlmock.NewResult(5, 1)) -// mock.ExpectCommit() -// // 更新子目录 -// mock.ExpectBegin() -// mock.ExpectExec("INSERT(.+)"). -// WillReturnResult(sqlmock.NewResult(6, 1)) -// mock.ExpectCommit() -// mock.ExpectBegin() -// mock.ExpectExec("INSERT(.+)"). -// WillReturnResult(sqlmock.NewResult(7, 1)) -// mock.ExpectCommit() -// -// // 获取子目录下的所有子文件 -// mock.ExpectQuery("SELECT(.+)"). -// WithArgs(1, 3, 2, 4). -// WillReturnRows( -// sqlmock.NewRows([]string{"id", "folder_id", "dir", "size"}). -// AddRow(1, 2, "/test", 10). -// AddRow(2, 3, "/test/1", 20), -// ) -// -// // 更新子文件记录 -// mock.ExpectBegin() -// mock.ExpectExec("INSERT(.+)").WillReturnResult(sqlmock.NewResult(1, 1)) -// mock.ExpectCommit() -// mock.ExpectBegin() -// mock.ExpectExec("INSERT(.+)").WillReturnError(errors.New("error")) -// mock.ExpectRollback() -// -// storage, err := parFolder.MoveFolderTo([]string{"/test"}, &dstFolder, true) -// asserts.NoError(mock.ExpectationsWereMet()) -// asserts.NoError(err) -// asserts.Equal(uint64(10), storage) -// -// } -// -//} - -//func TestFolder_MoveOrCopyFolderTo_Move(t *testing.T) { -// conf.DatabaseConfig.Type = "mysql" -// asserts := assert.New(t) -// // 父目录 -// parFolder := Folder{ -// OwnerID: 1, -// PositionAbsolute: "/", -// } -// // 目标目录 -// dstFolder := Folder{ -// Model: gorm.Model{ID: 10}, -// PositionAbsolute: "/dst", -// } -// -// // 测试复制目录结构 -// // test(2) -// // 1(3) 2.txt -// // 3(4) 4.txt -// -// // 正常情况 成功 -// { -// // 查找所有递归子目录,包括自身 -// mock.ExpectQuery("SELECT(.+)"). -// WithArgs(1, sqlmock.AnyArg(), 1, "/test"). -// WillReturnRows( -// sqlmock.NewRows([]string{"id", "parent_id", "name", "position", "position_absolute"}). -// AddRow(3, 2, "1", "/test", "/test/1"). -// AddRow(2, 1, "test", "/", "/test"). -// AddRow(4, 3, "3", "/test/1", "/test/1/3"), -// ) -// // 更改顶级要移动目录的父目录指向 -// mock.ExpectBegin() -// mock.ExpectExec("UPDATE(.+)"). -// WithArgs(10, "/dst", "/dst/", sqlmock.AnyArg(), "/test", 1). -// WillReturnResult(sqlmock.NewResult(1, 1)) -// mock.ExpectCommit() -// // 移动子目录 -// mock.ExpectBegin() -// mock.ExpectExec("UPDATE(.+)"). -// WithArgs("/dst/test", "/dst/test/1", sqlmock.AnyArg(), 3). -// WillReturnResult(sqlmock.NewResult(1, 1)) -// mock.ExpectCommit() -// mock.ExpectBegin() -// mock.ExpectExec("UPDATE(.+)"). -// WithArgs("/dst/test/1", "/dst/test/1/3", sqlmock.AnyArg(), 4). -// WillReturnResult(sqlmock.NewResult(1, 1)) -// mock.ExpectCommit() -// // 获取子文件 -// mock.ExpectQuery("SELECT(.+)"). -// WithArgs(1, 3, 2, 4). -// WillReturnRows( -// sqlmock.NewRows([]string{"id", "folder_id", "dir", "size"}). -// AddRow(1, 2, "/test", 10). -// AddRow(2, 3, "/test/1", 20), -// ) -// // 移动子文件 -// mock.ExpectBegin() -// mock.ExpectExec("UPDATE(.+)"). -// WithArgs("/dst/test", sqlmock.AnyArg(), 1). -// WillReturnResult(sqlmock.NewResult(1, 1)) -// mock.ExpectCommit() -// mock.ExpectBegin() -// mock.ExpectExec("UPDATE(.+)"). -// WithArgs("/dst/test/1", sqlmock.AnyArg(), 2). -// WillReturnResult(sqlmock.NewResult(1, 1)) -// mock.ExpectCommit() -// -// storage, err := parFolder.MoveFolderTo([]string{"/test"}, &dstFolder, false) -// asserts.NoError(mock.ExpectationsWereMet()) -// asserts.NoError(err) -// asserts.Equal(uint64(0), storage) -// } -// -// // 无法移动顶层目录 -// { -// // 查找所有递归子目录,包括自身 -// mock.ExpectQuery("SELECT(.+)"). -// WithArgs(1, sqlmock.AnyArg(), 1, "/test"). -// WillReturnRows( -// sqlmock.NewRows([]string{"id", "parent_id", "name", "position", "position_absolute"}). -// AddRow(3, 2, "1", "/test", "/test/1"). -// AddRow(2, 1, "test", "/", "/test"). -// AddRow(4, 3, "3", "/test/1", "/test/1/3"), -// ) -// // 更改顶级要移动目录的父目录指向 -// mock.ExpectBegin() -// mock.ExpectExec("UPDATE(.+)"). -// WithArgs(10, "/dst", "/dst/", sqlmock.AnyArg(), "/test", 1). -// WillReturnError(errors.New("error")) -// mock.ExpectRollback() -// -// storage, err := parFolder.MoveFolderTo([]string{"/test"}, &dstFolder, false) -// asserts.NoError(mock.ExpectationsWereMet()) -// asserts.Error(err) -// asserts.Equal(uint64(0), storage) -// } -//} +func TestFolder_MoveOrCopyFileTo(t *testing.T) { + asserts := assert.New(t) + // 当前目录 + folder := Folder{ + Model: gorm.Model{ID: 1}, + OwnerID: 1, + Name: "test", + } + // 目标目录 + dstFolder := Folder{ + Model: gorm.Model{ID: 10}, + Name: "dst", + } + + // 复制文件 + { + mock.ExpectQuery("SELECT(.+)"). + WithArgs( + 1, + 2, + 1, + 1, + ).WillReturnRows( + sqlmock.NewRows([]string{"id", "size"}). + AddRow(1, 10). + AddRow(2, 20), + ) + mock.ExpectBegin() + mock.ExpectExec("INSERT(.+)").WillReturnResult(sqlmock.NewResult(1, 1)) + mock.ExpectCommit() + mock.ExpectBegin() + mock.ExpectExec("INSERT(.+)").WillReturnResult(sqlmock.NewResult(1, 1)) + mock.ExpectCommit() + storage, err := folder.MoveOrCopyFileTo( + []uint{1, 2}, + &dstFolder, + true, + ) + asserts.NoError(err) + asserts.NoError(mock.ExpectationsWereMet()) + asserts.Equal(uint64(30), storage) + } + + // 复制文件, 检索文件出错 + { + mock.ExpectQuery("SELECT(.+)"). + WithArgs( + 1, + 2, + 1, + 1, + ).WillReturnError(errors.New("error")) + + storage, err := folder.MoveOrCopyFileTo( + []uint{1, 2}, + &dstFolder, + true, + ) + asserts.Error(err) + asserts.NoError(mock.ExpectationsWereMet()) + asserts.Equal(uint64(0), storage) + } + + // 复制文件,第二个文件插入出错 + { + mock.ExpectQuery("SELECT(.+)"). + WithArgs( + 1, + 2, + 1, + 1, + ).WillReturnRows( + sqlmock.NewRows([]string{"id", "size"}). + AddRow(1, 10). + AddRow(2, 20), + ) + mock.ExpectBegin() + mock.ExpectExec("INSERT(.+)").WillReturnResult(sqlmock.NewResult(1, 1)) + mock.ExpectCommit() + mock.ExpectBegin() + mock.ExpectExec("INSERT(.+)").WillReturnError(errors.New("error")) + mock.ExpectRollback() + storage, err := folder.MoveOrCopyFileTo( + []uint{1, 2}, + &dstFolder, + true, + ) + asserts.Error(err) + asserts.NoError(mock.ExpectationsWereMet()) + asserts.Equal(uint64(10), storage) + } + + // 移动文件 成功 + { + mock.ExpectBegin() + mock.ExpectExec("UPDATE(.+)"). + WithArgs(10, sqlmock.AnyArg(), 1, 2, 1, 1). + WillReturnResult(sqlmock.NewResult(1, 2)) + mock.ExpectCommit() + storage, err := folder.MoveOrCopyFileTo( + []uint{1, 2}, + &dstFolder, + false, + ) + asserts.NoError(mock.ExpectationsWereMet()) + asserts.NoError(err) + asserts.Equal(uint64(0), storage) + } + + // 移动文件 出错 + { + mock.ExpectBegin() + mock.ExpectExec("UPDATE(.+)"). + WithArgs(10, sqlmock.AnyArg(), 1, 2, 1, 1). + WillReturnError(errors.New("error")) + mock.ExpectRollback() + storage, err := folder.MoveOrCopyFileTo( + []uint{1, 2}, + &dstFolder, + false, + ) + asserts.NoError(mock.ExpectationsWereMet()) + asserts.Error(err) + asserts.Equal(uint64(0), storage) + } +} + +func TestFolder_CopyFolderTo(t *testing.T) { + conf.DatabaseConfig.Type = "mysql" + asserts := assert.New(t) + // 父目录 + parFolder := Folder{ + Model: gorm.Model{ID: 9}, + OwnerID: 1, + } + // 目标目录 + dstFolder := Folder{ + Model: gorm.Model{ID: 10}, + } + + // 测试复制目录结构 + // test(2)(5) + // 1(3)(6) 2.txt + // 3(4)(7) 4.txt + + // 正常情况 成功 + { + // GetRecursiveChildFolder + mock.ExpectQuery("SELECT(.+)").WithArgs(1, 2).WillReturnRows(sqlmock.NewRows([]string{"id", "parent_id"}).AddRow(2, 9)) + mock.ExpectQuery("SELECT(.+)").WithArgs(1, 2).WillReturnRows(sqlmock.NewRows([]string{"id", "parent_id"}).AddRow(3, 2)) + mock.ExpectQuery("SELECT(.+)").WithArgs(1, 3).WillReturnRows(sqlmock.NewRows([]string{"id", "parent_id"}).AddRow(4, 3)) + mock.ExpectQuery("SELECT(.+)").WithArgs(1, 4).WillReturnRows(sqlmock.NewRows([]string{"id", "parent_id"})) + + // 复制目录 + mock.ExpectBegin() + mock.ExpectExec("INSERT(.+)").WillReturnResult(sqlmock.NewResult(5, 1)) + mock.ExpectCommit() + mock.ExpectBegin() + mock.ExpectExec("INSERT(.+)").WillReturnResult(sqlmock.NewResult(6, 1)) + mock.ExpectCommit() + mock.ExpectBegin() + mock.ExpectExec("INSERT(.+)").WillReturnResult(sqlmock.NewResult(7, 1)) + mock.ExpectCommit() + + // 查找子文件 + mock.ExpectQuery("SELECT(.+)"). + WithArgs(1, 2, 3, 4). + WillReturnRows( + sqlmock.NewRows([]string{"id", "name", "folder_id", "size"}). + AddRow(1, "2.txt", 2, 10). + AddRow(2, "3.txt", 3, 20), + ) + + // 复制子文件 + mock.ExpectBegin() + mock.ExpectExec("INSERT(.+)").WillReturnResult(sqlmock.NewResult(5, 1)) + mock.ExpectCommit() + mock.ExpectBegin() + mock.ExpectExec("INSERT(.+)").WillReturnResult(sqlmock.NewResult(6, 1)) + mock.ExpectCommit() + + size, err := parFolder.CopyFolderTo(2, &dstFolder) + asserts.NoError(mock.ExpectationsWereMet()) + asserts.NoError(err) + asserts.Equal(uint64(30), size) + } + + // 递归查询失败 + { + // GetRecursiveChildFolder + mock.ExpectQuery("SELECT(.+)").WithArgs(1, 2).WillReturnError(errors.New("error")) + + size, err := parFolder.CopyFolderTo(2, &dstFolder) + asserts.NoError(mock.ExpectationsWereMet()) + asserts.Error(err) + asserts.Equal(uint64(0), size) + } + + // 父目录ID不存在 + { + // GetRecursiveChildFolder + mock.ExpectQuery("SELECT(.+)").WithArgs(1, 2).WillReturnRows(sqlmock.NewRows([]string{"id", "parent_id"}).AddRow(2, 9)) + mock.ExpectQuery("SELECT(.+)").WithArgs(1, 2).WillReturnRows(sqlmock.NewRows([]string{"id", "parent_id"}).AddRow(3, 99)) + mock.ExpectQuery("SELECT(.+)").WithArgs(1, 3).WillReturnRows(sqlmock.NewRows([]string{"id", "parent_id"}).AddRow(4, 3)) + mock.ExpectQuery("SELECT(.+)").WithArgs(1, 4).WillReturnRows(sqlmock.NewRows([]string{"id", "parent_id"})) + + // 复制目录 + mock.ExpectBegin() + mock.ExpectExec("INSERT(.+)").WillReturnResult(sqlmock.NewResult(5, 1)) + mock.ExpectCommit() + + size, err := parFolder.CopyFolderTo(2, &dstFolder) + asserts.NoError(mock.ExpectationsWereMet()) + asserts.Error(err) + asserts.Equal(uint64(0), size) + } + + // 查询子文件失败 + { + // GetRecursiveChildFolder + mock.ExpectQuery("SELECT(.+)").WithArgs(1, 2).WillReturnRows(sqlmock.NewRows([]string{"id", "parent_id"}).AddRow(2, 9)) + mock.ExpectQuery("SELECT(.+)").WithArgs(1, 2).WillReturnRows(sqlmock.NewRows([]string{"id", "parent_id"}).AddRow(3, 2)) + mock.ExpectQuery("SELECT(.+)").WithArgs(1, 3).WillReturnRows(sqlmock.NewRows([]string{"id", "parent_id"}).AddRow(4, 3)) + mock.ExpectQuery("SELECT(.+)").WithArgs(1, 4).WillReturnRows(sqlmock.NewRows([]string{"id", "parent_id"})) + + // 复制目录 + mock.ExpectBegin() + mock.ExpectExec("INSERT(.+)").WillReturnResult(sqlmock.NewResult(5, 1)) + mock.ExpectCommit() + mock.ExpectBegin() + mock.ExpectExec("INSERT(.+)").WillReturnResult(sqlmock.NewResult(6, 1)) + mock.ExpectCommit() + mock.ExpectBegin() + mock.ExpectExec("INSERT(.+)").WillReturnResult(sqlmock.NewResult(7, 1)) + mock.ExpectCommit() + + // 查找子文件 + mock.ExpectQuery("SELECT(.+)"). + WithArgs(1, 2, 3, 4). + WillReturnError(errors.New("error")) + + size, err := parFolder.CopyFolderTo(2, &dstFolder) + asserts.NoError(mock.ExpectationsWereMet()) + asserts.Error(err) + asserts.Equal(uint64(0), size) + } + + // 复制文件 一个失败 + { + // GetRecursiveChildFolder + mock.ExpectQuery("SELECT(.+)").WithArgs(1, 2).WillReturnRows(sqlmock.NewRows([]string{"id", "parent_id"}).AddRow(2, 9)) + mock.ExpectQuery("SELECT(.+)").WithArgs(1, 2).WillReturnRows(sqlmock.NewRows([]string{"id", "parent_id"}).AddRow(3, 2)) + mock.ExpectQuery("SELECT(.+)").WithArgs(1, 3).WillReturnRows(sqlmock.NewRows([]string{"id", "parent_id"}).AddRow(4, 3)) + mock.ExpectQuery("SELECT(.+)").WithArgs(1, 4).WillReturnRows(sqlmock.NewRows([]string{"id", "parent_id"})) + + // 复制目录 + mock.ExpectBegin() + mock.ExpectExec("INSERT(.+)").WillReturnResult(sqlmock.NewResult(5, 1)) + mock.ExpectCommit() + mock.ExpectBegin() + mock.ExpectExec("INSERT(.+)").WillReturnResult(sqlmock.NewResult(6, 1)) + mock.ExpectCommit() + mock.ExpectBegin() + mock.ExpectExec("INSERT(.+)").WillReturnResult(sqlmock.NewResult(7, 1)) + mock.ExpectCommit() + + // 查找子文件 + mock.ExpectQuery("SELECT(.+)"). + WithArgs(1, 2, 3, 4). + WillReturnRows( + sqlmock.NewRows([]string{"id", "name", "folder_id", "size"}). + AddRow(1, "2.txt", 2, 10). + AddRow(2, "3.txt", 3, 20), + ) + + // 复制子文件 + mock.ExpectBegin() + mock.ExpectExec("INSERT(.+)").WillReturnResult(sqlmock.NewResult(5, 1)) + mock.ExpectCommit() + mock.ExpectBegin() + mock.ExpectExec("INSERT(.+)").WillReturnError(errors.New("error")) + mock.ExpectRollback() + + size, err := parFolder.CopyFolderTo(2, &dstFolder) + asserts.NoError(mock.ExpectationsWereMet()) + asserts.Error(err) + asserts.Equal(uint64(10), size) + } + +} + +func TestFolder_MoveOrCopyFolderTo_Move(t *testing.T) { + conf.DatabaseConfig.Type = "mysql" + asserts := assert.New(t) + // 父目录 + parFolder := Folder{ + Model: gorm.Model{ID: 9}, + OwnerID: 1, + } + // 目标目录 + dstFolder := Folder{ + Model: gorm.Model{ID: 10}, + } + + // 成功 + { + mock.ExpectBegin() + mock.ExpectExec("UPDATE(.+)"). + WithArgs(10, sqlmock.AnyArg(), 1, 2, 1, 9). + WillReturnResult(sqlmock.NewResult(1, 1)) + mock.ExpectCommit() + err := parFolder.MoveFolderTo([]uint{1, 2}, &dstFolder) + asserts.NoError(mock.ExpectationsWereMet()) + asserts.NoError(err) + } +} diff --git a/pkg/filesystem/file.go b/pkg/filesystem/file.go index 962be47..43a32f9 100644 --- a/pkg/filesystem/file.go +++ b/pkg/filesystem/file.go @@ -42,7 +42,6 @@ func (fs *FileSystem) AddFile(ctx context.Context, parent *model.Folder) (*model Size: file.GetSize(), FolderID: parent.ID, PolicyID: fs.User.Policy.ID, - Dir: parent.PositionAbsolute, } _, err := newFile.Create()