JJ_MKVMaker/test/app_trash_test.dart

61 lines
3.1 KiB
Dart

import 'dart:io';
import 'package:flutter_test/flutter_test.dart';
import 'package:jj_mkvmaker/core/app_trash.dart';
import 'package:path/path.dart' as p;
/// X-plore 비교 e: Android 앱 휴지통 (저장 장치의 .jj_trash) - Windows 임시 폴더로 시험
void main() {
late Directory tmp;
late AppTrash trash;
setUp(() {
tmp = Directory.systemTemp.createTempSync('jj_trash_e_');
trash = AppTrash([p.join(tmp.path, 'vol')]);
Directory(p.join(tmp.path, 'vol', 'a', 'sub')).createSync(recursive: true);
File(p.join(tmp.path, 'vol', 'a', 'f.txt')).writeAsStringSync('hello');
File(p.join(tmp.path, 'vol', 'a', 'sub', 'g.txt')).writeAsStringSync('gg');
});
tearDown(() => tmp.deleteSync(recursive: true));
test('파일 · 폴더를 휴지통으로 (같은 저장 장치의 .jj_trash, .nomedia) → 목록 → 되살리기 (자리에 같은 이름이면 "(되살림)")', () async {
final f = p.join(tmp.path, 'vol', 'a', 'f.txt');
final sub = p.join(tmp.path, 'vol', 'a', 'sub');
final i1 = await trash.moveToTrash(f, now: DateTime(2026, 10, 1));
final i2 = await trash.moveToTrash(sub, now: DateTime(2026, 10, 2));
expect(File(f).existsSync(), isFalse);
expect(Directory(sub).existsSync(), isFalse);
expect(File(p.join(tmp.path, 'vol', trashFolderName, '.nomedia')).existsSync(), isTrue);
expect(trash.isInTrash(i1.stored), isTrue);
final list = await trash.list();
expect(list.map((x) => x.original), [sub, f], reason: '최근 것부터');
expect((list.last.size, list.first.isDir, list.first.size), (5, true, 2));
// 자리에 같은 이름이 새로 생겼으면 그것은 두고 다른 이름으로
File(f).writeAsStringSync('new');
final back = await trash.restore(list.last);
expect(p.basename(back), 'f (되살림).txt');
expect(File(back).readAsStringSync(), 'hello');
expect(File(f).readAsStringSync(), 'new');
expect(await trash.restore(i2), sub);
expect(File(p.join(sub, 'g.txt')).readAsStringSync(), 'gg');
expect(await trash.list(), isEmpty);
});
test('보관 일이 지난 것만 지운다 · 영구 삭제 · 저장 장치 밖 · 휴지통 안의 것은 다시 보내지 않음', () async {
final f = p.join(tmp.path, 'vol', 'a', 'f.txt');
final g = p.join(tmp.path, 'vol', 'a', 'sub', 'g.txt');
await trash.moveToTrash(f, now: DateTime(2026, 9, 1));
await trash.moveToTrash(g, now: DateTime(2026, 10, 15));
expect(await trash.purgeOlderThan(14, now: DateTime(2026, 10, 18)), 1);
final left = await trash.list();
expect(left.single.original, g);
await trash.purge(left.single);
expect(await trash.list(), isEmpty);
// 어느 저장 장치에도 없는 경로 → 옮기지 못함 (원래 것 그대로)
final out = File(p.join(tmp.path, 'outside.txt'))..writeAsStringSync('x');
expect(() => trash.moveToTrash(out.path), throwsA(isA<TrashMoveException>()));
expect(out.existsSync(), isTrue);
expect(trash.isInTrash(p.join(tmp.path, 'vol', trashFolderName, 'x')), isTrue);
expect(trash.isTrashRoot(p.join(tmp.path, 'vol', trashFolderName)), isTrue);
});
}