class SystemTestCase(TestCase): def setUp(self): self.system = System() self.system.save() def test_simple(self): system = self.system system.transition('Initialize', 'Initialized') self.assertEqual(len(system), 1) def test_long(self): system = self.system # Specify the event.. system.start_transition('Initialize') self.assertTrue(system.in_transition()) self.assertEqual(system.current_state(), State.TRANSITION) self.assertEqual(len(system), 1) self.assertRaises(STSError, system.start_transition, 'Initialize') # Sleep for 2 seconds.. time.sleep(2) # Specify the state.. trans = system.end_transition('Initialized') self.assertTrue(trans.duration, 2) self.assertFalse(system.in_transition()) self.assertEqual(system.current_state().name, 'Initialized') self.assertEqual(len(system), 1) self.assertRaises(STSError, system.end_transition, 'Initialized') system.transition('Saved', event='Save by foobar') system.transition('Saved', event='Save by admin') self.assertEqual(len(system), 3) self.assertEqual(State.objects.count(), 3) self.assertEqual(Event.objects.count(), 3) def test_iteration(self): system = self.system system.transition('Shoe Buckled', event='Buckle Shoe') system.transition('Door Closed', event='Close Door') # Test iteration self.assertEqual([str(t.state) for t in system], [ 'Shoe Buckled', 'Door Closed', ]) def test_getitem(self): system = self.system self.assertEqual(system[:3], []) self.assertEqual(system[2:3], []) self.assertRaises(IndexError, system.__getitem__, 5) self.assertRaises(IndexError, system.__getitem__, slice(None, None, 2)) self.assertRaises(ValueError, system.__getitem__, slice(None, None)) for i in range(1, 6): system.transition('Count {0}'.format(i), event='Incr 1') # Don't be confused.. indexing is zero-based, while counting is 1-based self.assertEqual([str(t.state) for t in system[:3]], ['Count 1', 'Count 2', 'Count 3']) self.assertEqual([str(t.state) for t in system[-3:]], ['Count 3', 'Count 4', 'Count 5']) self.assertEqual([str(t.state) for t in system[:-3]], ['Count 1', 'Count 2']) self.assertEqual([str(t.state) for t in system[1:3]], ['Count 2', 'Count 3']) self.assertEqual(str(system[3].state), 'Count 4') self.assertEqual(str(system[-1].state), 'Count 5') # Bad slices.. self.assertEqual(system[-1:-3], []) self.assertEqual(system[-1:2], []) self.assertEqual(system[1:1], []) def test_shortcuts(self): from django.contrib.auth.models import User from sts.shortcuts import transition, start_transition, end_transition user = User.objects.create_user(username='******', password='******', email='*****@*****.**') transition(user, 'Creating User', 'User Created') start_transition(user, 'Creating User') end_transition(user, 'User Created') def test_context_manager(self): from sts.contextmanagers import transition with transition('Sleeper', 'Awake', event='Nap') as trans: time.sleep(2) trans.message = 'That was a short nap!' system = System.objects.get(name='Sleeper') self.assertEqual(system.current_state().name, 'Awake') trans = system[0] self.assertEqual(trans.message, 'That was a short nap!') self.assertTrue(2000 < trans.duration < 3000) try: with transition('Sleeper', 'Awake', event='Nap', fail_state='Annoyed'): raise Exception except: pass self.assertEqual(system.current_state().name, 'Annoyed')