backend.tests.api.test_worker_controller
1import pytest 2import io 3from datetime import datetime 4from types import SimpleNamespace 5from unittest.mock import patch, MagicMock 6 7 8# --- Testy GET /api/workers --- 9 10@patch('backend.components.workers.workerController.get_all_workers') 11def test_get_all_workers_empty(mock_get_all, client): 12 """Test for downloading the employee list when the database is empty.""" 13 mock_get_all.return_value = [] 14 response = client.get('/api/workers') 15 assert response.status_code == 200 16 assert response.json == [] 17 18 19@patch('backend.components.workers.workerController.get_all_workers') 20def test_get_all_workers_populated(mock_get_all, client): 21 """Test for downloading a list of employees with data.""" 22 # Używamy SimpleNamespace 23 fake_worker = SimpleNamespace( 24 id=1, 25 name="Jan Kowalski", 26 expiration_date=datetime(2030, 1, 1) 27 ) 28 29 mock_get_all.return_value = [fake_worker] 30 31 response = client.get('/api/workers') 32 assert response.status_code == 200 33 data = response.json 34 assert isinstance(data, list) 35 assert len(data) == 1 36 assert data[0]['name'] == "Jan Kowalski" 37 38 39@patch('backend.components.workers.workerController.get_worker_by_id') 40def test_get_single_worker_success(mock_get_by_id, client): 41 """Test for downloading a single employee by ID.""" 42 fake_worker = SimpleNamespace( 43 id=1, 44 name="Jan Kowalski", 45 expiration_date=datetime(2030, 1, 1) 46 ) 47 48 mock_get_by_id.return_value = fake_worker 49 50 response = client.get('/api/workers/1') 51 assert response.status_code == 200 52 assert response.json['name'] == "Jan Kowalski" 53 54 55@patch('backend.components.workers.workerController.get_worker_by_id') 56def test_get_single_worker_not_found(mock_get_by_id, client): 57 """ 58 Test for a 404 error. 59 Mock returns None, which (if it doesn't throw a ValueError in the service) will trigger an 'if not worker' in the controller. 60 """ 61 mock_get_by_id.return_value = None 62 63 response = client.get('/api/workers/999') 64 assert response.status_code == 404 65 66 67# --- Testy POST /api/workers (Tworzenie) --- 68 69@patch('backend.components.workers.workerController.parse_image') 70@patch('backend.components.workers.workerController.create_worker') 71def test_create_worker_success(mock_create_worker, mock_parse_image, client): 72 """Test for correct employee creation.""" 73 mock_parse_image.return_value = "fake_image_array" 74 75 fake_worker = SimpleNamespace( 76 id=1, 77 name="Test Worker", 78 expiration_date=datetime(2030, 1, 1) 79 ) 80 mock_create_worker.return_value = fake_worker 81 82 data = { 83 'name': 'Test Worker', 84 'expiration_date': '2030-01-01T00:00:00', 85 'file': (io.BytesIO(b"fake_image_content"), 'face.jpg') 86 } 87 88 response = client.post( 89 '/api/workers', 90 data=data, 91 content_type='multipart/form-data' 92 ) 93 94 assert response.status_code == 200 95 assert response.json['name'] == 'Test Worker' 96 97 98def test_create_worker_missing_data(client): 99 """Missing data validation test.""" 100 data = {'name': 'Incomplete Worker'} # Brak pliku 101 response = client.post( 102 '/api/workers', 103 data=data, 104 content_type='multipart/form-data' 105 ) 106 assert response.status_code == 400 107 108 109# --- Testy PUT /api/workers/<id> (Aktualizacja) --- 110 111@patch('backend.components.workers.workerController.get_worker_by_id') 112@patch('backend.components.workers.workerController.update_worker_name') 113@patch('backend.components.workers.workerController.extend_worker_expiration') 114def test_update_worker_success(mock_extend, mock_update_name, mock_get_by_id, client): 115 """Employee update test.""" 116 fake_worker = SimpleNamespace( 117 id=1, 118 name="Old Name", 119 expiration_date=datetime(2030, 1, 1) 120 ) 121 mock_get_by_id.return_value = fake_worker 122 123 data = { 124 'name': 'New Name', 125 'expiration_date': '2035-01-01T00:00:00' 126 } 127 128 response = client.put( 129 '/api/workers/1', 130 data=data, 131 content_type='multipart/form-data' 132 ) 133 134 assert response.status_code == 200 135 # Sprawdzamy czy mocki serwisów zostały wywołane z naszym obiektem 136 mock_update_name.assert_called_with(fake_worker, 'New Name') 137 mock_extend.assert_called() 138 139 140@patch('backend.components.workers.workerController.get_worker_by_id') 141def test_update_worker_not_found(mock_get_by_id, client): 142 """Test to update a non-existent employee.""" 143 mock_get_by_id.return_value = None 144 response = client.put('/api/workers/999', data={'name': 'Ghost'}) 145 assert response.status_code == 404 146 147 148# --- Testy PUT /api/workers/invalidate/<id> --- 149 150@patch('backend.components.workers.workerController.get_worker_by_id') 151@patch('backend.components.workers.workerController.extend_worker_expiration') 152def test_invalidate_worker(mock_extend, mock_get_by_id, client): 153 """Employee invalidation test.""" 154 fake_worker = SimpleNamespace( 155 id=1, 156 name="Jan Kowalski", 157 expiration_date=datetime(2030, 1, 1) 158 ) 159 mock_get_by_id.return_value = fake_worker 160 161 response = client.put('/api/workers/invalidate/1') 162 163 assert response.status_code == 200 164 mock_extend.assert_called() 165 166 167@patch('backend.components.workers.workerController.get_worker_by_id') 168def test_invalidate_worker_not_found(mock_get_by_id, client): 169 """Test to invalidate a non-existent employee.""" 170 mock_get_by_id.return_value = None 171 response = client.put('/api/workers/invalidate/999') 172 assert response.status_code == 404 173 174 175# --- Testy GET /api/workers/entrypass/<id> --- 176 177@patch('backend.components.workers.workerController.generate_worker_entry_pass') 178@patch('backend.components.workers.workerController.get_worker_by_id') 179def test_get_worker_entry_pass(mock_get_by_id, mock_generate, client): 180 """Pass download test.""" 181 fake_worker = SimpleNamespace(id=1) 182 mock_get_by_id.return_value = fake_worker 183 mock_generate.return_value = b"fake_png_bytes" 184 185 response = client.get('/api/workers/entrypass/1') 186 187 assert response.status_code == 200 188 assert response.mimetype == 'image/png' 189 190 191@patch('backend.components.workers.workerController.get_worker_by_id') 192def test_get_worker_entry_pass_not_found(mock_get_by_id, client): 193 """ Test to download a pass for a non-existent employee. """ 194 mock_get_by_id.return_value = None 195 response = client.get('/api/workers/entrypass/999') 196 assert response.status_code == 404
@patch('backend.components.workers.workerController.get_all_workers')
def
test_get_all_workers_empty(mock_get_all, client):
11@patch('backend.components.workers.workerController.get_all_workers') 12def test_get_all_workers_empty(mock_get_all, client): 13 """Test for downloading the employee list when the database is empty.""" 14 mock_get_all.return_value = [] 15 response = client.get('/api/workers') 16 assert response.status_code == 200 17 assert response.json == []
Test for downloading the employee list when the database is empty.
@patch('backend.components.workers.workerController.get_all_workers')
def
test_get_all_workers_populated(mock_get_all, client):
20@patch('backend.components.workers.workerController.get_all_workers') 21def test_get_all_workers_populated(mock_get_all, client): 22 """Test for downloading a list of employees with data.""" 23 # Używamy SimpleNamespace 24 fake_worker = SimpleNamespace( 25 id=1, 26 name="Jan Kowalski", 27 expiration_date=datetime(2030, 1, 1) 28 ) 29 30 mock_get_all.return_value = [fake_worker] 31 32 response = client.get('/api/workers') 33 assert response.status_code == 200 34 data = response.json 35 assert isinstance(data, list) 36 assert len(data) == 1 37 assert data[0]['name'] == "Jan Kowalski"
Test for downloading a list of employees with data.
@patch('backend.components.workers.workerController.get_worker_by_id')
def
test_get_single_worker_success(mock_get_by_id, client):
40@patch('backend.components.workers.workerController.get_worker_by_id') 41def test_get_single_worker_success(mock_get_by_id, client): 42 """Test for downloading a single employee by ID.""" 43 fake_worker = SimpleNamespace( 44 id=1, 45 name="Jan Kowalski", 46 expiration_date=datetime(2030, 1, 1) 47 ) 48 49 mock_get_by_id.return_value = fake_worker 50 51 response = client.get('/api/workers/1') 52 assert response.status_code == 200 53 assert response.json['name'] == "Jan Kowalski"
Test for downloading a single employee by ID.
@patch('backend.components.workers.workerController.get_worker_by_id')
def
test_get_single_worker_not_found(mock_get_by_id, client):
56@patch('backend.components.workers.workerController.get_worker_by_id') 57def test_get_single_worker_not_found(mock_get_by_id, client): 58 """ 59 Test for a 404 error. 60 Mock returns None, which (if it doesn't throw a ValueError in the service) will trigger an 'if not worker' in the controller. 61 """ 62 mock_get_by_id.return_value = None 63 64 response = client.get('/api/workers/999') 65 assert response.status_code == 404
Test for a 404 error. Mock returns None, which (if it doesn't throw a ValueError in the service) will trigger an 'if not worker' in the controller.
@patch('backend.components.workers.workerController.parse_image')
@patch('backend.components.workers.workerController.create_worker')
def
test_create_worker_success(mock_create_worker, mock_parse_image, client):
70@patch('backend.components.workers.workerController.parse_image') 71@patch('backend.components.workers.workerController.create_worker') 72def test_create_worker_success(mock_create_worker, mock_parse_image, client): 73 """Test for correct employee creation.""" 74 mock_parse_image.return_value = "fake_image_array" 75 76 fake_worker = SimpleNamespace( 77 id=1, 78 name="Test Worker", 79 expiration_date=datetime(2030, 1, 1) 80 ) 81 mock_create_worker.return_value = fake_worker 82 83 data = { 84 'name': 'Test Worker', 85 'expiration_date': '2030-01-01T00:00:00', 86 'file': (io.BytesIO(b"fake_image_content"), 'face.jpg') 87 } 88 89 response = client.post( 90 '/api/workers', 91 data=data, 92 content_type='multipart/form-data' 93 ) 94 95 assert response.status_code == 200 96 assert response.json['name'] == 'Test Worker'
Test for correct employee creation.
def
test_create_worker_missing_data(client):
99def test_create_worker_missing_data(client): 100 """Missing data validation test.""" 101 data = {'name': 'Incomplete Worker'} # Brak pliku 102 response = client.post( 103 '/api/workers', 104 data=data, 105 content_type='multipart/form-data' 106 ) 107 assert response.status_code == 400
Missing data validation test.
@patch('backend.components.workers.workerController.get_worker_by_id')
@patch('backend.components.workers.workerController.update_worker_name')
@patch('backend.components.workers.workerController.extend_worker_expiration')
def
test_update_worker_success(mock_extend, mock_update_name, mock_get_by_id, client):
112@patch('backend.components.workers.workerController.get_worker_by_id') 113@patch('backend.components.workers.workerController.update_worker_name') 114@patch('backend.components.workers.workerController.extend_worker_expiration') 115def test_update_worker_success(mock_extend, mock_update_name, mock_get_by_id, client): 116 """Employee update test.""" 117 fake_worker = SimpleNamespace( 118 id=1, 119 name="Old Name", 120 expiration_date=datetime(2030, 1, 1) 121 ) 122 mock_get_by_id.return_value = fake_worker 123 124 data = { 125 'name': 'New Name', 126 'expiration_date': '2035-01-01T00:00:00' 127 } 128 129 response = client.put( 130 '/api/workers/1', 131 data=data, 132 content_type='multipart/form-data' 133 ) 134 135 assert response.status_code == 200 136 # Sprawdzamy czy mocki serwisów zostały wywołane z naszym obiektem 137 mock_update_name.assert_called_with(fake_worker, 'New Name') 138 mock_extend.assert_called()
Employee update test.
@patch('backend.components.workers.workerController.get_worker_by_id')
def
test_update_worker_not_found(mock_get_by_id, client):
141@patch('backend.components.workers.workerController.get_worker_by_id') 142def test_update_worker_not_found(mock_get_by_id, client): 143 """Test to update a non-existent employee.""" 144 mock_get_by_id.return_value = None 145 response = client.put('/api/workers/999', data={'name': 'Ghost'}) 146 assert response.status_code == 404
Test to update a non-existent employee.
@patch('backend.components.workers.workerController.get_worker_by_id')
@patch('backend.components.workers.workerController.extend_worker_expiration')
def
test_invalidate_worker(mock_extend, mock_get_by_id, client):
151@patch('backend.components.workers.workerController.get_worker_by_id') 152@patch('backend.components.workers.workerController.extend_worker_expiration') 153def test_invalidate_worker(mock_extend, mock_get_by_id, client): 154 """Employee invalidation test.""" 155 fake_worker = SimpleNamespace( 156 id=1, 157 name="Jan Kowalski", 158 expiration_date=datetime(2030, 1, 1) 159 ) 160 mock_get_by_id.return_value = fake_worker 161 162 response = client.put('/api/workers/invalidate/1') 163 164 assert response.status_code == 200 165 mock_extend.assert_called()
Employee invalidation test.
@patch('backend.components.workers.workerController.get_worker_by_id')
def
test_invalidate_worker_not_found(mock_get_by_id, client):
168@patch('backend.components.workers.workerController.get_worker_by_id') 169def test_invalidate_worker_not_found(mock_get_by_id, client): 170 """Test to invalidate a non-existent employee.""" 171 mock_get_by_id.return_value = None 172 response = client.put('/api/workers/invalidate/999') 173 assert response.status_code == 404
Test to invalidate a non-existent employee.
@patch('backend.components.workers.workerController.generate_worker_entry_pass')
@patch('backend.components.workers.workerController.get_worker_by_id')
def
test_get_worker_entry_pass(mock_get_by_id, mock_generate, client):
178@patch('backend.components.workers.workerController.generate_worker_entry_pass') 179@patch('backend.components.workers.workerController.get_worker_by_id') 180def test_get_worker_entry_pass(mock_get_by_id, mock_generate, client): 181 """Pass download test.""" 182 fake_worker = SimpleNamespace(id=1) 183 mock_get_by_id.return_value = fake_worker 184 mock_generate.return_value = b"fake_png_bytes" 185 186 response = client.get('/api/workers/entrypass/1') 187 188 assert response.status_code == 200 189 assert response.mimetype == 'image/png'
Pass download test.
@patch('backend.components.workers.workerController.get_worker_by_id')
def
test_get_worker_entry_pass_not_found(mock_get_by_id, client):
192@patch('backend.components.workers.workerController.get_worker_by_id') 193def test_get_worker_entry_pass_not_found(mock_get_by_id, client): 194 """ Test to download a pass for a non-existent employee. """ 195 mock_get_by_id.return_value = None 196 response = client.get('/api/workers/entrypass/999') 197 assert response.status_code == 404
Test to download a pass for a non-existent employee.