85 lines
3.9 KiB
Dart
85 lines
3.9 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:jj_mkvmaker/app/app_controller.dart';
|
|
import 'package:jj_mkvmaker/app/version_snapshot.dart';
|
|
import 'package:jj_mkvmaker/core/app_update.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/update/update_install.dart';
|
|
import 'package:jj_mkvmaker/ui/update_dialog.dart';
|
|
|
|
/// 업데이트 나누기 (update_dialog 651줄 → lib/ui/update/) 의 모듈 약속 시험.
|
|
/// 확인 · 고르기 · 설치 · Android 되돌리기 흐름 전체는 update_ui_test 가 본다
|
|
void main() {
|
|
ReleaseInfo rel(String v, {bool zip = true}) => ReleaseInfo(
|
|
version: v, tag: 'v$v', name: v, notes: '', pageUrl: 'https://example.com/$v', zipUrl: zip ? 'https://example.com/$v.zip' : null);
|
|
|
|
test('update_install (단계): gbText (1GB 이상은 소수 한 자리 GB, 아래는 MB)', () {
|
|
expect(gbText(1 << 30), '1.0GB');
|
|
expect(gbText(3 * (1 << 29)), '1.5GB');
|
|
expect(gbText(5 << 20), '5MB');
|
|
expect(gbText(0), '0MB');
|
|
});
|
|
|
|
test('update_dialog (버전 고르기): 처음 고를 버전 = 이 기기용 파일이 있는 가장 새것, 없으면 지금, 그것도 없으면 맨 앞', () {
|
|
expect(initialVersionPick([rel('3', zip: false), rel('2'), rel('1')], '1').version, '2');
|
|
expect(initialVersionPick([rel('3', zip: false), rel('2', zip: false)], '2').version, '2');
|
|
expect(initialVersionPick([rel('3', zip: false), rel('2', zip: false)], '9').version, '3');
|
|
});
|
|
|
|
testWidgets('update_install (단계): withProgressDialog - 끝나면 창을 닫고 null, 실패하면 그 글 · 진행은 % 로', (t) async {
|
|
late BuildContext ctx;
|
|
await t.pumpWidget(MaterialApp(home: Builder(builder: (c) {
|
|
ctx = c;
|
|
return const Scaffold();
|
|
})));
|
|
void Function(int, int)? report;
|
|
var release = false;
|
|
final ok = withProgressDialog(ctx, '복사 중', (onProgress) async {
|
|
report = onProgress;
|
|
while (!release) {
|
|
await Future<void>.delayed(const Duration(milliseconds: 10));
|
|
}
|
|
return null;
|
|
});
|
|
await t.pump();
|
|
expect(find.text('복사 중'), findsOneWidget);
|
|
expect(find.text('준비하는 중'), findsOneWidget);
|
|
report!(1, 4);
|
|
await t.pump();
|
|
expect(find.text('25%'), findsOneWidget);
|
|
release = true;
|
|
await t.pump(const Duration(milliseconds: 20));
|
|
await t.pumpAndSettle();
|
|
expect(await ok, isNull);
|
|
expect(find.text('복사 중'), findsNothing);
|
|
|
|
final bad = withProgressDialog(ctx, '되살리는 중', (_) async => throw StateError('자리 없음'));
|
|
await t.pumpAndSettle();
|
|
expect(await bad, contains('자리 없음'));
|
|
expect(find.text('되살리는 중'), findsNothing);
|
|
});
|
|
|
|
test('update_install (단계): 설정 보관 저장소가 없으면 (VersionSnapshot 없음) 아무것도 하지 않음 · 던지지 않음', () async {
|
|
final was = VersionSnapshot.instance;
|
|
VersionSnapshot.instance = null;
|
|
addTearDown(() => VersionSnapshot.instance = was);
|
|
final c = AppController(PlatformServices(mediaTool: ProcessMediaTool('x', 'y'), storage: DesktopStorageService()));
|
|
final before = c.settings.run.lastRunVersion;
|
|
await saveVersionSnapshot(c, '9.9.9');
|
|
expect(c.settings.run.lastRunVersion, before);
|
|
});
|
|
|
|
testWidgets('update_dialog (버전 고르기): 바뀐 내용이 비면 "(설명 없음)" · 표는 글자 그대로', (t) async {
|
|
await t.pumpWidget(MaterialApp(
|
|
home: Scaffold(
|
|
body: Column(children: [
|
|
const SizedBox(height: 100, child: UpdateNotes('')),
|
|
UpdateBadge('최신', Colors.green),
|
|
]))));
|
|
expect(find.text('(설명 없음)'), findsOneWidget);
|
|
expect(find.text('최신'), findsOneWidget);
|
|
});
|
|
}
|