Skip to content

Commit

Permalink
Merge pull request #978 from SundayMba/bugfix/squeeze_fix
Browse files Browse the repository at this point in the history
fix: added email service to squeeze sign up
  • Loading branch information
CodewithSegNet authored Aug 24, 2024
2 parents 0d0c333 + f764b97 commit dc8cc2a
Show file tree
Hide file tree
Showing 5 changed files with 101 additions and 13 deletions.
56 changes: 56 additions & 0 deletions api/core/dependencies/email/templates/squeeze.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
{% extends 'base.html' %}

{% block title %}Welcome{% endblock %}

{% block content %}
<table role="presentation" width="100%" style="padding: 3.5rem;">
<tr>
<td>
<div style="text-align: center; margin-bottom: 1.5rem;">
<h1 style="font-size: 1.5rem; color: #0A0A0A; font-weight: 600;">Welcome to Boilerplate Squeeze</h1>
<p style="font-size: 1.125rem; color: rgba(0, 0, 0, 0.8); font-weight: 500;">Thanks for signing up</p>
</div>

<div>
<p style="color: #111; font-size: 1.125rem; font-weight: 600;">Hi {{name}}</p>
<p style="color: rgba(17, 17, 17, 0.9); font-weight: 400;">Experience quality and innovation
like never before. Our product is made to fit your needs and make your
life easier.</p>
</div>

<div style="margin-bottom: 1.75rem;">
<h3 style="color: #0A0A0A; font-weight: 600;">Here's what you can look forward to.</h3>
<div style="margin-bottom: 1.25rem;">
<ul>
<li>
<span style="font-weight: 600;">Exclusive Offers:</span> Enjoy special promotions and
discounts available only to our members.
</li>
<li>
<span style="font-weight: 600;">Exclusive Offers:</span> Enjoy special promotions and
discounts available only to our members.
</li>
<li>
<span style="font-weight: 600;">Exclusive Offers:</span> Enjoy special promotions and
discounts available only to our members.
</li>
</ul>
</div>
</div>

<a href="{{cta_link}}" style="display: block; width: fit-content; padding: 0.5rem 2.5rem; background-color: #F97316; color: white; text-decoration: none; border-radius: 0.5rem; margin: 0 auto; text-align: center;">
Learn more about us
</a>

<!-- <div style="margin-top: 2rem;">
<p style="color: #111; font-size: 0.875rem; font-weight: 500;">Thank you for joining Boilerplate</p>
</div> -->

<div style="margin-top: 2rem;">
<p>Regards,</p>
<p>Boilerplate</p>
</div>
</td>
</tr>
</table>
{% endblock %}
5 changes: 3 additions & 2 deletions api/v1/routes/squeeze.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from fastapi import APIRouter, Depends, status
from fastapi import APIRouter, Depends, status, BackgroundTasks
from sqlalchemy.orm import Session
from api.db.database import get_db
from api.core.responses import SUCCESS
Expand All @@ -13,6 +13,7 @@

