50 lines
2.5 KiB
Dart
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');
|
|
});
|
|
}
|