def test_create_timedelta(self): self.assertRaises(event_models.BadTimeUnitError, event_models.create_timedelta, 5, 'y') # No years. self.assertEqual(event_models.create_timedelta(2, 'h'), datetime.timedelta(seconds=2 * 3600)) self.assertEqual(event_models.create_timedelta(3, 'd'), datetime.timedelta(seconds=3 * 86400)) self.assertEqual(event_models.create_timedelta(4, 'w'), datetime.timedelta(seconds=4 * 604800))
def test_build_query_components(self): """Tests building a simple query and one with two inequality filters.""" self.setup_events() query_components1 = self.device_event._build_query_components() self.assertEqual(query_components1['less_than_properties'], ['due_date']) self.assertEqual(query_components1['extra_inequality_conditions'], []) self.assertLen( query_components1['query'].filters._ConjunctionNode__nodes, 3) # Add another inequality filter that uses <. Propery name hould be added to # less_than_properties, condition should be added to # extra_inequality_filters, and the core query should be identical. self.device_event.conditions.append( event_models.CustomEventCondition( name='last_heartbeat', opsymbol='<', value=event_models.create_timedelta(-5, 'd'))) query_components2 = self.device_event._build_query_components() self.assertListEqual( query_components2['less_than_properties'], ['due_date', 'last_heartbeat']) self.assertEqual( query_components2['extra_inequality_conditions'], [self.device_event.conditions[3]]) self.assertLen( query_components2['query'].filters._ConjunctionNode__nodes, 3)
def test_get_and_put(self): self.assertEqual(event_models.ReminderEvent.get(0), None) test_event = event_models.ReminderEvent.create(0) self.assertEqual(test_event.level, 0) # Tests @property taken from ID. self.assertEqual(test_event.model, 'Device') self.assertEqual(test_event.name, 'reminder_level_0') self.assertEqual(event_models.ReminderEvent.make_name(0), 'reminder_level_0') test_event.description = 'Device is due soon.' tomorrow = event_models.create_timedelta(1, 'd') test_event.conditions = [ event_models.CustomEventCondition(name='due_date', opsymbol='<', value=tomorrow), event_models.CustomEventCondition(name='locked', opsymbol='=', value=False), event_models.CustomEventCondition(name='lost', opsymbol='=', value=False) ] test_event.template = 'reminder_due' test_event.put() self.assertEqual(test_event, event_models.ReminderEvent.get(0))
def setup_events(self): """Creates test events.""" self.device_event = event_models.CustomEvent.create('device_event') self.device_event.description = 'This is the device event.' self.device_event.model = 'Device' self.device_event.conditions = [ event_models.CustomEventCondition( name='due_date', opsymbol='<', value=event_models.create_timedelta(1, 'd')), event_models.CustomEventCondition(name='locked', opsymbol='=', value=False), event_models.CustomEventCondition(name='lost', opsymbol='=', value=False) ] self.device_event.actions = ['DO_THING1', 'DO_THING2', 'DO_THING3'] self.device_event.put() self.shelf_event1 = event_models.CustomEvent.create('shelf_event_1') self.shelf_event1.description = 'This is the first shelf event.' self.shelf_event1.model = 'Shelf' self.shelf_event1.conditions = [ event_models.CustomEventCondition(name='last_audit_time', opsymbol='<', value=_THREE_DAYS_AGO_DELTA), event_models.CustomEventCondition(name='enabled', opsymbol='=', value=True) ] self.shelf_event1.actions = ['DO_THING4', 'DO_THING5', 'DO_THING6'] self.shelf_event1.put() self.shelf_event2 = event_models.CustomEvent.create('shelf_event_2') self.shelf_event2.description = 'This is the second shelf event.' self.shelf_event2.model = 'Shelf' self.shelf_event2.conditions = [ event_models.CustomEventCondition(name='last_audit_time', opsymbol='<', value=_THREE_DAYS_AGO_DELTA), event_models.CustomEventCondition(name='enabled', opsymbol='=', value=True), event_models.CustomEventCondition(name='capacity', opsymbol='=', value=24), ] self.shelf_event2.actions = ['DO_THING7', 'DO_THING8', 'DO_THING9'] self.shelf_event2.put()
def setup_events(self): tomorrow_delta = event_models.create_timedelta(1, 'd') self.reminder_due_event = event_models.ReminderEvent.create(0) self.reminder_due_event.description = 'Device due in less than one day.' self.reminder_due_event.conditions = [ event_models.CustomEventCondition( name='due_date', opsymbol='<', value=tomorrow_delta), event_models.CustomEventCondition( name='due_date', opsymbol='>', value=datetime.timedelta(seconds=0)), event_models.CustomEventCondition( name='locked', opsymbol='=', value=False), event_models.CustomEventCondition( name='lost', opsymbol='=', value=False) ] self.reminder_due_event.actions = ['DO_THING1', 'DO_THING2', 'DO_THING3'] self.reminder_due_event.put()
def _interpret_time(value): """Interprets a string from a YAML query condition for a time-related value. This turns a string like 'TIME:-3d' into a datetime.timedelta three days ago. Args: value: str, a value from datastore. If the passed value is not a string, this method returns it as originally passed. Returns: The original value, or an interpreted one as a datetime.timedelta. """ if isinstance(value, basestring): match = _TIME_RE.match(value) if match: qty = int(match.group(1)) unit = match.group(2) return event_models.create_timedelta(qty, unit) return value
def test_null_due_dates(self, mock_loginfo): """Tests with events and devices, but due_date for both devices are null.""" self.setup_devices() # pylint: disable=no-value-for-parameter tomorrow_delta = event_models.create_timedelta(1, 'd') simple_reminder_due_event = event_models.ReminderEvent.create(0) simple_reminder_due_event.description = 'Due date-based event.' simple_reminder_due_event.conditions = [ event_models.CustomEventCondition( name='due_date', opsymbol='<', value=tomorrow_delta)] simple_reminder_due_event.put() self.testbed.mock_raiseevent.reset_mock() response = self.testapp.get( r'/_cron/run_reminder_events?find_remindable_devices=true') self.assertEqual(response.status_int, 200) retrieved_device1 = self.device1.key.get() retrieved_device2 = self.device2.key.get() self.assertIsNone(retrieved_device1.next_reminder) self.assertIsNone(retrieved_device2.next_reminder)
import datetime from absl import logging import mock from google.appengine.api import datastore_errors from google.appengine.ext import ndb from loaner.web_app.backend.clients import directory from loaner.web_app.backend.models import device_model from loaner.web_app.backend.models import event_models from loaner.web_app.backend.models import shelf_model from loaner.web_app.backend.testing import loanertest _NOW = datetime.datetime.utcnow() _THREE_DAYS_AGO_DELTA = event_models.create_timedelta(-3, 'd') class CoreEventTest(loanertest.TestCase): """Tests for CoreEvent class.""" def test_core_event(self): self.assertEqual(event_models.CoreEvent.get('foo'), None) test_event = event_models.CoreEvent.create( 'test_core_event', 'Happens when a thing has occurred.') test_event.actions = ['do_thing1', 'do_thing2', 'do_thing3'] test_event.put() fetched_event = event_models.CoreEvent.get('test_core_event') self.assertEqual(test_event, fetched_event)