Beispiel #1
0
class BotTestCase(TestCase):
    def setUp(self):
        self.experiment = Experiment(name="backgroundcolor", state=ENABLED_STATE)
        self.experiment.save()
        self.request = request_factory.get("/", HTTP_USER_AGENT="GoogleBot/2.1")
        self.experiment_counter = ExperimentCounter()

    def test_user_does_not_enroll(self):
        experiment_user = participant(self.request)
        experiment_user.set_alternative(EXPERIMENT_NAME, TEST_ALTERNATIVE)
        self.assertEqual(
            self.experiment_counter.participant_count(self.experiment, TEST_ALTERNATIVE),
            0,
            "Bot counted towards results",
        )

    def test_bot_in_control_group(self):
        experiment_user = participant(self.request)
        experiment_user.set_alternative(EXPERIMENT_NAME, TEST_ALTERNATIVE)
        self.assertEqual(experiment_user.get_alternative(EXPERIMENT_NAME), "control", "Bot enrolled in a group")
        self.assertEqual(
            experiment_user.is_enrolled(self.experiment.name, TEST_ALTERNATIVE, self.request),
            False,
            "Bot in test alternative",
        )
        self.assertEqual(
            experiment_user.is_enrolled(self.experiment.name, CONTROL_GROUP, self.request),
            True,
            "Bot not in control group",
        )

    def tearDown(self):
        self.experiment_counter.delete(self.experiment)
Beispiel #2
0
 def setUp(self):
     self.experiment = Experiment(name='backgroundcolor',
                                  state=ENABLED_STATE)
     self.experiment.save()
     self.request = request_factory.get('/',
                                        HTTP_USER_AGENT='GoogleBot/2.1')
     self.experiment_counter = ExperimentCounter()
Beispiel #3
0
 def test_experiment_is_related_to_owner(self):
     owner = User.objects.first()
     experiment = Experiment(nes_id=17,
                             owner=owner,
                             version=1,
                             sent_date=datetime.utcnow())
     experiment.save()
     self.assertIn(experiment, owner.experiment_set.all())
Beispiel #4
0
 def test_duplicate_experiments_are_invalid(self):
     owner = User.objects.first()
     Experiment.objects.create(nes_id=17,
                               owner=owner,
                               version=1,
                               sent_date=datetime.utcnow())
     experiment = Experiment(nes_id=17,
                             owner=owner,
                             version=1,
                             sent_date=datetime.utcnow())
     with self.assertRaises(ValidationError):
         experiment.full_clean()
    def render(self, context):
        # Get User object
        request = context.get('request', None)

        if request is None:
            user = StaticUser()
        else:
            # Create experiment_user in session if not already
            if not hasattr(request, 'experiment_user'):
                request.experiment_user = WebUser(request)
            user = request.experiment_user

        # Set the alternative saved in session by middleware if available.
        session_alternative = None
        if 'experiment' in request.session:
            if request.session['experiment'] == self.experiment_name:
                session_alternative = request.session['alternative']
                del request.session['experiment']

        # Should we render?
        if Experiment.show_alternative(self.experiment_name, user, 
                self.alternative, session_alternative, experiment_manager):
            response = self.node_list.render(context)
        else:
            response = ""

        return response
Beispiel #6
0
class BotTestCase(TestCase):
    def setUp(self):
        self.experiment = Experiment(name='backgroundcolor', state=ENABLED_STATE)
        self.experiment.save()
        self.request = request_factory.get('/', HTTP_USER_AGENT='GoogleBot/2.1')

    def test_user_does_not_enroll(self):
        experiment_user = create_user(self.request)
        experiment_user.set_enrollment(self.experiment, TEST_ALTERNATIVE)
        self.assertEqual(self.experiment.participant_count(TEST_ALTERNATIVE), 0, "Bot counted towards results")

    def test_bot_in_control_group(self):
        experiment_user = create_user(self.request)
        experiment_user.set_enrollment(self.experiment, TEST_ALTERNATIVE)
        self.assertEqual(experiment_user.get_enrollment(self.experiment), CONTROL_GROUP, "Bot alternative is not control")
        self.assertEqual(experiment_user.is_enrolled(self.experiment.name, TEST_ALTERNATIVE, self.request), False, "Bot in test alternative")
        self.assertEqual(experiment_user.is_enrolled(self.experiment.name, CONTROL_GROUP, self.request), True, "Bot not in control group")
