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())
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 })
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])
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)
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())
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)
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)
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 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)
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))
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)
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]))
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)
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)
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)
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)