Пример #1
0
    def test_perform_filtering(self):
        ''' Runs the filtering celery task '''
        visitor = models.relational.Visitor.objects.create()
        visit = visitor.visits.create(session_id='123', app_id=123, ip='127.0.0.1')

        ranked_edges = targeting.px3_crawl(self.token)
        # Ensure at least one edge passes filter:
        # (NOTE: May have to fiddle with campaign properties as well.)
        ranked_edges[0].secondary.state = 'Illinois'

        (
            edges_ranked,
            edges_filtered,
            filter_id,
            cs_slug,
            campaign_id,
            content_id,
        ) = targeting.perform_filtering(
            ranked_edges,
            campaign_id=1,
            content_id=1,
            fbid=1,
            visit_id=visit.pk,
            num_faces=1,
        )

        self.assertTrue(edges_ranked)
        self.assertEqual({type(edge) for edge in edges_ranked},
                         {models.datastructs.Edge})
        self.assertIsInstance(edges_filtered, models.datastructs.TieredEdges)
        self.assertEqual({type(edge) for edge in edges_filtered.edges},
                         {models.datastructs.Edge})
        self.assertIsInstance(filter_id, long)
        self.assertIsInstance(cs_slug, (types.NoneType, basestring))
Пример #2
0
    def test_px4_choiceset_filter(self, classifier_mock):
        # Configure null global filter:
        self.campaign.campaignglobalfilters.create(filter=self.default_filter, rand_cdf=1)

        # Configure choiceset:
        topics_filter = self.client.filters.create()
        topics_filter.filterfeatures.create(
            feature_type=models.relational.FilterFeatureType.objects.get_topics(),
            feature='topics[Weather]',
            operator=models.FilterFeature.Operator.MIN,
            value=0.1,
        )
        choice_set = self.client.choicesets.create()
        choice_set.choicesetfilters.create(filter=topics_filter)
        self.campaign.campaignchoicesets.create(choice_set=choice_set, rand_cdf=1)

        # px3
        ranked_edges = targeting.px3_crawl(self.token)
        result = targeting.perform_filtering(
            ranked_edges,
            fbid=self.token.fbid,
            campaign_id=self.campaign.pk,
            content_id=self.content.pk,
            visit_id=self.visit.pk,
            num_faces=1,
        )
        self.assertTrue(result.ranked)
        self.assertTrue(result.filtered)
        self.assertEqual(len(result.filtered), len(result.ranked)) # no filtering

        # px4
        (stream, ranked_edges) = targeting.px4_crawl(self.token)
        self.assertTrue(stream)

        self.assertEqual(models.dynamo.PostTopics.items.count(), 0)

        filtering_result = targeting.px4_filter(
            stream,
            ranked_edges,
            fbid=self.token.fbid,
            campaign_id=self.campaign.pk,
            content_id=self.content.pk,
            visit_id=self.visit.pk,
            num_faces=1,
        )
        result = targeting.px4_rank(filtering_result)

        self.assertTrue(result.ranked)
        self.assertTrue(result.filtered)
        self.assertTrue(classifier_mock.called)

        self.assertGreater(models.dynamo.PostTopics.items.count(), 0)

        self.assertLess(len(result.filtered), len(result.ranked))
        mismatch = [user for user in result.filtered.secondaries
                    if user.topics['Weather'] < 0.1]
        self.assertFalse(mismatch)
Пример #3
0
    def test_px3_crawl(self):
        ''' Run the px3_crawl celery task without throwing it
        through the celery/rabbitmq stack, because we're testing our code,
        not celerys.

        Pass in True for mock mode, a dummy FB id, and a dummy token. Should
        get back a lengthy list of Edges.
        '''
        ranked_edges = targeting.px3_crawl(self.token)
        assert all(isinstance(x, models.datastructs.Edge) for x in ranked_edges)