Skip to content

Commit 84794f2

Browse files
authored
Merge branch 'main' into NO-TASK-fix-flashing-logo-when-custom-logo-is-present
2 parents f61dd09 + 38b7862 commit 84794f2

File tree

6 files changed

+140
-107
lines changed

6 files changed

+140
-107
lines changed

.github/workflows/python-app.yml

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,28 @@ jobs:
2727
python -m pip install --upgrade pip
2828
pip install -r requirements-dev.txt
2929
- name: Test with pytest
30+
env:
31+
AZURE_OPENAI_ENDPOINT: ${{ secrets.AZUREOPENAIENDPOINT }}
32+
AZURE_OPENAI_MODEL: ${{ secrets.AZUREOPENAIMODEL }}
33+
AZURE_OPENAI_KEY: ${{ secrets.AZUREOPENAIKEY }}
34+
AZURE_OPENAI_EMBEDDING_NAME: ${{ secrets.AZUREOPENAIEMBEDDINGNAME }}
35+
AZURE_COSMOSDB_ACCOUNT: ${{ secrets.AZURECOSMOSDBACCOUNT }}
36+
AZURE_COSMOSDB_DATABASE: ${{ secrets.AZURECOSMOSDBDATABASE }}
37+
AZURE_COSMOSDB_CONVERSATIONS_CONTAINER: ${{ secrets.AZURECOSMOSDBCONVERSATIONSCONTAINER }}
38+
AZURE_COSMOSDB_ACCOUNT_KEY: ${{ secrets.AZURECOSMOSDBACCOUNTKEY }}
39+
AZURE_SEARCH_SERVICE: ${{ secrets.AZURESEARCHSERVICE }}
40+
AZURE_SEARCH_INDEX: ${{ secrets.AZURESEARCHINDEX }}
41+
AZURE_SEARCH_KEY: ${{ secrets.AZURESEARCHKEY }}
42+
AZURE_SEARCH_QUERY: ${{ secrets.AZURESEARCHQUERY }}
43+
ELASTICSEARCH_EMBEDDING_MODEL_ID: ${{ secrets.ELASTICSEARCHEMBEDDINGMODELID }}
44+
ELASTICSEARCH_ENCODED_API_KEY: ${{ secrets.ELASTICSEARCHENCODEDAPIKEY }}
45+
ELASTICSEARCH_ENDPOINT: ${{ secrets.ELASTICSEARCHENDPOINT }}
46+
ELASTICSEARCH_INDEX: ${{ secrets.ELASTICSEARCHINDEX }}
47+
ELASTICSEARCH_QUERY: ${{ secrets.ELASTICSEARCHQUERY }}
3048
run: |
3149
export PYTHONPATH=$(pwd)
32-
coverage run --omit=tests/integration_tests -m pytest -v --show-capture=stdout -k "not integration"
33-
coverage report -m
50+
coverage run -m pytest -v --show-capture=stdout
51+
coverage report -m --include=app.py,backend/*,tests/*
3452
coverage xml
3553
3654
- name: Code Coverage Report
@@ -44,7 +62,7 @@ jobs:
4462
hide_complexity: true
4563
indicators: true
4664
output: both
47-
thresholds: '60 80'
65+
thresholds: '50 80'
4866

4967
test_windows:
5068
runs-on:

tests/conftest.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import pytest
2+
3+
4+
def pytest_addoption(parser):
5+
parser.addoption(
6+
"--use-keyvault-secrets",
7+
help='Get secrets from a keyvault instead of the environment.',
8+
action='store_true', default=False
9+
)
10+
11+
12+
@pytest.fixture(scope="session")
13+
def use_keyvault_secrets(request) -> str:
14+
return request.config.getoption("use_keyvault_secrets")

tests/integration_tests/conftest.py

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import pytest
44
from azure.identity import AzureCliCredential
55
from azure.keyvault.secrets import SecretClient
6+
from pydantic.alias_generators import to_snake
67

78

89
VAULT_NAME = os.environ.get("VAULT_NAME")
@@ -17,12 +18,52 @@ def secret_client() -> SecretClient:
1718

1819

1920
@pytest.fixture(scope="module")
20-
def dotenv_template_params(secret_client: SecretClient) -> dict[str, str]:
21+
def dotenv_template_params_from_kv(secret_client: SecretClient) -> dict[str, str]:
2122
secrets_properties_list = secret_client.list_properties_of_secrets()
2223
secrets = {}
2324
for secret in secrets_properties_list:
24-
secrets[secret.name] = secret_client.get_secret(secret.name).value
25-
25+
secret_name = to_snake(secret.name).upper()
26+
secrets[secret_name] = secret_client.get_secret(secret.name).value
27+
2628
return secrets
2729

2830

31+
@pytest.fixture(scope="module")
32+
def dotenv_template_params_from_env() -> dict[str, str]:
33+
def get_and_unset_variable(var_name):
34+
# we need this function to ensure that the environment is clean before
35+
# testing with generated dotenv files.
36+
var_value = os.getenv(var_name)
37+
os.environ[var_name] = ""
38+
return var_value
39+
40+
env_secrets = [
41+
"AZURE_COSMOSDB_ACCOUNT",
42+
"AZURE_COSMOSDB_ACCOUNT_KEY",
43+
"AZURE_COSMOSDB_CONVERSATIONS_CONTAINER",
44+
"AZURE_COSMOSDB_DATABASE",
45+
"AZURE_OPENAI_EMBEDDING_NAME"
46+
"AZURE_OPENAI_ENDPOINT",
47+
"AZURE_OPENAI_MODEL",
48+
"AZURE_OPENAI_KEY",
49+
"AZURE_SEARCH_INDEX",
50+
"AZURE_SEARCH_KEY",
51+
"AZURE_SEARCH_QUERY",
52+
"AZURE_SEARCH_SERVICE",
53+
"ELASTICSEARCH_EMBEDDING_MODEL_ID",
54+
"ELASTICSEARCH_ENCODED_API_KEY",
55+
"ELASTICSEARCH_ENDPOINT",
56+
"ELASTICSEARCH_INDEX",
57+
"ELASTICSEARCH_QUERY"
58+
]
59+
60+
return {s: get_and_unset_variable(s) for s in env_secrets}
61+
62+
63+
@pytest.fixture(scope="module")
64+
def dotenv_template_params(request, use_keyvault_secrets):
65+
if use_keyvault_secrets:
66+
return request.getfixturevalue("dotenv_template_params_from_kv")
67+
68+
return request.getfixturevalue("dotenv_template_params_from_env")
69+
Lines changed: 48 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,79 +1,79 @@
1-
DATASOURCE_TYPE={{ datasourceType }}
2-
AZURE_OPENAI_ENDPOINT={{ azureOpenaiEndpoint }}
3-
AZURE_OPENAI_MODEL={{ azureOpenaiModel }}
4-
AZURE_OPENAI_KEY={{ azureOpenaiKey }}
1+
DATASOURCE_TYPE={{ DATASOURCE_TYPE }}
2+
AZURE_OPENAI_ENDPOINT={{ AZURE_OPENAI_ENDPOINT }}
3+
AZURE_OPENAI_MODEL={{ AZURE_OPENAI_MODEL }}
4+
AZURE_OPENAI_KEY={{ AZURE_OPENAI_KEY }}
55
AZURE_OPENAI_TEMPERATURE=0
66
AZURE_OPENAI_TOP_P=1.0
77
AZURE_OPENAI_MAX_TOKENS=1000
88
AZURE_OPENAI_STOP_SEQUENCE=
99
AZURE_OPENAI_SYSTEM_MESSAGE=You are an AI assistant that helps people find information.
1010
AZURE_OPENAI_PREVIEW_API_VERSION=2024-05-01-preview
11-
AZURE_OPENAI_STREAM={{ azureOpenaiStream }}
12-
{% if useAoaiEmbeddings and azureOpenaiEmbeddingName %}
13-
AZURE_OPENAI_EMBEDDING_NAME={{ azureOpenaiEmbeddingName }}
11+
AZURE_OPENAI_STREAM={{ AZURE_OPENAI_STREAM }}
12+
{% if USE_AOAI_EMBEDDINGS and AZURE_OPENAI_EMBEDDING_NAME %}
13+
AZURE_OPENAI_EMBEDDING_NAME={{ AZURE_OPENAI_EMBEDDING_NAME }}
1414
{% endif %}
15-
{% if useAoaiEmbeddings %}
16-
AZURE_OPENAI_EMBEDDING_ENDPOINT={{ azureOpenaiEndpoint }}/openai/deployments/ada/embeddings??api-version=2023-03-15-preview
17-
AZURE_OPENAI_EMBEDDING_KEY={{ azureOpenaiKey }}
15+
{% if USE_AOAI_EMBEDDINGS %}
16+
AZURE_OPENAI_EMBEDDING_ENDPOINT={{ AZURE_OPENAI_ENDPOINT }}/openai/deployments/ada/embeddings?api-version=2023-03-15-preview
17+
AZURE_OPENAI_EMBEDDING_KEY={{ AZURE_OPENAI_KEY }}
1818
{% endif %}
19-
{% if enableChatHistory %}
20-
AZURE_COSMOSDB_ACCOUNT={{ azureCosmosdbAccount }}
21-
AZURE_COSMOSDB_DATABASE={{ azureCosmosdbDatabase }}
22-
AZURE_COSMOSDB_CONVERSATIONS_CONTAINER={{ azureCosmosdbConversationsContainer }}
23-
AZURE_COSMOSDB_ACCOUNT_KEY={{ azureCosmosdbAccountKey }}
24-
AZURE_COSMOSDB_ENABLE_FEEDBACK={{ azureCosmosdbEnableFeedback }}
19+
{% if ENABLE_CHAT_HISTORY %}
20+
AZURE_COSMOSDB_ACCOUNT={{ AZURE_COSMOSDB_ACCOUNT }}
21+
AZURE_COSMOSDB_DATABASE={{ AZURE_COSMOSDB_DATABASE }}
22+
AZURE_COSMOSDB_CONVERSATIONS_CONTAINER={{ AZURE_COSMOSDB_CONVERSATIONS_CONTAINER }}
23+
AZURE_COSMOSDB_ACCOUNT_KEY={{ AZURE_COSMOSDB_ACCOUNT_KEY }}
24+
AZURE_COSMOSDB_ENABLE_FEEDBACK={{ AZURE_COSMOSDB_ENABLE_FEEDBACK }}
2525
{% endif %}
26-
{% if datasourceType == "AzureCognitiveSearch" %}
27-
AZURE_SEARCH_SERVICE={{ azureSearchService }}
28-
AZURE_SEARCH_INDEX={{ azureSearchIndex }}
29-
AZURE_SEARCH_KEY={{ azureSearchKey }}
26+
{% if DATASOURCE_TYPE == "AZURE_COGNITIVE_SEARCH" %}
27+
AZURE_SEARCH_SERVICE={{ AZURE_SEARCH_SERVICE }}
28+
AZURE_SEARCH_INDEX={{ AZURE_SEARCH_INDEX }}
29+
AZURE_SEARCH_KEY={{ AZURE_SEARCH_KEY }}
3030
AZURE_SEARCH_SEMANTIC_SEARCH_CONFIG=
3131
AZURE_SEARCH_CONTENT_COLUMNS=content
3232
AZURE_SEARCH_FILENAME_COLUMN=
3333
AZURE_SEARCH_TITLE_COLUMN=
3434
AZURE_SEARCH_URL_COLUMN=
3535
AZURE_SEARCH_VECTOR_COLUMNS=contentVector
36-
AZURE_SEARCH_QUERY_TYPE={{ azureSearchQueryType }}
37-
AZURE_SEARCH_PERMITTED_GROUPS_COLUMN={{ azureSearchPermittedGroupsColumn }}
38-
{% elif datasourceType == "Elasticsearch" %}
39-
ELASTICSEARCH_ENDPOINT={{ elasticsearchEndpoint }}
40-
ELASTICSEARCH_ENCODED_API_KEY={{ elasticsearchEncodedApiKey }}
41-
ELASTICSEARCH_INDEX={{ elasticsearchIndex }}
42-
ELASTICSEARCH_QUERY_TYPE={{ elasticsearchQueryType }}
36+
AZURE_SEARCH_QUERY_TYPE={{ AZURE_SEARCH_QUERY_TYPE }}
37+
AZURE_SEARCH_PERMITTED_GROUPS_COLUMN={{ AZURE_SEARCH_PERMITTED_GROUPS_COLUMN }}
38+
{% elif DATASOURCE_TYPE == "ELASTICSEARCH" %}
39+
ELASTICSEARCH_ENDPOINT={{ ELASTICSEARCH_ENDPOINT }}
40+
ELASTICSEARCH_ENCODED_API_KEY={{ ELASTICSEARCH_ENCODED_API_KEY }}
41+
ELASTICSEARCH_INDEX={{ ELASTICSEARCH_INDEX }}
42+
ELASTICSEARCH_QUERY_TYPE={{ ELASTICSEARCH_QUERY_TYPE }}
4343
ELASTICSEARCH_CONTENT_COLUMNS=text
4444
ELASTICSEARCH_FILENAME_COLUMN=
4545
ELASTICSEARCH_TITLE_COLUMN=
4646
ELASTICSEARCH_URL_COLUMN=
4747
ELASTICSEARCH_VECTOR_COLUMNS=text_embedding.predicted_value
48-
{% if useElasticsearchEmbeddings and elasticsearchEmbeddingModelId %}
49-
ELASTICSEARCH_EMBEDDING_MODEL_ID={{ elasticsearchEmbeddingModelId }}
48+
{% if USE_ELASTICSEARCH_EMBEDDINGS and ELASTICSEARCH_EMBEDDING_MODEL_ID %}
49+
ELASTICSEARCH_EMBEDDING_MODEL_ID={{ ELASTICSEARCH_EMBEDDING_MODEL_ID }}
5050
{% endif %}
51-
{% elif datasourceType == "AzureCosmosDb" %}
52-
AZURE_COSMOSDB_MONGO_VCORE_CONNECTION_STRING={{ azureCosmosdbMongoVcoreConnectionString }}
53-
AZURE_COSMOSDB_MONGO_VCORE_DATABASE={{ azureCosmosdbMongoVcoreDatabase }}
54-
AZURE_COSMOSDB_MONGO_VCORE_CONTAINER={{ azureCosmosdbMongoVcoreContainer }}
55-
AZURE_COSMOSDB_MONGO_VCORE_INDEX={{ azureCosmosdbMongoVcoreIndex }}
56-
AZURE_COSMOSDB_MONGO_VCORE_CONTENT_COLUMNS={{ azureCosmosdbMongoVcoreContentColumns }}
51+
{% elif DATASOURCE_TYPE == "AZURE_COSMOS_DB" %}
52+
AZURE_COSMOSDB_MONGO_VCORE_CONNECTION_STRING={{ AZURE_COSMOSDB_MONGO_VCORE_CONNECTION_STRING }}
53+
AZURE_COSMOSDB_MONGO_VCORE_DATABASE={{ AZURE_COSMOSDB_MONGO_VCORE_DATABASE }}
54+
AZURE_COSMOSDB_MONGO_VCORE_CONTAINER={{ AZURE_COSMOSDB_MONGO_VCORE_CONTAINER }}
55+
AZURE_COSMOSDB_MONGO_VCORE_INDEX={{ AZURE_COSMOSDB_MONGO_VCORE_INDEX }}
56+
AZURE_COSMOSDB_MONGO_VCORE_CONTENT_COLUMNS={{ AZURE_COSMOSDB_MONGO_VCORE_CONTENT_COLUMNS }}
5757
AZURE_COSMOSDB_MONGO_VCORE_FILENAME_COLUMN=
5858
AZURE_COSMOSDB_MONGO_VCORE_TITLE_COLUMN=
5959
AZURE_COSMOSDB_MONGO_VCORE_URL_COLUMN=
60-
AZURE_COSMOSDB_MONGO_VCORE_VECTOR_COLUMNS={{ azureCosmosdbMongoVcoreVectorColumns }}
61-
{% elif datasourceType == "Pinecone" %}
62-
PINECONE_ENVIRONMENT={{ pineconeEnvironment }}
63-
PINECONE_API_KEY={{ pineconeApiKey }}
64-
PINECONE_INDEX_NAME={{ pineconeIndexName }}
65-
PINECONE_CONTENT_COLUMNS={{ pineconeContentColumns }}
60+
AZURE_COSMOSDB_MONGO_VCORE_VECTOR_COLUMNS={{ AZURE_COSMOSDB_MONGO_VCORE_VECTOR_COLUMNS }}
61+
{% elif DATASOURCE_TYPE == "PINECONE" %}
62+
PINECONE_ENVIRONMENT={{ PINECONE_ENVIRONMENT }}
63+
PINECONE_API_KEY={{ PINECONE_API_KEY }}
64+
PINECONE_INDEX_NAME={{ PINECONE_INDEX_NAME }}
65+
PINECONE_CONTENT_COLUMNS={{ PINECONE_CONTENT_COLUMNS }}
6666
PINECONE_FILENAME_COLUMN=
6767
PINECONE_TITLE_COLUMN=
6868
PINECONE_URL_COLUMN=
69-
PINECONE_VECTOR_COLUMNS={{ pineconeVectorColumns }}
70-
{% elif datasourceType == "AzureMLIndex" %}
71-
AZURE_MLINDEX_NAME={{ azureMlIndexName }}
72-
AZURE_MLINDEX_VERSION={{ azureMlIndexVersion }}
73-
AZURE_ML_PROJECT_RESOURCE_ID={{ azureMlProjectResourceId }}
74-
AZURE_MLINDEX_CONTENT_COLUMNS={{ azureMlIndexContentColumns }}
69+
PINECONE_VECTOR_COLUMNS={{ PINECONE_VECTOR_COLUMNS }}
70+
{% elif DATASOURCE_TYPE == "AZURE_ML_INDEX" %}
71+
AZURE_MLINDEX_NAME={{ AZURE_ML_INDEX_NAME }}
72+
AZURE_MLINDEX_VERSION={{ AZURE_ML_INDEX_VERSION }}
73+
AZURE_ML_PROJECT_RESOURCE_ID={{ AZURE_ML_PROJECT_RESOURCE_ID }}
74+
AZURE_MLINDEX_CONTENT_COLUMNS={{ AZURE_ML_INDEX_CONTENT_COLUMNS }}
7575
AZURE_MLINDEX_FILENAME_COLUMN=
7676
AZURE_MLINDEX_TITLE_COLUMN=
7777
AZURE_MLINDEX_URL_COLUMN=
78-
AZURE_MLINDEX_VECTOR_COLUMNS={{ azureMlIndexVectorColumns }}
78+
AZURE_MLINDEX_VECTOR_COLUMNS={{ AZURE_ML_INDEX_VECTOR_COLUMNS }}
7979
{% endif %}

tests/integration_tests/test_datasources.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -83,25 +83,25 @@ def dotenv_rendered_template_path(
8383
)
8484

8585
if datasource != "none":
86-
dotenv_template_params["datasourceType"] = datasource
86+
dotenv_template_params["DATASOURCE_TYPE"] = datasource
8787

8888
if datasource != "Elasticsearch" and use_elasticsearch_embeddings:
8989
pytest.skip("Elasticsearch embeddings not supported for test.")
9090

9191
if datasource == "Elasticsearch":
92-
dotenv_template_params["useElasticsearchEmbeddings"] = use_elasticsearch_embeddings
92+
dotenv_template_params["USE_ELASTICSEARCH_EMBEDDINGS"] = use_elasticsearch_embeddings
9393

94-
dotenv_template_params["useAoaiEmbeddings"] = use_aoai_embeddings
94+
dotenv_template_params["USE_AOAI_EMBEDDINGS"] = use_aoai_embeddings
9595

9696
if use_aoai_embeddings or use_elasticsearch_embeddings:
97-
dotenv_template_params["azureSearchQueryType"] = "vector"
98-
dotenv_template_params["elasticsearchQueryType"] = "vector"
97+
dotenv_template_params["AZURE_SEARCH_QUERY_TYPE"] = "vector"
98+
dotenv_template_params["ELASTICSEARCH_QUERY_TYPE"] = "vector"
9999
else:
100-
dotenv_template_params["azureSearchQueryType"] = "simple"
101-
dotenv_template_params["elasticsearchQueryType"] = "simple"
100+
dotenv_template_params["AZURE_SEARCH_QUERY_TYPE"] = "simple"
101+
dotenv_template_params["ELASTICSEARCH_QUERY_TYPE"] = "simple"
102102

103-
dotenv_template_params["enableChatHistory"] = enable_chat_history
104-
dotenv_template_params["azureOpenaiStream"] = stream
103+
dotenv_template_params["ENABLE_CHAT_HISTORY"] = enable_chat_history
104+
dotenv_template_params["AZURE_OPENAI_STREAM"] = stream
105105

106106
return render_template_to_tempfile(
107107
rendered_template_name,
@@ -122,11 +122,11 @@ def test_app(dotenv_rendered_template_path) -> Quart:
122122

123123
@pytest.mark.asyncio
124124
async def test_dotenv(test_app: Quart, dotenv_template_params: dict[str, str]):
125-
if dotenv_template_params["datasourceType"] == "AzureCognitiveSearch":
126-
message_content = dotenv_template_params["azureSearchQuery"]
125+
if dotenv_template_params["DATASOURCE_TYPE"] == "AzureCognitiveSearch":
126+
message_content = dotenv_template_params["AZURE_SEARCH_QUERY"]
127127

128-
elif dotenv_template_params["datasourceType"] == "Elasticsearch":
129-
message_content = dotenv_template_params["elasticsearchQuery"]
128+
elif dotenv_template_params["DATASOURCE_TYPE"] == "Elasticsearch":
129+
message_content = dotenv_template_params["ELASTICSEARCH_QUERY"]
130130

131131
else:
132132
message_content = "What is Contoso?"

tests/integration_tests/test_startup_scripts.py

Lines changed: 0 additions & 40 deletions
This file was deleted.

0 commit comments

Comments
 (0)