added fetch by user

This commit is contained in:
Beverly Nguyen
2024-06-17 12:36:21 -07:00
parent 0fa6e59a49
commit 3594694de2
4 changed files with 77 additions and 43 deletions

View File

@@ -31,11 +31,11 @@
var socket = io(); var socket = io();
socket.on('connect', function() { socket.on('connect', function() {
socket.emit('fetch_daily_stats_by_user'); socket.emit('fetch_daily_stats');
console.log('connected') console.log('connected')
}); });
socket.on('daily_stats_by_user_update', function(data) { socket.on('daily_stats_update', function(data) {
console.log('Data received:', data); console.log('Data received:', data);
var labels = []; var labels = [];
var requestedData = []; var requestedData = [];
@@ -57,7 +57,7 @@
var sevenDaysButton = document.getElementById('sevenDaysButton'); var sevenDaysButton = document.getElementById('sevenDaysButton');
if (sevenDaysButton) { if (sevenDaysButton) {
sevenDaysButton.addEventListener('click', function() { sevenDaysButton.addEventListener('click', function() {
socket.emit('fetch_daily_stats_by_user'); socket.emit('fetch_daily_stats');
console.log('clicked') console.log('clicked')
}); });
} }

View File

@@ -4,7 +4,7 @@ from datetime import datetime
from functools import partial from functools import partial
from itertools import groupby 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_login import current_user
from flask_socketio import emit from flask_socketio import emit
from werkzeug.utils import redirect 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.time import get_current_financial_year
from app.utils.user import user_has_permissions from app.utils.user import user_has_permissions
from notifications_utils.recipients import format_phone_number_human_readable from notifications_utils.recipients import format_phone_number_human_readable
from flask_socketio import SocketIO
import app
@socketio.on("fetch_daily_stats") @socketio.on("fetch_daily_stats")
def handle_fetch_daily_stats(): def handle_fetch_daily_stats():
service_id = session.get('service_id') service_id = session.get('service_id')
print('''
service_id ''',
service_id)
if service_id: if service_id:
date_range = get_stats_date_range() date_range = get_stats_date_range()
daily_stats = service_api_client.get_service_notification_statistics_by_day( 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") @socketio.on("fetch_daily_stats_by_user")
def handle_fetch_daily_stats_by_user(): def handle_fetch_daily_stats_by_user():
service_id = session.get('service_id') service_id = session.get("service_id")
user_id = session.get('user_id') user_id = session.get("user_id")
# print(f"Service ID in handler: {service_id}")
if service_id and user_id: if service_id and user_id:
date_range = get_stats_date_range() date_range = get_stats_date_range()
daily_stats_by_user = service_api_client.get_user_service_notification_statistics_by_day( daily_stats_by_user = (
service_id, user_id, start_date=date_range["start_date"], days=date_range["days"] 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) emit("daily_stats_by_user_update", daily_stats_by_user)
else: else:

View File

@@ -60,7 +60,9 @@ class ServiceAPIClient(NotifyAdminAPIClient):
start_date = datetime.now().strftime("%Y-%m-%d") start_date = datetime.now().strftime("%Y-%m-%d")
return self.get( 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"] )["data"]
def get_services(self, params_dict=None): def get_services(self, params_dict=None):

View File

@@ -4,8 +4,10 @@ from datetime import datetime
import pytest import pytest
from flask import Flask, url_for from flask import Flask, url_for
from flask_socketio import SocketIOTestClient from flask_socketio import SocketIO, SocketIOTestClient
from freezegun import freeze_time from freezegun import freeze_time
from boto3 import Session
import app
from app import create_app, socketio from app import create_app, socketio
from app.main.views.dashboard import ( from app.main.views.dashboard import (
@@ -15,6 +17,7 @@ from app.main.views.dashboard import (
format_monthly_stats_to_list, format_monthly_stats_to_list,
get_dashboard_totals, get_dashboard_totals,
get_tuples_of_financial_years, get_tuples_of_financial_years,
handle_fetch_daily_stats
) )
from tests import ( from tests import (
organization_json, organization_json,
@@ -1884,6 +1887,12 @@ def test_service_dashboard_shows_batched_jobs(
def app_with_socketio(): def app_with_socketio():
app = Flask("app") app = Flask("app")
create_app(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 return app, socketio
@@ -1893,26 +1902,26 @@ def app_with_socketio():
( (
SERVICE_ONE_ID, SERVICE_ONE_ID,
{"start_date": "2024-01-01", "days": 7}, {"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}, {"start_date": "2023-06-01", "days": 7},
{"service_id": SERVICE_TWO_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( def test_fetch_daily_stats(
app_with_socketio, mocker, app_with_socketio,
service_id, mocker, service_id,
date_range, date_range,
expected_call_args expected_call_args,
client_request,
): ):
app, socketio = app_with_socketio app, socketio = app_with_socketio
mocker.patch( mocker.patch(
"app.main.views.dashboard.get_stats_date_range", "app.main.views.dashboard.get_stats_date_range", return_value=date_range
return_value=date_range
) )
mock_service_api = mocker.patch( mock_service_api = mocker.patch(
@@ -1920,34 +1929,39 @@ def test_fetch_daily_stats(
return_value={ return_value={
date_range["start_date"]: { date_range["start_date"]: {
"email": {"delivered": 0, "failure": 0, "requested": 0}, "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) 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() # service_id = session["service_id"]
assert received, "Should receive a response message" client.emit('fetch_daily_stats')
assert received[0]['name'] == 'daily_stats_update' received = client.get_received()
assert received[0]['args'][0] == { print(f"Received messages: {received}")
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( assert received, "Should receive a response message"
service_id, assert received[0]["name"] == "daily_stats_update"
start_date=expected_call_args["start_date"], assert received[0]["args"][0] == {
days=expected_call_args["days"] date_range["start_date"]: {
) "email": {"delivered": 0, "failure": 0, "requested": 0},
finally: "sms": {"delivered": 0, "failure": 1, "requested": 1},
client.disconnect() },
disconnected = not client.is_connected() }
assert disconnected, "Client should be disconnected"
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"