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.