Test Server Endpoints

This commit is contained in:
Jean Jacques Avril 2025-01-04 17:41:12 +00:00
parent d4bf238f50
commit 01a603b8d4
No known key found for this signature in database
5 changed files with 203 additions and 3 deletions

View File

@ -57,7 +57,7 @@ class ResponseHelpers {
static Response fromError(IError error) { static Response fromError(IError error) {
// Print error to console // Print error to console
print('Error: ${error.code.name} - ${error.message}'); print('ErrorResponse: ${error.code.name} - ${error.message}');
//print(error.stackTrace); //print(error.stackTrace);
return Response( return Response(
mapErrorCodeToHttpStatus(error.code), mapErrorCodeToHttpStatus(error.code),

View File

@ -5,6 +5,5 @@ import 'package:crypto/crypto.dart';
String generateSecureHash(String input) { String generateSecureHash(String input) {
final bytes = utf8.encode(input); final bytes = utf8.encode(input);
final hash = sha256.convert(bytes); final hash = sha256.convert(bytes);
print(hash);
return hash.toString(); return hash.toString();
} }

View File

@ -1,7 +1,8 @@
import 'package:backend_dart/domain/data/database.dart';
import 'package:backend_dart/infrastructure/data/prisma_database.dart'; import 'package:backend_dart/infrastructure/data/prisma_database.dart';
import 'package:riverpod/riverpod.dart'; import 'package:riverpod/riverpod.dart';
final databaseProvider = Provider<PrismaDatabase>((ref) { final databaseProvider = Provider<IDatabase>((ref) {
// Hier die Datenbankverbindung initialisieren // Hier die Datenbankverbindung initialisieren
final database = PrismaDatabase(); final database = PrismaDatabase();
return database; return database;

View File

@ -0,0 +1,48 @@
// get nullable
import 'dart:convert';
import 'package:backend_dart/domain/entities/user.dart';
import 'package:backend_dart/domain/errors/error.dart';
import 'package:fpdart/fpdart.dart';
import 'package:shelf/shelf.dart';
import 'package:test/test.dart';
extension NullableGet<T> on TaskEither<IError, T> {
// !THIS IS ONLY FOR TESTING PURPOSES!
Future<T?> get get {
return match((e) => null, identity).run();
}
}
String? extractSessionTokenFromCookie(String? token) {
if (token == null) return null;
final parts = token.split('=');
if (parts[0] == 'session_token' && parts[1].isNotEmpty) {
return parts[1];
}
return null;
}
Future<String?> createLoggedInToken(
User? user,
Handler handler, {
String password = 'password',
}) async {
if (user == null) {
fail('User creation failed');
}
final responseLogin = await handler(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,
},
),
));
return extractSessionTokenFromCookie(responseLogin.headers['Set-Cookie']);
}

View File

@ -0,0 +1,152 @@
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');
});
}