Skip to content

Commit

Permalink
Merge pull request #22 from Roopan-Microsoft/PSL-8549
Browse files Browse the repository at this point in the history
feat: backend unit test added
  • Loading branch information
Roopan-Microsoft authored Oct 15, 2024
2 parents f66c2dd + 3ede0b8 commit b07a2eb
Show file tree
Hide file tree
Showing 14 changed files with 1,875 additions and 43 deletions.
16 changes: 13 additions & 3 deletions .github/workflows/test_client_advisor.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: Tests
name: Unit Tests - Client Advisor

on:
push:
Expand Down Expand Up @@ -34,7 +34,17 @@ jobs:
cd ClientAdvisor/App
python -m pip install -r requirements.txt
python -m pip install coverage pytest-cov
- name: Run Backend Tests with Coverage
run: |
cd ClientAdvisor/App
python -m pytest -vv --cov=. --cov-report=xml --cov-report=html --cov-report=term-missing --cov-fail-under=80 --junitxml=coverage-junit.xml
- uses: actions/upload-artifact@v4
with:
name: client-advisor-coverage
path: |
ClientAdvisor/App/coverage.xml
ClientAdvisor/App/coverage-junit.xml
ClientAdvisor/App/htmlcov/
- name: Set up Node.js
uses: actions/setup-node@v3
with:
Expand All @@ -52,4 +62,4 @@ jobs:
name: client-advisor-frontend-coverage
path: |
ClientAdvisor/App/frontend/coverage/
ClientAdvisor/App/frontend/coverage/lcov-report/
ClientAdvisor/App/frontend/coverage/lcov-report/
46 changes: 18 additions & 28 deletions ClientAdvisor/App/app.py
Original file line number Diff line number Diff line change
@@ -1,39 +1,29 @@
import copy
import json
import os
import logging
import uuid
from dotenv import load_dotenv
import httpx
import os
import time
import requests
import uuid
from types import SimpleNamespace
from db import get_connection
from quart import (
Blueprint,
Quart,
jsonify,
make_response,
request,
send_from_directory,
render_template,
)

import httpx
import requests
from azure.identity.aio import (DefaultAzureCredential,
get_bearer_token_provider)
from dotenv import load_dotenv
# from quart.sessions import SecureCookieSessionInterface
from openai import AsyncAzureOpenAI
from azure.identity.aio import DefaultAzureCredential, get_bearer_token_provider
from backend.auth.auth_utils import get_authenticated_user_details, get_tenantid
from backend.history.cosmosdbservice import CosmosConversationClient

from quart import (Blueprint, Quart, jsonify, make_response, render_template,
request, send_from_directory)

from backend.utils import (
format_as_ndjson,
format_stream_response,
generateFilterString,
parse_multi_columns,
convert_to_pf_format,
format_pf_non_streaming_response,
)
from backend.auth.auth_utils import (get_authenticated_user_details,
get_tenantid)
from backend.history.cosmosdbservice import CosmosConversationClient
from backend.utils import (convert_to_pf_format, format_as_ndjson,
format_pf_non_streaming_response,
format_stream_response, generateFilterString,
parse_multi_columns)
from db import get_connection

bp = Blueprint("routes", __name__, static_folder="static", template_folder="static")

Expand Down Expand Up @@ -1598,14 +1588,14 @@ def get_users():
cursor.execute(sql_stmt)
rows = cursor.fetchall()


if len(rows) <= 6:
# update ClientMeetings,Assets,Retirement tables sample data to current date
cursor = conn.cursor()
cursor.execute(
"""select DATEDIFF(d,CAST(max(StartTime) AS Date),CAST(GETDATE() AS Date)) + 3 as ndays from ClientMeetings"""
)
rows = cursor.fetchall()
ndays = 0
for row in rows:
ndays = row["ndays"]
sql_stmt1 = f"UPDATE ClientMeetings SET StartTime = dateadd(day,{ndays},StartTime), EndTime = dateadd(day,{ndays},EndTime)"
Expand Down
3 changes: 2 additions & 1 deletion ClientAdvisor/App/backend/history/cosmosdbservice.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import uuid
from datetime import datetime
from azure.cosmos.aio import CosmosClient

