forked from baron/baron-sso
95 lines
2.8 KiB
Dart
95 lines
2.8 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:go_router/go_router.dart';
|
|
import 'package:userfront/core/i18n/locale_registry.dart';
|
|
import 'package:userfront/core/i18n/locale_utils.dart';
|
|
import 'package:userfront/core/services/auth_token_store.dart';
|
|
|
|
class _AuthRefreshNotifier extends ChangeNotifier {
|
|
void refresh() => notifyListeners();
|
|
}
|
|
|
|
Widget _buildRaceTestApp(_AuthRefreshNotifier notifier) {
|
|
final router = GoRouter(
|
|
initialLocation: '/ko/signin',
|
|
refreshListenable: notifier,
|
|
routes: [
|
|
GoRoute(
|
|
path: '/:locale',
|
|
builder: (context, state) => const Scaffold(body: Text('locale-root')),
|
|
routes: [
|
|
GoRoute(
|
|
path: 'dashboard',
|
|
builder: (context, state) => const Scaffold(body: Text('home')),
|
|
),
|
|
GoRoute(
|
|
path: 'signin',
|
|
builder: (context, state) {
|
|
return Scaffold(
|
|
body: Center(
|
|
child: FilledButton(
|
|
onPressed: () {
|
|
AuthTokenStore.setToken('race-token', provider: 'ory');
|
|
notifier.refresh();
|
|
context.go('/ko/dashboard');
|
|
},
|
|
child: const Text('login'),
|
|
),
|
|
),
|
|
);
|
|
},
|
|
),
|
|
],
|
|
),
|
|
],
|
|
redirect: (context, state) {
|
|
final requestedLocale = extractLocaleFromPath(state.uri);
|
|
if (requestedLocale == null) {
|
|
return buildLocalizedPath(resolvePreferredLocaleCode(), state.uri);
|
|
}
|
|
|
|
final token = AuthTokenStore.getToken();
|
|
final isLoggedIn =
|
|
(token != null && token.isNotEmpty) || AuthTokenStore.usesCookie();
|
|
final path = stripLocalePath(state.uri);
|
|
if (path == '/signin') {
|
|
return null;
|
|
}
|
|
if (!isLoggedIn) {
|
|
return buildSigninRedirectPath(requestedLocale, state.uri);
|
|
}
|
|
if (path == '/') {
|
|
return '/$requestedLocale/dashboard';
|
|
}
|
|
return null;
|
|
},
|
|
);
|
|
|
|
return MaterialApp.router(routerConfig: router);
|
|
}
|
|
|
|
void main() {
|
|
setUp(() {
|
|
LocaleRegistry.setSupportedLocaleCodesForTest(['en', 'ko']);
|
|
AuthTokenStore.clear();
|
|
});
|
|
|
|
tearDown(() {
|
|
AuthTokenStore.clear();
|
|
LocaleRegistry.resetForTest();
|
|
});
|
|
|
|
testWidgets('로그인 성공 이벤트(notify + go) 동시 호출 시 홈으로 안정적으로 이동', (tester) async {
|
|
final notifier = _AuthRefreshNotifier();
|
|
await tester.pumpWidget(_buildRaceTestApp(notifier));
|
|
await tester.pumpAndSettle();
|
|
expect(find.text('login'), findsOneWidget);
|
|
|
|
await tester.tap(find.text('login'));
|
|
await tester.pumpAndSettle();
|
|
|
|
expect(find.text('home'), findsOneWidget);
|
|
expect(tester.takeException(), isNull);
|
|
});
|
|
}
|