From f384c6483f0ec3b0735ae15f5b1580b07f65c486 Mon Sep 17 00:00:00 2001 From: Ming Ming Date: Sat, 27 Nov 2021 23:30:41 +0800 Subject: [PATCH] Add tests --- test/mock_type.dart | 11 +++ test/use_case/remove_album_test.dart | 140 +++++++++++++++++++++++++++ 2 files changed, 151 insertions(+) create mode 100644 test/use_case/remove_album_test.dart diff --git a/test/mock_type.dart b/test/mock_type.dart index 28718eab..362bb64f 100644 --- a/test/mock_type.dart +++ b/test/mock_type.dart @@ -189,6 +189,17 @@ class MockFileMemoryRepo extends MockFileRepo { return files.where((f) => file_util.isOrUnderDir(f, root)).toList(); } + @override + remove(Account account, File file) async { + files.removeWhere((f) { + if (file.isCollection == true) { + return file_util.isOrUnderDir(f, file); + } else { + return f.compareServerIdentity(file); + } + }); + } + final List files; var _id = 0; } diff --git a/test/use_case/remove_album_test.dart b/test/use_case/remove_album_test.dart new file mode 100644 index 00000000..ce8a2971 --- /dev/null +++ b/test/use_case/remove_album_test.dart @@ -0,0 +1,140 @@ +import 'package:event_bus/event_bus.dart'; +import 'package:idb_shim/idb.dart'; +import 'package:kiwi/kiwi.dart'; +import 'package:nc_photos/app_db.dart'; +import 'package:nc_photos/pref.dart'; +import 'package:nc_photos/use_case/remove_album.dart'; +import 'package:test/test.dart'; + +import '../mock_type.dart'; +import '../test_util.dart' as util; + +void main() { + KiwiContainer().registerInstance(MockEventBus()); + + group("RemoveAlbum", () { + test("album", _removeAlbum); + group("shared album", () { + test("file", _removeSharedAlbum); + test("file w/ share in other album", _removeSharedAlbumFileInOtherAlbum); + }); + }); +} + +/// Remove an album +/// +/// Expect: album deleted +Future _removeAlbum() async { + final account = util.buildAccount(); + final album1 = util.AlbumBuilder().build(); + final albumFile1 = album1.albumFile!; + final album2 = util.AlbumBuilder.ofId(albumId: 1).build(); + final albumFile2 = album2.albumFile!; + final appDb = MockAppDb(); + await appDb.use((db) async { + final transaction = db.transaction(AppDb.fileDbStoreName, idbModeReadWrite); + final store = transaction.objectStore(AppDb.fileDbStoreName); + await store.put(AppDbFileDbEntry.fromFile(account, albumFile1).toJson(), + AppDbFileDbEntry.toPrimaryKey(account, albumFile1)); + await store.put(AppDbFileDbEntry.fromFile(account, albumFile2).toJson(), + AppDbFileDbEntry.toPrimaryKey(account, albumFile2)); + }); + final fileRepo = MockFileMemoryRepo([albumFile1, albumFile2]); + final albumRepo = MockAlbumMemoryRepo([album1, album2]); + final shareRepo = MockShareRepo(); + + await RemoveAlbum(fileRepo, albumRepo, shareRepo, Pref())( + account, albumRepo.findAlbumByPath(albumFile1.path)); + expect(fileRepo.files, [albumFile2]); +} + +/// Remove a shared album (admin -> user1) +/// +/// Expect: album deleted; +/// share (admin -> user1) for the album json deleted; +/// share (admin -> user1) for the files deleted +Future _removeSharedAlbum() async { + final account = util.buildAccount(); + final pref = Pref.scoped(PrefMemoryProvider({ + "isLabEnableSharedAlbum": true, + })); + final files = + (util.FilesBuilder(initialFileId: 1)..addJpeg("admin/test1.jpg")).build(); + final album = (util.AlbumBuilder() + ..addFileItem(files[0]) + ..addShare("user1")) + .build(); + final albumFile = album.albumFile!; + final appDb = MockAppDb(); + await appDb.use((db) async { + final transaction = db.transaction(AppDb.fileDbStoreName, idbModeReadWrite); + final store = transaction.objectStore(AppDb.fileDbStoreName); + await store.put(AppDbFileDbEntry.fromFile(account, albumFile).toJson(), + AppDbFileDbEntry.toPrimaryKey(account, albumFile)); + await store.put(AppDbFileDbEntry.fromFile(account, files[0]).toJson(), + AppDbFileDbEntry.toPrimaryKey(account, files[0])); + }); + final fileRepo = MockFileMemoryRepo([albumFile, ...files]); + final albumRepo = MockAlbumMemoryRepo([album]); + final shareRepo = MockShareMemoryRepo([ + util.buildShare(id: "0", file: albumFile, shareWith: "user1"), + util.buildShare(id: "1", file: files[0], shareWith: "user1"), + ]); + + await RemoveAlbum(fileRepo, albumRepo, shareRepo, pref)( + account, albumRepo.findAlbumByPath(albumFile.path)); + expect(fileRepo.files, [files[0]]); + expect(shareRepo.shares, const []); +} + +/// Remove a shared album (admin -> user1) where the file is +/// also shared in other album (admin -> user1) +/// +/// Expect: album deleted; +/// share (admin -> user1) for the album json deleted; +/// share (admin -> user1) for the file unchanged +Future _removeSharedAlbumFileInOtherAlbum() async { + final account = util.buildAccount(); + final pref = Pref.scoped(PrefMemoryProvider({ + "isLabEnableSharedAlbum": true, + })); + final files = + (util.FilesBuilder(initialFileId: 1)..addJpeg("admin/test1.jpg")).build(); + final albums = [ + (util.AlbumBuilder() + ..addFileItem(files[0]) + ..addShare("user1")) + .build(), + (util.AlbumBuilder.ofId(albumId: 1) + ..addFileItem(files[0]) + ..addShare("user1")) + .build(), + ]; + final albumFiles = albums.map((e) => e.albumFile!).toList(); + final appDb = MockAppDb(); + await appDb.use((db) async { + final transaction = db.transaction(AppDb.fileDbStoreName, idbModeReadWrite); + final store = transaction.objectStore(AppDb.fileDbStoreName); + await store.put(AppDbFileDbEntry.fromFile(account, albumFiles[0]).toJson(), + AppDbFileDbEntry.toPrimaryKey(account, albumFiles[0])); + await store.put(AppDbFileDbEntry.fromFile(account, albumFiles[1]).toJson(), + AppDbFileDbEntry.toPrimaryKey(account, albumFiles[1])); + await store.put(AppDbFileDbEntry.fromFile(account, files[0]).toJson(), + AppDbFileDbEntry.toPrimaryKey(account, files[0])); + }); + final fileRepo = MockFileMemoryRepo([...albumFiles, ...files]); + final albumRepo = MockAlbumMemoryRepo(albums); + final shareRepo = MockShareMemoryRepo([ + util.buildShare(id: "0", file: albumFiles[0], shareWith: "user1"), + util.buildShare(id: "1", file: files[0], shareWith: "user1"), + util.buildShare(id: "2", file: albumFiles[1], shareWith: "user1"), + ]); + + await RemoveAlbum(fileRepo, albumRepo, shareRepo, pref)( + account, albumRepo.findAlbumByPath(albumFiles[0].path)); + expect(fileRepo.files, [albumFiles[1], files[0]]); + expect(shareRepo.shares, [ + util.buildShare(id: "1", file: files[0], shareWith: "user1"), + util.buildShare(id: "2", file: albumFiles[1], shareWith: "user1"), + ]); +}