import 'dart:convert'; import 'package:backend_dart/application/service/dto/user_dto.dart'; import 'package:backend_dart/domain/entities/user.dart'; import 'package:backend_dart/domain/errors/error.dart'; import 'package:backend_dart/infrastructure/data/database_provider.dart'; import 'package:backend_dart/interfaces/http/router.dart'; import 'package:fpdart/fpdart.dart'; import 'package:riverpod/riverpod.dart'; import 'package:shelf/shelf.dart'; import 'package:test/test.dart'; import 'extensions.dart'; import 'mocks/mock_database.dart'; void main() { late MockDatabase database; late Handler testHandler; late TaskEither defaultUser; setUpAll( () async { database = MockDatabase(); final container = ProviderContainer( overrides: [ // Add any overrides here databaseProvider.overrideWithValue(database), ], ); // Load the router from the router file testHandler = Pipeline() .addMiddleware(logRequests()) // Logs all incoming requests .addHandler(getRouter(container).call); }, ); setUp( () async { database.clear(); // Clear the database before each test defaultUser = database.users.create(UserCreate( email: 'user@example.com', password: 'password', name: 'John Doe1', )); }, ); test('Check health', () async { final response = await testHandler(Request('GET', Uri.parse('http://localhost/health'))); expect(response.statusCode, 200, reason: 'Server health is abnormal'); }); test('Login', () async { final user = await defaultUser.get; if (user == null) { fail('User creation failed'); } final responseLogin = await testHandler(Request( 'POST', Uri.parse('http://localhost/api/auth/login'), headers: { 'Content-Type': 'application/json', }, body: jsonEncode( { 'email': user.email, 'password': 'password', }, ), )); expect(responseLogin.statusCode, 200, reason: 'Login failed'); expect(responseLogin.headers['Set-Cookie'], isNotNull, reason: 'Cookies not found'); expect(extractSessionTokenFromCookie(responseLogin.headers['Set-Cookie']), isNotEmpty, reason: 'Session token not found'); }); test('Logout', () async { final token = await createLoggedInToken(await defaultUser.get, testHandler); if (token == null) { fail('User creation failed'); } final responseLogout = await testHandler(Request( 'POST', Uri.parse('http://localhost/api/auth/logout'), headers: { 'Content-Type': 'application/json', 'Cookie': 'session_token=$token', }, )); expect(responseLogout.statusCode, 200, reason: 'Logout failed'); final responseLogout2 = await testHandler(Request( 'POST', Uri.parse('http://localhost/api/auth/logout'), headers: { 'Content-Type': 'application/json', 'Cookie': 'session_token=$token', }, )); expect(responseLogout2.statusCode, 401, reason: 'Logout should fail'); }); test('CreateUser', () async { final token = await createLoggedInToken(await defaultUser.get, testHandler); final userCreate = UserCreateDto( email: 'user@example.com', password: 'password', name: 'John Doe1', ); final responseCreate = await testHandler(Request( 'POST', Uri.parse('http://localhost/api/users/'), headers: { 'Content-Type': 'application/json', 'Cookie': 'session_token=$token', }, body: jsonEncode(userCreate.toJson()), )); expect(responseCreate.statusCode, 200, reason: 'User creation failed'); }); test('GetUser', () async { final token = await createLoggedInToken(await defaultUser.get, testHandler); final newUser = await database.users .create(UserCreate( email: 'user@example.com', password: 'password', name: 'John Doe1', )) .get; if (newUser == null) { fail('User creation failed'); } final responseCreate = await testHandler(Request( 'GET', Uri.parse('http://localhost/api/users/${newUser.id}'), headers: { 'Cookie': 'session_token=$token', }, )); expect(responseCreate.statusCode, 200, reason: 'User creation failed'); }); }