JJ_MKVMaker/test/browser_modules_contract_te...

77 lines
3.2 KiB
Dart

import 'dart:io';
import 'package:flutter_test/flutter_test.dart';
import 'package:jj_mkvmaker/core/download_detect.dart' show CookieExport, CookieRecord;
import 'package:jj_mkvmaker/ui/browser/web_nav.dart';
import 'package:path/path.dart' as p;
/// 받은 조작을 적어 두는 WebNav (NavWatch 가 무엇을 그대로 넘기는지 보려고)
class _Log implements WebNav {
final calls = <String>[];
@override
Future<void> load(String url) async => calls.add('load $url');
@override
Future<void> back() async => calls.add('back');
@override
Future<void> forward() async => calls.add('forward');
@override
Future<void> reload() async => calls.add('reload');
@override
Future<void> stop() async => calls.add('stop');
@override
Future<void> exportCookies() async => calls.add('cookies');
@override
Future<void> pauseMedia() async => calls.add('pause');
@override
Future<void> runScript(String js) async => calls.add('run $js');
@override
Future<void> clearData() async => calls.add('clear');
@override
Future<Object?> evaluate(String js) async {
calls.add('eval $js');
return 7;
}
@override
Future<void> setJavaScript(bool on) async => calls.add('js $on');
}
void main() {
test('약속 NavWatch: 사용자가 옮길 때 (주소 · 뒤로 · 앞으로 · 새로고침) 만 알리고, 모든 조작은 그대로 넘긴다', () async {
final inner = _Log();
var moved = 0;
final w = NavWatch(inner, () => moved++);
await w.load('https://a.example/');
await w.back();
await w.forward();
await w.reload();
expect(moved, 4);
await w.stop();
await w.exportCookies();
await w.pauseMedia();
await w.runScript('x');
await w.clearData();
expect(await w.evaluate('y'), 7);
await w.setJavaScript(false);
expect(moved, 4, reason: '멈춤 · 쿠키 · 스크립트 등은 페이지를 옮기지 않는다');
expect(inner.calls,
['load https://a.example/', 'back', 'forward', 'reload', 'stop', 'cookies', 'pause', 'run x', 'clear', 'eval y', 'js false']);
});
test('약속 writeLoginCookies · deleteExportedCookies: cookies.txt 를 한 번에 바꿔 넣고, 지우면 임시 파일까지 없앤다', () async {
final dir = await Directory.systemTemp.createTemp('jj_cookie_');
addTearDown(() => dir.delete(recursive: true));
final file = File(p.join(dir.path, CookieExport.fileName));
await writeLoginCookies(dir.path, const []);
expect(file.existsSync(), isFalse, reason: '쿠키가 없으면 쓰지 않는다');
await writeLoginCookies('', [const CookieRecord(name: 'a', value: 'b', domain: '.youtube.com')]);
await writeLoginCookies(dir.path, [const CookieRecord(name: 'SID', value: 'v1', domain: '.youtube.com', expires: 0)]);
expect(file.readAsStringSync(), contains('SID\tv1'));
expect(File('${file.path}.tmp').existsSync(), isFalse, reason: '임시 파일은 바꿔 넣은 뒤 남지 않는다');
File('${file.path}.tmp').writeAsStringSync('half');
await deleteExportedCookies(dir.path);
expect([file.existsSync(), File('${file.path}.tmp').existsSync()], [false, false]);
await deleteExportedCookies(''); // 데이터 폴더가 없으면 아무것도 안 함
});
}