def test_thows_if_client_id_is_none(self):
        hit = False
        try:
            experiments = bernoulli.get_experiments()
        except:
            hit = True

        self.assertTrue(hit)
    def test_handles_success(self):
        @urlmatch(netloc=r'(.*\.)?bernoulli.herokuapp.com$', path='/client/api/experiments/')
        def get_experiments_mock(url, request):
            return {
                'status': 200,
                'content': json.dumps({
                    'status': 'ok',
                    'value': [{ 'id': 32, }],
                })
            }

        with HTTMock(get_experiments_mock):
            experiments = bernoulli.get_experiments(client_id="1", experiment_ids=["1234"], user_id='s59')
            self.assertEqual(1, len(experiments))
            self.assertEqual(32, experiments[0]['id'])
    def test_handles_failure(self):
        @urlmatch(netloc=r'(.*\.)?bernoulli.herokuapp.com$', path='/client/api/experiments/')
        def get_experiments_mock(url, request):
            self.assertEqual(url[3], 'experimentIds=1234&bucketIfNecessary=True&userId=s59&clientId=1')
            return {
                'status': 200,
                'content': json.dumps({
                    'status': 'error',
                    'message': 'invalid clientId',
                })
            }

        with HTTMock(get_experiments_mock):
            threw = False
            try:
                experiments = bernoulli.get_experiments(client_id="1", experiment_ids=["1234"], user_id="s59")
            except:
                threw = True

            self.assertTrue(threw)
    def render(self, context):
        #if self not in context.render_context:
        # Get variant from server
        request = self.request.resolve(context)
        is_a_bot = False
        user_id = request.session.get('bernoulli_id', None) if request.user.is_anonymous() else request.user.id
        experiment = None

        if not user_id:
            is_a_bot = self.is_bot(request.META['HTTP_USER_AGENT'])

        if not is_a_bot:
            experiments = bernoulli.get_experiments(
                client_id=settings.BERNOULLI_CLIENT_ID,
                experiment_ids=self.experiment_id,
                user_id=user_id,
            )


            experiment = None
            for e in experiments:
                if e['id'] == self.experiment_id:
                    experiment = e
                    break


            if user_id is None and experiment is not None:
                # save user id to session for use later
                request.session['bernoulli_id'] = experiment['user_id']

        output = ''
        for variant, nodelist, is_control in self.variant_nodelists:
            if variant is None:
                # Just render this, it is not in a variant block
                output += nodelist.render(context)
            elif is_control and is_a_bot:
                output += nodelist.render(context)
            elif experiment is not None and variant == experiment['variant']:
                output += nodelist.render(context)

        return output