Beispiel #7
0
 def test_can_save_same_experiment_to_different_owners(self):
     owner1 = User.objects.get(username='******')
     owner2 = User.objects.get(username='******')
     Experiment.objects.create(
         title='A title',
         description='A description',
         nes_id=1,
         owner=owner1,
         version=17,
         sent_date=datetime.utcnow(),
         slug='slug6'  # last slug in tests_helper was 'slug'
     )
     experiment2 = Experiment(title='A title',
                              description='A description',
                              nes_id=1,
                              owner=owner2,
                              version=17,
                              sent_date=datetime.utcnow(),
                              slug='slug7')
     experiment2.full_clean()
def get_experiment(name, description, category, publishable, user, project, publication_list):
    #check if experiment exist, if so return, if not create new
    try:
        year_later = datetime.now() + timedelta(days=(1*365))
        experiment = Experiment(name=name, description=description, category=category,
                                publishable=publishable, date_created=datetime.now(), date_embargo=year_later)
        experiment.validate_unique()
        experiment.save()
        
        experiment.projects.add(project)
        for publication in publication_list:
            experiment.publications.add(publication)

        experiment_contributor = ExperimentContributor.experiment_contributor_objects.create_experiment_as_superuser(experiment, user)
        experiment_contributor.validate_unique()
        experiment_contributor.save()

    except ValidationError as e:
        experiment = Experiment.objects.get(name=name)
  
    return experiment
Beispiel #9
0
class WebUserTests:
    def setUp(self):
        self.experiment = Experiment(name='backgroundcolor', state=ENABLED_STATE)
        self.experiment.save()
        self.request = request_factory.get('/')
        self.request.session = DatabaseSession()

    def tearDown(self):
        self.experiment.delete()

    def confirm_human(self, experiment_user):
        pass

    def participants(self, alternative):
        return self.experiment.participant_count(alternative)

    def enrollment_initially_none(self,):
        experiment_user = create_user(self.request)
        self.assertEqual(experiment_user.get_enrollment(self.experiment), None)

    def test_user_enrolls(self):
        experiment_user = create_user(self.request)
        experiment_user.set_enrollment(self.experiment, TEST_ALTERNATIVE)
        self.assertEqual(experiment_user.get_enrollment(self.experiment), TEST_ALTERNATIVE)

    def test_record_goal_increments_counts(self):
        experiment_user = create_user(self.request)
        self.confirm_human(experiment_user)
        experiment_user.set_enrollment(self.experiment, TEST_ALTERNATIVE)

        self.assertEqual(self.experiment.goal_count(TEST_ALTERNATIVE, TEST_GOAL), 0)
        experiment_user.record_goal(TEST_GOAL)
        self.assertEqual(self.experiment.goal_count(TEST_ALTERNATIVE, TEST_GOAL), 1)

    def test_can_record_goal_multiple_times(self):
        experiment_user = create_user(self.request)
        self.confirm_human(experiment_user)
        experiment_user.set_enrollment(self.experiment, TEST_ALTERNATIVE)

        experiment_user.record_goal(TEST_GOAL)
        experiment_user.record_goal(TEST_GOAL)
        experiment_user.record_goal(TEST_GOAL)
        self.assertEqual(self.experiment.goal_count(TEST_ALTERNATIVE, TEST_GOAL), 1)

    def test_counts_increment_immediately_once_confirmed_human(self):
        experiment_user = create_user(self.request)
        self.confirm_human(experiment_user)

        experiment_user.set_enrollment(self.experiment, TEST_ALTERNATIVE)
        self.assertEqual(self.participants(TEST_ALTERNATIVE), 1, "Did not count participant after confirm human")
