Source code for lomas_server.administration.tests.test_streamlit_app_page_b

import json
from io import BytesIO
from pathlib import Path
from unittest.mock import patch

import pytest
from streamlit.testing.v1 import AppTest

from lomas_core.models.constants import PrivateDatabaseType
from lomas_server.administration.mongodb_admin import drop_collection, get_mongodb
from lomas_server.models.config import AdminConfig, MongoDBConfig


[docs] @pytest.fixture def mock_mongodb_and_helpers(): """Fixture to mock the MongoDB and helper functions used in the Streamlit app.""" with patch("streamlit.file_uploader") as mock_file_uploader: mock_file_path = Path(__file__).parent / "../../../data/collections/metadata/iris_metadata.yaml" mock_file = BytesIO(mock_file_path.read_bytes()) mock_file.name = mock_file_path.name mock_file_uploader.return_value = mock_file yield mock_file_uploader
[docs] def wipe_db(mg_config: MongoDBConfig): drop_collection(mg_config, "metadata") drop_collection(mg_config, "datasets") drop_collection(mg_config, "users") drop_collection(mg_config, "queries_archives")
[docs] @pytest.fixture def at(): mg_config = AdminConfig().mg_config # pre-clean MongoDB (typical case: we are here after notebooks run) wipe_db(mg_config) get_mongodb(mg_config) yield AppTest.from_file("../dashboard/pages/b_database_administration.py").run() # post-clean by politesse wipe_db(mg_config)
[docs] @pytest.fixture def dataset_iris(at: AppTest, mock_mongodb_and_helpers): at.text_input("ad_dataset").set_value("IRIS").run() at.selectbox("ad_type").set_value(PrivateDatabaseType.PATH).run() at.selectbox("ad_meta_type").set_value(PrivateDatabaseType.PATH).run() at.text_input("ad_path").set_value( "https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv" ).run() at.button("add_dataset_with_metadata").click().run() assert at.success[0].value == "File iris_metadata.yaml uploaded successfully!" assert at.markdown[0].value == "Dataset IRIS was added." assert at.session_state.list_datasets == ["IRIS"] yield at.selectbox("rd_dataset").set_value("IRIS").run() at.button("delete_dataset_and_metadata").click().run() assert at.session_state.list_datasets == []
[docs] def test_widgets(at: AppTest, dataset_iris) -> None: """Test the different widgets (add/remove users/datasets/metadata).""" # User tab # Subheader "Add user" at.text_input("au_username_key").set_value("").run() at.button("add_user_button").click().run() assert at.warning[0].value == "Please fill all fields." at.text_input("au_username_key").set_value("test").run() at.text_input("au_email_key").set_value("test@test.com").run() at.button("add_user_button").click().run() assert at.markdown[0].value == "User test was added." at.text_input("au_username_key").set_value("test").run() at.text_input("au_email_key").set_value("test@test.com").run() at.button("add_user_button").click().run() assert at.warning[0].value == "User test is already in the database." # assert at.warning[1].value == "Please fill all fields." # Subheader "Add user with budget" at.text_input("auwb_username").set_value("Bobby").run() at.text_input("auwb_email_key").set_value("bobby@test.com").run() at.selectbox("dataset of add user with budget").set_value("IRIS").run() at.number_input("auwb_epsilon").set_value(None).run() at.number_input("auwb_delta").set_value(None).run() at.button("add_user_with_budget").click().run() assert at.warning[0].value == "Please fill all fields." at.text_input("auwb_username").set_value("Bobby").run() at.text_input("auwb_email_key").set_value("bobby@test.com").run() at.selectbox("dataset of add user with budget").set_value("IRIS").run() at.number_input("auwb_epsilon").set_value(10).run() at.number_input("auwb_delta").set_value(0.01).run() at.button("add_user_with_budget").click().run() assert at.markdown[0].value == "User Bobby was added with dataset IRIS." # Subheader "Add dataset to user" at.selectbox("username of add dataset to user").set_value("test").run() at.selectbox("dataset of add dataset to user").set_value("IRIS").run() at.number_input("adtu_epsilon").set_value(10).run() at.number_input("adtu_delta").set_value(0.01).run() at.button("add_dataset_to_user").click().run() assert at.markdown[0].value == "Dataset IRIS was added to user test with epsilon = 10.0 and delta = 0.01" # Subheader "Modify user epsilon" at.selectbox("username of modify user epsilon").set_value("test").run() at.selectbox("dataset of modify user epsilon").set_value("IRIS").run() at.number_input("sue_epsilon").set_value(1).run() at.button("modify_user_epsilon").click().run() assert at.markdown[0].value == "User test on dataset IRIS initial epsilon value was modified to 1.0" # Subheader "Modify user delta" at.selectbox("username of modify user delta").set_value("test").run() at.selectbox("dataset of modify user delta").set_value("IRIS").run() at.number_input("sud_delta").set_value(0.001).run() at.button("modify_user_delta").click().run() assert at.markdown[0].value == "User test on dataset IRIS initial delta value was modified to 0.001" # Subheader "Modify user may query" at.selectbox("username of user may query").set_value("test").run() at.selectbox("umq_may_query").set_value(False).run() at.button("m_u_m_q").click().run() assert at.markdown[0].value == "User test may_query is now: `False`" # Content tab # Subheader "Show one element" at.selectbox("username of user to show").set_value("test").run() at.button("content_user_display").click().run() result = json.loads(at.json[0].value) assert result["id"]["name"] == "test" assert not result["may_query"] at.selectbox("username of archives from user").set_value("test").run() at.button("content_user_archive_display").click().run() assert json.loads(at.json[0].value) == [] at.selectbox("dataset_to_show").set_value("IRIS").run() at.button("content_dataset_display").click().run() result = json.loads(at.json[0].value) assert result["dataset_name"] == "IRIS" assert "dataset_access" in result at.selectbox("metadata_of_dataset_to_show").set_value("IRIS").run() at.button("content_metadata_dataset_display").click().run() result = json.loads(at.json[0].value) assert result["max_ids"] == 1 assert result["rows"] == 150 # Subheader "Show full collection" at.button("content_show_all_users").click().run() assert json.loads(at.json[0].value)[0]["id"]["name"] == "test" at.button("content_show_all_datasets").click().run() assert json.loads(at.json[0].value)[0]["dataset_name"] == "IRIS" at.button("content_show_all_metadata").click().run() assert json.loads(at.json[0].value)[0]["IRIS"]["max_ids"] == 1 at.button("content_show_archives").click().run() assert json.loads(at.json[0].value) == [] # Deletion tab # Subheader "Delete one element" # Remove dataset from user at.selectbox("rdtu_user").set_value("test").run() at.selectbox("rdtu_dataset").set_value("IRIS").run() at.button("delete_dataset_from_user").click().run() assert at.markdown[3].value == "Dataset IRIS was removed from user test." # Delete one user at.selectbox("du_username").set_value("test").run() at.button("delete_user").click().run() assert at.session_state["list_users"] == ["Bobby"] assert at.markdown[2].value == "User test was deleted." # Subheader "Delete full collection" at.button("delete_all_users").click().run() assert at.markdown[4].value == "Users were all deleted." at.button("delete_all_datasets").click().run() assert at.markdown[4].value == "Datasets were all deleted." at.button("delete_all_metadata").click().run() assert at.markdown[4].value == "Metadata were all deleted." at.button("delete_all_archives").click().run() assert at.markdown[4].value == "Archives were all deleted."
[docs] def test_layout(at: AppTest) -> None: """Test the layout of administration page b.""" # Check the title assert "Admin Database Management" in at.title[0].value # Check tab "user management" assert at.tabs[0].label == ":technologist: User Management" assert "Add user" in at.subheader[0].value assert "Add user with budget" in at.subheader[1].value assert "Add dataset to user" in at.subheader[2].value assert "Set user client secret" in at.subheader[3].value assert "Modify user epsilon" in at.subheader[4].value assert "Modify user delta" in at.subheader[5].value assert "Modify user may query" in at.subheader[6].value assert "Add many users via a yaml file" in at.subheader[7].value # Check tab "user management" assert at.tabs[1].label == ":file_cabinet: Dataset Management" assert "Add one dataset" in at.subheader[8].value assert "Add many datasets via a yaml file" in at.subheader[9].value # Check tab "view database content" assert at.tabs[2].label == ":eyes: View Database Content" assert "Show one element" in at.subheader[10].value assert "Show full collection" in at.subheader[11].value # Check tab "delete content" assert at.tabs[3].label == ":wastebasket: Delete Content (:red[DANGEROUS])" assert at.markdown[0].value == ":warning: :red[**Danger Zone: deleting is final**] :warning:" assert "Delete one element" in at.subheader[12].value assert at.markdown[1].value == "**Delete one user**" assert at.markdown[2].value == "**Remove dataset from user**" assert at.markdown[3].value == "**Remove dataset and it's associated metadata**" assert "Delete full collection" in at.subheader[13].value