Beispiel #1
0
    def test_basic(self):
        """
        Aggregate any datapoints older than 90 days into the totals
        stored on their links.
        """
        link1 = LinkFactory.create(aggregate_link_clicks=7, aggregate_firefox_downloads=10)
        link1_old_datapoint = DataPointFactory.create(link=link1, date=aware_date(2014, 1, 1),
                                                      link_clicks=8, firefox_downloads=4)
        link1_new_datapoint = DataPointFactory.create(link=link1, date=aware_date(2014, 3, 1),
                                                      link_clicks=2, firefox_downloads=7)

        link2 = LinkFactory.create(aggregate_link_clicks=7, aggregate_firefox_downloads=10)
        link2_old_datapoint1 = DataPointFactory.create(link=link2, date=aware_date(2014, 1, 1),
                                                       link_clicks=8, firefox_downloads=4)
        link2_old_datapoint2 = DataPointFactory.create(link=link2, date=aware_date(2013, 12, 30),
                                                       link_clicks=2, firefox_downloads=7)

        self.command.handle()

        # link1 should have 7+8=15 clicks, 10+4=14 downloads, and the
        # new datapoint should still exist.
        link1 = Link.objects.get(pk=link1.pk)
        eq_(link1.aggregate_link_clicks, 15)
        eq_(link1.aggregate_firefox_downloads, 14)
        ok_(not DataPoint.objects.filter(pk=link1_old_datapoint.pk).exists())
        ok_(DataPoint.objects.filter(pk=link1_new_datapoint.pk).exists())

        # link2 should have 7+8+2=17 clicks, 10+4+7=21 downloads, and the
        # old datapoints should not exist.
        link2 = Link.objects.get(pk=link2.pk)
        eq_(link2.aggregate_link_clicks, 17)
        eq_(link2.aggregate_firefox_downloads, 21)
        ok_(not DataPoint.objects.filter(pk=link2_old_datapoint1.pk).exists())
        ok_(not DataPoint.objects.filter(pk=link2_old_datapoint2.pk).exists())
Beispiel #2
0
    def test_not_authenticated(self):
        """
        If the current user isn't authenticated, render the home
        page with the correct stats.
        """
        request = self.factory.get('/')
        request.user = Mock()
        request.user.is_authenticated.return_value = False

        # User count = 27 + 8 autogenerated via related factory
        # Click count = 64
        # Link count = 3 + 5 autogenerated via related factory
        UserFactory.create_batch(27)
        for clicks in (4, 6, 9, 10):
            DataPointFactory.create(link_clicks=clicks, date=date(2014, 4, 26))
        for clicks in (25, 5, 5):
            LinkFactory.create(aggregate_link_clicks=clicks)

        # Create a link with multiple datapoints to test for a faulty
        # join that would screw up the totals.
        link = LinkFactory.create()
        DataPointFactory.create(link_clicks=7, link=link, date=date(2014, 4, 26))
        DataPointFactory.create(link_clicks=7, link=link, date=date(2014, 4, 27))

        with patch('affiliates.base.views.render') as render:
            eq_(views.home(request), render.return_value)
            render.assert_called_with(request, 'base/home.html', {
                'affiliate_count': 35,
                'link_count': 8,
                'click_count': 78
            })
Beispiel #3
0
    def test_not_authenticated(self):
        """
        If the current user isn't authenticated, render the home
        page with the correct stats.
        """
        request = self.factory.get('/')
        request.user = Mock()
        request.user.is_authenticated.return_value = False

        # User count = 27 + 8 autogenerated via related factory
        # Click count = 64
        # Link count = 3 + 5 autogenerated via related factory
        UserFactory.create_batch(27)
        for clicks in (4, 6, 9, 10):
            DataPointFactory.create(link_clicks=clicks, date=date(2014, 4, 26))
        for clicks in (25, 5, 5):
            LinkFactory.create(aggregate_link_clicks=clicks)

        # Create a link with multiple datapoints to test for a faulty
        # join that would screw up the totals.
        link = LinkFactory.create()
        DataPointFactory.create(link_clicks=7,
                                link=link,
                                date=date(2014, 4, 26))
        DataPointFactory.create(link_clicks=7,
                                link=link,
                                date=date(2014, 4, 27))

        with patch('affiliates.base.views.render') as render:
            eq_(views.home(request), render.return_value)
            render.assert_called_with(request, 'base/home.html', {
                'affiliate_count': 35,
                'link_count': 8,
                'click_count': 78
            })