class BotTests(object):
    def setUp(self):
        self.experiment = Experiment(name='backgroundcolor', state=ENABLED_STATE)
        self.experiment.save()
        self.experiment_counter = ExperimentCounter()

    def test_user_does_not_enroll(self):
        self.experiment_user.set_alternative(EXPERIMENT_NAME, TEST_ALTERNATIVE)
        self.assertEqual(self.experiment_counter.participant_count(self.experiment, TEST_ALTERNATIVE), 0, "Bot counted towards results")

    def test_user_does_not_fire_goals(self):
        self.experiment_user.set_alternative(EXPERIMENT_NAME, TEST_ALTERNATIVE)
        self.experiment_user.goal(TEST_GOAL)
        self.assertEqual(self.experiment_counter.participant_count(self.experiment, TEST_ALTERNATIVE), 0, "Bot counted towards results")

    def test_bot_in_control_group(self):
        self.experiment_user.set_alternative(EXPERIMENT_NAME, TEST_ALTERNATIVE)
        self.assertEqual(self.experiment_user.get_alternative(EXPERIMENT_NAME), 'control', "Bot enrolled in a group")
        self.assertEqual(self.experiment_user.is_enrolled(self.experiment.name, TEST_ALTERNATIVE), False, "Bot in test alternative")
        self.assertEqual(self.experiment_user.is_enrolled(self.experiment.name, CONTROL_GROUP), True, "Bot not in control group")

    def tearDown(self):
        self.experiment_counter.delete(self.experiment)
Beispiel #11
0
 def test_default_attributes(self):
     experiment = Experiment()
     self.assertEqual(experiment.nes_id, None)
     self.assertEqual(experiment.title, '')
     self.assertEqual(experiment.description, '')
     self.assertEqual(experiment.data_acquisition_done, False)
     self.assertEqual(experiment.sent_date, None)
     self.assertEqual(experiment.version, None)
     self.assertEqual(experiment.status, experiment.RECEIVING)
     self.assertEqual(experiment.trustee, None)
     self.assertEqual(experiment.project_url, None)
     self.assertEqual(experiment.ethics_committee_url, None)
     self.assertEqual(experiment.ethics_committee_file, None)
     self.assertEqual(experiment.slug, '')
     self.assertEqual(experiment.downloads, 0)
Beispiel #12
0
    def render(self, context):
        # Get User object
        request = context.get('request', None)

        if request is None:
            user = StaticUser()
        else:
            # Create experiment_user in session if not already
            if not hasattr(request, 'experiment_user'):
                request.experiment_user = WebUser(request)
            user = request.experiment_user

        # Should we render?
        if Experiment.show_alternative(self.experiment_name, user, self.alternative, experiment_manager):
            response = self.node_list.render(context)
        else:
            response = ""

        return response
    def render(self, context):
        # Get User object
        request = context.get("request", None)

        if request is None:
            user = StaticUser()
        else:
            # Create experiment_user in session if not already
            if not hasattr(request, "experiment_user"):
                request.experiment_user = WebUser(request)
            user = request.experiment_user

        # Should we render?
        if Experiment.show_alternative(self.experiment_name, user, self.alternative, experiment_manager):
            response = self.node_list.render(context)
        else:
            response = ""

        return response
Beispiel #14
0
 def test_cannot_save_empty_attributes(self):
     owner = User.objects.first()
     # version=17: large number to avoid conflicts with global setup
     experiment = Experiment(nes_id=1,
                             title='',
                             description='',
                             owner=owner,
                             version=17,
                             slug='',
                             sent_date=datetime.utcnow())
     # TODO: slug='' does not raises ValidationError
     with self.assertRaises(ValidationError):
         experiment.save()
         experiment.full_clean()
