Example #1
0
class TipModelTestCase(unittest.TestCase):

    def setUp(self):
        # --------------------------------------------------------------------
        #   All Tips need an owner Guide, which need an owner Account.
        # --------------------------------------------------------------------
        self.user = User.objects.create_user(username = '******',
                                             email = '*****@*****.**',
                                             password = '******')
        self.user.save()
        self.account = self.user.get_profile()

        self.guide = Guide(title = "What to do in Montreal!",
                           location = "Montreal, Canada",
                           owner = self.account,
                           is_draft = False)
        self.guide.save()

        self.draft_guide = Guide(title = "What to do in Montreal!",
                                 location = "Montreal, Canada",
                                 owner = self.account,
                                 is_draft = True)
        self.draft_guide.save()
        # --------------------------------------------------------------------

        cache.clear()

    def tearDown(self):
        for pk in [self.guide.pk, self.draft_guide.pk]:
            if Guide.objects.filter(pk__exact = self.guide.pk).exists():
                self.guide.delete()
        self.user.delete()

    def test_tip_creation(self):
        self.assertEqual(len(Tip.objects.all()), 0)
        self.assertEqual(len(self.guide.tip_set.all()), 0)
        tip = Tip(title = "Peel Pub",
                  location = "Peel Street, near McGill campus",
                  guide = self.guide)
        tip.save()
        self.assertEqual(len(Tip.objects.all()), 1)
        self.assertEqual(len(self.guide.tip_set.all()), 1)

    def test_guide_deletion_deletes_tip(self):
        tip = Tip(title = "Peel Pub",
                  location = "Peel Street, near McGill campus",
                  guide = self.guide)
        tip.save()
        self.assertTrue(Tip.objects.filter(pk__exact = tip.pk).exists())
        self.guide.delete()
        self.assertFalse(Tip.objects.filter(pk__exact = tip.pk).exists())

    def test_tip_add_remove_tags(self):
        tip = Tip(title = "Peel Pub",
                  location = "Peel Street, near McGill campus",
                  guide = self.guide)
        tip.save()
        self.assertEqual(tip.tags.count(), 0)
        tip.tags.add("drink", "pub", "student")
        self.assertEqual(tip.tags.count(), 3)
        self.assertEqual(Tip.objects.filter(tags__name__exact = "drink").count(), 1)
        self.assertEqual(Tip.objects.filter(tags__name__exact = "pub").count(), 1)
        self.assertEqual(Tip.objects.filter(tags__name__exact = "student").count(), 1)
        self.assertEqual(Tip.objects.filter(tags__name__exact = "museum").count(), 0)
        tip.tags.remove("drink", "pub")
        self.assertEqual(tip.tags.count(), 1)
        self.assertEqual(Tip.objects.filter(tags__name__exact = "drink").count(), 0)
        self.assertEqual(Tip.objects.filter(tags__name__exact = "pub").count(), 0)
        self.assertEqual(Tip.objects.filter(tags__name__exact = "student").count(), 1)
        self.assertEqual(Tip.objects.filter(tags__name__exact = "museum").count(), 0)

    # -------------------------------------------------------------------------
    #   Account.has_favourited_tip. Tested here as the m2m field is
    #   Tip.favouritors.
    # -------------------------------------------------------------------------
    def _test_account_has_favourited_tip(self,
                                         is_public_guide = None,
                                         is_draft_guide = None,
                                         remove_favourited_tip = None,
                                         delete_tip = None,
                                         delete_guide = None,
                                         toggle_guide_visibility = None):
        assert(any(guide for guide in [is_public_guide, is_draft_guide]))
        if is_public_guide:
            tip = Tip(title = "Peel Pub",
                      location = "Peel Street, near McGill campus",
                      guide = self.guide)
        elif is_draft_guide:
            tip = Tip(title = "Peel Pub",
                      location = "Peel Street, near McGill campus",
                      guide = self.draft_guide)
        tip.save()
        account = tip.guide.owner
        print "adding tip"
        account.add_favourited_tip(tip)
        if is_public_guide:
            self.assertTrue(account.has_favourited_tip(tip))
        else:
            self.assertFalse(account.has_favourited_tip(tip))
        if remove_favourited_tip:
            print "removing tip"
            account.remove_favourited_tip(tip)
        elif delete_tip:
            print "deleting tip"
            tip.delete()
        elif delete_guide:
            print "deleting guide"
            tip.guide.delete()
        elif toggle_guide_visibility:
            print "toggling guide visibility"
            tip.guide.is_draft = not tip.guide.is_draft
            tip.guide.save()
        if is_public_guide:
            self.assertFalse(account.has_favourited_tip(tip))
        elif is_draft_guide and not toggle_guide_visibility:
            self.assertFalse(account.has_favourited_tip(tip))
        elif is_draft_guide and toggle_guide_visibility:
            self.assertTrue(account.has_favourited_tip(tip))

    def test_account_has_favourited_tip_after_removing_favourited_tip_for_public_guide(self):
        self._test_account_has_favourited_tip(is_public_guide = True,
                                              remove_favourited_tip = True)

    def test_account_has_favourited_tip_after_removing_favourited_tip_for_draft_guide(self):
        self._test_account_has_favourited_tip(is_draft_guide = True,
                                              remove_favourited_tip = True)

    def test_account_has_favourited_tip_after_deleting_tip_for_public_guide(self):
        self._test_account_has_favourited_tip(is_public_guide = True,
                                              delete_tip = True)

    def test_account_has_favourited_tip_after_deleting_tip_for_draft_guide(self):
        self._test_account_has_favourited_tip(is_draft_guide = True,
                                              delete_tip = True)

    def test_account_has_favourited_tip_after_deleting_guide_for_public_guide(self):
        self._test_account_has_favourited_tip(is_public_guide = True,
                                              delete_guide = True)

    def test_account_has_favourited_tip_after_deleting_guide_for_draft_guide(self):
        self._test_account_has_favourited_tip(is_draft_guide = True,
                                              delete_guide = True)

    def test_account_has_favourited_tip_after_toggling_guide_visibility_for_draft_guide(self):
        self._test_account_has_favourited_tip(is_draft_guide = True,
                                              toggle_guide_visibility = True)

    # -------------------------------------------------------------------------
    #   Account.favourite_tips. Tested here as the m2m field is
    #   Tip.favouritors.
    # -------------------------------------------------------------------------
    def _test_account_favourite_tips(self,
                                     is_public_guide = None,
                                     is_draft_guide = None,
                                     remove_favourited_tip = None,
                                     delete_tip = None,
                                     delete_guide = None,
                                     toggle_guide_visibility = None):
        assert(any(guide for guide in [is_public_guide, is_draft_guide]))
        if is_public_guide:
            tip = Tip(title = "Peel Pub",
                      location = "Peel Street, near McGill campus",
                      guide = self.guide)
        elif is_draft_guide:
            tip = Tip(title = "Peel Pub",
                      location = "Peel Street, near McGill campus",
                      guide = self.draft_guide)
        tip.save()
        account = tip.guide.owner
        print "adding tip"
        account.add_favourited_tip(tip)
        if is_public_guide:
            self.assertTrue(account.has_favourited_tip(tip))
        else:
            self.assertFalse(account.has_favourited_tip(tip))
        print "check favourite tips on account"
        if is_public_guide:
            self.assertTrue(tip in account.favourite_tips)
        else:
            self.assertFalse(tip in account.favourite_tips)
        if remove_favourited_tip:
            print "removing tip"
            account.remove_favourited_tip(tip)
        elif delete_tip:
            print "deleting tip"
            tip.delete()
        elif delete_guide:
            print "deleting guide"
            tip.guide.delete()
        elif toggle_guide_visibility:
            print "toggling guide visibility"
            tip.guide.is_draft = not tip.guide.is_draft
            tip.guide.save()
        if is_public_guide:
            self.assertFalse(tip in account.favourite_tips)
        elif is_draft_guide and not toggle_guide_visibility:
            self.assertFalse(tip in account.favourite_tips)
        elif is_draft_guide and toggle_guide_visibility:
            self.assertTrue(tip in account.favourite_tips)

    def test_account_favourite_tips_after_removing_favourited_tip_for_public_guide(self):
        self._test_account_favourite_tips(is_public_guide = True,
                                          remove_favourited_tip = True)

    def test_account_favourite_tips_after_removing_favourited_tip_for_draft_guide(self):
        self._test_account_favourite_tips(is_draft_guide = True,
                                          remove_favourited_tip = True)

    def test_account_favourite_tips_after_deleting_tip_for_public_guide(self):
        self._test_account_favourite_tips(is_public_guide = True,
                                          delete_tip = True)

    def test_account_favourite_tips_after_deleting_tip_for_draft_guide(self):
        self._test_account_favourite_tips(is_draft_guide = True,
                                          delete_tip = True)

    def test_account_favourite_tips_after_deleting_guide_for_public_guide(self):
        self._test_account_favourite_tips(is_public_guide = True,
                                          delete_guide = True)

    def test_account_favourite_tips_after_deleting_guide_for_draft_guide(self):
        self._test_account_favourite_tips(is_draft_guide = True,
                                          delete_guide = True)

    def test_account_favourite_tips_after_toggling_guide_visibility_for_draft_guide(self):
        self._test_account_favourite_tips(is_draft_guide = True,
                                          toggle_guide_visibility = True)
    # -------------------------------------------------------------------------

    # -------------------------------------------------------------------------
    #   Account.get_favourite_tag_generator. Tested here as the m2m field is
    #   Tip.favouritors. Recall this function returns TagWithURL objects.
    # -------------------------------------------------------------------------
    def _test_account_get_favourite_tag_generator(self,
                                                  is_public_guide = None,
                                                  is_draft_guide = None,
                                                  tip_before_tags = None,
                                                  remove_favourited_tip = None,
                                                  delete_tip = None,
                                                  delete_guide = None,
                                                  toggle_guide_visibility = None):
        assert(any(guide for guide in [is_public_guide, is_draft_guide]))
        if is_public_guide:
            tip = Tip(title = "Peel Pub",
                      location = "Peel Street, near McGill campus",
                      guide = self.guide)
        else:
            tip = Tip(title = "Peel Pub",
                      location = "Peel Street, near McGill campus",
                      guide = self.draft_guide)
        tip.save()
        account = tip.guide.owner
        if tip_before_tags == True:
            print "adding tip as favourite"
            account.add_favourited_tip(tip)
            print "add tags"
            tip.tags.add("pub", "student", "fun")
        else:
            print "add tags"
            tip.tags.add("pub", "student", "fun")
            print "adding tip as favourite"
            account.add_favourited_tip(tip)
        print "check favourite tags on account"
        if is_public_guide:
            self.assertTrue("pub" in [tag.tag.name for tag in account.get_favourite_tag_generator()])
            self.assertTrue("student" in [tag.tag.name for tag in account.get_favourite_tag_generator()])
            self.assertTrue("fun" in [tag.tag.name for tag in account.get_favourite_tag_generator()])
        else:
            self.assertFalse("pub" in [tag.tag.name for tag in account.get_favourite_tag_generator()])
            self.assertFalse("student" in [tag.tag.name for tag in account.get_favourite_tag_generator()])
            self.assertFalse("fun" in [tag.tag.name for tag in account.get_favourite_tag_generator()])

        if remove_favourited_tip:
            print "removing tip"
            account.remove_favourited_tip(tip)
        elif delete_tip:
            print "deleting tip"
            tip.delete()
        elif delete_guide:
            print "deleting guide"
            self.guide.delete()
        elif toggle_guide_visibility:
            print "toggling guide visibility"
            tip.guide.is_draft = not tip.guide.is_draft
            tip.guide.save()
        if is_public_guide:
            self.assertFalse("pub" in [tag.tag.name for tag in account.get_favourite_tag_generator()])
            self.assertFalse("student" in [tag.tag.name for tag in account.get_favourite_tag_generator()])
            self.assertFalse("fun" in [tag.tag.name for tag in account.get_favourite_tag_generator()])
        elif is_draft_guide and not toggle_guide_visibility:
            self.assertFalse("pub" in [tag.tag.name for tag in account.get_favourite_tag_generator()])
            self.assertFalse("student" in [tag.tag.name for tag in account.get_favourite_tag_generator()])
            self.assertFalse("fun" in [tag.tag.name for tag in account.get_favourite_tag_generator()])
        elif is_draft_guide and toggle_guide_visibility:
            self.assertTrue("pub" in [tag.tag.name for tag in account.get_favourite_tag_generator()])
            self.assertTrue("student" in [tag.tag.name for tag in account.get_favourite_tag_generator()])
            self.assertTrue("fun" in [tag.tag.name for tag in account.get_favourite_tag_generator()])

    def test_account_get_favourite_tag_generator_tip_before_tags_for_draft_guide(self):
        self._test_account_get_favourite_tag_generator(is_draft_guide = True,
                                                       tip_before_tags = True,
                                                       remove_favourited_tip = True)

    def test_account_get_favourite_tag_generator_tip_before_tags_for_public_guide(self):
        self._test_account_get_favourite_tag_generator(is_public_guide = True,
                                                       tip_before_tags = True,
                                                       remove_favourited_tip = True)

    def test_account_get_favourite_tag_generator_tags_before_tip_for_draft_guide(self):
        self._test_account_get_favourite_tag_generator(is_draft_guide = True,
                                                       tip_before_tags = False,
                                                       remove_favourited_tip = True)

    def test_account_get_favourite_tag_generator_tags_before_tip_for_draft_guide(self):
        self._test_account_get_favourite_tag_generator(is_public_guide = True,
                                                       tip_before_tags = False,
                                                       remove_favourited_tip = True)

    def test_account_get_favourite_tag_generator_during_tip_deletion_tip_before_tags_for_draft_guide(self):
        self._test_account_get_favourite_tag_generator(is_draft_guide = True,
                                                       tip_before_tags = True,
                                                       delete_tip = True)

    def test_account_get_favourite_tag_generator_during_tip_deletion_tip_before_tags_for_public_guide(self):
        self._test_account_get_favourite_tag_generator(is_public_guide = True,
                                                       tip_before_tags = True,
                                                       delete_tip = True)

    def test_account_get_favourite_tag_generator_during_tip_deletion_tags_before_tips_for_draft_guide(self):
        self._test_account_get_favourite_tag_generator(is_draft_guide = True,
                                                       tip_before_tags = False,
                                                       delete_tip = True)

    def test_account_get_favourite_tag_generator_during_tip_deletion_tags_before_tips_for_public_guide(self):
        self._test_account_get_favourite_tag_generator(is_public_guide = True,
                                                       tip_before_tags = False,
                                                       delete_tip = True)

    def test_account_get_favourite_tag_generator_during_guide_deletion_tip_before_tags_for_draft_guide(self):
        self._test_account_get_favourite_tag_generator(is_draft_guide = True,
                                                       tip_before_tags = True,
                                                       delete_guide = True)

    def test_account_get_favourite_tag_generator_during_guide_deletion_tip_before_tags_for_public_guide(self):
        self._test_account_get_favourite_tag_generator(is_public_guide = True,
                                                       tip_before_tags = True,
                                                       delete_guide = True)

    def test_account_get_favourite_tag_generator_during_guide_deletion_tags_before_tips_for_draft_guide(self):
        self._test_account_get_favourite_tag_generator(is_draft_guide = True,
                                                       tip_before_tags = False,
                                                       delete_guide = True)

    def test_account_get_favourite_tag_generator_during_guide_deletion_tags_before_tips_for_public_guide(self):
        self._test_account_get_favourite_tag_generator(is_public_guide = True,
                                                       tip_before_tags = False,
                                                       delete_guide = True)

    def test_account_get_favourite_tag_generator_during_toggle_guide_visibility_tags_before_tips_for_draft_guide(self):
        self._test_account_get_favourite_tag_generator(is_draft_guide = True,
                                                       tip_before_tags = False,
                                                       toggle_guide_visibility = True)

    def test_account_get_favourite_tag_generator_during_toggle_guide_visibility_tips_before_tags_for_draft_guide(self):
        self._test_account_get_favourite_tag_generator(is_draft_guide = True,
                                                       tip_before_tags = True,
                                                       toggle_guide_visibility = True)
    # -------------------------------------------------------------------------

    # -------------------------------------------------------------------------
    #   Test Tip.tags_as_list
    # -------------------------------------------------------------------------
    def test_tip_tags_as_list(self):
        tip = Tip(title = "Peel Pub",
                  location = "Peel Street, near McGill campus",
                  guide = self.guide)
        tip.save()
        self.assertEqual(len(tip.tags_as_list), 0)

        tip.tags.add("pub", "student", "fun")
        self.assertEqual(len(tip.tags_as_list), 3)
        self.assertTrue("pub" in [tag.tag for tag in tip.tags_as_list])
        self.assertTrue("student" in [tag.tag for tag in tip.tags_as_list])
        self.assertTrue("fun" in [tag.tag for tag in tip.tags_as_list])

        tip.tags.remove("pub")
        self.assertEqual(len(tip.tags_as_list), 2)
        self.assertFalse("pub" in [tag.tag for tag in tip.tags_as_list])
        self.assertTrue("student" in [tag.tag for tag in tip.tags_as_list])
        self.assertTrue("fun" in [tag.tag for tag in tip.tags_as_list])

        tip.tags.clear()
        self.assertEqual(len(tip.tags_as_list), 0)
    # -------------------------------------------------------------------------

    def test_image_add(self):
        tip = Tip(title = "Peel Pub",
                  location = "Peel Street, near McGill campus",
                  guide = self.guide)
        tip.save()
        self.assertEqual(len(tip.image_set.all()), 0)
        i = Image(description = "cute dog!", owner=self.account)
        i.tip = tip
        i.save()
        self.assertEqual(len(tip.image_set.all()), 1)