Beispiel #4
0
    def test_links_filters(self):
        category = CategoryFactory.create()
        user = UserFactory.create()

        text_banner_variation = TextBannerVariationFactory.create(banner__category=category)
        upgrade_banner_variation = FirefoxUpgradeBannerVariationFactory.create(
            banner__category=category)

        text_link = LinkFactory.create(banner_variation=text_banner_variation, user=user)
        LinkFactory.create(banner_variation=upgrade_banner_variation)

        eq_(list(category.links(user=user)), [text_link])
Beispiel #5
0
    def test_links_filters(self):
        category = CategoryFactory.create()
        user = UserFactory.create()

        text_banner_variation = TextBannerVariationFactory.create(banner__category=category)
        upgrade_banner_variation = FirefoxUpgradeBannerVariationFactory.create(
            banner__category=category)

        text_link = LinkFactory.create(banner_variation=text_banner_variation, user=user)
        LinkFactory.create(banner_variation=upgrade_banner_variation)

        eq_(list(category.links(user=user)), [text_link])
Beispiel #6
0
    def test_manager_total_link_clicks(self):
        for clicks in (4, 6, 9, 10):  # = 29 clicks
            DataPointFactory.create(link_clicks=clicks, date=date(2014, 4, 26))
        for clicks in (25, 5, 5):  # = 35 clicks
            LinkFactory.create(aggregate_link_clicks=clicks)

        # Create a link with multiple datapoints to test for a faulty
        # join that would screw up the totals.
        link = LinkFactory.create()
        DataPointFactory.create(link_clicks=7, link=link, date=date(2014, 4, 26))
        DataPointFactory.create(link_clicks=7, link=link, date=date(2014, 4, 27))


        # 29 + 35 + 7 + 7 = 78 clicks
        eq_(Link.objects.total_link_clicks(), 78)
Beispiel #7
0
    def test_basic(self):
        """
        Aggregate any datapoints older than 90 days into the totals
        stored on their links.
        """
        link1 = LinkFactory.create(aggregate_link_clicks=7,
                                   aggregate_firefox_downloads=10)
        link1_old_datapoint = DataPointFactory.create(link=link1,
                                                      date=aware_date(
                                                          2014, 1, 1),
                                                      link_clicks=8,
                                                      firefox_downloads=4)
        link1_new_datapoint = DataPointFactory.create(link=link1,
                                                      date=aware_date(
                                                          2014, 3, 1),
                                                      link_clicks=2,
                                                      firefox_downloads=7)

        link2 = LinkFactory.create(aggregate_link_clicks=7,
                                   aggregate_firefox_downloads=10)
        link2_old_datapoint1 = DataPointFactory.create(link=link2,
                                                       date=aware_date(
                                                           2014, 1, 1),
                                                       link_clicks=8,
                                                       firefox_downloads=4)
        link2_old_datapoint2 = DataPointFactory.create(link=link2,
                                                       date=aware_date(
                                                           2013, 12, 30),
                                                       link_clicks=2,
                                                       firefox_downloads=7)

        self.command.handle()

        # link1 should have 7+8=15 clicks, 10+4=14 downloads, and the
        # new datapoint should still exist.
        link1 = Link.objects.get(pk=link1.pk)
        eq_(link1.aggregate_link_clicks, 15)
        eq_(link1.aggregate_firefox_downloads, 14)
        ok_(not DataPoint.objects.filter(pk=link1_old_datapoint.pk).exists())
        ok_(DataPoint.objects.filter(pk=link1_new_datapoint.pk).exists())

        # link2 should have 7+8+2=17 clicks, 10+4+7=21 downloads, and the
        # old datapoints should not exist.
        link2 = Link.objects.get(pk=link2.pk)
        eq_(link2.aggregate_link_clicks, 17)
        eq_(link2.aggregate_firefox_downloads, 21)
        ok_(not DataPoint.objects.filter(pk=link2_old_datapoint1.pk).exists())
        ok_(not DataPoint.objects.filter(pk=link2_old_datapoint2.pk).exists())
