import 'dart:io'; import 'package:flutter_test/flutter_test.dart'; import 'package:jj_mkvmaker/core/file_ops.dart' show FileOps; import 'package:jj_mkvmaker/core/rsync_filter.dart'; import 'package:jj_mkvmaker/core/sync_preview.dart'; import 'package:path/path.dart' as p; /// modular_sync F1 약속: 맞추기는 로컬 · 원격 모두 같은 구현 하나 (anyMirror) - 예전 로컬 맞추기는 거르기 (filter) 를 무시하고 /// 받는 쪽의 같은 이름 폴더 충돌도 몰랐다. 실제 시험 폴더 · 실제 맞추기, 실행 전 미리 보기와 같은 결과 void main() { late Directory tmp; late String s, m; setUp(() { tmp = Directory.systemTemp.createTempSync('jj_mirror1_'); s = p.join(tmp.path, 's'); m = p.join(tmp.path, 'm'); }); tearDown(() => tmp.deleteSync(recursive: true)); void mk(String path, [String text = 'x']) => File(path) ..createSync(recursive: true) ..writeAsStringSync(text); bool there(String rel) => FileSystemEntity.typeSync(p.join(m, rel)) != FileSystemEntityType.notFound; test('로컬도 거르기를 따른다: 거른 것은 보내지 않고 · 받는 쪽의 거른 것은 지우지 않음 · 나머지는 --delete 로 지움 (미리 보기와 같음)', () async { mk(p.join(s, 'keep.txt')); mk(p.join(s, 'skip.tmp')); mk(p.join(s, 'cache', 'x.txt')); mk(p.join(m, 'old.tmp')); mk(p.join(m, 'extra.txt')); final filter = RsyncFilter.parse('--exclude=*.tmp --exclude=cache/'); final preview = await previewSync(s, m, toRight: true, delete: true, filter: filter); final adds = {for (final i in preview) if (i.action == PreviewAction.add) i.rel}; final dels = {for (final i in preview) if (i.action == PreviewAction.delete) i.rel}; expect([adds, dels], [{'keep.txt'}, {'extra.txt'}]); await FileOps().mirror(s, m, delete: true, filter: filter); expect([there('keep.txt'), there('skip.tmp'), there('cache'), there('old.tmp'), there('extra.txt')], [true, false, false, true, false]); }); test('받는 쪽에 같은 이름의 폴더: 지우기 없으면 건너뛰고 알림 · 지우기 포함이면 폴더를 지우고 파일로', () async { mk(p.join(s, 'clash'), 'file'); mk(p.join(m, 'clash', 'inner.txt')); final ops = FileOps(); await ops.mirror(s, m); expect([FileSystemEntity.isDirectorySync(p.join(m, 'clash')), ops.dirConflicts], [true, [p.join(m, 'clash')]]); await FileOps().mirror(s, m, delete: true); expect(File(p.join(m, 'clash')).readAsStringSync(), 'file'); }); }