def test_get(self): states = WidgetStates() _create_widget("trigger", states).trigger_value = True _create_widget("bool", states).bool_value = True _create_widget("float", states).double_value = 0.5 _create_widget("int", states).int_value = 123 _create_widget("string", states).string_value = "howdy!" session_state = SessionState() session_state.set_widgets_from_proto(states) session_state._set_widget_metadata( create_metadata("trigger", "trigger_value")) session_state._set_widget_metadata( create_metadata("bool", "bool_value")) session_state._set_widget_metadata( create_metadata("float", "double_value")) session_state._set_widget_metadata(create_metadata("int", "int_value")) session_state._set_widget_metadata( create_metadata("string", "string_value")) self.assertEqual(True, session_state["trigger"]) self.assertEqual(True, session_state["bool"]) self.assertAlmostEqual(0.5, session_state["float"]) self.assertEqual(123, session_state["int"]) self.assertEqual("howdy!", session_state["string"])
def test_call_callbacks(self): """Test the call_callbacks method in 6 possible cases: 1. A widget does not have a callback 2. A widget's old and new values are equal, so the callback is not called. 3. A widget's callback has no args provided. 4. A widget's callback has just args provided. 5. A widget's callback has just kwargs provided. 6. A widget's callback has both args and kwargs provided. """ prev_states = WidgetStates() _create_widget("trigger", prev_states).trigger_value = True _create_widget("bool", prev_states).bool_value = True _create_widget("bool2", prev_states).bool_value = True _create_widget("float", prev_states).double_value = 0.5 _create_widget("int", prev_states).int_value = 123 _create_widget("string", prev_states).string_value = "howdy!" session_state = SessionState() session_state.set_widgets_from_proto(prev_states) mock_callback = MagicMock() deserializer = lambda x, s: x callback_cases = [ ("trigger", "trigger_value", None, None, None), ("bool", "bool_value", mock_callback, None, None), ("bool2", "bool_value", mock_callback, None, None), ("float", "double_value", mock_callback, (1,), None), ("int", "int_value", mock_callback, None, {"x": 2}), ("string", "string_value", mock_callback, (1,), {"x": 2}), ] for widget_id, value_type, callback, args, kwargs in callback_cases: session_state._set_widget_metadata( WidgetMetadata( widget_id, deserializer, lambda x: x, value_type=value_type, callback=callback, callback_args=args, callback_kwargs=kwargs, ) ) states = WidgetStates() _create_widget("trigger", states).trigger_value = True _create_widget("bool", states).bool_value = True _create_widget("bool2", states).bool_value = False _create_widget("float", states).double_value = 1.5 _create_widget("int", states).int_value = 321 _create_widget("string", states).string_value = "!ydwoh" session_state.on_script_will_rerun(states) mock_callback.assert_has_calls([call(), call(1), call(x=2), call(1, x=2)])
def test_set_widget_attrs_nonexistent(self): session_state = SessionState() session_state._set_widget_metadata(create_metadata("fake_widget_id", "")) self.assertTrue( isinstance( session_state._new_widget_state.widget_metadata["fake_widget_id"], WidgetMetadata, ) )
def test_get_keyed_widget_values(self): states = WidgetStates() _create_widget("trigger", states).trigger_value = True _create_widget("trigger2", states).trigger_value = True session_state = SessionState() session_state.set_widgets_from_proto(states) session_state._set_widget_metadata( create_metadata("trigger", "trigger_value", True)) session_state._set_widget_metadata( create_metadata("trigger2", "trigger_value")) self.assertEqual(dict(session_state.values()), {"trigger": True})
def test_marshall_excludes_widgets_without_state(self): widget_states = WidgetStates() _create_widget("trigger", widget_states).trigger_value = True session_state = SessionState() session_state.set_widgets_from_proto(widget_states) session_state._set_widget_metadata( WidgetMetadata("other_widget", lambda x, s: x, None, "trigger_value", True)) widgets = session_state.get_widget_states() self.assertEqual(len(widgets), 1) self.assertEqual(widgets[0].id, "trigger")
def test_reset_triggers(self): states = WidgetStates() session_state = SessionState() _create_widget("trigger", states).trigger_value = True _create_widget("int", states).int_value = 123 session_state.set_widgets_from_proto(states) session_state._set_widget_metadata( WidgetMetadata("trigger", lambda x, s: x, None, "trigger_value")) session_state._set_widget_metadata( WidgetMetadata("int", lambda x, s: x, None, "int_value")) self.assertTrue(session_state["trigger"]) self.assertEqual(123, session_state["int"]) session_state._reset_triggers() self.assertFalse(session_state["trigger"]) self.assertEqual(123, session_state["int"])
def test_coalesce_widget_states(self): session_state = SessionState() old_states = WidgetStates() _create_widget("old_set_trigger", old_states).trigger_value = True _create_widget("old_unset_trigger", old_states).trigger_value = False _create_widget("missing_in_new", old_states).int_value = 123 _create_widget("shape_changing_trigger", old_states).trigger_value = True session_state._set_widget_metadata( create_metadata("old_set_trigger", "trigger_value")) session_state._set_widget_metadata( create_metadata("old_unset_trigger", "trigger_value")) session_state._set_widget_metadata( create_metadata("missing_in_new", "int_value")) session_state._set_widget_metadata( create_metadata("shape changing trigger", "trigger_value")) new_states = WidgetStates() _create_widget("old_set_trigger", new_states).trigger_value = False _create_widget("new_set_trigger", new_states).trigger_value = True _create_widget("added_in_new", new_states).int_value = 456 _create_widget("shape_changing_trigger", new_states).int_value = 3 session_state._set_widget_metadata( create_metadata("new_set_trigger", "trigger_value")) session_state._set_widget_metadata( create_metadata("added_in_new", "int_value")) session_state._set_widget_metadata( create_metadata("shape_changing_trigger", "int_value")) session_state.set_widgets_from_proto( coalesce_widget_states(old_states, new_states)) self.assertRaises(KeyError, lambda: session_state["old_unset_trigger"]) self.assertRaises(KeyError, lambda: session_state["missing_in_new"]) self.assertEqual(True, session_state["old_set_trigger"]) self.assertEqual(True, session_state["new_set_trigger"]) self.assertEqual(456, session_state["added_in_new"]) # Widgets that were triggers before, but no longer are, will *not* # be coalesced self.assertEqual(3, session_state["shape_changing_trigger"])
def test_rerun_data_coalescing(self): """Test that multiple RERUN requests get coalesced with expected values. (This is similar to widgets_test.test_coalesce_widget_states - it's testing the same thing, but through the ScriptEventQueue interface.) """ queue = ScriptRequestQueue() session_state = SessionState() states = WidgetStates() _create_widget("trigger", states).trigger_value = True _create_widget("int", states).int_value = 123 queue.enqueue(ScriptRequest.RERUN, RerunData(widget_states=states)) states = WidgetStates() _create_widget("trigger", states).trigger_value = False _create_widget("int", states).int_value = 456 session_state._set_widget_metadata( WidgetMetadata("trigger", lambda x, s: x, None, "trigger_value")) session_state._set_widget_metadata( WidgetMetadata("int", lambda x, s: x, lambda x: x, "int_value")) queue.enqueue(ScriptRequest.RERUN, RerunData(widget_states=states)) event, data = queue.dequeue() self.assertEqual(event, ScriptRequest.RERUN) session_state.set_widgets_from_proto(data.widget_states) # Coalesced triggers should be True if either the old or # new value was True self.assertEqual(True, session_state.get("trigger")) # Other widgets should have their newest value self.assertEqual(456, session_state.get("int")) # We should have no more events self.assertEqual((None, None), queue.dequeue(), "Expected empty event queue") # Test that we can coalesce if previous widget state is None queue.enqueue(ScriptRequest.RERUN, RerunData(widget_states=None)) queue.enqueue(ScriptRequest.RERUN, RerunData(widget_states=None)) states = WidgetStates() _create_widget("int", states).int_value = 789 queue.enqueue(ScriptRequest.RERUN, RerunData(widget_states=states)) event, data = queue.dequeue() session_state.set_widgets_from_proto(data.widget_states) self.assertEqual(event, ScriptRequest.RERUN) self.assertEqual(789, session_state.get("int")) # We should have no more events self.assertEqual((None, None), queue.dequeue(), "Expected empty event queue") # Test that we can coalesce if our *new* widget state is None states = WidgetStates() _create_widget("int", states).int_value = 101112 queue.enqueue(ScriptRequest.RERUN, RerunData(widget_states=states)) queue.enqueue(ScriptRequest.RERUN, RerunData(widget_states=None)) event, data = queue.dequeue() session_state.set_widgets_from_proto(data.widget_states) self.assertEqual(event, ScriptRequest.RERUN) self.assertEqual(101112, session_state.get("int")) # We should have no more events self.assertEqual((None, None), queue.dequeue(), "Expected empty event queue")