Beispiel #8
0
    def test_rate_limiting(self):
        request = self.factory.get('/')
        link = LinkFactory.create()

        with patch('affiliates.links.views.cache') as cache_patch:
            with patch('affiliates.links.views.add_click') as add_click:
                cache_patch.get.return_value = 3
                self.view(request, pk=link.pk)
                ok_(not add_click.delay.called)
Beispiel #9
0
    def test_rate_limiting(self):
        request = self.factory.get('/')
        link = LinkFactory.create()


        with patch('affiliates.links.views.cache') as cache_patch:
            with patch('affiliates.links.views.add_click') as add_click:
                cache_patch.get.return_value = 3
                self.view(request, pk=link.pk)
                ok_(not add_click.delay.called)
Beispiel #10
0
 def _link_with_clicks(self, user, aggregate_link_clicks, link_click_counts):
     """
     Create a link with a specific number of aggregate links and
     datapoints with the given click counts.
     """
     start_date = aware_date(2014, 4, 1)
     link = LinkFactory.create(user=user, aggregate_link_clicks=aggregate_link_clicks)
     for link_clicks in link_click_counts:
         DataPointFactory.create(link=link, link_clicks=link_clicks, date=start_date)
         start_date += timedelta(1)
Beispiel #11
0
    def test_add_click(self):
        request = self.factory.get('/')
        link = LinkFactory.create()

        with patch('affiliates.links.views.add_click') as add_click:
            with patch('affiliates.links.views.timezone') as timezone:
                timezone.now.return_value = aware_datetime(2014, 4, 7)

                self.view(request, pk=link.pk)
                add_click.delay.assert_called_with(link.id, date(2014, 4, 7))
 def _link_with_clicks(self, user, aggregate_link_clicks, link_click_counts):
     """
     Create a link with a specific number of aggregate links and
     datapoints with the given click counts.
     """
     start_date = aware_date(2014, 4, 1)
     link = LinkFactory.create(user=user, aggregate_link_clicks=aggregate_link_clicks)
     for link_clicks in link_click_counts:
         DataPointFactory.create(link=link, link_clicks=link_clicks, date=start_date)
         start_date += timedelta(1)
Beispiel #13
0
    def test_get_metric_total(self):
        """
        _get_metric_total should combine the aggregate data on the link
        and the data stored in multiple data points.
        """
        link = LinkFactory.create(aggregate_link_clicks=58)
        DataPointFactory.create(link=link, link_clicks=5, date=aware_date(2014, 1, 1))
        DataPointFactory.create(link=link, link_clicks=2, date=aware_date(2014, 1, 2))
        DataPointFactory.create(link=link, link_clicks=87, date=aware_date(2014, 1, 3))

        eq_(link._get_metric_total('link_clicks'), 58 + 5 + 2 + 87)
Beispiel #14
0
    def test_links(self):
        """
        links should return a queryset of links related to any type of
        banner variation within the category.
        """
        category = CategoryFactory.create()

        # Test against several variations, and multiple variations.
        image_banner_variation1 = ImageBannerVariationFactory.create(banner__category=category)
        image_banner_variation2 = ImageBannerVariationFactory.create(banner__category=category)
        text_banner_variation = TextBannerVariationFactory.create(banner__category=category)
        upgrade_banner_variation = FirefoxUpgradeBannerVariationFactory.create(banner__category=category)

        # Create links from the variations.
        image_link1 = LinkFactory.create(banner_variation=image_banner_variation1)
        image_link2 = LinkFactory.create(banner_variation=image_banner_variation1)
        image_link3 = LinkFactory.create(banner_variation=image_banner_variation2)
        text_link = LinkFactory.create(banner_variation=text_banner_variation)
        upgrade_link = LinkFactory.create(banner_variation=upgrade_banner_variation)

        eq_(set([image_link1, image_link2, image_link3, text_link, upgrade_link]), set(category.links))
Beispiel #15
0
    def test_link_exists_datapoint_exists(self):
        """
        If a datapoint exists for the given date, increment it's
        link_clicks value.
        """
        link = LinkFactory.create()
        datapoint = DataPointFactory.create(link=link,
                                            date=date(2014, 1, 1),
                                            link_clicks=7)

        add_click(link.id, date(2014, 1, 1))
        datapoint = DataPoint.objects.get(pk=datapoint.pk)
        eq_(datapoint.link_clicks, 8)
