Skip to content

Commit 72d0596

Browse files
authored
Feature/getjoke (#143)
1 parent 1048956 commit 72d0596

File tree

12 files changed

+484
-3
lines changed

12 files changed

+484
-3
lines changed

app/database/models.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,13 @@ def __repr__(self):
382382
)
383383

384384

385+
class Joke(Base):
386+
__tablename__ = "jokes"
387+
388+
id = Column(Integer, primary_key=True, index=True)
389+
text = Column(String, nullable=False)
390+
391+
385392
# insert language data
386393

387394
# Credit to adrihanu https://stackoverflow.com/users/9127249/adrihanu

app/internal/jokes.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
from typing import Dict, Optional
2+
3+
from sqlalchemy.orm import Session
4+
from sqlalchemy.sql.expression import func
5+
6+
from app.database.models import Joke
7+
8+
9+
def get_joke(joke_: Dict[str, Optional[str]]) -> Joke:
10+
"""Returns a Joke object from the dictionary data.
11+
12+
Args:
13+
joke_: A dictionary joke related information.
14+
15+
Returns:
16+
A new Joke object.
17+
"""
18+
return Joke(
19+
text=joke_['text'],
20+
)
21+
22+
23+
def get_a_joke(session: Session):
24+
return session.query(Joke).order_by(func.random()).first()

app/internal/json_data_loader.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
from loguru import logger
66
from sqlalchemy.orm import Session
77

8-
from app.database.models import Base, Quote, Zodiac
9-
from app.internal import daily_quotes, zodiac
8+
from app.database.models import Base, Joke, Quote, Zodiac
9+
from app.internal import daily_quotes, jokes, zodiac
1010

1111

1212
def load_to_database(session: Session) -> None:
@@ -35,6 +35,13 @@ def load_to_database(session: Session) -> None:
3535
daily_quotes.get_quote,
3636
)
3737

38+
_insert_into_database(
39+
session,
40+
'app/resources/jokes.json',
41+
Joke,
42+
jokes.get_joke,
43+
)
44+
3845

3946
def _insert_into_database(
4047
session: Session,

app/main.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ def create_tables(engine, psql_environment):
4242
from app.routers import ( # noqa: E402
4343
about_us, agenda, calendar, categories, celebrity, credits,
4444
currency, dayview, email, event, export, four_o_four, friendview,
45-
google_connect, invitation, login, logout, profile,
45+
google_connect, invitation, joke, login, logout, profile,
4646
register, search, telegram, user, weekview, whatsapp,
4747
)
4848

@@ -82,6 +82,7 @@ async def swagger_ui_redirect():
8282
four_o_four.router,
8383
google_connect.router,
8484
invitation.router,
85+
joke.router,
8586
login.router,
8687
logout.router,
8788
profile.router,

app/resources/jokes.json

Lines changed: 368 additions & 0 deletions
Large diffs are not rendered by default.

app/routers/joke.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from fastapi import APIRouter, Depends, Request
2+
from app.internal import jokes
3+
from sqlalchemy.orm import Session
4+
from app.dependencies import get_db
5+
6+
7+
router = APIRouter()
8+
9+
10+
@router.get("/joke")
11+
async def joke(request: Request, db: Session = Depends(get_db)):
12+
return jokes.get_a_joke(db)

app/static/joke.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
function makejoke() {
2+
fetch('/joke')
3+
.then(response => response.json())
4+
.then(data => Swal.fire(data.text));
5+
}
6+
7+
8+
function addEventsAfterPageLoaded() {
9+
const element = document.getElementById("a-joke");
10+
element.addEventListener("click", makejoke, false);
11+
}
12+
13+
14+
document.addEventListener("DOMContentLoaded", addEventsAfterPageLoaded);

app/templates/base.html

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@
5555
<li class="nav-item">
5656
<a class="nav-link" href="{{ url_for('friendview') }}">Friend View</a>
5757
</li>
58+
<li class="nav-item">
59+
<button id="a-joke" class="btn btn-link">Make me Laugh</button>
60+
</li>
5861
<li class="nav-item">
5962
<a class="nav-link" href="{{ url_for('about') }}">{{ gettext("About Us") }}</a>
6063
</li>
@@ -75,6 +78,9 @@
7578
<!-- This bootstrap version is needed here because of the toggler bug in the beta version-->
7679
<script src="https://stackpath.bootstrapcdn.com/bootstrap/5.0.0-alpha2/js/bootstrap.bundle.min.js" integrity="sha384-BOsAfwzjNJHrJ8cZidOg56tcQWfp6y72vEJ8xQ9w6Quywb24iOsW913URv1IS4GD" crossorigin="anonymous"></script>
7780
<script src="{{ url_for('static', path='/horoscope.js') }}"></script>
81+
<script src="{{ url_for('static', path='/joke.js') }}"></script>
82+
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@10"></script>
83+
7884
</body>
7985

8086
</html>

tests/conftest.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
'smtpdfix',
2121
'tests.quotes_fixture',
2222
'tests.zodiac_fixture',
23+
'tests.jokes_fixture',
2324
'tests.comment_fixture',
2425
]
2526

tests/jokes_fixture.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import pytest
2+
from sqlalchemy.orm import Session
3+
4+
from app.database.models import Joke
5+
from app.internal.utils import create_model, delete_instance
6+
7+
8+
def add_joke(session: Session, id_joke: int, text: str) -> Joke:
9+
joke = create_model(session, Joke, id=id_joke, text=text)
10+
yield joke
11+
delete_instance(session, joke)
12+
13+
14+
@pytest.fixture
15+
def joke(session: Session) -> Joke:
16+
yield from add_joke(
17+
session=session,
18+
id_joke=1,
19+
text='Chuck Norris can slam a revolving door.',
20+
)

tests/test_joke.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
from app.database.models import Joke
2+
from app.internal import jokes
3+
4+
5+
def get_jokes_amount(session):
6+
return session.query(Joke).count()
7+
8+
9+
def test_get_a_joke(session, joke):
10+
assert jokes.get_a_joke(session).text == joke.text
11+
12+
13+
def test_jokes_not_load_twice_to_db(session):
14+
jokes.get_a_joke(session)
15+
first_load_amount = get_jokes_amount(session)
16+
jokes.get_a_joke(session)
17+
assert first_load_amount == get_jokes_amount(session)

tests/test_joke_route.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
def test_joke(client, session):
2+
resp = client.get('/joke')
3+
assert resp.ok
4+
assert resp.json

0 commit comments

Comments
 (0)