Skip to content

some working tests but 1 is still broken #124

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jun 19, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions backend/tenantfirstaid/session.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from flask.views import View
from valkey import Valkey
import simplejson as json
from typing import Any, Dict


class TenantSession:
Expand Down Expand Up @@ -51,11 +52,11 @@ def getNewSessionData(self):


class InitSessionView(View):
def __init__(self, session: TenantSession):
self.session = session
def __init__(self, tenant_session: TenantSession):
self.tenant_session = tenant_session

def dispatch_request(self):
data = request.json
data: Dict[str, Any] = request.json
session_id = session.get("session_id")
if not session_id:
session_id = str(uuid.uuid4())
Expand All @@ -65,7 +66,7 @@ def dispatch_request(self):

# Initialize the session with city and state
initial_data = {"city": city, "state": state, "messages": []}
self.session.set(session_id, initial_data)
self.tenant_session.set(session_id, initial_data)

return Response(
status=200,
Expand Down
129 changes: 107 additions & 22 deletions backend/tests/test_session.py
Original file line number Diff line number Diff line change
@@ -1,21 +1,34 @@
import pytest
from tenantfirstaid.session import TenantSession
from flask import Flask
from tenantfirstaid.session import TenantSession, InitSessionView
from typing import Dict, Any


@pytest.fixture
def mock_valkey(mocker):
"""Mock the Valkey class with the db_con.ping(), db_con.get(), and db_con.set() methods."""
mock_client = mocker.Mock()
mocker.patch("tenantfirstaid.session.Valkey", return_value=mock_client)
def mock_valkey_ping_nop(mocker):
"""Mock the Valkey class with the db_con.ping() method."""
mock_valkey_client = mocker.Mock()
mocker.patch("tenantfirstaid.session.Valkey", return_value=mock_valkey_client)
mock_valkey_client.ping = mocker.Mock()
return mock_valkey_client


_data = {}
@pytest.fixture
def mock_valkey(mock_valkey_ping_nop, mocker):
# mock_valkey_dbcon_client = mocker.Mock()
# mocker.patch("tenantfirstaid.session.Valkey", mock_valkey_dbcon_client)

_data: Dict[str, Any] = {}

mock_client.set = mocker.Mock(
mock_valkey_ping_nop.set = mocker.Mock(
side_effect=lambda key, value: _data.update({key: value})
)
mock_client.get = mocker.Mock(side_effect=lambda key: _data.get(key, None))
mock_client.ping = mocker.Mock()
return mock_client

mock_valkey_ping_nop.get = mocker.Mock(
return_value=lambda key: _data.get(key, None)
)

return mock_valkey_ping_nop


@pytest.fixture
Expand All @@ -26,24 +39,37 @@ def mock_environ(monkeypatch):
monkeypatch.setenv("DB_USE_SSL", "false")


def test_session_set_and_get(mock_valkey, mock_environ):
tenant_session = TenantSession()

mock_valkey.get.return_value = '"test_value"'
tenant_session.set("some_session_id", "test_value")
value = tenant_session.get("some_session_id")
assert value == "test_value"
def test_session_init_success(mocker, mock_environ):
test_data = {
"city": "Test City",
"state": "Test State",
}

mock_valkey_client = mocker.Mock()
mocker.patch("tenantfirstaid.session.Valkey", return_value=mock_valkey_client)
mock_valkey_client.ping = mocker.Mock()

def test_session_get_unknown_session_id(mock_valkey, mock_environ):
tenant_session = TenantSession()
app = Flask(__name__)
app.add_url_rule(
"/api/init",
view_func=InitSessionView.as_view("init", tenant_session),
methods=["POST"],
)
app.secret_key = "test_secret_key" # Set a secret key for session management

mock_valkey.get.return_value = None
value = tenant_session.get("some_session_id")
assert value == []
with app.test_request_context("/api/init", method="POST", json=test_data) as reqctx:
assert (
reqctx.session.get("session_id") is None
) # Ensure session_id is NOT set in the request context (before dispatch)
response = app.full_dispatch_request()
assert response.status_code == 200 # Ensure the response is successful
assert (
reqctx.session.get("session_id") is not None
) # Ensure session_id is set in the request context


def test_session_init_ping_exception(mocker, mock_environ, capsys):
def test_session_init_ping_exception(mocker, capsys):
# Patch Valkey so that ping raises an exception
mock_client = mocker.Mock()
mock_client.ping = mocker.Mock(side_effect=Exception("Ping failed"))
Expand All @@ -52,3 +78,62 @@ def test_session_init_ping_exception(mocker, mock_environ, capsys):
_obj = TenantSession()
captured = capsys.readouterr()
assert "Ping failed" in captured.out


def test_session_get_unknown_session_id(mocker, mock_environ):
test_data = {
"city": "Test City",
"state": "Test State",
}

mock_valkey_client = mocker.Mock()
mocker.patch("tenantfirstaid.session.Valkey", return_value=mock_valkey_client)
mock_valkey_client.ping = mocker.Mock()

tenant_session = TenantSession()
app = Flask(__name__)
app.add_url_rule(
"/api/init",
view_func=InitSessionView.as_view("init", tenant_session),
methods=["POST"],
)
app.secret_key = "test_secret_key" # Set a secret key for session management

with app.test_request_context("/api/init", method="POST", json=test_data) as reqctx:
assert (
reqctx.session.get("session_id") is None
) # Ensure session_id is NOT set in the request context (before dispatch)
assert tenant_session.get() == {
"city": "",
"state": "",
"messages": [],
}


# def test_session_set_and_get(mocker, mock_environ, mock_valkey):
# test_data: Dict[str, Any] = {
# "city": "Test City",
# "state": "Test State",
# "messages": ["this is message 1", "this is message 2"],
# }

# mock_valkey_client = mocker.Mock()
# mocker.patch("tenantfirstaid.session.Valkey", return_value=mock_valkey_client)
# mock_valkey_client.ping = mocker.Mock()

# tenant_session = TenantSession()
# app = Flask(__name__)
# app.add_url_rule(
# "/api/init",
# view_func=InitSessionView.as_view("init", tenant_session),
# methods=["POST"],
# )
# app.secret_key = "test_secret_key" # Set a secret key for session management

# with app.test_request_context("/api/init", method="POST", json=test_data):
# response = app.full_dispatch_request()
# assert response.status_code == 200 # Ensure the response is successful
# session_id = response.json["session_id"]

# tenant_session.set(session_id, test_data)
# assert tenant_session.get() == test_data