Beispiel #15
0
def double_knockdown(request, mutant, clones, temperature):
    """
    Render the page showing knockdown by both mutation and RNAi.

    context['data'] is returned in format:

        {clone: {
            library_stock: {
                date: {
                    'mutant_rnai': {
                        'experiments': [experiments], 'link_to_all': url
                    },
                    'n2_rnai': {
                        'experiments': [experiments], 'link_to_all': url
                    },
                    'mutant_l4440': {
                        'experiments': [experiments], 'link_to_all': url
                    },
                    'n2_l4440': {
                        'experiments': [experiments], 'link_to_all': url
                    },
                }
            }
        }}

    """

    data = OrderedDict()

    n2 = WormStrain.get_n2()
    l4440 = Clone.get_l4440()
    mutant = get_object_or_404(WormStrain, pk=mutant)
    clones = Clone.objects.filter(pk__in=clones.split(','))

    for clone in clones:
        data_per_clone = OrderedDict()

        library_stocks = (LibraryStock.objects.filter(intended_clone=clone)
                          .order_by('-plate__screen_stage', 'id'))

        for library_stock in library_stocks:
            data_per_well = OrderedDict()

            dates = Experiment.get_distinct_dates({
                'is_junk': False,
                'worm_strain': mutant,
                'library_stock': library_stock,
                'plate__temperature': temperature,
            })

            for date in dates:
                # Add double knockdowns
                filters = {
                    'is_junk': False,
                    'plate__date': date,
                    'worm_strain': mutant.pk,
                    'library_stock': library_stock,
                    'plate__temperature': temperature,
                }
                mutant_rnai = _create_inner_dictionary(
                    filters, join_manual=True)

                # Add mutant + L4440 controls
                filters = {
                    'is_junk': False,
                    'plate__date': date,
                    'worm_strain': mutant.pk,
                    'library_stock__intended_clone': l4440,
                    'plate__temperature': temperature,
                }
                mutant_l4440 = _create_inner_dictionary(filters)

                # Add N2 + RNAi controls
                filters = {
                    'is_junk': False,
                    'plate__date': date,
                    'worm_strain': n2.pk,
                    'library_stock': library_stock,
                }

                t = Experiment.get_closest_temperature(temperature, filters)
                filters['plate__temperature'] = t

                n2_rnai = _create_inner_dictionary(filters)

                # Add N2 + L4440 controls
                filters = {
                    'is_junk': False,
                    'plate__date': date,
                    'worm_strain': n2.pk,
                    'library_stock__intended_clone': l4440,
                }

                t = Experiment.get_closest_temperature(temperature, filters)
                filters['plate__temperature'] = t

                n2_l4440 = _create_inner_dictionary(filters)

                data_per_well[date] = {
                    'mutant_rnai': mutant_rnai,
                    'mutant_l4440': mutant_l4440,
                    'n2_rnai': n2_rnai,
                    'n2_l4440': n2_l4440,
                }

            if data_per_well:
                data_per_clone[library_stock] = data_per_well

        data[clone] = data_per_clone

    context = {
        'mutant': mutant,
        'clones': clones,
        'temperature': temperature,
        'data': data,
    }

    return render(request, 'double_knockdown.html', context)
Beispiel #16
0
    def scheduleHeuristicSignatureRecording(self, job):

        # Retrieve the heuristic version
        try:
            heuristic_version = HeuristicVersion.objects.get(id=job.command.parameters[0])
        except:
            alert = Alert()
            alert.message = 'Unknown heuristic version ID: %d' % job.command.parameters[0]
            job.outStream.write("ERROR - %s\n" % alert.message)
            job.markAsFailed(alert=alert)
            return

        job.markAsRunning()

        # If the heuristic already has a signature, delete it
        try:
            signature = heuristic_version.signature[0]
        except:
            signature = None

        if signature is not None:
            if signature.experiment.isRunning() or signature.experiment.isScheduled:
                self.channel.sendMessage(Message('CANCEL_EXPERIMENT', [signature.experiment.id]))
                job.markAsDone()
                return

            signature.experiment.configuration.delete()
            signature.delete()

        # Retrieve the recording configuration
        try:
            configuration_template = Configuration.objects.get(experiment_type=Configuration.SIGNATURE,
                                                               name__startswith='template/')
        except:
            alert = Alert()
            alert.message = 'No signature recording configuration found'
            job.outStream.write("ERROR - %s\n" % alert.message)
            job.markAsFailed(alert=alert)
            return

        # Create the configuration
        configuration                 = Configuration()
        configuration.name            = configuration_template.name.replace('template/', '%s/' % heuristic_version.fullname())
        configuration.heuristics      = configuration_template.heuristics
        configuration.experiment_type = configuration_template.experiment_type
        configuration.task            = configuration_template.task
        configuration.save()

        # Add the heuristic version
        configuration.heuristics_set.add(heuristic_version)

        # Save the configuration
        configuration.save()

        # Add the settings
        for setting in configuration_template.settings.all():
            configuration.addSetting(setting.name, setting.value)

        # Create the experiment
        experiment               = Experiment()
        experiment.name          = configuration.name
        experiment.configuration = configuration
        experiment.save()

        # Create the signature
        signature                   = HeuristicSignature()
        signature.heuristic_version = heuristic_version
        signature.experiment        = experiment
        signature.save()

        self.channel.sendMessage(Message('RUN_EXPERIMENT', [experiment.id]))

        job.markAsDone()
