Skip to content

Commit

Permalink
Merge pull request #764 from Okunola11/feat/newsletter
Browse files Browse the repository at this point in the history
feat: get a single newsletter
  • Loading branch information
joboy-dev authored Aug 7, 2024
2 parents ae1ff19 + 1eca680 commit c316ff0
Show file tree
Hide file tree
Showing 5 changed files with 127 additions and 8 deletions.
21 changes: 19 additions & 2 deletions api/v1/routes/newsletter.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
from fastapi import APIRouter, Depends, status
from typing import Annotated
from sqlalchemy.orm import Session
from api.utils.success_response import success_response
from api.v1.schemas.newsletter import EmailSchema, EmailRetrieveSchema
from api.v1.schemas.newsletter import EmailSchema, EmailRetrieveSchema, SingleNewsletterResponse
from api.db.database import get_db
from api.v1.services.newsletter import NewsletterService
from fastapi.encoders import jsonable_encoder
Expand Down Expand Up @@ -56,6 +57,22 @@ def retrieve_subscribers(
data=jsonable_encoder(subs_filtered),
)

@newsletter.get('/{id}', response_model=SingleNewsletterResponse, status_code=status.HTTP_200_OK)
async def get_single_newsletter(
id: str,
db: Annotated[Session, Depends(get_db)],
):
"""Retrieves a single newsletter.
Args:
id: The id of the job for the newsletter
db: database Session object
Returns:
SingleNewslettersResponse: response on success
"""
newsletterservice = NewsletterService()
return newsletterservice.fetch(news_id=id, db=db)

@newsletter.delete(
"/{id}",
Expand All @@ -69,4 +86,4 @@ def delete_newsletter(
current_user: User = Depends(user_service.get_current_super_admin),
):
"""Endpoint to delete a newsletter"""
NewsletterService.delete(db=db, id=id)
NewsletterService.delete(db=db, id=id)
17 changes: 17 additions & 0 deletions api/v1/schemas/newsletter.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from pydantic import BaseModel, EmailStr
from datetime import datetime


class EmailSchema(BaseModel):
Expand All @@ -13,3 +14,19 @@ class EmailRetrieveSchema(EmailSchema):

class Config:
from_attributes = True

class NewsletterBase(BaseModel):
title: str
description: str
content: str
created_at: datetime
updated_at: datetime

class SingleNewsletterResponse(BaseModel):
"""Schema for single newsletter
"""
status_code: int = 200
message: str
success: bool = True
data: NewsletterBase

33 changes: 29 additions & 4 deletions api/v1/services/newsletter.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
from fastapi import HTTPException
from fastapi import HTTPException, Depends
from sqlalchemy.orm import Session
from api.db.database import get_db
from api.v1.schemas.newsletter import EmailSchema
from api.core.base.services import Service
from api.v1.models.newsletter import NewsletterSubscriber, Newsletter
from typing import Optional, Any
from typing import Optional, Any, Annotated
from api.utils.db_validators import check_model_existence

from api.utils.success_response import success_response
from api.v1.schemas.newsletter import SingleNewsletterResponse

class NewsletterService(Service):
"""Newsletter service functionality"""
Expand Down Expand Up @@ -63,10 +65,33 @@ def fetch_all(db: Session, **query_params: Optional[Any]):
return query.all()

@staticmethod
def fetch(news_id: str, db: Annotated[Session, Depends(get_db)]):
"""Fetch a single newsletter.
Args:
news_id: The id of the newsletter
db: database Session object
Return:
SingleNewsletterResponse: Response on success
"""

# checking if newsletter exist and send
newsletter = check_model_existence(db, Newsletter, news_id)
return success_response(
status_code=200,
message="Successfully fetched newsletter",
data=newsletter
)

@staticmethod
def update():
pass

def delete(db: Session, id: str):
"""Deletes a single newsletter by id"""

newsletter = check_model_existence(db=db, model=Newsletter, id=id)

db.delete(newsletter)
db.commit()
db.commit()
16 changes: 14 additions & 2 deletions scripts/seed.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@

user_1 = User(
id=str(uuid7()),
email="test@mail",
email="test@email.com",
password=user_service.hash_password("testpass"),
first_name="John",
last_name="Doe",
Expand Down Expand Up @@ -83,6 +83,18 @@
is_verified=True,
)
db.add(admin_user)

newsletter_1 = Newsletter(
title="test newsletter 1",
description="a test newsletter"
)

newsletter_2 = Newsletter(
title="test newsletter 2",
description="a test newsletter"
)

db.add_all([newsletter_1, newsletter_2])
db.commit()

job_1 = Job(id=str(uuid7()), author_id=user_1.id, description="Test job one", title="Engineer")
Expand All @@ -96,5 +108,5 @@
db.add_all([job_1, job_2, application_1, application_2])
db.commit()

# users = db.query(Organization).first().users
users = db.query(Organization).first().users
print("Seed data succesfully")
48 changes: 48 additions & 0 deletions tests/v1/newsletter/test_get_single_newsletter.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import pytest
from fastapi.testclient import TestClient
from main import app
from sqlalchemy.orm import Session
from api.db.database import get_db
from api.v1.models import User, Newsletter
from uuid_extensions import uuid7
from unittest.mock import MagicMock

client = TestClient(app)

# Mock database
@pytest.fixture
def mock_db_session(mocker):
db_session_mock = mocker.MagicMock(spec=Session)
app.dependency_overrides[get_db] = lambda: db_session_mock
return db_session_mock

# Test Newsletter
@pytest.fixture
def test_newsletter():
return Newsletter(
id=str(uuid7()),
title="test newsletter 1",
description="a test newsletter"
)



# Test fetch single newsletter
def test_fetching_single_newsletter(
mock_db_session,
test_newsletter,
):
# Mock the GET method for Newletter ID
def mock_get(model, ident):
if model == Newsletter and ident == test_newsletter.id:
return test_newsletter
return None

mock_db_session.get.side_effect = mock_get

# Test get single newsletter
response = client.get(f"/api/v1/pages/newsletters/{test_newsletter.id}")

assert response.status_code == 200, f"Expected status code 200, got {response.status_code}"
assert response.json()['message'] == "Successfully fetched newsletter"

0 comments on commit c316ff0

Please sign in to comment.