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')