Beispiel #17
0
    def scheduleHeuristicEvaluation(self, job):

        # Retrieve the heuristic version
        try:
            heuristic_version = HeuristicVersion.objects.get(id=job.command.parameters[0])
        except:
            alert = Alert()
            alert.message = 'Unknown heuristic version ID: %d' % job.command.parameters[0]
            job.outStream.write("ERROR - %s\n" % alert.message)
            job.markAsFailed(alert=alert)
            return

        job.markAsRunning()

        # If the heuristic is already evaluated, remove the results from the database
        if heuristic_version.evaluated:
            configurations = map(lambda x: x.experiment.configuration, heuristic_version.evaluation_results.all())

            heuristic_version.evaluation_results.all().delete()
            heuristic_version.evaluated = False
            heuristic_version.rank = None
            heuristic_version.save()

            for configuration in configurations:
                configuration.delete()

        # If the heuristic is currently evaluated, remove the existing results from
        # the database and cancel the running experiments
        elif heuristic_version.evaluation_results.count() > 0:
            for evaluation_results in heuristic_version.evaluation_results.filter(experiment__status=Experiment.STATUS_RUNNING):
                self.channel.sendMessage(Message('CANCEL_EXPERIMENT', [evaluation_results.experiment.id]))

            configurations = map(lambda x: x.experiment.configuration, heuristic_version.evaluation_results.exclude(experiment__status=Experiment.STATUS_RUNNING))
            heuristic_version.evaluation_results.exclude(experiment__status=Experiment.STATUS_RUNNING).delete()

            for configuration in configurations:
                configuration.delete()

            job.markAsDone()
            return

        # Retrieve all the evaluation configurations
        evaluation_configurations = Configuration.objects.filter(experiment_type=Configuration.EVALUATION,
                                                                 name__startswith='template/')
        if evaluation_configurations.count() == 0:
            alert = Alert()
            alert.message = 'No evaluation configuration found'
            job.outStream.write("ERROR - %s\n" % alert.message)
            job.markAsFailed(alert=alert)
            return

        # Schedule the evaluation experiments
        for evaluation_configuration in evaluation_configurations:

            # Create the configuration
            configuration                 = Configuration()
            configuration.name            = evaluation_configuration.name.replace('template/', '%s/' % heuristic_version.fullname())
            configuration.heuristics      = evaluation_configuration.heuristics
            configuration.experiment_type = evaluation_configuration.experiment_type
            configuration.task            = evaluation_configuration.task
            configuration.save()

            # Add the list of heuristic versions
            for version in evaluation_configuration.heuristics_set.all():
                configuration.heuristics_set.add(version)

            if heuristic_version not in evaluation_configuration.heuristics_set.all():
                configuration.heuristics_set.add(heuristic_version)
            else:
                configuration.addSetting('PREDICTOR_SETUP/ADDITIONAL_HEURISTICS', heuristic_version.absolutename())

            # Add the list of instruments
            for instrument in evaluation_configuration.instruments_set.all():
                configuration.instruments_set.add(instrument)

            # Save the configuration
            configuration.save()

            # Add the settings
            for setting in evaluation_configuration.settings.all():
                configuration.addSetting(setting.name, setting.value)

            # Create the experiment
            experiment               = Experiment()
            experiment.name          = configuration.name
            experiment.configuration = configuration
            experiment.save()

            # Create the evaluation results entry
            evaluation_results                   = HeuristicEvaluationResults()
            evaluation_results.heuristic_version = heuristic_version
            evaluation_results.evaluation_config = evaluation_configuration
            evaluation_results.experiment        = experiment
            evaluation_results.save()

            self.channel.sendMessage(Message('RUN_EXPERIMENT', [experiment.id]))

        job.markAsDone()
