add tests and automated tests
Some checks failed
Deploy Bookshelf / deploy (push) Failing after 0s

This commit is contained in:
Julien Aldon
2026-01-29 10:45:41 +01:00
parent 84369911cd
commit 4639c6d900
7 changed files with 598 additions and 118 deletions

396
back/tests/test_main.py Normal file
View File

@@ -0,0 +1,396 @@
import pytest
from fastapi.testclient import TestClient
from unittest.mock import MagicMock, patch, ANY
from ..main import app, get_current_user
from ..database import get_db
def override_get_db():
mock_db = MagicMock()
mock_cursor = MagicMock()
mock_cursor.fetchone.return_value = {}
mock_db.cursor.return_value.__enter__.return_value = mock_cursor
yield mock_db
def override_get_user(user):
return user
app.dependency_overrides[get_db] = override_get_db
class TestBooks:
test_success_payload = {
'title': '1984',
'author': 'George Orwell',
'type': 'novel',
'editor': 'Secker & Warburg'
}
test_error_payload = {
'title': 1984,
'author': 'George Orwell',
'type': 'novel',
'editor': 'Secker & Warburg'
}
mock_result = {
'id': 1,
**test_success_payload
}
def test_create_book_success(self):
def override_get_user():
return {'username': 'test'}
app.dependency_overrides[get_current_user] = override_get_user
client = TestClient(app)
with patch('back.main.add_book', MagicMock(return_value=self.mock_result)) as mock_add_book:
response = client.post('/api/books', json=self.test_success_payload)
assert response.status_code == 200
assert response.json() == self.mock_result
mock_add_book.assert_called_once_with(ANY, self.test_success_payload)
def test_create_book_unauthorized(self):
def override_get_user():
return None
app.dependency_overrides[get_current_user] = override_get_user
client = TestClient(app)
response = client.post('/api/books', json=self.test_success_payload)
assert response.status_code == 401
assert response.json()['detail'] == 'User not allowed'
def test_create_book_error_request(self):
def override_get_user():
return {'username': 'test'}
app.dependency_overrides[get_current_user] = override_get_user
client = TestClient(app)
with patch('back.main.add_book', MagicMock(return_value=None)) as mock_add_book:
response = client.post('/api/books', json=self.test_success_payload)
assert response.status_code == 400
assert response.json()['detail'] == 'Error with request, database may be offline'
def test_create_book_wrong_body(self):
def override_get_user():
return {'username': 'test'}
app.dependency_overrides[get_current_user] = override_get_user
client = TestClient(app)
with patch('back.main.add_book', MagicMock(return_value=self.mock_result)) as mock_add_book:
response = client.post('/api/books', json=self.test_error_payload)
assert response.status_code == 422
assert response.json()['detail'] == [{'input': 1984, 'loc': ['body', 'title'], 'msg': 'Input should be a valid string', 'type': 'string_type'}]
def test_get_book_success(self):
def override_get_user():
return {'username': 'test'}
app.dependency_overrides[get_current_user] = override_get_user
client = TestClient(app)
with patch('back.main.get_books', MagicMock(return_value=([self.mock_result], [{'count': 1}]))) as mock_get_book:
response = client.get('/api/books')
assert response.status_code == 200
assert response.json() == {'result': [self.mock_result]}
mock_get_book.assert_called_once_with(ANY, 0, limit=50, search='')
def test_get_book_unauthorized(self):
def override_get_user():
return None
app.dependency_overrides[get_current_user] = override_get_user
client = TestClient(app)
response = client.get('/api/books')
assert response.status_code == 401
assert response.json()['detail'] == 'User not allowed'
def test_get_book_error_request(self):
def override_get_user():
return {'username': 'test'}
app.dependency_overrides[get_current_user] = override_get_user
client = TestClient(app)
with patch('back.main.get_books', MagicMock(return_value=(False, None))) as mock_get_book:
response = client.get('/api/books')
assert response.status_code == 400
assert response.json()['detail'] == 'Error with request, database may be offline'
def test_update_book_success(self):
def override_get_user():
return {'username': 'test'}
app.dependency_overrides[get_current_user] = override_get_user
client = TestClient(app)
with patch('back.main.edit_book', MagicMock(return_value=True)) as mock_edit_book:
response = client.put('api/book/1', json=self.test_success_payload)
assert response.status_code == 200
assert response.json() == True
mock_edit_book.assert_called_once_with(ANY, '1', self.test_success_payload)
def test_update_book_unothorized(self):
def override_get_user():
return None
app.dependency_overrides[get_current_user] = override_get_user
client = TestClient(app)
response = client.put('api/book/1', json=self.test_success_payload)
assert response.status_code == 401
assert response.json()['detail'] == 'User not allowed'
def test_update_book_error_request(self):
def override_get_user():
return {'username': 'test'}
app.dependency_overrides[get_current_user] = override_get_user
client = TestClient(app)
with patch('back.main.edit_book', MagicMock(return_value=None)) as mock_edit_book:
response = client.put('api/book/1', json=self.test_success_payload)
assert response.status_code == 400
assert response.json()['detail'] == 'Error with request, database may be offline'
mock_edit_book.assert_called_once_with(ANY, '1', self.test_success_payload)
def test_update_book_error_body(self):
def override_get_user():
return {'username': 'test'}
app.dependency_overrides[get_current_user] = override_get_user
client = TestClient(app)
with patch('back.main.edit_book', MagicMock(return_value=False)) as mock_edit_book:
response = client.put('api/book/1', json=self.test_error_payload)
assert response.status_code == 422
def test_remove_book_success(self):
def override_get_user():
return {'username': 'test'}
app.dependency_overrides[get_current_user] = override_get_user
client = TestClient(app)
with patch('back.main.remove_book', MagicMock(return_value=True)) as mock_remove_book:
response = client.delete('api/book/1')
assert response.status_code == 200
assert response.json() == True
mock_remove_book.assert_called_once_with(ANY, '1')
def test_remove_book_unauthorized(self):
def override_get_user():
return None
app.dependency_overrides[get_current_user] = override_get_user
client = TestClient(app)
response = client.delete('api/book/1')
assert response.status_code == 401
assert response.json()['detail'] == 'User not allowed'
def test_remove_book_error_request(self):
def override_get_user():
return {'username': 'test'}
app.dependency_overrides[get_current_user] = override_get_user
client = TestClient(app)
with patch('back.main.remove_book', MagicMock(return_value=None)) as mock_remove_book:
response = client.delete('api/book/1')
assert response.status_code == 400
assert response.json()['detail'] == 'Error with request, database may be offline'
mock_remove_book.assert_called_once_with(ANY, '1')
class TestFilms:
test_success_payload = {
'title': 'Harry Potter and the Half-Blood Prince',
'director': 'David Yates',
'producer': 'David Heyman',
'actors': 'Daniel Radcliffe, Rupert Grint, Emma Watson',
'length': 153,
'type': 'action'
}
test_error_payload = {
'title': 1234,
'director': 'David Yates',
'producer': 'David Heyman',
'actors': 'Daniel Radcliffe, Rupert Grint, Emma Watson',
'length': '153',
'type': 'action'
}
mock_result = {
'id': 1,
**test_success_payload
}
def test_create_film_success(self):
def override_get_user():
return {'username': 'test'}
app.dependency_overrides[get_current_user] = override_get_user
client = TestClient(app)
with patch('back.main.add_film', MagicMock(return_value=True)) as mock_add_film:
response = client.post('api/films', json=self.test_success_payload)
assert response.status_code == 200
assert response.json() == True
mock_add_film.assert_called_once_with(ANY, self.test_success_payload)
def test_create_film_unauthorized(self):
def override_get_user():
return None
app.dependency_overrides[get_current_user] = override_get_user
client = TestClient(app)
response = client.post('api/films', json=self.test_success_payload)
assert response.status_code == 401
assert response.json()['detail'] == 'User not allowed'
def test_create_film_error_request(self):
def override_get_user():
return {'username': 'test'}
app.dependency_overrides[get_current_user] = override_get_user
client = TestClient(app)
with patch('back.main.add_film', MagicMock(return_value=None)) as mock_add_film:
response = client.post('api/films', json=self.test_success_payload)
assert response.status_code == 400
mock_add_film.assert_called_once_with(ANY, self.test_success_payload)
def test_create_film_error_body(self):
def override_get_user():
return {'username': 'test'}
app.dependency_overrides[get_current_user] = override_get_user
client = TestClient(app)
response = client.post('api/films', json=self.test_error_payload)
assert response.status_code == 422
def test_read_film_success(self):
def override_get_user():
return {'username': 'test'}
app.dependency_overrides[get_current_user] = override_get_user
client = TestClient(app)
with patch('back.main.get_films', MagicMock(return_value=True)) as mock_read_book:
response = client.get('api/films')
assert response.status_code == 200
assert response.json() == True
mock_read_book.assert_called_once_with(ANY, 0, limit=50)
def test_read_film_unauthorized(self):
def override_get_user():
return None
app.dependency_overrides[get_current_user] = override_get_user
client = TestClient(app)
response = client.get('api/films')
assert response.status_code == 401
assert response.json()['detail'] == 'User not allowed'
def test_read_film_error_request(self):
def override_get_user():
return {'username': 'test'}
app.dependency_overrides[get_current_user] = override_get_user
client = TestClient(app)
with patch('back.main.get_films', MagicMock(return_value=None)) as mock_read_book:
response = client.get('api/films')
assert response.status_code == 400
mock_read_book.assert_called_once_with(ANY, 0, limit=50)
def test_update_film_success(self):
def override_get_user():
return {'username': 'test'}
app.dependency_overrides[get_current_user] = override_get_user
client = TestClient(app)
with patch('back.main.edit_film', MagicMock(return_value=True)) as mock_edit_film:
response = client.put('api/film/1', json=self.test_success_payload)
assert response.status_code == 200
assert response.json() == True
mock_edit_film.assert_called_once_with(ANY, '1', self.test_success_payload)
def test_update_film_unauthorized(self):
def override_get_user():
return None
app.dependency_overrides[get_current_user] = override_get_user
client = TestClient(app)
response = client.put('api/film/1', json=self.test_success_payload)
assert response.status_code == 401
assert response.json()['detail'] == 'User not allowed'
def test_update_film_error_request(self):
def override_get_user():
return {'username': 'test'}
app.dependency_overrides[get_current_user] = override_get_user
client = TestClient(app)
with patch('back.main.edit_film', MagicMock(return_value=None)) as mock_edit_film:
response = client.put('api/film/1', json=self.test_success_payload)
assert response.status_code == 400
mock_edit_film.assert_called_once_with(ANY, '1', self.test_success_payload)
def test_update_film_error_body(self):
def override_get_user():
return {'username': 'test'}
app.dependency_overrides[get_current_user] = override_get_user
client = TestClient(app)
response = client.put('api/film/1', json=self.test_error_payload)
assert response.status_code == 422
def test_delete_film_success(self):
def override_get_user():
return {'username': 'test'}
app.dependency_overrides[get_current_user] = override_get_user
client = TestClient(app)
with patch('back.main.remove_film', MagicMock(return_value=True)) as mock_remove_film:
response = client.delete('api/film/1')
assert response.status_code == 200
assert response.json() == True
mock_remove_film.assert_called_once_with(ANY, '1')
def test_delete_film_unauthorized(self):
def override_get_user():
return None
app.dependency_overrides[get_current_user] = override_get_user
client = TestClient(app)
response = client.delete('api/film/1')
assert response.status_code == 401
assert response.json()['detail'] == 'User not allowed'
def test_delete_film_error_request(self):
def override_get_user():
return {'username': 'test'}
app.dependency_overrides[get_current_user] = override_get_user
client = TestClient(app)
with patch('back.main.remove_film', MagicMock(return_value=None)) as mock_remove_film:
response = client.delete('api/film/1')
assert response.status_code == 400
mock_remove_film.assert_called_once_with(ANY, '1')