Skip to content

Commit d77745e

Browse files
committed
Implement tests using pytest
1 parent 27880df commit d77745e

File tree

4 files changed

+86
-0
lines changed

4 files changed

+86
-0
lines changed

.github/workflows/pr-build.yml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,20 @@ jobs:
1515
- name: Checkout code
1616
uses: actions/checkout@master
1717

18+
- name: Set up Python
19+
uses: actions/setup-python@v5
20+
with:
21+
python-version: "3.10"
22+
23+
- name: Install dependencies
24+
run: |
25+
python -m pip install --upgrade pip
26+
pip install -r requirements.txt
27+
28+
- name: Run tests with pytest
29+
run: |
30+
pytest --tb=short --disable-warnings
31+
1832
- name: Install doctl
1933
uses: digitalocean/action-doctl@v2
2034
with:

pytest.ini

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[pytest]
2+
filterwarnings =
3+
ignore::DeprecationWarning:flask_caching.*

requirements.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,3 +42,6 @@ environs==14.1.1
4242
# Async tasks
4343
celery==5.5.2
4444
redis==6.1.0
45+
46+
# Testing
47+
pytest==8.3.5

tests/test_views.py

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
# -*- coding: utf-8 -*-
2+
"""API unit tests."""
3+
4+
import pytest
5+
from flask import Flask
6+
from api.extensions import cache
7+
from unittest.mock import patch, MagicMock
8+
from api.views import blueprint
9+
10+
11+
12+
@pytest.fixture
13+
def app():
14+
app = Flask(__name__)
15+
app.register_blueprint(blueprint)
16+
app.config['TESTING'] = True
17+
app.config['CACHE_TYPE'] = 'SimpleCache' # Use simple cache for testing
18+
cache.init_app(app)
19+
return app
20+
21+
@pytest.fixture
22+
def client(app):
23+
return app.test_client()
24+
25+
def test_index(client):
26+
resp = client.get("/")
27+
assert resp.status_code == 200
28+
assert b"Template-flask-app is Running" in resp.data
29+
30+
def test_cached_time(client):
31+
resp = client.get("/time")
32+
assert resp.status_code == 200
33+
data = resp.get_json()
34+
assert "current_time" in data
35+
36+
def test_uncached_time(client):
37+
resp = client.get("/uncached-time")
38+
assert resp.status_code == 200
39+
data = resp.get_json()
40+
assert "current_time" in data
41+
42+
@patch("api.views.create_task")
43+
def test_run_task_with_time_param(mock_create_task, client):
44+
mock_task = MagicMock()
45+
mock_task.id = "fake-task-id"
46+
mock_create_task.delay.return_value = mock_task
47+
48+
resp = client.get("/run-task?time=5")
49+
assert resp.status_code == 200
50+
data = resp.get_json()
51+
assert data["task_id"] == "fake-task-id"
52+
assert data["status"] == "Task submitted!"
53+
mock_create_task.delay.assert_called_with("5")
54+
55+
@patch("api.views.create_task")
56+
def test_run_task_without_time_param(mock_create_task, client):
57+
mock_task = MagicMock()
58+
mock_task.id = "fake-task-id"
59+
mock_create_task.delay.return_value = mock_task
60+
61+
resp = client.get("/run-task")
62+
assert resp.status_code == 200
63+
data = resp.get_json()
64+
assert data["task_id"] == "fake-task-id"
65+
assert data["status"] == "Task submitted!"
66+
mock_create_task.delay.assert_called_with(10)

0 commit comments

Comments
 (0)