# Copyright 2023 (c) Anna Schumaker. """Test our functions for callbacks at a specific time.""" import datetime import unittest.mock import emmental.alarm from gi.repository import GLib class TestAlarm(unittest.TestCase): """Test case for callbacks at a specific time.""" def setUp(self): """Set up common variables.""" emmental.alarm._GSOURCE_MAPPING.clear() emmental.alarm._NEXT_ALARM_ID = 1 self.midnight = datetime.time(hour=0, minute=0, second=0) def test_state(self): """Test our global state.""" self.assertDictEqual(emmental.alarm._GSOURCE_MAPPING, {}) self.assertEqual(emmental.alarm._NEXT_ALARM_ID, 1) def test_calc_seconds(self): """Test calculating the seconds until the next alarm.""" now = datetime.datetime.now() time = (now + datetime.timedelta(minutes=2)).time() self.assertEqual(emmental.alarm._calc_seconds(time), 120) time = (now - datetime.timedelta(minutes=2)).time() self.assertEqual(emmental.alarm._calc_seconds(time), 86280) @unittest.mock.patch("gi.repository.GLib.timeout_add_seconds") def test_set_alarm(self, mock_timeout_add: unittest.mock.Mock): """Test setting an alarm.""" callback = unittest.mock.Mock() seconds = emmental.alarm._calc_seconds(self.midnight) mock_timeout_add.return_value = 42 srcid = emmental.alarm.set_alarm(self.midnight, callback) mock_timeout_add.assert_called_with(seconds, emmental.alarm._do_alarm, self.midnight, callback, 1) self.assertEqual(srcid, 1) self.assertEqual(emmental.alarm._NEXT_ALARM_ID, 2) self.assertEqual(emmental.alarm._GSOURCE_MAPPING[1], 42) @unittest.mock.patch("gi.repository.GLib.source_remove") @unittest.mock.patch("gi.repository.GLib.timeout_add_seconds") def test_cancel_alarm(self, mock_timeout_add: unittest.mock.Mock, mock_source_remove: unittest.mock.Mock): """Test cancelling an alarm.""" callback = unittest.mock.Mock() mock_timeout_add.return_value = 42 srcid = emmental.alarm.set_alarm(self.midnight, callback) emmental.alarm.cancel_alarm(srcid) mock_source_remove.assert_called_with(42) self.assertNotIn(srcid, emmental.alarm._GSOURCE_MAPPING) @unittest.mock.patch("gi.repository.GLib.timeout_add_seconds") def test_do_alarm(self, mock_timeout_add: unittest.mock.Mock): """Test triggering an alarm.""" callback = unittest.mock.Mock() seconds = emmental.alarm._calc_seconds(self.midnight) emmental.alarm._GSOURCE_MAPPING[1] = 2 mock_timeout_add.return_value = 42 self.assertEqual(emmental.alarm._do_alarm(self.midnight, callback, 1), GLib.SOURCE_REMOVE) callback.assert_called() mock_timeout_add.assert_called_with(seconds, emmental.alarm._do_alarm, self.midnight, callback, 1) self.assertEqual(emmental.alarm._GSOURCE_MAPPING[1], 42)