Add auth session flow and sign-in UX

This commit is contained in:
Rijad Zuzo
2026-02-15 16:38:07 +01:00
parent a33e663d57
commit aaabc51d2d
7 changed files with 417 additions and 9 deletions
@@ -0,0 +1,59 @@
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:relationship_saver/core/auth/in_memory_token_store.dart';
import 'package:relationship_saver/features/auth/session_controller.dart';
import 'package:relationship_saver/integrations/backend/backend_gateway_fake.dart';
import 'package:relationship_saver/integrations/backend/backend_gateway_provider.dart';
import 'package:relationship_saver/integrations/backend/models/backend_models.dart';
void main() {
test('initial state is signed out when token store is empty', () async {
final ProviderContainer container = ProviderContainer(
overrides: [
tokenStoreProvider.overrideWithValue(InMemoryTokenStore()),
backendGatewayProvider.overrideWithValue(BackendGatewayFake()),
],
);
addTearDown(container.dispose);
final AuthSession? session = await container.read(
sessionControllerProvider.future,
);
expect(session, isNull);
});
test('sign-in creates session and sign-out clears it', () async {
final InMemoryTokenStore tokenStore = InMemoryTokenStore();
final ProviderContainer container = ProviderContainer(
overrides: [
tokenStoreProvider.overrideWithValue(tokenStore),
backendGatewayProvider.overrideWithValue(BackendGatewayFake()),
],
);
addTearDown(container.dispose);
await container
.read(sessionControllerProvider.notifier)
.signIn(
method: SignInMethod.password,
email: 'demo@example.com',
password: 'password123',
);
final AuthSession? signedIn = container
.read(sessionControllerProvider)
.asData
?.value;
expect(signedIn, isNotNull);
expect(signedIn?.user.email, 'demo@example.com');
await container.read(sessionControllerProvider.notifier).signOut();
final AuthSession? signedOut = container
.read(sessionControllerProvider)
.asData
?.value;
expect(signedOut, isNull);
expect(await tokenStore.read(), isNull);
});
}
+11 -4
View File
@@ -1,5 +1,7 @@
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:relationship_saver/core/auth/in_memory_token_store.dart';
import 'package:relationship_saver/integrations/backend/backend_gateway_provider.dart';
import 'package:relationship_saver/main.dart';
import 'package:shared_preferences/shared_preferences.dart';
@@ -8,11 +10,16 @@ void main() {
SharedPreferences.setMockInitialValues(<String, Object>{});
});
testWidgets('renders dashboard flow', (WidgetTester tester) async {
await tester.pumpWidget(const ProviderScope(child: RelationshipSaverApp()));
testWidgets('renders sign-in flow by default', (WidgetTester tester) async {
await tester.pumpWidget(
ProviderScope(
overrides: [tokenStoreProvider.overrideWithValue(InMemoryTokenStore())],
child: const RelationshipSaverApp(),
),
);
await tester.pumpAndSettle();
expect(find.text('Today'), findsOneWidget);
expect(find.text('Active People'), findsOneWidget);
expect(find.text('Sign in to continue'), findsOneWidget);
expect(find.text('Sign In'), findsOneWidget);
});
}