Files
2026-05-16 01:10:06 +08:00

135 lines
3.6 KiB
Dart

import 'dart:convert';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:ttx_page_admin/main.dart';
Future<HttpServer> _startMockBackend() async {
final server = await HttpServer.bind(InternetAddress.loopbackIPv4, 0);
server.listen((request) async {
final path = request.uri.pathSegments.join('/');
Future<void> writeJson(Map<String, Object?> body) async {
request.response.headers.contentType = ContentType.json;
request.response.write(jsonEncode(body));
await request.response.close();
}
if (request.method == 'GET' && path == 'rest/auth/loginPageConfig') {
await writeJson({
'code': '0',
'data': {
'server': 'http://127.0.0.1:${server.port}/',
'db': 'studio',
'appName': 'TTX Studio',
},
});
return;
}
if (request.method == 'POST' && path == 'rest/auth/login') {
await writeJson({
'code': '0',
'message': 'ok',
'leftDays': 30,
'session': {
'user': 'admin',
'db': 'studio',
'tk': 'token-1',
'client': 'client-1',
'locale': 'zh-CN',
'timezone': 'Asia/Shanghai',
'portal': 'studio',
},
'appConfig': {'appName': 'TTX Studio'},
'systemConfig': {'showDashboard': true},
});
return;
}
if (request.method == 'GET' && path == 'user/getUser') {
await writeJson({
'code': '0',
'data': {
'code': 'admin',
'name': '管理员',
'isDeveloper': true,
'portal': 'studio',
},
});
return;
}
if (request.method == 'POST' && path == 'cbt/org/byUser') {
await writeJson({
'code': '0',
'data': {
'code': 'org-1',
'name': '测试组织',
},
});
return;
}
if (request.method == 'POST' && path == 'studio/access/permissions') {
await writeJson({
'code': '0',
'data': [
{'id': 'model-center'},
{'id': 'json-center'},
{'id': 'history'},
{'id': 'manage'},
{'id': 'ModelSync'},
{'id': 'DataRepair'},
{'id': 'SqlTemplate'},
{'id': 'AdvancedSqlTemplate'},
{'id': 'PortalMaintain'},
],
});
return;
}
if (request.method == 'GET' && path == 'rest/auth/logout') {
await writeJson({'code': '0'});
return;
}
request.response.statusCode = HttpStatus.notFound;
await request.response.close();
});
return server;
}
void main() {
testWidgets('Studio desktop login opens workspace', (WidgetTester tester) async {
final server = await _startMockBackend();
addTearDown(() async {
await server.close(force: true);
});
await tester.binding.setSurfaceSize(const Size(1440, 1200));
addTearDown(() async {
await tester.binding.setSurfaceSize(null);
});
await tester.pumpWidget(const StudioApp());
await tester.pumpAndSettle();
await tester.enterText(find.byType(TextField).at(0), 'http://127.0.0.1:${server.port}/');
await tester.enterText(find.byType(TextField).at(1), 'studio');
await tester.enterText(find.byType(TextField).at(2), 'admin');
await tester.enterText(find.byType(TextField).at(3), '123456');
await tester.tap(find.text('进入 Studio'));
await tester.pump();
await tester.pumpAndSettle();
expect(find.byType(StudioShell), findsOneWidget);
expect(find.byType(StudioWorkspaceView), findsOneWidget);
expect(find.text('测试组织'), findsWidgets);
});
}