JJ_MKVMaker/test/component_store_test.dart

50 lines
2.5 KiB
Dart

import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:jj_mkvmaker/app/component_store.dart';
import 'package:path/path.dart' as p;
/// 실제 설치 (LibreOffice 373MB 받기 · 풀기 · H2Orestart · 문서 → PDF): JJ_COMPONENTS_URL=목록 주소 일 때만.
/// JJ_COMPONENTS_DIR 를 주면 그 폴더에 설치하고 남긴다 (여러 번 시험할 때 다시 받지 않게).
void main() {
test('components.json 읽기: 기기별 파일 · 없는 기기는 null', () {
final m = ComponentManifest.parse('''
{"format":1,"components":{"docs":{"version":"x","windows":[{"name":"a.msi","kind":"msi","url":"https://e/a.msi","sha256":"AB"}]}}}''');
expect(m.version('docs'), 'x');
final f = m.files('docs', 'windows')!.single;
expect([f.name, f.kind, f.sha256], ['a.msi', 'msi', 'ab']);
expect(m.files('docs', 'android'), isNull);
expect(m.files('nope', 'windows'), isNull);
});
final url = Platform.environment['JJ_COMPONENTS_URL'];
test('실제 설치: LibreOffice + H2Orestart → DOCX · HWPX 를 PDF 로', () async {
final keep = Platform.environment['JJ_COMPONENTS_DIR'];
final data = keep ?? Directory.systemTemp.createTempSync('jj_comp_').path;
final store = ComponentStore(data, manifestUrl: url!);
if (!store.isInstalled('docs')) {
var last = '';
await store.install('docs', onProgress: (step, d) {
final s = '$step ${d == null ? '' : (d * 100).floor()}';
if (s != last && (d == null || (d * 100).floor() % 10 == 0)) debugPrint(s);
last = s;
});
}
expect(store.isInstalled('docs'), isTrue);
expect(store.soffice(), isNotNull);
// 시험 문서: LibreOffice 로 텍스트 → DOCX 를 만든 뒤 다시 PDF 로
final tmp = Directory.systemTemp.createTempSync('jj_doc_');
final txt = File(p.join(tmp.path, 'hello.txt'))..writeAsStringSync('안녕하세요 JJ 문서 미리보기');
final pdf = await store.convertToPdf(txt.path, p.join(tmp.path, 'out'));
expect(File(pdf).lengthSync(), greaterThan(1000));
final hwp = Platform.environment['JJ_HWP_FILE'];
if (hwp != null) {
final out = await store.convertToPdf(hwp, p.join(tmp.path, 'out'));
expect(File(out).lengthSync(), greaterThan(1000));
}
tmp.deleteSync(recursive: true);
if (keep == null) await store.remove('docs');
}, skip: url == null ? 'JJ_COMPONENTS_URL 일 때만' : null, timeout: const Timeout(Duration(minutes: 30)));
}