forked from baron/baron-sso
계정 생성, 비밀번호변경, 삭제 테스트케이스 추가
This commit is contained in:
@@ -63,6 +63,14 @@ void main() {
|
||||
);
|
||||
});
|
||||
|
||||
test('buildLocalizedPath preserves redirect_url parameter', () {
|
||||
final uri = Uri.parse('/signin?redirect_url=https://example.com/after');
|
||||
expect(
|
||||
buildLocalizedPath('ko', uri),
|
||||
'/ko/signin?redirect_url=https://example.com/after',
|
||||
);
|
||||
});
|
||||
|
||||
test('buildLocalizedPath preserves raw query order and duplicates', () {
|
||||
final uri = Uri.parse(
|
||||
'/signin?a=1&a=2&redirect_uri=https%3A%2F%2Fexample.com%2Fcb%3Fx%3D1%26y%3D2',
|
||||
@@ -109,5 +117,15 @@ void main() {
|
||||
'/ko/signin?a=1&a=2&redirect_uri=https%3A%2F%2Fexample.com%2Fcb%3Fx%3D1%26y%3D2¬ice=qr_login_required',
|
||||
);
|
||||
});
|
||||
|
||||
test('buildSigninRedirectPath preserves redirect_url and redirect_uri', () {
|
||||
final uri = Uri.parse(
|
||||
'/ko/profile?redirect_url=https%3A%2F%2Fa.example.com%2Fcb&redirect_uri=https%3A%2F%2Fb.example.com%2Fcb',
|
||||
);
|
||||
expect(
|
||||
buildSigninRedirectPath('ko', uri),
|
||||
'/ko/signin?redirect_url=https%3A%2F%2Fa.example.com%2Fcb&redirect_uri=https%3A%2F%2Fb.example.com%2Fcb',
|
||||
);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
121
userfront/test/router_redirect_widget_test.dart
Normal file
121
userfront/test/router_redirect_widget_test.dart
Normal file
@@ -0,0 +1,121 @@
|
||||
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';
|
||||
|
||||
Widget _buildTestApp(String initialLocation) {
|
||||
final router = GoRouter(
|
||||
initialLocation: initialLocation,
|
||||
routes: [
|
||||
GoRoute(
|
||||
path: '/:locale',
|
||||
builder: (context, state) => const Scaffold(body: Text('root')),
|
||||
routes: [
|
||||
GoRoute(
|
||||
path: 'signin',
|
||||
builder: (context, state) {
|
||||
final challenge = state.uri.queryParameters['login_challenge'];
|
||||
final redirect =
|
||||
state.uri.queryParameters['redirect_uri'] ??
|
||||
state.uri.queryParameters['redirect_url'] ??
|
||||
'';
|
||||
return Scaffold(
|
||||
body: Text(
|
||||
'signin|challenge=${challenge ?? ''}|redirect=$redirect',
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
GoRoute(
|
||||
path: 'profile',
|
||||
builder: (context, state) =>
|
||||
const Scaffold(body: Text('profile-page')),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
redirect: (context, state) {
|
||||
final requestedLocale = extractLocaleFromPath(state.uri);
|
||||
if (requestedLocale == null) {
|
||||
return buildLocalizedPath(resolvePreferredLocaleCode(), state.uri);
|
||||
}
|
||||
|
||||
final isLoggedIn =
|
||||
AuthTokenStore.getToken() != null || AuthTokenStore.usesCookie();
|
||||
final path = stripLocalePath(state.uri);
|
||||
final isPublicPath = path == '/signin';
|
||||
if (isPublicPath) {
|
||||
return null;
|
||||
}
|
||||
if (!isLoggedIn) {
|
||||
return buildSigninRedirectPath(requestedLocale, state.uri);
|
||||
}
|
||||
return null;
|
||||
},
|
||||
);
|
||||
|
||||
return MaterialApp.router(routerConfig: router);
|
||||
}
|
||||
|
||||
void main() {
|
||||
setUp(() {
|
||||
LocaleRegistry.setSupportedLocaleCodesForTest(['en', 'ko']);
|
||||
AuthTokenStore.clear();
|
||||
});
|
||||
|
||||
tearDown(() {
|
||||
AuthTokenStore.clear();
|
||||
LocaleRegistry.resetForTest();
|
||||
});
|
||||
|
||||
testWidgets('비로그인: redirect_uri/login_challenge가 signin으로 전달', (
|
||||
tester,
|
||||
) async {
|
||||
final encodedRedirectUri = Uri.encodeComponent(
|
||||
'https://rp.example.com/cb?x=1',
|
||||
);
|
||||
await tester.pumpWidget(
|
||||
_buildTestApp(
|
||||
'/en/profile?login_challenge=lc_123&redirect_uri=$encodedRedirectUri',
|
||||
),
|
||||
);
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(
|
||||
find.text(
|
||||
'signin|challenge=lc_123|redirect=https://rp.example.com/cb?x=1',
|
||||
),
|
||||
findsOneWidget,
|
||||
);
|
||||
});
|
||||
|
||||
testWidgets('비로그인: redirect_uri가 없으면 redirect_url을 전달', (tester) async {
|
||||
final encodedRedirectUrl = Uri.encodeComponent(
|
||||
'https://legacy.example.com/cb',
|
||||
);
|
||||
await tester.pumpWidget(
|
||||
_buildTestApp('/en/profile?redirect_url=$encodedRedirectUrl'),
|
||||
);
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(
|
||||
find.text('signin|challenge=|redirect=https://legacy.example.com/cb'),
|
||||
findsOneWidget,
|
||||
);
|
||||
});
|
||||
|
||||
testWidgets('로그인 상태: profile 접근 시 signin으로 리다이렉트하지 않음', (tester) async {
|
||||
AuthTokenStore.setToken('test-token', provider: 'ory');
|
||||
await tester.pumpWidget(
|
||||
_buildTestApp(
|
||||
'/en/profile?redirect_uri=https%3A%2F%2Frp.example.com%2Fcb',
|
||||
),
|
||||
);
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(find.text('profile-page'), findsOneWidget);
|
||||
expect(find.textContaining('signin|'), findsNothing);
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user