JJ_MKVMaker/integration_test/windows_cookie_shot_test.dart

86 lines
4.9 KiB
Dart
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import 'dart:io';
import 'dart:ui' as ui;
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:integration_test/integration_test.dart';
import 'package:jj_mkvmaker/app/app_controller.dart';
import 'package:jj_mkvmaker/app/i18n_controller.dart';
import 'package:jj_mkvmaker/l10n/tr.dart';
import 'package:jj_mkvmaker/platform/windows/desktop_storage_service.dart';
import 'package:jj_mkvmaker/platform/windows/process_media_tool.dart';
import 'package:jj_mkvmaker/services/platform_services.dart';
import 'package:jj_mkvmaker/ui/settings_page.dart';
import 'package:jj_mkvmaker/ui/theme.dart';
import 'package:path/path.dart' as p;
import 'support/temp_dir.dart';
/// 131 (관리자 지시 10/21): 환경 설정의 YouTube 쿠키 칸 (앱 안 브라우저 로그인 · 평문 쿠키 파일 안내 · 넘길 사이트 · [쿠키 파일 지우기]) 을
/// ko · en · ja × 412 · 960 으로 찍고, [사용 안 함] 으로 바꾸면 내보낸 쿠키 파일 (평문) 이 지워지는지 본다.
/// 사용자 데이터는 쓰지 않는다 (시험 폴더의 가짜 쿠키 파일, 설정은 메모리만). 실행: … -d windows (JJ_SHOT_DIR 에 PNG)
void main() {
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
final out = Platform.environment['JJ_SHOT_DIR'] ?? '';
for (final lang in ['ko', 'en', 'ja']) {
for (final (w, h) in [(412, 900), (960, 600)]) {
testWidgets('쿠키 칸 $lang ${w}x$h', (t) async {
t.view.physicalSize = Size(w.toDouble(), h.toDouble());
t.view.devicePixelRatio = 1;
addTearDown(t.view.reset);
await t.runAsync(() => i18n.apply(lang, save: false));
addTearDown(() => i18n.apply('ko', save: false));
final tmp = testTempDir('jj_cookieshot_');
final web = Directory(p.join(tmp.path, 'webview'))..createSync();
final cookie = File(p.join(web.path, 'cookies_youtube.txt'))..writeAsStringSync('# Netscape HTTP Cookie File\n.youtube.com\tTRUE\t/\tTRUE\t0\tSID\tfake\n');
final c = AppController(PlatformServices(mediaTool: ProcessMediaTool('x', 'y'), storage: DesktopStorageService()));
c.settings.webViewDataDir = web.path;
final shotKey = GlobalKey();
await t.pumpWidget(RepaintBoundary(
key: shotKey,
child: MaterialApp(theme: buildTheme(), debugShowCheckedModeBanner: false, home: SettingsPage(c: c)),
));
Future<void> settle([int n = 10]) async {
for (var i = 0; i < n; i++) {
await t.runAsync(() => Future<void>.delayed(const Duration(milliseconds: 60)));
await t.pump();
}
}
Future<void> shot(String name) async {
await settle(3);
expect(t.takeException(), isNull, reason: '$name 넘침');
if (out.isEmpty) return;
final b = shotKey.currentContext!.findRenderObject()! as RenderRepaintBoundary;
final img = await t.runAsync(() => b.toImage());
final bytes = await t.runAsync(() => img!.toByteData(format: ui.ImageByteFormat.png));
Directory(out).createSync(recursive: true);
File(p.join(out, 'cookie_${name}_${lang}_$w.png')).writeAsBytesSync(bytes!.buffer.asUint8List());
}
await settle(20);
// 세로로 넘기는 설정 목록에서 [쿠키 파일 지우기] (칸의 맨 아래) 가 보일 때까지
final list = find.byWidgetPredicate((x) => x is Scrollable && x.axisDirection == AxisDirection.down).first;
await t.scrollUntilVisible(find.text(tr('쿠키 파일 지우기')), 200, scrollable: list, maxScrolls: 200);
// 칸 제목이 위 묶음 바로가기 막대 아래 (화면 1/4 쯤) 에 오게 - 그래야 고르기 · 안내 · 칩 · 버튼이 함께 보인다
await t.runAsync(() => Scrollable.ensureVisible(t.element(find.text(tr('YouTube 쿠키 (로봇 확인이 나올 때)'))), alignment: 0.25));
await settle();
expect(find.text(tr('YouTube 쿠키 (로봇 확인이 나올 때)')), findsOneWidget, reason: '칸 제목도 화면 안');
expect(find.text(tr('쿠키 파일 지우기')), findsOneWidget, reason: '앱 안 브라우저 로그인 (처음 값) 이면 안내 · 지우기 버튼');
await shot('1_internal');
// [사용 안 함] 으로 바꾸면 내보낸 평문 쿠키 파일을 지운다 (131)
await t.tap(find.text(tr('앱 안 브라우저 (권장)')).first);
await settle();
await t.tap(find.text(tr('사용 안 함')).last);
await settle(15);
expect(c.settings.download.ytCookiesBrowser, '');
expect(cookie.existsSync(), isFalse, reason: '쓰지 않게 바꾸면 내보낸 쿠키 파일을 지움');
expect(find.text(tr('쿠키 파일 지우기')), findsNothing, reason: '파일이 없고 쓰지 않으면 안내도 숨김');
await shot('2_off');
});
}
}
}