Beispiel #16
0
    def test_links(self):
        """
        links should return a queryset of links related to any type of
        banner variation within the category.
        """
        category = CategoryFactory.create()

        # Test against several variations, and multiple variations.
        image_banner_variation1 = ImageBannerVariationFactory.create(banner__category=category)
        image_banner_variation2 = ImageBannerVariationFactory.create(banner__category=category)
        text_banner_variation = TextBannerVariationFactory.create(banner__category=category)
        upgrade_banner_variation = FirefoxUpgradeBannerVariationFactory.create(
            banner__category=category)

        # Create links from the variations.
        image_link1 = LinkFactory.create(banner_variation=image_banner_variation1)
        image_link2 = LinkFactory.create(banner_variation=image_banner_variation1)
        image_link3 = LinkFactory.create(banner_variation=image_banner_variation2)
        text_link = LinkFactory.create(banner_variation=text_banner_variation)
        upgrade_link = LinkFactory.create(banner_variation=upgrade_banner_variation)

        eq_(set(category.links()),
            set([image_link1, image_link2, image_link3, text_link, upgrade_link]))
Beispiel #17
0
    def test_get_queryset(self):
        """
        Available links should be limited to those owned by the current
        user.
        """
        request = self.factory.get('/')
        request.user = UserFactory.create()

        link1, link2 = LinkFactory.create_batch(2, user=request.user)
        unowned_link = LinkFactory.create()

        view = views.LinkDetailView()
        view.request = request
        qs = view.get_queryset()

        ok_(link1 in qs)
        ok_(link2 in qs)
        ok_(unowned_link not in qs)
Beispiel #18
0
    def test_get_queryset(self):
        """
        Available links should be limited to those owned by the current
        user.
        """
        request = self.factory.get('/')
        request.user = UserFactory.create()

        link1, link2 = LinkFactory.create_batch(2, user=request.user)
        unowned_link = LinkFactory.create()

        view = views.LinkDetailView()
        view.request = request
        qs = view.get_queryset()

        ok_(link1 in qs)
        ok_(link2 in qs)
        ok_(unowned_link not in qs)
Beispiel #19
0
    def test_link_exists_datapoint_exists(self):
        """
        If a datapoint exists for the given date, increment it's
        link_clicks value.
        """
        link = LinkFactory.create()
        datapoint = DataPointFactory.create(link=link, date=date(2014, 1, 1), link_clicks=7)
        call_command('denormalize_metrics')  # Ensure denormalized data.

        add_click(link.id, date(2014, 1, 1))

        datapoint = DataPoint.objects.get(pk=datapoint.pk)
        eq_(datapoint.link_clicks, 8)

        link = datapoint.link
        eq_(link.link_clicks, 8)

        banner = link.banner
        eq_(banner.link_clicks, 8)

        category = banner.category
        eq_(category.link_clicks, 8)
Beispiel #20
0
    def test_get_object(self):
        link = LinkFactory.create(legacy_banner_image_id=7)
        view = views.LegacyLinkReferralView()
        view.kwargs = {'user_id': unicode(link.user.id), 'banner_img_id': '7'}

        eq_(view.get_object(), link)
Beispiel #21
0
 def test_link_exists_no_datapoint(self):
     """If not datapoint for the given date exists, create one."""
     link = LinkFactory.create()
     add_click(link.id, date(2014, 4, 1))
     datapoint = link.datapoint_set.get(date=date(2014, 4, 1))
     eq_(datapoint.link_clicks, 1)
Beispiel #22
0
    def test_get_object(self):
        link = LinkFactory.create(legacy_banner_image_id=7)
        view = views.LegacyLinkReferralView()
        view.kwargs = {'user_id': unicode(link.user.id), 'banner_img_id': '7'}

        eq_(view.get_object(), link)
Beispiel #23
0
 def test_link_exists_no_datapoint(self):
     """If not datapoint for the given date exists, create one."""
     link = LinkFactory.create()
     add_click(link.id, date(2014, 4, 1))
     datapoint = link.datapoint_set.get(date=date(2014, 4, 1))
     eq_(datapoint.link_clicks, 1)