iop/apps/client/test/client_bootstrap_test.dart
toki 01dc2ef78b refactor: readability baseline 및 테스트 구조 개선
- agent-readable-repository-refactor 완료: 기존 테스트 파일 아카이브 이동
- 새 테스트 파일 추가 (edge, node, client, config, readability)
- readability_audit 스크립트 및 baseline 추가
- roadmap/SDD 문서 갱신
- agent-client/pi/extensions/openai-sampling-parameters 추가
2026-07-17 16:02:12 +09:00

147 lines
4.2 KiB
Dart

import 'package:flutter_test/flutter_test.dart';
import 'package:iop_client/client_bootstrap.dart';
import 'package:iop_client/main.dart';
import 'package:iop_client/src/integrations/nexo/nexo_notification_client.dart';
import 'package:iop_client/src/integrations/nexo/nexo_notification_host_integration.dart';
import 'support/client_test_harness.dart';
/// Fake NexoNotificationClient that does not reach out to Firebase/FCM.
/// Includes `initializedForTest` for test verification.
class _TestFakeNexoClient implements NexoNotificationClient {
bool _initialized = false;
bool get initializedForTest => _initialized;
@override
Stream<Map<String, dynamic>> get onNotification =>
const Stream<Map<String, dynamic>>.empty();
@override
Future<void> initialize() async {
_initialized = true;
}
@override
Future<String?> getDeviceToken() async => null;
@override
Future<void> setAuthToken(
String serverUrl,
String token, {
String? identifier,
}) async {}
@override
Future<void> setSigningKey(String serverUrl, String signingKey) async {}
@override
set onDeviceTokenReady(Future<void> Function(String token)? callback) {}
@override
set onNavigateToChannel(
void Function(String serverUrl, String channelId)? callback,
) {}
@override
set onNavigateToThread(
void Function(String serverUrl, String rootId)? callback,
) {}
}
void main() {
testWidgets('runIopClient can skip external integrations', (
WidgetTester tester,
) async {
const options = IopClientBootstrapOptions(
initializeFirebase: false,
initializeNotifications: false,
);
// This should run without any exceptions
await bootstrapIopClient(options: options);
final fakeClient = FakeClientWireClient(shouldSuccess: true);
// Verify it doesn't fail basic widget pump
await tester.pumpWidget(
IopClientApp(testClient: fakeClient, statusRepository: null),
);
expect(find.byType(IopClientApp), findsOneWidget);
});
testWidgets('bootstrap initializes Nexo notification host by default', (
WidgetTester tester,
) async {
// Default initializeNotifications = true, but with fake host to avoid
// Firebase/FCM plugin calls in test environment.
final fakeHost = NexoNotificationHostIntegration(
pushClient: _TestFakeNexoClient(),
);
final testOptions = IopClientBootstrapOptions(
initializeFirebase: false,
notificationHost: fakeHost,
);
await bootstrapIopClient(options: testOptions);
// Verify the provided host is initialized
expect(fakeHost.isInitialized, isTrue);
});
testWidgets('bootstrap skips notification when disabled', (
WidgetTester tester,
) async {
final fakeHost = NexoNotificationHostIntegration(
pushClient: _TestFakeNexoClient(),
);
const options = IopClientBootstrapOptions(
initializeFirebase: false,
initializeNotifications: false,
);
await bootstrapIopClient(
options: IopClientBootstrapOptions(
initializeFirebase: options.initializeFirebase,
initializeNotifications: options.initializeNotifications,
notificationHost: fakeHost,
),
);
expect(fakeHost.isInitialized, isFalse);
});
testWidgets('bootstrap accepts custom NexoNotificationHostIntegration', (
WidgetTester tester,
) async {
final customHost = NexoNotificationHostIntegration(
pushClient: _TestFakeNexoClient(),
);
final testOptions = IopClientBootstrapOptions(
initializeFirebase: false,
notificationHost: customHost,
);
await bootstrapIopClient(options: testOptions);
expect(customHost.isInitialized, isTrue);
});
testWidgets('bootstrap initializes with injected host without requiring '
'auth login or credential assets', (WidgetTester tester) async {
final fakeClient = _TestFakeNexoClient();
final fakeHost = NexoNotificationHostIntegration(pushClient: fakeClient);
final testOptions = IopClientBootstrapOptions(
initializeFirebase: false,
notificationHost: fakeHost,
);
// This must succeed without looking for external push credentials.
await bootstrapIopClient(options: testOptions);
expect(fakeHost.isInitialized, isTrue);
expect(fakeClient.initializedForTest, isTrue);
});
}