141 lines
4.0 KiB
Python
141 lines
4.0 KiB
Python
"""
|
|
Unit tests for Tweet model.
|
|
"""
|
|
|
|
import pytest
|
|
from datetime import datetime, timezone
|
|
from sqlalchemy.orm import Session
|
|
|
|
from app.models.tweet import Tweet
|
|
from app.database import Base, engine, SessionLocal
|
|
|
|
|
|
@pytest.fixture(scope="function")
|
|
def db_session():
|
|
"""Create a fresh database session for each test."""
|
|
# Create tables
|
|
Base.metadata.create_all(bind=engine)
|
|
|
|
# Create session
|
|
session = SessionLocal()
|
|
try:
|
|
yield session
|
|
session.rollback()
|
|
finally:
|
|
session.close()
|
|
Base.metadata.drop_all(bind=engine)
|
|
|
|
|
|
class TestTweetModel:
|
|
"""Test Tweet SQLAlchemy model."""
|
|
|
|
def test_tweet_creation(self, db_session: Session):
|
|
"""Test creating a tweet in the database."""
|
|
tweet = Tweet(
|
|
tweet_id="123456789",
|
|
text="Test tweet content",
|
|
created_at=datetime.now(timezone.utc),
|
|
retweet_count=10,
|
|
like_count=20,
|
|
match_id=1,
|
|
source="twitter"
|
|
)
|
|
|
|
db_session.add(tweet)
|
|
db_session.commit()
|
|
db_session.refresh(tweet)
|
|
|
|
assert tweet.id is not None
|
|
assert tweet.tweet_id == "123456789"
|
|
assert tweet.text == "Test tweet content"
|
|
assert tweet.retweet_count == 10
|
|
assert tweet.like_count == 20
|
|
assert tweet.match_id == 1
|
|
assert tweet.source == "twitter"
|
|
|
|
def test_tweet_defaults(self, db_session: Session):
|
|
"""Test tweet default values."""
|
|
tweet = Tweet(
|
|
tweet_id="987654321",
|
|
text="Another test tweet",
|
|
created_at=datetime.now(timezone.utc)
|
|
)
|
|
|
|
db_session.add(tweet)
|
|
db_session.commit()
|
|
db_session.refresh(tweet)
|
|
|
|
assert tweet.retweet_count == 0
|
|
assert tweet.like_count == 0
|
|
assert tweet.source == "twitter"
|
|
assert tweet.match_id is None
|
|
|
|
def test_tweet_unique_constraint(self, db_session: Session):
|
|
"""Test that tweet_id must be unique."""
|
|
tweet1 = Tweet(
|
|
tweet_id="111111111",
|
|
text="First tweet",
|
|
created_at=datetime.now(timezone.utc)
|
|
)
|
|
|
|
tweet2 = Tweet(
|
|
tweet_id="111111111", # Same tweet_id
|
|
text="Second tweet",
|
|
created_at=datetime.now(timezone.utc)
|
|
)
|
|
|
|
db_session.add(tweet1)
|
|
db_session.commit()
|
|
|
|
db_session.add(tweet2)
|
|
|
|
with pytest.raises(Exception): # IntegrityError expected
|
|
db_session.commit()
|
|
|
|
def test_tweet_to_dict(self, db_session: Session):
|
|
"""Test converting tweet to dictionary."""
|
|
tweet = Tweet(
|
|
tweet_id="222222222",
|
|
text="Test tweet for dict",
|
|
created_at=datetime.now(timezone.utc),
|
|
retweet_count=5,
|
|
like_count=10,
|
|
match_id=2,
|
|
source="reddit"
|
|
)
|
|
|
|
db_session.add(tweet)
|
|
db_session.commit()
|
|
db_session.refresh(tweet)
|
|
|
|
tweet_dict = tweet.to_dict()
|
|
|
|
assert tweet_dict['tweet_id'] == "222222222"
|
|
assert tweet_dict['text'] == "Test tweet for dict"
|
|
assert tweet_dict['retweet_count'] == 5
|
|
assert tweet_dict['like_count'] == 10
|
|
assert tweet_dict['match_id'] == 2
|
|
assert tweet_dict['source'] == "reddit"
|
|
assert 'id' in tweet_dict
|
|
assert 'created_at' in tweet_dict
|
|
|
|
def test_tweet_repr(self, db_session: Session):
|
|
"""Test tweet __repr__ method."""
|
|
tweet = Tweet(
|
|
tweet_id="333333333",
|
|
text="Test tweet repr",
|
|
created_at=datetime.now(timezone.utc),
|
|
match_id=3
|
|
)
|
|
|
|
db_session.add(tweet)
|
|
db_session.commit()
|
|
db_session.refresh(tweet)
|
|
|
|
repr_str = repr(tweet)
|
|
|
|
assert "Tweet" in repr_str
|
|
assert "id=" in repr_str
|
|
assert "tweet_id=333333333" in repr_str
|
|
assert "match_id=3" in repr_str
|