@squeeze.post("", response_model=success_response, status_code=201)
def create_squeeze(
background_tasks: BackgroundTasks,
data: CreateSqueeze,
db: Session = Depends(get_db),
current_user: User = Depends(user_service.get_current_super_admin),
Expand All @@ -23,7 +24,7 @@ def create_squeeze(
return success_response(status.HTTP_404_NOT_FOUND, "User not found!")
data.user_id = user.id
data.full_name = f"{user.first_name} {user.last_name}"
new_squeeze = squeeze_service.create(db, data)
new_squeeze = squeeze_service.create(background_tasks, db, data)
return success_response(status.HTTP_201_CREATED, SUCCESS, new_squeeze.to_dict())


Expand Down
17 changes: 15 additions & 2 deletions api/v1/services/squeeze.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
from fastapi import HTTPException
from fastapi import HTTPException, BackgroundTasks
from sqlalchemy.orm import Session
from api.core.base.services import Service
from api.v1.models.squeeze import Squeeze
from api.core.dependencies.email_sender import send_email
from api.v1.schemas.squeeze import CreateSqueeze, FilterSqueeze


class SqueezeService(Service):
"""Squeeze service"""

def create(self, db: Session, data: CreateSqueeze):
def create(self, background_tasks: BackgroundTasks, db: Session, data: CreateSqueeze):
"""Create squeeze page"""
new_squeeze = Squeeze(
title=data.title,
Expand All @@ -25,6 +26,18 @@ def create(self, db: Session, data: CreateSqueeze):
db.add(new_squeeze)
db.commit()
db.refresh(new_squeeze)
cta_link = 'https://anchor-python.teams.hng.tech/about-us'
background_tasks.add_task(
send_email,
recipient=data.email,
template_name='squeeze.html',
subject='Welcome to HNG Squeeze',
context={
'name': data.full_name,
'cta_link': cta_link
}
)

return new_squeeze

def fetch_all(self, db: Session, filter: FilterSqueeze = None):
Expand Down
18 changes: 13 additions & 5 deletions tests/v1/squeeze_page/test_create_squeeze.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
import pytest
from fastapi.testclient import TestClient
from main import app
from api.db.database import get_db
from unittest.mock import MagicMock, patch
from api.v1.models import *
from api.v1.models import User
from api.v1.services.user import user_service
from uuid_extensions import uuid7
from fastapi import status
Expand Down Expand Up @@ -47,6 +46,14 @@
"status_code": 201,
}

# Mock the BackgroundTasks and email sending function
@pytest.fixture(scope='module')
def mock_send_email():
with patch("api.core.dependencies.email_sender.send_email", return_value=None) as mock_email_sending:
with patch("fastapi.BackgroundTasks.add_task") as add_task_mock:
# Override the add_task method to simulate direct function call
add_task_mock.side_effect = lambda func, *args, **kwargs: func(*args, **kwargs)
yield mock_email_sending

@pytest.fixture
def mock_db_session(_=MagicMock()):
Expand All @@ -71,16 +78,17 @@ def create_mock_super_admin(_):


@pytest.mark.parametrize("data", [squeeze1, squeeze2, squeeze3])
@pytest.mark.usefixtures("mock_db_session")
def test_create_squeeze_page(mock_db_session, data):
@pytest.mark.usefixtures("mock_db_session", "mock_send_email")
def test_create_squeeze_page(mock_db_session, data, mock_send_email):
"""Test create squeeze page."""
create_mock_super_admin(mock_db_session)
tok = client.post(
LOGIN_URI, json={"email": "[email protected]", "password": "P@ssw0rd"}
).json()
print(tok)
assert tok["status_code"] == status.HTTP_200_OK
token = tok["access_token"]
res = client.post(URI, json=data, headers=theader(token))
assert res.status_code == data["status_code"]
assert res.json()['data']['title'] == data["title"]
assert res.json()['data']['email'] == data["email"]
assert res.json()['data']['email'] == data["email"]
18 changes: 14 additions & 4 deletions tests/v1/squeeze_page/test_fetch_squeeze.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,16 @@
"status_code": 201,
}


# Mock the BackgroundTasks and email sending function
@pytest.fixture(scope='module')
def mock_send_email():
with patch("api.core.dependencies.email_sender.send_email", return_value=None) as mock_email_sending:
with patch("fastapi.BackgroundTasks.add_task") as add_task_mock:
# Override the add_task method to simulate direct function call
add_task_mock.side_effect = lambda func, *args, **kwargs: func(*args, **kwargs)
yield mock_email_sending

@pytest.fixture
def mock_db_session(_=MagicMock()):
"""Mock session"""
Expand All @@ -60,8 +70,8 @@ def create_mock_super_admin(_):


@pytest.mark.parametrize("data", [squeeze1])
@pytest.mark.usefixtures("mock_db_session")
def test_fetch_squeeze_page(mock_db_session, data):
@pytest.mark.usefixtures("mock_db_session", "mock_send_email")
def test_fetch_squeeze_page(mock_db_session, data, mock_send_email):
"""Test create squeeze page."""
create_mock_super_admin(mock_db_session)
tok = client.post(
Expand All @@ -76,8 +86,8 @@ def test_fetch_squeeze_page(mock_db_session, data):


@pytest.mark.parametrize("data", [squeeze1, squeeze2])
@pytest.mark.usefixtures("mock_db_session")
def test_fetch_all_squeeze_page(mock_db_session, data):
@pytest.mark.usefixtures("mock_db_session", "mock_send_email")
def test_fetch_all_squeeze_page(mock_db_session, data, mock_send_email):
"""Test create squeeze page."""
create_mock_super_admin(mock_db_session)
tok = client.post(
Expand Down

0 comments on commit dc8cc2a

Please sign in to comment.