Add auth session flow and sign-in UX
This commit is contained in:
@@ -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
@@ -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);
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user