로그아웃 SDK 대기 제거 · 온보딩 국가 시트 · 프로필 머리줄

This commit is contained in:
Sn-Kinos
2026-10-06 04:47:37 +09:00
parent 976e569a56
commit 40756d5c86
21 changed files with 277 additions and 43 deletions
+29 -1
View File
@@ -228,7 +228,32 @@ void main() {
releaseMode: true,
);
await expectLater(auth.signOut(), throwsA(isA<StateError>()));
// SDK 로그아웃 실패는 로그만 남기고 호출자에게 던지지 않는다(처리되지 않은 예외 방지).
await auth.signOut();
expect(auth.isSignedIn, isFalse);
expect(provider.signOutCalls, 1);
expect(session.signOutCalls, 1);
auth.dispose();
await session.close();
});
test('SDK 로그아웃이 응답 없이 멈춰도 기다리지 않는다', () async {
final provider = _FakeProvider(
SocialProvider.google,
result: const AuthCancelled(),
signOutHangs: true,
);
final session = _FakeSession(
const AuthAccount(uid: 'google-user', provider: SocialProvider.google),
);
final auth = AuthRepository(
providers: [provider],
session: session,
releaseMode: true,
);
await auth.signOut().timeout(const Duration(milliseconds: 100));
expect(auth.isSignedIn, isFalse);
expect(provider.signOutCalls, 1);
@@ -245,6 +270,7 @@ final class _FakeProvider implements SocialAuthProvider {
this.result,
this.signInError,
this.signOutError,
this.signOutHangs = false,
});
@override
@@ -252,6 +278,7 @@ final class _FakeProvider implements SocialAuthProvider {
final AuthOutcome? result;
final Object? signInError;
final Object? signOutError;
final bool signOutHangs;
int signOutCalls = 0;
@override
@@ -269,6 +296,7 @@ final class _FakeProvider implements SocialAuthProvider {
@override
Future<void> signOut() async {
signOutCalls += 1;
if (signOutHangs) return Completer<void>().future;
if (signOutError case final error?) throw error;
}
}
+38 -3
View File
@@ -3,12 +3,15 @@ import 'dart:async';
import 'package:fancake/app.dart';
import 'package:fancake/core/data/repositories.dart';
import 'package:fancake/core/firebase/firebase_boot.dart';
import 'package:fancake/core/i18n/app_locale.dart';
import 'package:fancake/features/planet/planet_data.dart' show countryName;
import 'package:fancake/features/auth/auth.dart';
import 'package:fancake/features/auth/auth_repository.dart';
import 'package:fancake/features/auth/login_screen.dart';
import 'package:fancake/features/auth/onboarding_data.dart';
import 'package:fancake/features/auth/onboarding_screens.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:shared_preferences/shared_preferences.dart';
@@ -57,7 +60,9 @@ void main() {
expect(find.byType(NavigationBar), findsOneWidget);
});
testWidgets('동의한 계정은 셸로 가는 동안 약관 화면이 한 프레임도 그려지지 않는다 — 10/6 콜드 스타트 깜빡임', (tester) async {
testWidgets('동의한 계정은 셸로 가는 동안 약관 화면이 한 프레임도 그려지지 않는다 — 10/6 콜드 스타트 깜빡임', (
tester,
) async {
// 서버 판정이 몇 프레임 걸리는 실기기처럼 늦춘다.
final (auth, _) = await boot(
tester,
@@ -148,8 +153,11 @@ void main() {
await tester.tap(find.text('완료'));
await tester.pumpAndSettle();
await tester.tap(find.text('국가/지역').first);
await tester.tap(
find.ancestor(of: find.text('거주 국가/지역'), matching: find.byType(InkWell)),
);
await tester.pumpAndSettle();
expect(find.text('거주 국가/지역 선택'), findsOneWidget);
await tester.scrollUntilVisible(
find.text('대한민국'),
300,
@@ -210,7 +218,34 @@ void main() {
await auth.signIn(SocialProvider.google, signUp: true);
await tester.pumpAndSettle();
expect(repo.agreed, contains('marketing'));
expect(find.text('프로필을 설정해 주세요'), findsOneWidget);
expect(find.text('거주 국가/지역'), findsOneWidget); // ③ 프로필
expect(find.text('회원가입'), findsOneWidget); // 511:86825 머리줄 가운데 타이틀
});
test('국가명은 OS 이름 · OS 정렬 순서 — 이름 없는 나라도 코드로 보이지 않는다', () async {
TestWidgetsFlutterBinding.ensureInitialized();
const channel = MethodChannel('kr.co.fanuzu.app/locale');
final messenger =
TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger;
String? asked;
messenger.setMockMethodCallHandler(channel, (call) async {
asked = (call.arguments as Map)['locale'] as String;
return [
['GH', '가나'],
['AD', '안도라'],
['KR', '대한민국'],
];
});
addTearDown(() {
messenger.setMockMethodCallHandler(channel, null);
platformCountryNames = const {};
});
await loadCountryNames(const Locale('ko'));
expect(asked, 'ko');
expect(countryName('AD'), '안도라');
expect(sortedCountries().take(3), ['GH', 'AD', 'KR']);
expect(sortedCountries().length, isoCountries.length);
});
testWidgets('첫 실행은 소개 3장 — 건너뛰기를 눌러도 로그인 화면', (tester) async {