| |
| import pytest |
| import pandas as pd |
| import gradio as gr |
| from unittest.mock import patch |
|
|
| |
| from ankigen_core import ui_logic |
|
|
| |
|
|
|
|
| @pytest.mark.parametrize( |
| "mode, expected_visibility", |
| [ |
| ( |
| "subject", |
| { |
| "subject": True, |
| "path": False, |
| "text": False, |
| "web": False, |
| "cards": True, |
| "path_res": False, |
| }, |
| ), |
| ( |
| "path", |
| { |
| "subject": False, |
| "path": True, |
| "text": False, |
| "web": False, |
| "cards": False, |
| "path_res": True, |
| }, |
| ), |
| ( |
| "text", |
| { |
| "subject": False, |
| "path": False, |
| "text": True, |
| "web": False, |
| "cards": True, |
| "path_res": False, |
| }, |
| ), |
| ( |
| "web", |
| { |
| "subject": False, |
| "path": False, |
| "text": False, |
| "web": True, |
| "cards": True, |
| "path_res": False, |
| }, |
| ), |
| ( |
| "invalid", |
| { |
| "subject": False, |
| "path": False, |
| "text": False, |
| "web": False, |
| "cards": False, |
| "path_res": False, |
| }, |
| ), |
| ], |
| ) |
| def test_update_mode_visibility_group_visibility(mode, expected_visibility): |
| """Test visibility updates for different modes.""" |
| result = ui_logic.update_mode_visibility(mode, "s", "d", "t", "u") |
|
|
| |
| assert result["subject_mode_group"]["visible"] == expected_visibility["subject"] |
| assert result["path_mode_group"]["visible"] == expected_visibility["path"] |
| assert result["text_mode_group"]["visible"] == expected_visibility["text"] |
| assert result["web_mode_group"]["visible"] == expected_visibility["web"] |
|
|
| |
| assert result["cards_output_group"]["visible"] == expected_visibility["cards"] |
| assert result["path_results_group"]["visible"] == expected_visibility["path_res"] |
|
|
|
|
| def test_update_mode_visibility_value_persistence(): |
| """Test that input values are preserved for the selected mode and cleared otherwise.""" |
| subject_val = "Test Subject" |
| desc_val = "Test Description" |
| text_val = "Test Text" |
| url_val = "http://test.com" |
|
|
| |
| result = ui_logic.update_mode_visibility( |
| "subject", subject_val, desc_val, text_val, url_val |
| ) |
| assert result["subject_textbox"]["value"] == subject_val |
| assert result["description_textbox"]["value"] == "" |
| assert result["source_text_textbox"]["value"] == "" |
| assert result["url_textbox"]["value"] == "" |
|
|
| |
| result = ui_logic.update_mode_visibility( |
| "path", subject_val, desc_val, text_val, url_val |
| ) |
| assert result["subject_textbox"]["value"] == "" |
| assert result["description_textbox"]["value"] == desc_val |
| assert result["source_text_textbox"]["value"] == "" |
| assert result["url_textbox"]["value"] == "" |
|
|
| |
| result = ui_logic.update_mode_visibility( |
| "text", subject_val, desc_val, text_val, url_val |
| ) |
| assert result["subject_textbox"]["value"] == "" |
| assert result["description_textbox"]["value"] == "" |
| assert result["source_text_textbox"]["value"] == text_val |
| assert result["url_textbox"]["value"] == "" |
|
|
| |
| result = ui_logic.update_mode_visibility( |
| "web", subject_val, desc_val, text_val, url_val |
| ) |
| assert result["subject_textbox"]["value"] == "" |
| assert result["description_textbox"]["value"] == "" |
| assert result["source_text_textbox"]["value"] == "" |
| assert result["url_textbox"]["value"] == url_val |
|
|
|
|
| def test_update_mode_visibility_clears_outputs(): |
| """Test that changing mode always clears output components.""" |
| result = ui_logic.update_mode_visibility("subject", "s", "d", "t", "u") |
| assert result["output_dataframe"]["value"] is None |
| assert result["subjects_dataframe"]["value"] is None |
| assert result["learning_order_markdown"]["value"] == "" |
| assert result["projects_markdown"]["value"] == "" |
| assert result["progress_html"]["value"] == "" |
| assert result["progress_html"]["visible"] is False |
| assert result["total_cards_number"]["value"] == 0 |
| assert result["total_cards_number"]["visible"] is False |
|
|
|
|
| |
|
|
|
|
| def test_use_selected_subjects_success(): |
| """Test successful transition using subjects DataFrame.""" |
| data = { |
| "Subject": ["Subj A", "Subj B"], |
| "Prerequisites": ["P1", "P2"], |
| "Time Estimate": ["T1", "T2"], |
| } |
| df = pd.DataFrame(data) |
|
|
| result = ui_logic.use_selected_subjects(df) |
|
|
| |
| assert result["generation_mode_radio"] == "subject" |
| assert result["subject_mode_group"]["visible"] is True |
| assert result["path_mode_group"]["visible"] is False |
| assert result["text_mode_group"]["visible"] is False |
| assert result["web_mode_group"]["visible"] is False |
| assert result["path_results_group"]["visible"] is False |
| assert result["cards_output_group"]["visible"] is True |
|
|
| |
| assert result["subject_textbox"] == "Subj A, Subj B" |
| assert result["topic_number_slider"] == 3 |
| assert ( |
| "connections between these subjects" in result["preference_prompt_textbox"] |
| ) |
|
|
| |
| assert result["description_textbox"] == "" |
| assert result["source_text_textbox"] == "" |
| assert result["url_textbox"] == "" |
| assert result["output_dataframe"]["value"] is None |
| assert result["subjects_dataframe"] is df |
|
|
|
|
| @patch("gradio.Warning") |
| def test_use_selected_subjects_none_input(mock_gr_warning): |
| """Test behavior with None input.""" |
| result = ui_logic.use_selected_subjects(None) |
|
|
| mock_gr_warning.assert_called_once_with( |
| "No subjects available to copy from Learning Path analysis." |
| ) |
| |
| assert isinstance(result, dict) |
| assert "generation_mode_radio" in result |
| assert ( |
| result["generation_mode_radio"] == gr.update() |
| ) |
|
|
|
|
| @patch("gradio.Warning") |
| def test_use_selected_subjects_empty_dataframe(mock_gr_warning): |
| """Test behavior with an empty DataFrame.""" |
| df = pd.DataFrame() |
| result = ui_logic.use_selected_subjects(df) |
|
|
| mock_gr_warning.assert_called_once_with( |
| "No subjects available to copy from Learning Path analysis." |
| ) |
| assert isinstance(result, dict) |
| assert result["generation_mode_radio"] == gr.update() |
|
|
|
|
| @patch("gradio.Error") |
| def test_use_selected_subjects_missing_column(mock_gr_error): |
| """Test behavior when DataFrame is missing the 'Subject' column.""" |
| df = pd.DataFrame({"WrongColumn": ["Data"]}) |
| result = ui_logic.use_selected_subjects(df) |
|
|
| mock_gr_error.assert_called_once_with( |
| "Learning path analysis result is missing the 'Subject' column." |
| ) |
| assert isinstance(result, dict) |
| assert result["generation_mode_radio"] == gr.update() |
|
|