from azure.cosmos import exceptions
from azure.cosmos.aio import CosmosClient


class CosmosConversationClient:
Expand Down
5 changes: 3 additions & 2 deletions ClientAdvisor/App/backend/utils.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import os
import dataclasses
import json
import logging
import os

import requests
import dataclasses

DEBUG = os.environ.get("DEBUG", "false")
if DEBUG.lower() == "true":
Expand Down
1 change: 1 addition & 0 deletions ClientAdvisor/App/db.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# db.py
import os

import pymssql
from dotenv import load_dotenv

Expand Down
3 changes: 3 additions & 0 deletions ClientAdvisor/App/requirements-dev.txt
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ gunicorn==20.1.0
quart-session==3.0.0
pymssql==2.3.0
httpx==0.27.0
pytest-asyncio==0.24.0
pytest-cov==5.0.0
flake8==7.1.1
black==24.8.0
autoflake==2.3.1
isort==5.13.2
3 changes: 3 additions & 0 deletions ClientAdvisor/App/requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ gunicorn==20.1.0
quart-session==3.0.0
pymssql==2.3.0
httpx==0.27.0
pytest-asyncio==0.24.0
pytest-cov==5.0.0
flake8==7.1.1
black==24.8.0
autoflake==2.3.1
isort==5.13.2
6 changes: 0 additions & 6 deletions ClientAdvisor/App/test_app.py

This file was deleted.

66 changes: 66 additions & 0 deletions ClientAdvisor/App/tests/backend/auth/test_auth.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
import base64
import json
from unittest.mock import patch

from backend.auth.auth_utils import (get_authenticated_user_details,
get_tenantid)


def test_get_authenticated_user_details_no_principal_id():
request_headers = {}
sample_user_data = {
"X-Ms-Client-Principal-Id": "default-id",
"X-Ms-Client-Principal-Name": "default-name",
"X-Ms-Client-Principal-Idp": "default-idp",
"X-Ms-Token-Aad-Id-Token": "default-token",
"X-Ms-Client-Principal": "default-b64",
}
with patch("backend.auth.sample_user.sample_user", sample_user_data):
user_details = get_authenticated_user_details(request_headers)
assert user_details["user_principal_id"] == "default-id"
assert user_details["user_name"] == "default-name"
assert user_details["auth_provider"] == "default-idp"
assert user_details["auth_token"] == "default-token"
assert user_details["client_principal_b64"] == "default-b64"


def test_get_authenticated_user_details_with_principal_id():
request_headers = {
"X-Ms-Client-Principal-Id": "test-id",
"X-Ms-Client-Principal-Name": "test-name",
"X-Ms-Client-Principal-Idp": "test-idp",
"X-Ms-Token-Aad-Id-Token": "test-token",
"X-Ms-Client-Principal": "test-b64",
}
user_details = get_authenticated_user_details(request_headers)
assert user_details["user_principal_id"] == "test-id"
assert user_details["user_name"] == "test-name"
assert user_details["auth_provider"] == "test-idp"
assert user_details["auth_token"] == "test-token"
assert user_details["client_principal_b64"] == "test-b64"


def test_get_tenantid_valid_b64():
user_info = {"tid": "test-tenant-id"}
client_principal_b64 = base64.b64encode(
json.dumps(user_info).encode("utf-8")
).decode("utf-8")
tenant_id = get_tenantid(client_principal_b64)
assert tenant_id == "test-tenant-id"


def test_get_tenantid_invalid_b64():
client_principal_b64 = "invalid-b64"
with patch("backend.auth.auth_utils.logging") as mock_logging:
tenant_id = get_tenantid(client_principal_b64)
assert tenant_id == ""
mock_logging.exception.assert_called_once()


def test_get_tenantid_no_tid():
user_info = {"some_other_key": "value"}
client_principal_b64 = base64.b64encode(
json.dumps(user_info).encode("utf-8")
).decode("utf-8")
tenant_id = get_tenantid(client_principal_b64)
assert tenant_id is None
Loading

0 comments on commit b07a2eb

Please sign in to comment.