Skip to content

Commit

Permalink
refactor(get_redis_clients): move this functionality to a central loc…
Browse files Browse the repository at this point in the history
…ation

this means we can stop writing the same code in two files while also avoiding circular imports
  • Loading branch information
soehlert committed Dec 27, 2024
1 parent e5ab61d commit 28dcb93
Show file tree
Hide file tree
Showing 7 changed files with 55 additions and 55 deletions.
27 changes: 1 addition & 26 deletions backend/services/redis.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,41 +3,16 @@
import json
import logging

import redis
from fastapi import HTTPException, status

from backend.config import settings
from backend.services.redis_client import get_redis_cache_client, get_redis_queue_client
from backend.utils import is_song_in_queue, is_track_object

logger = logging.getLogger(__name__)

CACHE_TTL = 21600


def get_redis_queue_client():
"""Lazy initialization of the Redis queue client.
Returns:
A Redis queue client.
"""
if not hasattr(get_redis_queue_client, "client"):
get_redis_queue_client.client = redis.StrictRedis.from_url(settings.redis_url, db=0, decode_responses=True)

return get_redis_queue_client.client


def get_redis_cache_client():
"""Lazy initialization of the Redis cache client.
Returns:
A redis cache client.
"""
if not hasattr(get_redis_cache_client, "client"):
get_redis_cache_client.client = redis.StrictRedis.from_url(settings.redis_url, db=1, decode_responses=True)

return get_redis_cache_client.client


def add_to_queue_redis(song):
"""Add a song to the Redis queue."""
if not is_track_object(song):
Expand Down
27 changes: 27 additions & 0 deletions backend/services/redis_client.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
"""Handle lazily creating redis clients in a central location."""

import redis

from backend.config import settings


def get_redis_queue_client():
"""Lazy initialization of the Redis queue client.
Returns:
A Redis queue client.
"""
if not hasattr(get_redis_queue_client, "client"):
get_redis_queue_client.client = redis.StrictRedis.from_url(settings.redis_url, db=0, decode_responses=True)
return get_redis_queue_client.client


def get_redis_cache_client():
"""Lazy initialization of the Redis cache client.
Returns:
A Redis cache client.
"""
if not hasattr(get_redis_cache_client, "client"):
get_redis_cache_client.client = redis.StrictRedis.from_url(settings.redis_url, db=1, decode_responses=True)
return get_redis_cache_client.client
4 changes: 2 additions & 2 deletions backend/tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ def mock_redis(mocker, mock_settings):
mock_redis_queue = MagicMock()
mock_redis_cache = MagicMock()

mocker.patch("backend.services.redis.get_redis_queue_client", return_value=mock_redis_queue)
mocker.patch("backend.services.redis.get_redis_cache_client", return_value=mock_redis_cache)
mocker.patch("backend.services.redis_client.get_redis_queue_client", return_value=mock_redis_queue)
mocker.patch("backend.services.redis_client.get_redis_cache_client", return_value=mock_redis_cache)

return mock_redis_queue, mock_redis_cache
29 changes: 19 additions & 10 deletions backend/tests/test_redis.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ def test_add_to_queue_redis(mock_redis, mock_plex_track, mocker):
mocker.patch("backend.utils.is_track_object", return_value=True)
mock_redis_queue, _ = mock_redis

with patch("backend.utils.get_redis_queue_client", return_value=mock_redis_queue):
with patch("backend.services.redis.get_redis_queue_client", return_value=mock_redis_queue):
add_to_queue_redis(mock_plex_track)

mock_redis_queue.rpush.assert_called_once()
Expand Down Expand Up @@ -66,7 +66,8 @@ def test_remove_from_redis_queue(mock_redis, sample_track_json):
mock_redis_queue, _ = mock_redis
mock_redis_queue.lrange.return_value = [sample_track_json]

response = remove_from_redis_queue("12345")
with patch("backend.services.redis.get_redis_queue_client", return_value=mock_redis_queue):
response = remove_from_redis_queue("12345")

mock_redis_queue.lrem.assert_called_once_with("playback_queue", 0, sample_track_json)
assert response == {"message": "Removed Test Song from the queue."}
Expand All @@ -77,7 +78,8 @@ def test_remove_from_redis_queue_not_found(mock_redis):
mock_redis_queue, _ = mock_redis
mock_redis_queue.lrange.return_value = []

response = remove_from_redis_queue("99999")
with patch("backend.services.redis.get_redis_queue_client", return_value=mock_redis_queue):
response = remove_from_redis_queue("99999")

mock_redis_queue.lrem.assert_not_called()
assert response == {"message": "Song not found in the queue."}
Expand All @@ -88,7 +90,8 @@ def test_get_redis_queue_with_items(mock_redis, sample_track_json):
mock_redis_queue, _ = mock_redis
mock_redis_queue.lrange.return_value = [sample_track_json]

queue = get_redis_queue()
with patch("backend.services.redis.get_redis_queue_client", return_value=mock_redis_queue):
queue = get_redis_queue()

assert len(queue) == 1
assert queue[0]["title"] == "Test Song"
Expand All @@ -100,7 +103,8 @@ def test_get_redis_queue_empty(mock_redis):
mock_redis_queue, _ = mock_redis
mock_redis_queue.lrange.return_value = []

