From a1f2deda8f5641f8f3402823449abd46764585e2 Mon Sep 17 00:00:00 2001 From: Beverly Nguyen Date: Mon, 17 Jun 2024 17:32:24 -0700 Subject: [PATCH] added test_fetch_daily_stats_by_user test --- .../javascripts/sampleChartDashboard.js | 6 +- app/main/views/dashboard.py | 19 +-- tests/app/main/views/test_dashboard.py | 147 +++++++++++++----- 3 files changed, 112 insertions(+), 60 deletions(-) diff --git a/app/assets/javascripts/sampleChartDashboard.js b/app/assets/javascripts/sampleChartDashboard.js index 5282f7626..a208d1bee 100644 --- a/app/assets/javascripts/sampleChartDashboard.js +++ b/app/assets/javascripts/sampleChartDashboard.js @@ -31,11 +31,11 @@ var socket = io(); socket.on('connect', function() { - socket.emit('fetch_daily_stats_by_user'); + socket.emit('fetch_daily_stats'); console.log('connected') }); - socket.on('daily_stats_by_user_update', function(data) { + socket.on('daily_stats_update', function(data) { console.log('Data received:', data); var labels = []; var requestedData = []; @@ -57,7 +57,7 @@ var sevenDaysButton = document.getElementById('sevenDaysButton'); if (sevenDaysButton) { sevenDaysButton.addEventListener('click', function() { - socket.emit('fetch_daily_stats_by_user'); + socket.emit('fetch_daily_stats'); console.log('clicked') }); } diff --git a/app/main/views/dashboard.py b/app/main/views/dashboard.py index 5bb497f3c..ae58ff226 100644 --- a/app/main/views/dashboard.py +++ b/app/main/views/dashboard.py @@ -4,7 +4,7 @@ from datetime import datetime from functools import partial from itertools import groupby -from flask import Response, abort, jsonify, render_template, request, session, url_for,Flask, g +from flask import Response, abort, jsonify, render_template, request, session, url_for from flask_login import current_user from flask_socketio import emit from werkzeug.utils import redirect @@ -32,23 +32,11 @@ from app.utils.pagination import generate_next_dict, generate_previous_dict from app.utils.time import get_current_financial_year from app.utils.user import user_has_permissions from notifications_utils.recipients import format_phone_number_human_readable -from flask_socketio import SocketIO -import app + @socketio.on("fetch_daily_stats") def handle_fetch_daily_stats(): service_id = session.get('service_id') - print(''' - - - - - - - service_id ''', - - service_id) - if service_id: date_range = get_stats_date_range() daily_stats = service_api_client.get_service_notification_statistics_by_day( @@ -63,7 +51,6 @@ def handle_fetch_daily_stats(): def handle_fetch_daily_stats_by_user(): service_id = session.get("service_id") user_id = session.get("user_id") - # print(f"Service ID in handler: {service_id}") if service_id and user_id: date_range = get_stats_date_range() daily_stats_by_user = ( @@ -76,7 +63,7 @@ def handle_fetch_daily_stats_by_user(): ) emit("daily_stats_by_user_update", daily_stats_by_user) else: - emit("error", {"error": "No service_id provided"}) + emit("error", {"error": "No service_id or user_id provided"}) @main.route("/services//dashboard") diff --git a/tests/app/main/views/test_dashboard.py b/tests/app/main/views/test_dashboard.py index 7cd150d6c..78889bff2 100644 --- a/tests/app/main/views/test_dashboard.py +++ b/tests/app/main/views/test_dashboard.py @@ -6,10 +6,8 @@ import pytest from flask import Flask, url_for from flask_socketio import SocketIO, SocketIOTestClient from freezegun import freeze_time -from boto3 import Session -import app -from app import create_app, socketio +from app import create_app from app.main.views.dashboard import ( aggregate_notifications_stats, aggregate_status_types, @@ -17,7 +15,8 @@ from app.main.views.dashboard import ( format_monthly_stats_to_list, get_dashboard_totals, get_tuples_of_financial_years, - handle_fetch_daily_stats + handle_fetch_daily_stats, + handle_fetch_daily_stats_by_user, ) from tests import ( organization_json, @@ -29,6 +28,7 @@ from tests.conftest import ( ORGANISATION_ID, SERVICE_ONE_ID, SERVICE_TWO_ID, + USER_ONE_ID, create_active_caseworking_user, create_active_user_view_permissions, normalize_spaces, @@ -1877,7 +1877,6 @@ def test_service_dashboard_shows_batched_jobs( rows = job_table_body.find_all("tbody")[0].find_all("tr") - # # Check if the "Job" table exists assert job_table_body is not None assert len(rows) == 1 @@ -1887,12 +1886,9 @@ def test_service_dashboard_shows_batched_jobs( def app_with_socketio(): app = Flask("app") create_app(app) - socketio = SocketIO(app, manage_session=False) - - @socketio.on("fetch_daily_stats") - def fetch_daily_stats_handler(): - handle_fetch_daily_stats() - + socketio = SocketIO(app) + socketio.on_event("fetch_daily_stats", handle_fetch_daily_stats) + socketio.on_event("fetch_daily_stats_by_user", handle_fetch_daily_stats_by_user) return app, socketio @@ -1905,7 +1901,7 @@ def app_with_socketio(): {"service_id": SERVICE_ONE_ID, "start_date": "2024-01-01", "days": 7}, ), ( - SERVICE_ONE_ID, + SERVICE_TWO_ID, {"start_date": "2023-06-01", "days": 7}, {"service_id": SERVICE_TWO_ID, "start_date": "2023-06-01", "days": 7} ), @@ -1913,10 +1909,10 @@ def app_with_socketio(): ) def test_fetch_daily_stats( app_with_socketio, - mocker, service_id, + mocker, + service_id, date_range, expected_call_args, - client_request, ): app, socketio = app_with_socketio @@ -1933,35 +1929,104 @@ def test_fetch_daily_stats( }, }, ) + with app.test_client() as client: + with client.session_transaction() as sess: + sess['service_id'] = service_id - client = SocketIOTestClient(app, socketio) + socketio_client = SocketIOTestClient(app, socketio, flask_test_client=client) - with client_request.session_transaction() as session: - # service_id = session["service_id"] - try: - connected = client.is_connected() - assert connected, "Client should be connected" + connected = socketio_client.is_connected() + assert connected, "Client should be connected" - # service_id = session["service_id"] - client.emit('fetch_daily_stats') - received = client.get_received() - print(f"Received messages: {received}") + socketio_client.emit('fetch_daily_stats') + received = socketio_client.get_received() - assert received, "Should receive a response message" - assert received[0]["name"] == "daily_stats_update" - assert received[0]["args"][0] == { - date_range["start_date"]: { - "email": {"delivered": 0, "failure": 0, "requested": 0}, - "sms": {"delivered": 0, "failure": 1, "requested": 1}, - }, - } + mock_service_api.assert_called_once_with( + expected_call_args["service_id"], + start_date=expected_call_args["start_date"], + days=expected_call_args["days"], + ) + assert received, "Should receive a response message" + assert received[0]["name"] == "daily_stats_update" + assert received[0]["args"][0] == { + date_range["start_date"]: { + "email": {"delivered": 0, "failure": 0, "requested": 0}, + "sms": {"delivered": 0, "failure": 1, "requested": 1}, + }, + } - mock_service_api.assert_called_once_with( - service_id, - start_date=expected_call_args["start_date"], - days=expected_call_args["days"], - ) - finally: - client.disconnect() - disconnected = not client.is_connected() - assert disconnected, "Client should be disconnected" + socketio_client.disconnect() + disconnected = not socketio_client.is_connected() + assert disconnected, "Client should be disconnected" + + +@pytest.mark.parametrize( + ("service_id", "user_id", "date_range", "expected_call_args", "user"), + [ + ( + SERVICE_ONE_ID, + USER_ONE_ID, + {"start_date": "2024-01-01", "days": 7}, + {"service_id": SERVICE_ONE_ID, "user_id": USER_ONE_ID, "start_date": "2024-01-01", "days": 7}, + {"id": USER_ONE_ID, "name": "Test User"} + ), + ], +) +def test_fetch_daily_stats_by_user( + app_with_socketio, + mocker, + service_id, + user_id, + date_range, + expected_call_args, + user, +): + app, socketio = app_with_socketio + + mocker.patch( + "app.main.views.dashboard.get_stats_date_range", return_value=date_range + ) + + mock_service_api = mocker.patch( + "app.service_api_client.get_user_service_notification_statistics_by_day", + return_value={ + date_range["start_date"]: { + "email": {"delivered": 0, "failure": 0, "requested": 0}, + "sms": {"delivered": 0, "failure": 1, "requested": 1}, + }, + }, + ) + + mocker.patch("app.user_api_client.get_user", return_value=user) + + with app.test_client() as client: + with client.session_transaction() as sess: + sess['service_id'] = service_id + sess['user_id'] = user_id + + socketio_client = SocketIOTestClient(app, socketio, flask_test_client=client) + + connected = socketio_client.is_connected() + assert connected, "Client should be connected" + + socketio_client.emit('fetch_daily_stats_by_user') + received = socketio_client.get_received() + + mock_service_api.assert_called_once_with( + expected_call_args["service_id"], + expected_call_args["user_id"], + start_date=expected_call_args["start_date"], + days=expected_call_args["days"], + ) + assert received, "Should receive a response message" + assert received[0]["name"] == "daily_stats_by_user_update" + assert received[0]["args"][0] == { + date_range["start_date"]: { + "email": {"delivered": 0, "failure": 0, "requested": 0}, + "sms": {"delivered": 0, "failure": 1, "requested": 1}, + }, + } + + socketio_client.disconnect() + disconnected = not socketio_client.is_connected() + assert disconnected, "Client should be disconnected"