forked from baron/baron-sso
CI test 업데이트
This commit is contained in:
@@ -1,75 +1,138 @@
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:userfront/core/i18n/locale_storage.dart';
|
||||
import 'package:userfront/core/i18n/locale_storage_backend.dart';
|
||||
import 'package:userfront/core/i18n/locale_storage_engine.dart';
|
||||
import 'package:userfront/core/i18n/locale_storage_policy.dart';
|
||||
|
||||
class _FakeTarget implements LocaleStorageTarget {
|
||||
_FakeTarget();
|
||||
|
||||
final Map<String, String> store = {};
|
||||
bool throwOnRead = false;
|
||||
bool throwOnWrite = false;
|
||||
bool throwOnRemove = false;
|
||||
bool throwOnClear = false;
|
||||
|
||||
@override
|
||||
String? read(String key) {
|
||||
if (throwOnRead) {
|
||||
throw StateError('read blocked');
|
||||
}
|
||||
return store[key];
|
||||
}
|
||||
|
||||
@override
|
||||
bool write(String key, String value) {
|
||||
if (throwOnWrite) {
|
||||
throw StateError('write blocked');
|
||||
}
|
||||
store[key] = value;
|
||||
return true;
|
||||
}
|
||||
|
||||
@override
|
||||
bool remove(String key) {
|
||||
if (throwOnRemove) {
|
||||
throw StateError('remove blocked');
|
||||
}
|
||||
store.remove(key);
|
||||
return true;
|
||||
}
|
||||
|
||||
@override
|
||||
void clear() {
|
||||
if (throwOnClear) {
|
||||
throw StateError('clear blocked');
|
||||
}
|
||||
store.clear();
|
||||
}
|
||||
}
|
||||
|
||||
void main() {
|
||||
late _FakeTarget localTarget;
|
||||
late _FakeTarget sessionTarget;
|
||||
late LocaleStorageEngine engine;
|
||||
|
||||
setUp(() {
|
||||
LocaleStorage.setTestModeForTests(LocaleStorageTestMode.normal);
|
||||
LocaleStorage.clearForTests();
|
||||
localTarget = _FakeTarget();
|
||||
sessionTarget = _FakeTarget();
|
||||
engine = LocaleStorageEngine(
|
||||
localTarget: localTarget,
|
||||
sessionTarget: sessionTarget,
|
||||
);
|
||||
engine.clearForTests();
|
||||
});
|
||||
|
||||
tearDown(() {
|
||||
LocaleStorage.setTestModeForTests(LocaleStorageTestMode.normal);
|
||||
LocaleStorage.clearForTests();
|
||||
});
|
||||
test('기본 모드에서는 local 우선으로 저장/조회한다', () {
|
||||
engine.write('ko');
|
||||
expect(engine.read(), 'ko');
|
||||
|
||||
test('localStorage write/read (웹)', () {
|
||||
if (!kIsWeb) {
|
||||
return;
|
||||
}
|
||||
|
||||
LocaleStorage.write('ko');
|
||||
expect(LocaleStorage.read(), 'ko');
|
||||
|
||||
final state = LocaleStorage.debugStateForTests();
|
||||
final state = engine.debugStateForTests();
|
||||
expect(state.localCurrent, 'ko');
|
||||
expect(state.sessionCurrent, isNull);
|
||||
expect(state.memoryCurrent, isNull);
|
||||
}, skip: !kIsWeb);
|
||||
});
|
||||
|
||||
test('legacy key에서 locale로 마이그레이션 (웹)', () {
|
||||
if (!kIsWeb) {
|
||||
return;
|
||||
}
|
||||
test('legacy key를 읽으면 current key로 마이그레이션한다', () {
|
||||
localTarget.store[LocaleStoragePolicy.legacyKey] = 'en';
|
||||
|
||||
LocaleStorage.seedLegacyForTests('en');
|
||||
expect(LocaleStorage.read(), 'en');
|
||||
expect(engine.read(), 'en');
|
||||
|
||||
final state = LocaleStorage.debugStateForTests();
|
||||
final state = engine.debugStateForTests();
|
||||
expect(state.localCurrent, 'en');
|
||||
expect(state.localLegacy, isNull);
|
||||
}, skip: !kIsWeb);
|
||||
});
|
||||
|
||||
test('localStorage 접근이 차단되면 메모리 fallback (웹)', () {
|
||||
if (!kIsWeb) {
|
||||
return;
|
||||
}
|
||||
test('localStorage가 차단되면 sessionStorage로 fallback 한다', () {
|
||||
localTarget
|
||||
..throwOnRead = true
|
||||
..throwOnWrite = true
|
||||
..throwOnRemove = true;
|
||||
|
||||
LocaleStorage.forceMemoryStorageForTests(true);
|
||||
engine.write('ko');
|
||||
expect(engine.read(), 'ko');
|
||||
|
||||
LocaleStorage.write('en');
|
||||
expect(LocaleStorage.read(), 'en');
|
||||
|
||||
final state = LocaleStorage.debugStateForTests();
|
||||
expect(state.localCurrent, isNull);
|
||||
expect(state.sessionCurrent, isNull);
|
||||
expect(state.memoryCurrent, 'en');
|
||||
}, skip: !kIsWeb);
|
||||
|
||||
test('localStorage 접근이 차단되면 sessionStorage로 fallback (웹)', () {
|
||||
if (!kIsWeb) {
|
||||
return;
|
||||
}
|
||||
|
||||
LocaleStorage.forceSessionStorageForTests(true);
|
||||
|
||||
LocaleStorage.write('ko');
|
||||
expect(LocaleStorage.read(), 'ko');
|
||||
|
||||
final state = LocaleStorage.debugStateForTests();
|
||||
final state = engine.debugStateForTests();
|
||||
expect(state.localCurrent, isNull);
|
||||
expect(state.sessionCurrent, 'ko');
|
||||
expect(state.memoryCurrent, isNull);
|
||||
}, skip: !kIsWeb);
|
||||
});
|
||||
|
||||
test('local/session 모두 차단되면 memory fallback 한다', () {
|
||||
localTarget
|
||||
..throwOnRead = true
|
||||
..throwOnWrite = true
|
||||
..throwOnRemove = true;
|
||||
sessionTarget
|
||||
..throwOnRead = true
|
||||
..throwOnWrite = true
|
||||
..throwOnRemove = true;
|
||||
|
||||
engine.write('en');
|
||||
expect(engine.read(), 'en');
|
||||
|
||||
final state = engine.debugStateForTests();
|
||||
expect(state.localCurrent, isNull);
|
||||
expect(state.sessionCurrent, isNull);
|
||||
expect(state.memoryCurrent, 'en');
|
||||
});
|
||||
|
||||
test('sessionOnly 모드에서는 session + memory만 사용한다', () {
|
||||
engine.setTestMode(LocaleStorageTestMode.sessionOnly);
|
||||
engine.write('ko');
|
||||
|
||||
final state = engine.debugStateForTests();
|
||||
expect(state.localCurrent, isNull);
|
||||
expect(state.sessionCurrent, 'ko');
|
||||
expect(state.memoryCurrent, isNull);
|
||||
});
|
||||
|
||||
test('memoryOnly 모드에서는 memory만 사용한다', () {
|
||||
engine.setTestMode(LocaleStorageTestMode.memoryOnly);
|
||||
engine.write('en');
|
||||
|
||||
final state = engine.debugStateForTests();
|
||||
expect(state.localCurrent, isNull);
|
||||
expect(state.sessionCurrent, isNull);
|
||||
expect(state.memoryCurrent, 'en');
|
||||
});
|
||||
}
|
||||
|
||||
@@ -152,4 +152,25 @@ void main() {
|
||||
expect(find.text('profile-page'), findsOneWidget);
|
||||
expect(find.textContaining('signin|'), findsNothing);
|
||||
});
|
||||
|
||||
testWidgets('로그인 후 같은 브라우저 새 창/팝업에서도 세션이 유지된다', (tester) async {
|
||||
await tester.pumpWidget(_buildTestApp('/en/signin'));
|
||||
await tester.pumpAndSettle();
|
||||
expect(find.textContaining('signin|'), findsOneWidget);
|
||||
|
||||
AuthTokenStore.setToken('persisted-token', provider: 'ory');
|
||||
|
||||
await tester.pumpWidget(const SizedBox.shrink());
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
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