async def test_network_speed_block_down(): with patch(**PSUTIL_MOCK_CONFIG) as mock_psutil: mock_psutil.configure_mock( **{ "net_if_stats.return_value": { "lo": misc.AttributeDict(isup=True, duplex=psutil.NIC_DUPLEX_UNKNOWN, speed=0, mtu=65536), "eno1": misc.AttributeDict(isup=False, duplex=psutil.NIC_DUPLEX_FULL, speed=1000, mtu=1500), } }) instance = ps.NetworkSpeedBlock( format_up="{interface} {upload} {download}", ) await instance.run() result = instance.result() assert result["full_text"] == "No network" assert result["color"] == types.Color.URGENT
async def test_window_title_block(): with patch("i3pyblocks.blocks.i3ipc.i3ipc_aio", autospec=True, spec_set=True) as mock_i3ipc_aio: mock_connection = mock_i3ipc_aio.Connection.return_value tree_mock = mock_connection.get_tree.return_value # For some reason this was mocked as a AsyncMock window_mock = tree_mock.find_focused = Mock() window_mock.return_value = misc.AttributeDict(name="Hello") instance = i3ipc.WindowTitleBlock() await task.runner([instance.start()]) result = instance.result() assert result["full_text"] == "Hello" await instance.clear_title() result = instance.result() assert result["full_text"] == "" # Sometimes window.name returns None window_mock.return_value = misc.AttributeDict(name=None) await instance.update_title(mock_connection) result = instance.result() assert result["full_text"] == ""
async def test_backlight_block_click_handler(tmpdir): with patch( "i3pyblocks.blocks.inotify.subprocess", autospec=True, spec_set=True, ) as mock_subprocess: mock_subprocess.configure_mock(**{ "arun.return_value": (misc.AttributeDict(returncode=0)), }) instance = inotify.BacklightBlock( base_path=tmpdir, command_on_click={ types.MouseButton.LEFT_BUTTON: "LEFT_BUTTON", types.MouseButton.MIDDLE_BUTTON: "MIDDLE_BUTTON", types.MouseButton.RIGHT_BUTTON: "RIGHT_BUTTON", types.MouseButton.SCROLL_UP: "SCROLL_UP", types.MouseButton.SCROLL_DOWN: "SCROLL_DOWN", }, ) for button in [ "LEFT_BUTTON", "RIGHT_BUTTON", "MIDDLE_BUTTON", "SCROLL_UP", "SCROLL_DOWN", ]: await instance.click_handler(getattr(types.MouseButton, button)) mock_subprocess.arun.assert_called_once_with(button) mock_subprocess.arun.reset_mock()
async def test_sensors_battery_block(): with patch(**PSUTIL_MOCK_CONFIG) as mock_psutil: mock_psutil.configure_mock( **{ "sensors_battery.side_effect": [ misc.AttributeDict( percent=93, secsleft=psutil.POWER_TIME_UNLIMITED, power_plugged=True, ), misc.AttributeDict( percent=23, secsleft=16628, power_plugged=False), None, misc.AttributeDict( percent=9, secsleft=psutil.POWER_TIME_UNKNOWN, power_plugged=False, ), ], # Unmock those enums "POWER_TIME_UNLIMITED": psutil.POWER_TIME_UNLIMITED, "POWER_TIME_UNKNOWN": psutil.POWER_TIME_UNKNOWN, }) instance = ps.SensorsBatteryBlock() await instance.run() result = instance.result() assert result["full_text"] == "B: PLUGGED 93%" await instance.run() result = instance.result() assert result["full_text"] == "B: ▂ 23% 4:37:08" assert result["color"] == types.Color.WARN await instance.run() result = instance.result() assert result["full_text"] == "No battery" await instance.run() result = instance.result() assert result["full_text"] == "B: ▁ 9%" assert result["color"] == types.Color.URGENT
def test_caffeine_block(): with patch( # Display.dpms_info() is generated at runtime so can't autospec here "i3pyblocks.blocks.x11.display", autospec=False, spec_set=True, ) as mock_display: mock_Display = mock_display.Display.return_value mock_Display.dpms_info.return_value = misc.AttributeDict(state=1) instance = x11.CaffeineBlock() instance.run_sync() assert instance.result()["full_text"] == "CAFFEINE OFF" instance.click_handler_sync() mock_Display.dpms_disable.assert_called_once() mock_Display.set_screen_saver.assert_called_once_with( allow_exposures=X.DefaultExposures, interval=0, prefer_blank=X.DefaultBlanking, timeout=0, ) mock_Display.reset_mock() mock_Display.dpms_info.return_value = misc.AttributeDict(state=0) instance.run_sync() assert instance.result()["full_text"] == "CAFFEINE ON" instance.click_handler_sync() mock_Display.dpms_enable.assert_called_once() mock_Display.set_screen_saver.assert_called_once_with( allow_exposures=X.DefaultExposures, interval=-1, prefer_blank=X.DefaultBlanking, timeout=-1, )
async def test_shell_block_click_handler(): with patch("i3pyblocks.blocks.shell.subprocess", autospec=True, spec_set=True) as mock_subprocess: mock_subprocess.configure_mock( **{ "arun.return_value": (misc.AttributeDict( stdout="stdout\n", stderr="stderr\n", returncode=0, )), "PIPE": subprocess.PIPE, }) instance = shell.ShellBlock( command="exit 0", command_on_click={ types.MouseButton.LEFT_BUTTON: "LEFT_BUTTON", types.MouseButton.MIDDLE_BUTTON: "MIDDLE_BUTTON", types.MouseButton.RIGHT_BUTTON: "RIGHT_BUTTON", types.MouseButton.SCROLL_UP: "SCROLL_UP", types.MouseButton.SCROLL_DOWN: "SCROLL_DOWN", }, ) for button in [ "LEFT_BUTTON", "RIGHT_BUTTON", "MIDDLE_BUTTON", "SCROLL_UP", "SCROLL_DOWN", ]: await instance.click_handler(getattr(types.MouseButton, button)) mock_subprocess.arun.assert_has_calls([ call(button), call( "exit 0", stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, ), ]) mock_subprocess.arun.reset_mock()
async def test_disk_usage_block(): with patch(**PSUTIL_MOCK_CONFIG) as mock_psutil: mock_psutil.configure_mock( **{ "disk_usage.return_value": misc.AttributeDict( total=226227036160, used=49354395648, free=165309575168, percent=91.3, ) }) instance = ps.DiskUsageBlock( format="{icon} {path} {total:.1f} {used:.1f} {free:.1f} {percent}", ) await instance.run() result = instance.result() assert result["full_text"] == "█ / 210.7 46.0 154.0 91.3" assert result["color"] == types.Color.URGENT
async def test_virtual_memory_block(): with patch(**PSUTIL_MOCK_CONFIG) as mock_psutil: mock_psutil.configure_mock( **{ "virtual_memory.return_value": misc.AttributeDict( total=16758484992, available=13300297728, percent=95.6, used=2631917568, free=10560126976, ) }) instance = ps.VirtualMemoryBlock( format= "{icon} {total:.1f} {available:.1f} {used:.1f} {free:.1f} {percent}", ) await instance.run() result = instance.result() assert result["full_text"] == "█ 15.6 12.4 2.5 9.8 95.6"
async def test_disk_usage_block_with_short_path(): path_str = "/media/backup/Downloads" with patch(**PSUTIL_MOCK_CONFIG) as mock_psutil: mock_psutil.configure_mock( **{ "disk_usage.return_value": misc.AttributeDict( total=226227036160, used=49354395648, free=165309575168, percent=91.3, ) }) instance = ps.DiskUsageBlock(path=Path(path_str), format="{short_path}") await instance.run() # Making sure that we call psutil.disk_usage with str instead of Path mock_psutil.disk_usage.assert_called_once_with(path_str) result = instance.result() assert result["full_text"] == "/m/b/D"
async def test_sensors_temperature_block(): with patch(**PSUTIL_MOCK_CONFIG) as mock_psutil: mock_psutil.configure_mock( **{ "sensors_temperatures.return_value": { "coretemp": [ misc.AttributeDict( label="Package id 0", current=78.0, high=82.0, critical=100.0, ), misc.AttributeDict(label="Core 0", current=29.0, high=82.0, critical=100.0), misc.AttributeDict(label="Core 1", current=28.0, high=82.0, critical=100.0), misc.AttributeDict(label="Core 2", current=28.0, high=82.0, critical=100.0), misc.AttributeDict(label="Core 3", current=28.0, high=82.0, critical=100.0), misc.AttributeDict(label="Core 4", current=30.0, high=82.0, critical=100.0), misc.AttributeDict(label="Core 5", current=28.0, high=82.0, critical=100.0), ], "acpitz": [ misc.AttributeDict( label="", current=16.8, high=18.8, critical=18.8), misc.AttributeDict( label="", current=27.8, high=119.0, critical=119.0), misc.AttributeDict( label="", current=29.8, high=119.0, critical=119.0), ], } }) instance_default = ps.SensorsTemperaturesBlock( format="{icon} {label} {current} {high} {critical}", ) await instance_default.run() result = instance_default.result() assert result["full_text"] == "▇ Package id 0 78.0 82.0 100.0" assert result["color"] == types.Color.WARN instance_acpitz = ps.SensorsTemperaturesBlock(sensor_regex="acpi.*") await instance_acpitz.run() result = instance_acpitz.result() assert result["full_text"] == "T: 17°C"
async def test_network_speed_block_two_interfaces_up(): with patch(**PSUTIL_MOCK_CONFIG) as mock_psutil: mock_psutil.configure_mock( **{ "net_if_stats.side_effect": [ { "eno1": misc.AttributeDict( isup=True, duplex=psutil.NIC_DUPLEX_FULL, speed=1000, mtu=1500, ), "eno2": misc.AttributeDict( isup=True, duplex=psutil.NIC_DUPLEX_FULL, speed=1000, mtu=1500, ), }, { "eno2": misc.AttributeDict( isup=True, duplex=psutil.NIC_DUPLEX_FULL, speed=1000, mtu=1500, ), "eno1": misc.AttributeDict( isup=True, duplex=psutil.NIC_DUPLEX_FULL, speed=1000, mtu=1500, ), }, { "eno2": misc.AttributeDict( isup=True, duplex=psutil.NIC_DUPLEX_FULL, speed=1000, mtu=1500, ), "eno1": misc.AttributeDict( isup=True, duplex=psutil.NIC_DUPLEX_FULL, speed=1000, mtu=1500, ), }, ], "net_io_counters.return_value": { "eno1": misc.AttributeDict( bytes_sent=1082551675, bytes_recv=2778549399, packets_sent=2198791, packets_recv=2589939, ), "eno2": misc.AttributeDict( bytes_sent=35052252, bytes_recv=35052252, packets_sent=72139, packets_recv=72139, ), }, }, ) instance = ps.NetworkSpeedBlock(format_up="{interface}") await instance.run() result = instance.result() assert result["full_text"] == "eno1" await instance.run() result = instance.result() assert result["full_text"] == "eno1"
async def test_network_speed_block_up(): with patch(**PSUTIL_MOCK_CONFIG) as mock_psutil, patch( "i3pyblocks.blocks.ps.time") as mock_time: mock_psutil.configure_mock( **{ "net_if_stats.return_value": { "lo": misc.AttributeDict(isup=True, duplex=psutil.NIC_DUPLEX_UNKNOWN, speed=0, mtu=65536), "eno1": misc.AttributeDict(isup=True, duplex=psutil.NIC_DUPLEX_FULL, speed=1000, mtu=1500), }, "net_io_counters.side_effect": [ { "lo": misc.AttributeDict( bytes_sent=35052252, bytes_recv=35052252, packets_sent=72139, packets_recv=72139, ), "eno1": misc.AttributeDict( bytes_sent=1082551675, bytes_recv=2778549399, packets_sent=2198791, packets_recv=2589939, ), }, { "lo": misc.AttributeDict( bytes_sent=35498316, bytes_recv=35498316, packets_sent=72619, packets_recv=72619, ), "eno1": misc.AttributeDict( bytes_sent=1093133039, bytes_recv=2789019792, packets_sent=2203911, packets_recv=2592307, ), }, ], }) mock_time.time.return_value = 3.328857660293579 instance = ps.NetworkSpeedBlock( format_up="{interface} {upload} {download}") mock_time.time.return_value = 6.328857660293579 await instance.run() result = instance.result() assert result["full_text"] == "eno1 3.4M 3.3M" assert result["color"] == types.Color.WARN
import pytest from helpers import misc from mock import Mock, patch from i3pyblocks import types try: pulsectl = pytest.importorskip("pulsectl") pulse = pytest.importorskip("i3pyblocks.blocks.pulse") except OSError: from unittest import SkipTest raise SkipTest("PulseAudio is not installed, skipping tests...") # Stub some PulseAudio sinks SINK = misc.AttributeDict(description="description", index=1, name="sink", mute=0) SINK_MUTE = misc.AttributeDict(description="description", index=1, name="sink", mute=1) ANOTHER_SINK = misc.AttributeDict( description="another description", index=2, name="another_sink", mute=1 ) DEFAULT_MOCK_CONFIG = { "Pulse.return_value.__enter__": Mock(), "Pulse.return_value.__exit__": Mock(), "Pulse.return_value.__enter__.return_value.sink_list.return_value": [ SINK, ANOTHER_SINK, ], "Pulse.return_value.__enter__.return_value.sink_info.return_value": SINK, "Pulse.return_value.__enter__.return_value.volume_get_all_chans.return_value": 0.8, # Unmock those exceptions "PulseLoopStop": pulsectl.PulseLoopStop,