From 3594694de218874d8e6ee6533a1464fb78d5d18b Mon Sep 17 00:00:00 2001 From: Beverly Nguyen Date: Mon, 17 Jun 2024 12:36:21 -0700 Subject: [PATCH] added fetch by user --- .../javascripts/sampleChartDashboard.js | 6 +- app/main/views/dashboard.py | 30 +++++-- app/notify_client/service_api_client.py | 4 +- tests/app/main/views/test_dashboard.py | 80 +++++++++++-------- 4 files changed, 77 insertions(+), 43 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 f2a4d6b20..5bb497f3c 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 +from flask import Response, abort, jsonify, render_template, request, session, url_for,Flask, g from flask_login import current_user from flask_socketio import emit from werkzeug.utils import redirect @@ -32,11 +32,23 @@ 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( @@ -49,12 +61,18 @@ def handle_fetch_daily_stats(): @socketio.on("fetch_daily_stats_by_user") def handle_fetch_daily_stats_by_user(): - service_id = session.get('service_id') - user_id = session.get('user_id') + 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 = service_api_client.get_user_service_notification_statistics_by_day( - service_id, user_id, start_date=date_range["start_date"], days=date_range["days"] + daily_stats_by_user = ( + service_api_client.get_user_service_notification_statistics_by_day( + service_id, + user_id, + start_date=date_range["start_date"], + days=date_range["days"], + ) ) emit("daily_stats_by_user_update", daily_stats_by_user) else: diff --git a/app/notify_client/service_api_client.py b/app/notify_client/service_api_client.py index bdb1340b6..f4f0d9f56 100644 --- a/app/notify_client/service_api_client.py +++ b/app/notify_client/service_api_client.py @@ -60,7 +60,9 @@ class ServiceAPIClient(NotifyAdminAPIClient): start_date = datetime.now().strftime("%Y-%m-%d") return self.get( - "/service/{0}/statistics/user/{1}/{2}/{3}".format(service_id, user_id, start_date, days), + "/service/{0}/statistics/user/{1}/{2}/{3}".format( + service_id, user_id, start_date, days + ), )["data"] def get_services(self, params_dict=None): diff --git a/tests/app/main/views/test_dashboard.py b/tests/app/main/views/test_dashboard.py index 285444b1b..7cd150d6c 100644 --- a/tests/app/main/views/test_dashboard.py +++ b/tests/app/main/views/test_dashboard.py @@ -4,8 +4,10 @@ from datetime import datetime import pytest from flask import Flask, url_for -from flask_socketio import SocketIOTestClient +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.main.views.dashboard import ( @@ -15,6 +17,7 @@ from app.main.views.dashboard import ( format_monthly_stats_to_list, get_dashboard_totals, get_tuples_of_financial_years, + handle_fetch_daily_stats ) from tests import ( organization_json, @@ -1884,6 +1887,12 @@ 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() + return app, socketio @@ -1893,26 +1902,26 @@ def app_with_socketio(): ( SERVICE_ONE_ID, {"start_date": "2024-01-01", "days": 7}, - {"service_id": SERVICE_ONE_ID, "start_date": "2024-01-01", "days": 7} + {"service_id": SERVICE_ONE_ID, "start_date": "2024-01-01", "days": 7}, ), ( - SERVICE_TWO_ID, + SERVICE_ONE_ID, {"start_date": "2023-06-01", "days": 7}, {"service_id": SERVICE_TWO_ID, "start_date": "2023-06-01", "days": 7} ), - ] + ], ) def test_fetch_daily_stats( - app_with_socketio, mocker, - service_id, + app_with_socketio, + mocker, service_id, date_range, - expected_call_args + expected_call_args, + client_request, ): app, socketio = app_with_socketio mocker.patch( - "app.main.views.dashboard.get_stats_date_range", - return_value=date_range + "app.main.views.dashboard.get_stats_date_range", return_value=date_range ) mock_service_api = mocker.patch( @@ -1920,34 +1929,39 @@ def test_fetch_daily_stats( return_value={ date_range["start_date"]: { "email": {"delivered": 0, "failure": 0, "requested": 0}, - "sms": {"delivered": 0, "failure": 1, "requested": 1} + "sms": {"delivered": 0, "failure": 1, "requested": 1}, }, - } + }, ) client = SocketIOTestClient(app, socketio) - try: - connected = client.is_connected() - assert connected, "Client should be connected" - client.emit('fetch_daily_stats', service_id) + with client_request.session_transaction() as session: + # service_id = session["service_id"] + try: + connected = client.is_connected() + assert connected, "Client should be connected" - received = 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} - }, - } + # service_id = session["service_id"] + client.emit('fetch_daily_stats') + received = client.get_received() + print(f"Received messages: {received}") - 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" + 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"