Beispiel #18
0
    def schedulePublicExperiments(self, job):

        job.markAsRunning()

        # Retrieve the configuration templates
        for template in Configuration.objects.filter(experiment_type=Configuration.PUBLIC, name__startswith='template/'):

            # Retrieve the list of heuristic versions already used in a public experiment
            # based on this template
            already_used_heuristic_versions = []
            previous = None
            try:
                previous = Configuration.objects.filter(experiment_type=Configuration.PUBLIC,
                                                        name__startswith=template.name.replace('template/', '')).order_by('-experiment__creation_date')[0]

                if previous.experiment.status == Experiment.STATUS_RUNNING:
                    continue

                already_used_heuristic_versions = list(previous.heuristics_set.all())
            except:
                pass

            # Ensure that some new heuristics exist since the last public experiment
            # based on this template
            current_heuristic_versions = map(lambda x: x.latest_public_version,
                                              list(Heuristic.objects.filter(latest_public_version__isnull=False, simple=False)))

            new_heuristic_versions = filter(lambda x: x not in already_used_heuristic_versions, current_heuristic_versions)

            if len(new_heuristic_versions) == 0:
                continue

            # Cancel the previous experiment if needed
            if (previous is not None) and (previous.experiment.status == Experiment.STATUS_SCHEDULED):
                self.channel.sendMessage(Message('CANCEL_EXPERIMENT', [previous.experiment.id]))
                continue

            # Create the configuration
            configuration                 = Configuration()
            configuration.name            = template.name.replace('template/', '') + '/' + datetime.now().strftime('%Y-%m-%d %H:%M:%S')
            configuration.heuristics      = template.heuristics
            configuration.experiment_type = template.experiment_type
            configuration.task            = template.task
            configuration.save()

            # Add the list of heuristic versions
            for heuristic_version in current_heuristic_versions:
                configuration.heuristics_set.add(heuristic_version)

            # Add the list of instruments
            for instrument in template.instruments_set.all():
                configuration.instruments_set.add(instrument)

            # Save the configuration
            configuration.save()

            # Add the settings
            for setting in template.settings.all():
                configuration.addSetting(setting.name, setting.value)

            # Create the experiment
            experiment               = Experiment()
            experiment.name          = configuration.name
            experiment.configuration = configuration
            experiment.save()

            self.channel.sendMessage(Message('RUN_EXPERIMENT', [experiment.id]))

        job.markAsDone()
Beispiel #19
0
 def setUp(self):
     self.experiment = Experiment(name='backgroundcolor', state=ENABLED_STATE)
     self.experiment.save()
     self.request = request_factory.get('/', HTTP_USER_AGENT='GoogleBot/2.1')
Beispiel #20
0
 def setUp(self):
     self.experiment = Experiment(name='backgroundcolor', state=ENABLED_STATE)
     self.experiment.save()
     self.request = request_factory.get('/')
     self.request.session = DatabaseSession()
Beispiel #21
0
 def setUp(self):
     self.experiment = Experiment(name="backgroundcolor", state=ENABLED_STATE)
     self.experiment.save()
     self.request = request_factory.get("/", HTTP_USER_AGENT="GoogleBot/2.1")
     self.experiment_counter = ExperimentCounter()
 def setUp(self):
     self.experiment = Experiment(name=EXPERIMENT_NAME, state=ENABLED_STATE)
     self.experiment.save()
     self.request = request_factory.get('/')
     self.request.session = DatabaseSession()
     self.experiment_counter = ExperimentCounter()
