153 lines
4.4 KiB
Dart

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<IError, User> 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: <String, String>{
'Content-Type': 'application/json',
},
body: jsonEncode(
<String, String>{
'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: <String, String>{
'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: <String, String>{
'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: <String, String>{
'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: <String, String>{
'Cookie': 'session_token=$token',
},
));
expect(responseCreate.statusCode, 200, reason: 'User creation failed');
});
}