def test_donation_thank_you_page(self):

        self.assertTrue(self.login(username=self.some_user.email, password='******'))

        # Create dummy donation, so we can validate the thank you page.
        donation = DonationFactory.create(user=self.some_user, project=self._projects[0])
        donation.order.status = 'current'
        donation.order.user = self.some_user
        donation.order.closed = None

        from apps.cowry_docdata.models import DocDataPaymentOrder
        DocDataPaymentOrder.objects.create(order=donation.order, payment_order_id='dummy')

        donation.order.save()

        self.visit_path('/support/thanks/{0}'.format(donation.order.pk))


        # Validate thank you page.
        self.assertTrue(self.browser.is_text_present('WELL, YOU ROCK!'))
        self.assertTrue(self.browser.is_text_present(self._projects[0].title.upper()))

        # check that the correct links are present
        self.browser.find_by_css('li.project-list-item a').first.click()
        self.assertEqual(self.browser.url, '{0}/en/#!/projects/{1}'.format(self.live_server_url, self._projects[0].slug))
    def test_single_mail_on_new_fundraiser_donation(self):

        self.fundraiser_owner = BlueBottleUserFactory.create(email='*****@*****.**', primary_language='en')
        fundraiser = FundRaiserFactory.create(owner=self.fundraiser_owner, project=self.project)
        donation = DonationFactory.create(user=self.user, project=self.project, donation_type=Donation.DonationTypes.one_off, fundraiser=fundraiser)

        # Mailbox should not contain anything.
        self.assertEqual(len(mail.outbox), 0)

        donation.status = DonationStatuses.pending
        donation.save()

        # Save twice!
        donation.save()

        # Save with different status.
        donation.status = DonationStatuses.paid
        donation.save()

        # Fundraiser owner and project owner should have just one email each
        # careful, fundraiser mail is sent first
        self.assertEqual(len(mail.outbox), 2)

        # Verify that the link points to the fundraiser page
        m = mail.outbox.pop(0)
        match = re.search(r'https?://.*/go/fundraisers/(\d+)', m.body)
        self.assertEqual(int(match.group(1)), fundraiser.id)

        # verify that the mail is indeed directed to the fundraiser owner
        self.assertIn(self.fundraiser_owner.email, m.recipients())
    def test_supporters_for_project(self):
        """
        Test the list of supporters of a project when a fundraiser donation was made.
        """
        DonationFactory.create(user=self.some_user, project=self.some_project, status=DonationStatuses.paid)

        DonationFactory.create(user=self.some_user, project=self.some_project, status=DonationStatuses.paid,
                fundraiser=self.fundraiser)

        project_supporter_url = '{0}?project={1}'.format(reverse('project-supporter-list'), self.some_project.slug)
        response = self.client.get(project_supporter_url)

        json_data = json.loads(response.content)
        # Expect donation for project and donation for fundraiser to show up.
        self.assertEqual(len(json_data['results']), 2)
        self.assertFalse('amount' in json_data['results'][0])
        self.assertFalse('amount' in json_data['results'][1])
    def test_donations_for_fundraiser_anonymous(self):
        self.assertTrue(self.client.login(username=self.another_user.email, password='******'))

        DonationFactory.create(user=self.some_user, project=self.some_project, status=DonationStatuses.paid)

        fundraise_donation = DonationFactory.create(user=self.some_user, project=self.some_project,
                                                  status=DonationStatuses.paid, fundraiser=self.fundraiser)

        project_donation_url = '{0}?project={1}&fundraiser={2}'.format(
            reverse('project-donation-list'),
            self.some_project.slug,
            fundraise_donation.fundraiser.pk,
        )
        response = self.client.get(project_donation_url)

        json_data = json.loads(response.content)

        # Only expect the donation for the fundraiser to show up.
        self.assertEqual(len(json_data['results']), 0)
    def test_supporters_for_fundraiser(self):
        """
        Test the list of supporters for a specific fundraiser.
        """
        DonationFactory.create(user=self.some_user, project=self.some_project, status=DonationStatuses.paid)

        fundraise_donation = DonationFactory.create(user=self.some_user, project=self.some_project, status=DonationStatuses.paid,
                fundraiser=self.fundraiser)

        project_supporter_url = '{0}?project={1}&fundraiser={2}'.format(
            reverse('project-supporter-list'),
            self.some_project.slug,
            fundraise_donation.fundraiser.pk,
        )
        response = self.client.get(project_supporter_url)

        json_data = json.loads(response.content)
        # Only expect the donation for the fundraiser to show up.
        self.assertEqual(len(json_data['results']), 1)
        self.assertFalse('amount' in json_data['results'][0])
    def test_fundraise_donation(self):
        """
        Test create donation for fundraise action.
        """
        self.login(username=self.some_user.email, password='******')

        self.visit_path(self.fundraiser_url)

        self.assertTrue(self.fundraiser.title != '')
        self.assertTrue(self.browser.is_text_present(self.fundraiser.title.upper()))

        # Go to donate page.
        # TODO: This fails for some reason, we use an alternative method:
        #self.browser.find_link_by_partial_text('Support').first.click()
        self.browser.find_by_css('a.btn.btn-primary.btn-iconed').first.click()

        # Validate donation page.
        self.assertTrue(self.browser.is_text_present('SUPPORT'))
        self.assertTrue(self.browser.is_text_present(self.fundraiser.title.upper()))
        self.assertTrue(self.browser.is_text_present('TOTAL'))

        self.assertEqual(self.browser.url, '{0}/en/#!/support/donations'.format(self.live_server_url))

        self.browser.find_by_css('button.btn.btn-iconed.btn-next').first.click()

        # Validate personal info page.
        self.assertTrue(self.browser.is_text_present('SUPPORT'))
        self.assertTrue(self.browser.is_text_present('Please verify your details.'))

        self.assertEqual(self.browser.url, '{0}/en/#!/support/details'.format(self.live_server_url))

        # TODO: Test rest of the flow?

        # Create dummy donation, so we can validate the thank you page.
        donation = DonationFactory.create(user=self.some_user, project=self.project_with_fundraiser)
        donation.fundraiser = self.fundraiser
        donation.order.status = OrderStatuses.current
        donation.order.closed = None

        from apps.cowry_docdata.models import DocDataPaymentOrder
        DocDataPaymentOrder.objects.create(order=donation.order, payment_order_id='dummy')

        donation.order.save()
        donation.save()

        self.visit_path('/support/thanks/{0}'.format(donation.order.pk))

        # Validate thank you page.
        self.assertTrue(self.browser.is_text_present('WELL, YOU ROCK!'))
        self.assertTrue(self.browser.is_text_present(self.fundraiser.title.upper()))

        # check that the correct links are present
        self.browser.find_by_css('li.project-list-item a').first.click()
        self.assertEqual(self.browser.url, '{0}/en/#!/fundraisers/{1}'.format(self.live_server_url, self.fundraiser.id))
    def test_donations_for_fundraiser_not_owner(self):
        fundraise_donation = DonationFactory.create(user=self.some_user, project=self.some_project, status=DonationStatuses.paid,
                fundraiser=self.fundraiser)

        project_donation_url = '{0}?project={1}&fundraiser={2}'.format(
            reverse('project-donation-list'),
            self.some_project.slug,
            fundraise_donation.fundraiser.pk,
        )

        response = self.client.get(project_donation_url)

        json_data = json.loads(response.content)
        self.assertDictEqual(json_data, {u'detail': u'Authentication credentials were not provided.'})
    def test_campaign_project_got_funded_no_overfunding(self):
        """
        A project gets a donation and gets funded. The project does not allow overfunding so the status changes,
        the campaign funded field is populated and campaign_ended field is populated
        """
        organization = OrganizationFactory.create()
        project = OnePercentProjectFactory.create(title="testproject", slug="testproject",
                                                  organization=organization,
                                                  status=ProjectPhase.objects.get(slug="campaign"),
                                                  amount_asked=100, allow_overfunding=False)

        self.assertTrue(project.campaign_ended is None)
        self.assertTrue(project.campaign_funded is None)

        donation = DonationFactory.create(user=self.user, project=project, amount=10000)

        loaded_project = Project.objects.get(pk=project.pk)
    def test_campaign_project_not_funded(self):
        """
        A donation is made but the project is not funded. The status doesn't change and neither the campaign_ended
        or campaign_funded are populated.
        """
        project = OnePercentProjectFactory.create(title="testproject", slug="testproject",
                                                  status=ProjectPhase.objects.get(slug="campaign"),
                                                  amount_asked=100)

        self.assertTrue(project.campaign_ended is None)
        self.assertTrue(project.campaign_funded is None)

        donation = DonationFactory.create(user=self.user, project=project, amount=99)

        self.assertTrue(project.campaign_ended is None)
        self.assertTrue(project.campaign_funded is None)
        self.assertEquals(project.status, ProjectPhase.objects.get(slug="campaign"))
    def test_campaign_project_got_funded_allow_overfunding(self):
        """
        A project gets funded and allows overfunding. The project status does not change, the campaign_funded field
        is populated but the campaign_ended field is not populated
        """
        project = OnePercentProjectFactory.create(title="testproject", slug="testproject",
                                                  status=ProjectPhase.objects.get(slug="campaign"),
                                                  amount_asked=100)

        self.assertTrue(project.campaign_ended is None)
        self.assertTrue(project.campaign_funded is None)

        donation = DonationFactory.create(user=self.user, project=project, amount=10000)

        self.assertTrue(project.campaign_ended is None)
        self.assertTrue(project.campaign_funded is not None)
        self.assertEquals(project.status, ProjectPhase.objects.get(slug="campaign"))
    def test_single_mail_on_new_donation(self):
        donation = DonationFactory.create(user=self.user, project=self.project, donation_type=Donation.DonationTypes.one_off)

        # Mailbox should not contain anything.
        self.assertEqual(len(mail.outbox), 0)

        donation.status = DonationStatuses.pending
        donation.save()

        # Save twice!
        donation.save()

        # Save with different status.
        donation.status = DonationStatuses.paid
        donation.save()

        # Owner should have just one email
        self.assertEqual(len(mail.outbox), 1)
    def test_mail_owner_on_new_donation(self):
        donation = DonationFactory.create(user=self.user, project=self.project, donation_type=Donation.DonationTypes.one_off)

        # Mailbox should not contain anything.
        self.assertEqual(len(mail.outbox), 0)

        donation.status = DonationStatuses.pending
        donation.save()

        # Owner should have a new email
        self.assertEqual(len(mail.outbox), 1)
        message = mail.outbox[0]

        self.assertListEqual(message.to, [self.project_owner.email])
        self.assertEqual(message.subject, 'You received a new donation')

        amount_string = 'EUR {0:.2f}'.format(donation.amount / 100.0)
        self.assertTrue(amount_string in message.body)

        for content, content_type in message.alternatives:
            self.assertTrue(amount_string in content)

        self.assertTrue(self.user.first_name in message.body)
    def test_donations_for_fundraiser_authenticated(self):
        """
        Test the list of donations for a specific fundraiser.
        """
        self.assertTrue(self.client.login(username=self.some_user.email, password='******'))

        fundraise_donation = DonationFactory.create(user=self.some_user, project=self.some_project, amount=5000,
                                                    status=DonationStatuses.paid, fundraiser=self.fundraiser)

        project_donation_url = '{0}?project={1}&fundraiser={2}'.format(
            reverse('project-donation-list'),
            self.some_project.slug,
            fundraise_donation.fundraiser.pk,
        )

        response = self.client.get(project_donation_url)
        json_data = json.loads(response.content)

        # Only expect the donation for the fundraiser to show up.
        print json_data

        self.assertEqual(len(json_data['results']), 1)
        self.assertTrue('amount' in json_data['results'][0])
        self.assertEqual(json_data['results'][0]['amount'], '50.00')
    """ Testcase for Payouts. """

    def setUp(self):
        """ Setup a project ready for payout. """

        self.init_projects()

        self.project = OnePercentProjectFactory.create()

        # Update phase to campaign.
        self.project.status = ProjectPhase.objects.get(slug='campaign')
        self.project.save()

        self.donation = DonationFactory.create(
            project=self.project,
            voucher=None,
            donation_type=Donation.DonationTypes.one_off,
            amount=1500
        )

        super(PayoutTestCase, self).setUp()

    def test_save(self):
        """ Test saving a payout. """

        # Generate new payout
        payout = N(Payout, completed=None)

        # Validate
        payout.clean()

        # Save it