JJ_MKVMaker/test/mirror_one_impl_contract_te...

50 lines
2.5 KiB
Dart

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');
});
}