class WebUserTests(object):
    def setUp(self):
        self.experiment = Experiment(name=EXPERIMENT_NAME, state=ENABLED_STATE)
        self.experiment.save()
        self.request = request_factory.get('/')
        self.request.session = DatabaseSession()
        self.experiment_counter = ExperimentCounter()

    def tearDown(self):
        self.experiment_counter.delete(self.experiment)

    def test_enrollment_initially_control(self):
        experiment_user = participant(self.request)
        self.assertEqual(experiment_user.get_alternative(EXPERIMENT_NAME), 'control', "Default Enrollment wasn't control")

    def test_user_enrolls(self):
        experiment_user = participant(self.request)
        experiment_user.set_alternative(EXPERIMENT_NAME, TEST_ALTERNATIVE)
        self.assertEqual(experiment_user.get_alternative(EXPERIMENT_NAME), TEST_ALTERNATIVE, "Wrong Alternative Set")

    def test_record_goal_increments_counts(self):
        experiment_user = participant(self.request)
        experiment_user.confirm_human()
        experiment_user.set_alternative(EXPERIMENT_NAME, TEST_ALTERNATIVE)

        self.assertEqual(self.experiment_counter.goal_count(self.experiment, TEST_ALTERNATIVE, TEST_GOAL), 0)
        experiment_user.goal(TEST_GOAL)
        self.assertEqual(self.experiment_counter.goal_count(self.experiment, TEST_ALTERNATIVE, TEST_GOAL), 1, "Did not increment Goal count")

    def test_can_record_goal_multiple_times(self):
        experiment_user = participant(self.request)
        experiment_user.confirm_human()
        experiment_user.set_alternative(EXPERIMENT_NAME, TEST_ALTERNATIVE)

        experiment_user.goal(TEST_GOAL)
        experiment_user.goal(TEST_GOAL)
        experiment_user.goal(TEST_GOAL)
        self.assertEqual(self.experiment_counter.goal_count(self.experiment, TEST_ALTERNATIVE, TEST_GOAL), 1, "Did not increment goal count correctly")
        self.assertEqual(self.experiment_counter.goal_distribution(self.experiment, TEST_ALTERNATIVE, TEST_GOAL), {3: 1}, "Incorrect goal count distribution")

    def test_counts_increment_immediately_once_confirmed_human(self):
        experiment_user = participant(self.request)
        experiment_user.confirm_human()

        experiment_user.set_alternative(EXPERIMENT_NAME, TEST_ALTERNATIVE)
        self.assertEqual(self.experiment_counter.participant_count(self.experiment, TEST_ALTERNATIVE), 1, "Did not count participant after confirm human")

    def test_visit_increases_goal(self):
        thetime = timezone.now()
        with patch('experiments.utils.now', return_value=thetime):
            experiment_user = participant(self.request)
            experiment_user.confirm_human()
            experiment_user.set_alternative(EXPERIMENT_NAME, TEST_ALTERNATIVE)

            experiment_user.visit()
            self.assertEqual(self.experiment_counter.goal_distribution(self.experiment, TEST_ALTERNATIVE, VISIT_NOT_PRESENT_COUNT_GOAL), {1: 1}, "Not Present Visit was not correctly counted")
            self.assertEqual(self.experiment_counter.goal_distribution(self.experiment, TEST_ALTERNATIVE, VISIT_PRESENT_COUNT_GOAL), {}, "Present Visit was not correctly counted")

        with patch('experiments.utils.now', return_value=thetime + timedelta(hours=7)):
            experiment_user.visit()
            self.assertEqual(self.experiment_counter.goal_distribution(self.experiment, TEST_ALTERNATIVE, VISIT_NOT_PRESENT_COUNT_GOAL), {2: 1}, "No Present Visit was not correctly counted")
            self.assertEqual(self.experiment_counter.goal_distribution(self.experiment, TEST_ALTERNATIVE, VISIT_PRESENT_COUNT_GOAL), {1: 1}, "Present Visit was not correctly counted")

    def test_visit_twice_increases_once(self):
        experiment_user = participant(self.request)
        experiment_user.confirm_human()
        experiment_user.set_alternative(EXPERIMENT_NAME, TEST_ALTERNATIVE)

        experiment_user.visit()
        experiment_user.visit()

        self.assertEqual(self.experiment_counter.goal_distribution(self.experiment, TEST_ALTERNATIVE, VISIT_NOT_PRESENT_COUNT_GOAL), {1: 1}, "Visit was not correctly counted")
        self.assertEqual(self.experiment_counter.goal_distribution(self.experiment, TEST_ALTERNATIVE, VISIT_PRESENT_COUNT_GOAL), {}, "Present Visit was not correctly counted")

    def test_user_force_enrolls(self):
        experiment_user = participant(self.request)
        experiment_user.enroll(EXPERIMENT_NAME, ['control', 'alternative1', 'alternative2'], force_alternative='alternative2')
        self.assertEqual(experiment_user.get_alternative(EXPERIMENT_NAME), 'alternative2')

    def test_user_does_not_force_enroll_to_new_alternative(self):
        alternatives = ['control', 'alternative1', 'alternative2']
        experiment_user = participant(self.request)
        experiment_user.enroll(EXPERIMENT_NAME, alternatives)
        alternative = experiment_user.get_alternative(EXPERIMENT_NAME)
        self.assertIsNotNone(alternative)

        other_alternative = random.choice(list(set(alternatives) - set(alternative)))
        experiment_user.enroll(EXPERIMENT_NAME, alternatives, force_alternative=other_alternative)
        self.assertEqual(alternative, experiment_user.get_alternative(EXPERIMENT_NAME))

    def test_second_force_enroll_does_not_change_alternative(self):
        alternatives = ['control', 'alternative1', 'alternative2']
        experiment_user = participant(self.request)
        experiment_user.enroll(EXPERIMENT_NAME, alternatives, force_alternative='alternative1')
        alternative = experiment_user.get_alternative(EXPERIMENT_NAME)
        self.assertIsNotNone(alternative)

        other_alternative = random.choice(list(set(alternatives) - set(alternative)))
        experiment_user.enroll(EXPERIMENT_NAME, alternatives, force_alternative=other_alternative)
        self.assertEqual(alternative, experiment_user.get_alternative(EXPERIMENT_NAME))
 def setUp(self):
     self.experiment = Experiment(name='backgroundcolor', state=ENABLED_STATE)
     self.experiment.save()
     self.experiment_counter = ExperimentCounter()
