def test_multiple_schedulers(self):
     p = self.project
     self.assertFalse(p.has_scheduler)
     
     b = Builder(project = p, name="test builder")
     b.save()
     
     # create cron scheduler
     cr = CronScheduler(project=p, name="cron")
     cr.save()
     self.assertEqual(1, p.scheduler_set.count())
     self.assertEqual(unicode(cr), "cron")
     self.assertFalse(p.has_scheduler) # scheduler has no assigned builder
     cr.builders.add(b)
     self.assertTrue(p.has_scheduler)
     
     
     # create change scheduler
     ch = ChangeScheduler(project=p, name="change")
     ch.save()
     self.assertEqual(2, p.scheduler_set.count())
     self.assertEqual(unicode(ch), "change")
     
     # check that they can be downcasted properly
     expect = [_("cron scheduler"), _("change scheduler")]
     for i,s in enumerate(p.scheduler_set.all()):
         # calling method on parent class should raise exception
         self.assertRaises(NotImplementedError, s.get_config_type)
         self.assertRaises(NotImplementedError, s.get_config_class)
         self.assertRaises(NotImplementedError, s.get_config_args)
         # should work with .cast()
         self.assertEqual(expect[i], s.cast().get_config_type())
 def test_name_uniqueness(self):
     """
     Ensure that a project cannot have multiple notifiers with the same name
     """
     p = self.project
     cr = CronScheduler(project=p, name="cron1")
     cr.save()
     
     ch = ChangeScheduler(project=p, name="cron1")
     self.assertRaises(IntegrityError, ch.save)
     self.assertEqual(ch.id, None)
     
     # the same name can be used in a different project
     p2 = Project(name="another p", owner=self.user)
     p2.save()
     ch.project = p2
     ch.save()
     self.assertNotEqual(ch.id, None)
     
     
 def test_simple_creation(self):
     """
     Basic cron-like scheduler
     """
     sched = CronScheduler(project = self.project, name = "cron")
     sched.save()
     self.assertNotEqual(sched.id, None)
     self.assertEqual(unicode(sched), "cron")
     self.assertEqual(sched.cast().get_config_type(), _("cron scheduler"))
     
      # add builders
     builders = ["builder1", "builder2", "builder3"]
     for bname in builders:
         b = Builder(project=self.project, name=bname)
         b.save()
         sched.builders.add(b)
     self.assertEqual(sched.builders.count(), len(builders))
     
     args = sched.cast().get_config_args()
     # check default arguments
     self.assertEqual(args.get("name", None), "cron")
     self.assertEqual(args.get("minute", None), "*")
     self.assertEqual(args.get("hour", None), "*")
     self.assertEqual(args.get("month", None), "*")
     self.assertEqual(args.get("dayOfWeek", None), "*")
     self.assertEqual(args.get("dayOfMonth", None), "*")
     self.assertEqual(args.get("onlyIfChanged", None), True)
     # check builderName
     bn = args.get("builderNames", [])
     self.assertEqual(len(bn), len(builders))
     for i,b in enumerate(builders):
         self.assertEqual(bn[i], b)
     
     # try instantiating buildbot config object
     self.assert_valid_buildbot_config(sched.cast().get_config_class(), args)
     
     # Check that the resulting config string is sensible
     self.assert_config_string_executable(sched.cast())
     
     # Check that changes in options are reflected in generated config
     sched.name = "newcode"
     sched.minute = 30
     sched.hour = 13
     sched.month = 5
     sched.day_of_month = 3
     sched.day_of_week = 4
     sched.only_if_code_changed = False
     sched.save()
     args = sched.cast().get_config_args()
     self.assertEqual(args.get("name", None), "newcode")
     self.assertEqual(args.get("minute", None), 30)
     self.assertEqual(args.get("hour", None), 13)
     self.assertEqual(args.get("month", None), 5)
     self.assertEqual(args.get("dayOfWeek", None), 4)
     self.assertEqual(args.get("dayOfMonth", None), 3)
     self.assertEqual(args.get("onlyIfChanged", None), False)
     
     # try instantiating buildbot config object
     self.assert_valid_buildbot_config(sched.cast().get_config_class(), args)
     
     # Check that the resulting config string is sensible
     self.assert_config_string_executable(sched.cast())