import json import numpy as np import pytest import gradio as gr class TestJSON: def test_component_functions(self): """ Postprocess """ js_output = gr.JSON() assert js_output.postprocess('{"a":1, "b": 2}'), '"{\\"a\\":1, \\"b\\": 2}"' assert js_output.get_config() == { "container": True, "min_width": 160, "scale": None, "elem_id": None, "elem_classes": [], "visible": True, "value": None, "show_label": True, "label": None, "name": "json", "proxy_url": None, "_selectable": False, "open": False, "key": None, "show_indices": False, } js_component = gr.Json(value={"a": 1, "b": 2}) assert js_component.get_config()["value"] == {"a": 1, "b": 2} def test_chatbot_selectable_in_config(self): with gr.Blocks() as demo: cb = gr.Chatbot(label="Chatbot") cb.like(lambda: print("foo")) gr.Chatbot(label="Chatbot2") assertion_count = 0 for component in demo.config["components"]: if component["props"]["label"] == "Chatbot": assertion_count += 1 assert component["props"]["likeable"] elif component["props"]["label"] == "Chatbot2": assertion_count += 1 assert not component["props"]["likeable"] assert assertion_count == 2 @pytest.mark.asyncio async def test_in_interface(self): """ Interface, process """ def get_avg_age_per_gender(data): return { "M": int(data[data["gender"] == "M"]["age"].mean()), "F": int(data[data["gender"] == "F"]["age"].mean()), "O": int(data[data["gender"] == "O"]["age"].mean()), } iface = gr.Interface( get_avg_age_per_gender, gr.Dataframe(headers=["gender", "age"]), "json", ) y_data = [ ["M", 30], ["F", 20], ["M", 40], ["O", 20], ["F", 30], ] assert ( await iface.process_api(0, [{"data": y_data, "headers": ["gender", "age"]}]) )["data"][0].model_dump() == { "M": 35, "F": 25, "O": 20, } @pytest.mark.parametrize( "value, expected", [ (None, None), (True, True), ([1, 2, 3], [1, 2, 3]), ([np.array([1, 2, 3])], [[1, 2, 3]]), ({"foo": [1, 2, 3]}, {"foo": [1, 2, 3]}), ({"foo": np.array([1, 2, 3])}, {"foo": [1, 2, 3]}), ], ) def test_postprocess_returns_json_serializable_value(self, value, expected): json_component = gr.JSON() postprocessed_value = json_component.postprocess(value) if postprocessed_value is None: assert value is None else: assert postprocessed_value.model_dump() == expected assert json.loads(json.dumps(postprocessed_value.model_dump())) == expected