Beispiel #25
0
class WebUserTests(object):
    def setUp(self):
        self.experiment = Experiment(name=EXPERIMENT_NAME, state=ENABLED_STATE)
        self.experiment.save()
        self.request = request_factory.get("/")
        self.request.session = DatabaseSession()
        self.experiment_counter = ExperimentCounter()

    def tearDown(self):
        self.experiment_counter.delete(self.experiment)

    def confirm_human(self, experiment_user):
        pass

    def participants(self, alternative):
        return self.experiment_counter.participant_count(self.experiment, alternative)

    def enrollment_initially_none(self,):
        experiment_user = participant(self.request)
        self.assertEqual(experiment_user.get_alternative(EXPERIMENT_NAME), None)

    def test_user_enrolls(self):
        experiment_user = participant(self.request)
        experiment_user.set_alternative(EXPERIMENT_NAME, TEST_ALTERNATIVE)
        self.assertEqual(experiment_user.get_alternative(EXPERIMENT_NAME), TEST_ALTERNATIVE)

    def test_record_goal_increments_counts(self):
        experiment_user = participant(self.request)
        self.confirm_human(experiment_user)
        experiment_user.set_alternative(EXPERIMENT_NAME, TEST_ALTERNATIVE)

        self.assertEqual(self.experiment_counter.goal_count(self.experiment, TEST_ALTERNATIVE, TEST_GOAL), 0)
        experiment_user.goal(TEST_GOAL)
        self.assertEqual(self.experiment_counter.goal_count(self.experiment, TEST_ALTERNATIVE, TEST_GOAL), 1)

    def test_can_record_goal_multiple_times(self):
        experiment_user = participant(self.request)
        self.confirm_human(experiment_user)
        experiment_user.set_alternative(EXPERIMENT_NAME, TEST_ALTERNATIVE)

        experiment_user.goal(TEST_GOAL)
        experiment_user.goal(TEST_GOAL)
        experiment_user.goal(TEST_GOAL)
        self.assertEqual(self.experiment_counter.goal_count(self.experiment, TEST_ALTERNATIVE, TEST_GOAL), 1)

    def test_counts_increment_immediately_once_confirmed_human(self):
        experiment_user = participant(self.request)
        self.confirm_human(experiment_user)

        experiment_user.set_alternative(EXPERIMENT_NAME, TEST_ALTERNATIVE)
        self.assertEqual(self.participants(TEST_ALTERNATIVE), 1, "Did not count participant after confirm human")

    def test_visit_increases_goal(self):
        experiment_user = participant(self.request)
        self.confirm_human(experiment_user)
        experiment_user.set_alternative(EXPERIMENT_NAME, TEST_ALTERNATIVE)

        experiment_user.visit()

        self.assertEqual(
            self.experiment_counter.goal_distribution(self.experiment, TEST_ALTERNATIVE, VISIT_COUNT_GOAL), {1: 1}
        )

    def test_visit_twice_increases_once(self):
        experiment_user = participant(self.request)
        self.confirm_human(experiment_user)
        experiment_user.set_alternative(EXPERIMENT_NAME, TEST_ALTERNATIVE)

        experiment_user.visit()
        experiment_user.visit()

        self.assertEqual(
            self.experiment_counter.goal_distribution(self.experiment, TEST_ALTERNATIVE, VISIT_COUNT_GOAL), {1: 1}
        )