queue = get_redis_queue()
with patch("backend.services.redis.get_redis_queue_client", return_value=mock_redis_queue):
queue = get_redis_queue()

assert len(queue) == 0
mock_redis_queue.lrange.assert_called_once_with("playback_queue", 0, -1)
Expand All @@ -110,7 +114,8 @@ def test_clear_redis_queue(mock_redis):
"""Test clearing the entire Redis queue."""
mock_redis_queue, _ = mock_redis

response = clear_redis_queue()
with patch("backend.services.redis.get_redis_queue_client", return_value=mock_redis_queue):
response = clear_redis_queue()

mock_redis_queue.delete.assert_called_once_with("playback_queue")
assert response == {"message": "The queue has been cleared."}
Expand All @@ -122,7 +127,8 @@ def test_cache_data_success(mock_redis):
key = "test_key"
data = {"some": "data"}

cache_data(key, data)
with patch("backend.services.redis.get_redis_cache_client", return_value=mock_redis_cache):
cache_data("test_key", {"some": "data"})

mock_redis_cache.setex.assert_called_once_with(key, 21600, json.dumps(data))

Expand All @@ -132,7 +138,8 @@ def test_get_cached_data_exists(mock_redis):
_, mock_redis_cache = mock_redis
mock_redis_cache.get.return_value = '{"some": "data"}'

data = get_cached_data("test_key")
with patch("backend.services.redis.get_redis_cache_client", return_value=mock_redis_cache):
data = get_cached_data("test_key")

assert data == {"some": "data"}
mock_redis_cache.get.assert_called_once_with("test_key")
Expand All @@ -143,7 +150,8 @@ def test_get_cached_data_not_found(mock_redis):
_, mock_redis_cache = mock_redis
mock_redis_cache.get.return_value = None

data = get_cached_data("test_key")
with patch("backend.services.redis.get_redis_cache_client", return_value=mock_redis_cache):
data = get_cached_data("test_key")

assert data is None
mock_redis_cache.get.assert_called_once_with("test_key")
Expand All @@ -154,7 +162,8 @@ def test_clear_cache_success(mock_redis):
_, mock_redis_cache = mock_redis
key = "test_key"

response = clear_cache(key)
with patch("backend.services.redis.get_redis_cache_client", return_value=mock_redis_cache):
response = clear_cache("test_key")

mock_redis_cache.delete.assert_called_once_with(key)
assert response == {"message": f"Cache cleared for key: {key}"}
5 changes: 3 additions & 2 deletions backend/tests/test_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,14 +49,15 @@ def test_song_found_in_queue(mock_redis, mock_plex_track):
mock_redis_queue, _ = mock_redis
with patch("backend.utils.get_redis_queue_client", return_value=mock_redis_queue):
mock_redis_queue.lrange.return_value = ['{"item_id": "12345", "title": "Mock Song", "artist": "Mock Artist"}']

assert is_song_in_queue(mock_plex_track) is True
mock_redis_queue.lrange.assert_called_once_with("playback_queue", 0, -1)


def test_song_not_in_queue(mock_redis, mock_plex_track):
"""Test when a song is not in the queue."""
mock_redis_queue, _ = mock_redis
with patch("backend.utils.get_redis_queue_client", return_value=mock_redis_queue):
with patch("backend.services.redis_client.get_redis_queue_client", return_value=mock_redis_queue):
mock_redis_queue.lrange.return_value = [
'{"item_id": "67890", "title": "Different Song", "artist": "Different Artist"}'
]
Expand All @@ -66,7 +67,7 @@ def test_song_not_in_queue(mock_redis, mock_plex_track):
def test_empty_queue(mock_redis, mock_plex_track):
"""Test behavior with an empty queue."""
mock_redis_queue, _ = mock_redis
with patch("backend.utils.get_redis_queue_client", return_value=mock_redis_queue):
with patch("backend.services.redis_client.get_redis_queue_client", return_value=mock_redis_queue):
mock_redis_queue.lrange.return_value = []
assert is_song_in_queue(mock_plex_track) is False

Expand Down
3 changes: 2 additions & 1 deletion backend/tests/test_websockets.py
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,8 @@ async def test_send_queue(mock_queue, mock_redis):
mock_redis_queue, _ = mock_redis
mock_redis_queue.lrange.return_value = [json.dumps(item) for item in mock_queue]

await send_queue()
with patch("backend.services.redis.get_redis_queue_client", return_value=mock_redis_queue):
await send_queue()

assert len(mock_ws.sent_messages) == 1
sent_data = json.loads(mock_ws.sent_messages[0])
Expand Down
15 changes: 1 addition & 14 deletions backend/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,22 +3,9 @@
import json
import time

import redis
from plexapi.audio import Track

from backend.config import settings


def get_redis_queue_client():
"""Lazy initialization of the Redis queue client.
Returns:
A Redis queue client.
"""
if not hasattr(get_redis_queue_client, "client"):
get_redis_queue_client.client = redis.StrictRedis.from_url(settings.redis_url, db=0, decode_responses=True)

return get_redis_queue_client.client
from backend.services.redis_client import get_redis_queue_client


def is_track_object(item):
Expand Down

0 comments on commit 28dcb93

Please sign in to comment.