def test_vote_for_feature_no_credits_returns_failiure_and_message(self):
        '''
        Test that voting for a feature with an empty of non-existent wallet returns success as False,
        and an appropriate message.
        '''
        test_ticket = Ticket(user=self.test_user,
                             title='Voting',
                             ticket_type='Feature',
                             content='Test content')
        test_ticket.save()

        voter = User.objects.create_user(username='******',
                                         email='*****@*****.**',
                                         password='******')

        result = test_ticket.vote(voter, 5)
        self.assertFalse(result['success'])
        self.assertIn('insufficient credits', result['message'].lower())

        wallet = Wallet(user=voter)
        wallet.save()

        result = test_ticket.vote(voter, 5)
        self.assertFalse(result['success'])
        self.assertIn('insufficient credits', result['message'].lower())
    def test_vote_for_bug_increases_votes(self):
        '''
        Test that the vote method increases votes on bug type tickets.
        '''
        test_ticket = Ticket(user=self.test_user,
                             title='Voting',
                             ticket_type='Bug',
                             content='Test content')
        test_ticket.save()

        voter = User.objects.create_user(username='******',
                                         email='*****@*****.**',
                                         password='******')

        test_ticket.vote(voter)
        test_ticket = Ticket.objects.get(id=test_ticket.id)
        self.assertEqual(1, test_ticket.no_votes)
    def test_vote_for_bug_twice_returns_failiure_and_message(self):
        '''
        Test that voting for a bug a second time returns success as False, and an appropriate message.
        '''
        test_ticket = Ticket(user=self.test_user,
                             title='Voting',
                             ticket_type='Bug',
                             content='Test content')
        test_ticket.save()

        voter = User.objects.create_user(username='******',
                                         email='*****@*****.**',
                                         password='******')

        test_ticket.vote(voter)
        result = test_ticket.vote(voter)
        self.assertFalse(result['success'])
        self.assertIn('already voted', result['message'].lower())
    def test_vote_for_bug_twice_does_not_increase_votes_a_second_time(self):
        '''
        Test voting for a bug a second time does not increase the number of votes.
        '''
        test_ticket = Ticket(user=self.test_user,
                             title='Voting',
                             ticket_type='Bug',
                             content='Test content')
        test_ticket.save()

        voter = User.objects.create_user(username='******',
                                         email='*****@*****.**',
                                         password='******')

        test_ticket.vote(voter)
        test_ticket.vote(voter)
        test_ticket = Ticket.objects.get(id=test_ticket.id)
        self.assertEqual(1, test_ticket.no_votes)
    def test_vote_for_feature_reduces_wallet_balance_by_credits_spent(self):
        '''
        Test that voting for a feature debits the user the correct number of credits.
        '''
        test_ticket = Ticket(user=self.test_user,
                             title='Voting',
                             ticket_type='Feature',
                             content='Test content')
        test_ticket.save()

        voter = User.objects.create_user(username='******',
                                         email='*****@*****.**',
                                         password='******')
        wallet = Wallet(user=voter)
        wallet.save()
        wallet.credit(10)

        test_ticket.vote(voter, 5)
        voter_wallet = Wallet.objects.get(id=wallet.id)
        self.assertEqual(5, voter_wallet.balance)
    def test_vote_for_feature_increases_votes_by_credits_spent(self):
        '''
        Test that the vote method increases votes on feature type tickets by the number of credits spent.
        '''
        test_ticket = Ticket(user=self.test_user,
                             title='Voting',
                             ticket_type='Feature',
                             content='Test content')
        test_ticket.save()

        voter = User.objects.create_user(username='******',
                                         email='*****@*****.**',
                                         password='******')
        wallet = Wallet(user=voter)
        wallet.save()
        wallet.credit(10)

        test_ticket.vote(voter, 5)
        test_ticket = Ticket.objects.get(id=test_ticket.id)
        self.assertEqual(5, test_ticket.no_votes)
    def test_vote_for_feature_twice_increase_votes_a_second_time(self):
        '''
        Test voting for a feature a second time again increase the number of votes by the number of crdits spent.
        '''
        test_ticket = Ticket(user=self.test_user,
                             title='Voting',
                             ticket_type='Feature',
                             content='Test content')
        test_ticket.save()

        voter = User.objects.create_user(username='******',
                                         email='*****@*****.**',
                                         password='******')
        wallet = Wallet(user=voter)
        wallet.save()
        wallet.credit(10)

        test_ticket.vote(voter, 5)
        test_ticket.vote(voter, 3)
        test_ticket = Ticket.objects.get(id=test_ticket.id)
        self.assertEqual(8, test_ticket.no_votes)
    def test_vote_for_feature_returns_success_and_message(self):
        '''
        Test that voting for a feature returns success as True, and an appropriate message.
        '''
        test_ticket = Ticket(user=self.test_user,
                             title='Voting',
                             ticket_type='Feature',
                             content='Test content')
        test_ticket.save()

        voter = User.objects.create_user(username='******',
                                         email='*****@*****.**',
                                         password='******')
        wallet = Wallet(user=voter)
        wallet.save()
        wallet.credit(10)

        result = test_ticket.vote(voter, 5)
        self.assertTrue(result['success'])
        self.assertIn('success', result['message'].lower())