Example #1
0
def test_my_ratings(driver, django_db_blocker):
    # creating a video

    login(driver)

    with django_db_blocker.unblock():
        me = UserPreferences.objects.get(user__username=test_username)
        video_id1 = create_test_video()
        video_id2 = create_test_video()
        video_1 = Video.objects.get(video_id=video_id1)
        video_2 = Video.objects.get(video_id=video_id2)
        ExpertRating.objects.create(video_1=video_1,
                                    video_2=video_2,
                                    **{k: 50
                                       for k in VIDEO_FIELDS},
                                    user=me)

    open_more_menu(driver)

    WebDriverWait(driver, TIME_WAIT).until(
        EC.visibility_of_element_located((By.ID, 'video_details_menu')))

    print("Going to the details page")
    expert_interface_btn = driver.find_element_by_id('video_details_menu')
    expert_interface_btn.click()

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located((By.CLASS_NAME, 'video_id_text_field')))

    elem = driver.find_element_by_class_name('video_id_text_field')
    elem = elem.find_element_by_tag_name('input')

    elem.clear()
    elem.send_keys(video_id1, Keys.HOME)
    if elem.get_attribute('value') != video_id1:
        elem.send_keys(3 * [Keys.DELETE])

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located(
            (By.CLASS_NAME, 'button_video_ratings')))

    # opening ratings page
    driver.find_element_by_class_name('button_video_ratings').click()

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located((By.ID, 'id_my_ratings')))

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located((By.CLASS_NAME, 'video_rating_video')))

    # have only 1 rating
    assert len(driver.find_elements_by_class_name('video_rating_video')) == 1

    # rerate
    driver.find_elements_by_class_name('video_rating_rerate')[0].click()

    # on the right page
    assert driver.current_url.split('/')[-2:] == [video_id1, video_id2]

    logout(driver)
Example #2
0
def test_user_ui_pref_videos(driver, django_db_blocker):
    """Test that user preferences are saved and videos are shown."""
    login(driver)

    with django_db_blocker.unblock():
        create_test_video(name="test")

    print("Going to user interface")
    ui_button = driver.find_element_by_id('user_interface')
    ui_button.click()

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located((By.ID, 'search_phrase')))

    print("Typing search phrase")
    search_phrase_field = driver.find_element_by_id('search_phrase')
    search_phrase_field.clear()
    search_phrase_field.send_keys('test')

    # random preferences
    np.random.seed(42)
    values = np.random.rand(len(VIDEO_FIELDS)) * 100

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located((By.ID, 'id_search_not_loading')))

    for f, v in zip(VIDEO_FIELDS, values):
        set_slider_value(driver, s_id='preference_slider_' + f, value=v)

        WebDriverWait(driver, TIME_WAIT).until(
            EC.presence_of_element_located((By.ID, 'id_search_not_loading')))

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located((By.ID, 'id_search_not_loading')))

    print("Loading recommendations")
    load_rec_btn = driver.find_element_by_id("load_recommendations")
    load_rec_btn.click()

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located((By.ID, 'id_search_not_loading')))

    entry = do_api_call_v2(driver, url='/user_preferences/my/')
    values_got = [entry[x] for x in VIDEO_FIELDS]
    values_transformed = values / 2 + 50
    diff = np.max(np.abs(values_transformed - values_got))
    assert diff < 5, (values_transformed, values_got)
    print("Preferences normal", diff)

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located((By.CLASS_NAME, 'video_search_result')))

    videos = driver.find_elements_by_class_name('video_search_result')
    assert videos, "No videos returned in search, or it took too long."
    print("Got", len(videos), "videos")
    logout(driver)
Example #3
0
def fill_rate_later(django_db_blocker):
    with django_db_blocker.unblock():
        dj_u = DjangoUser.objects.get(username=test_username)
        up, _ = UserPreferences.objects.get_or_create(user=dj_u)
        video_ids = [create_test_video() for _ in range(10)]
        videos = [Video.objects.get(video_id=vid) for vid in video_ids]
        [VideoRateLater.objects.create(user=up, video=v) for v in videos]
Example #4
0
def test_representative_search(driver, django_db_blocker):
    with django_db_blocker.unblock():
        u = DjangoUser.objects.create(username=random_alphanumeric(),
                                      is_active=True)
        up = UserPreferences.objects.create(user=u)
        UserInformation.objects.create(user=u, show_my_profile=True)
        video_id = create_test_video()
        video = Video.objects.get(video_id=video_id)
        ratings = {f: np.random.randn() for f in VIDEO_FIELDS}
        VideoRating.objects.create(user=up, video=video, **ratings)
        VideoRatingPrivacy.objects.create(user=up, video=video, is_public=True)

    login(driver)

    ui_button = driver.find_element_by_id('user_interface')
    ui_button.click()

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located((By.CLASS_NAME, 'search_options')))

    driver.find_element_by_class_name('search_options').click()
    inp_model = driver.find_element_by_id('autocomplete_search_model')
    inp_model.send_keys(len('Aggregated') * [Keys.BACK_SPACE])
    inp_model.send_keys(f"{u.username}'s representative")
    driver.find_element_by_class_name('MuiAutocomplete-popper').click()

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located((By.ID, 'id_search_not_loading')))

    print("Loading recommendations")
    load_rec_btn = driver.find_element_by_id("load_recommendations")
    load_rec_btn.click()

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located((By.ID, 'id_search_not_loading')))

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located(
            (By.CLASS_NAME, f'video_card_id_{video_id}')))

    # now will only see 1 video
    assert driver.find_elements_by_class_name(f'video_card_id_{video_id}')

    logout(driver)

    with django_db_blocker.unblock():
        u.delete()
        Video.objects.filter(video_id=video_id).delete()
def test_home_page_link_enough(driver, django_db_blocker):
    with django_db_blocker.unblock():
        VideoRateLater.objects.filter(user__user__username=test_username).delete()
        video_ids = [create_test_video() for _ in range(minNumRateLater)]
        videos = [Video.objects.get(video_id=vid) for vid in video_ids]
        dj_u = DjangoUser.objects.get(username=test_username)
        up, _ = UserPreferences.objects.get_or_create(user=dj_u)
        [VideoRateLater.objects.create(video=v, user=up) for v in videos]

    login(driver)

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located((By.ID, 'id_home_toexpert')))

    driver.find_element_by_id('id_home_toexpert').click()

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located((By.ID, 'id_no_pending_expert')))

    logout(driver)
Example #6
0
def test_rate_skips(driver, django_db_blocker):
    """Test skips mode."""

    login(driver)

    with django_db_blocker.unblock():
        # creating two videos
        video_1_id = create_test_video()
        video_2_id = create_test_video()

        # setting user preferences
        up = UserPreferences.objects.get(user__username=test_username)

        # enabling two features
        for f in VIDEO_FIELDS[:2]:
            setattr(up, f"{f}_enabled", True)
        for f in VIDEO_FIELDS[2:]:
            setattr(up, f"{f}_enabled", False)

        f0, f1 = VIDEO_FIELDS[:2]

        # setting mode to enable_all
        up.rating_mode = "skip"

        up.save()

    driver.get(web_url + f'/rate/{video_1_id}/{video_2_id}')

    # waiting for the page to load
    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located((By.ID, 'id_no_pending_expert')))

    check_feature_visibility(up, driver)

    # checkboxes should be unchecked
    elem0 = driver.find_element_by_id("id_checkbox_skip_" + f0)
    elem1 = driver.find_element_by_id("id_checkbox_skip_" + f1)
    assert elem0.get_property('checked') is False
    assert elem1.get_property('checked') is False

    elem1.click()

    print("Submitting the rating...")
    expert_submit_btn = driver.find_element_by_id('expert_submit_btn')
    expert_submit_btn.click()

    with django_db_blocker.unblock():
        obj = get_object_with_timeout(ExpertRating,
                                      video_1__video_id=video_1_id,
                                      video_2__video_id=video_2_id,
                                      user__user__username=test_username)

        # checking that weights are 1 for the first feature and 0 for the rest
        for i, f in enumerate(VIDEO_FIELDS):
            val = 1.0 if (i == 0) else 0.0
            assert getattr(obj, f"{f}_weight") == val

        # now, setting first value to None

        setattr(obj, VIDEO_FIELDS[0], None)
        obj.save()

    # editing the rating with default None values and wrong weights
    driver.refresh()

    # waiting for the page to load
    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located((By.ID, 'id_no_pending_expert')))

    elem0 = driver.find_element_by_id("id_checkbox_skip_" + f0)
    elem1 = driver.find_element_by_id("id_checkbox_skip_" + f1)
    assert elem0.get_property('checked') is True
    assert elem1.get_property('checked') is True

    print("Submitting the rating...")
    expert_submit_btn = driver.find_element_by_id('expert_submit_btn')
    expert_submit_btn.click()

    with django_db_blocker.unblock():
        obj = get_object_with_timeout(
            ExpertRating,
            video_1__video_id=video_1_id,
            video_2__video_id=video_2_id,
            user__user__username=test_username,
            **{VIDEO_FIELDS[0] + "_weight__lte": 0.5})

        # checking that weights are 1 for the first feature and 0 for the rest
        for i, f in enumerate(VIDEO_FIELDS):
            assert getattr(obj, f"{f}_weight") == 0.0

        assert getattr(obj, VIDEO_FIELDS[0]) is not None

    with django_db_blocker.unblock():
        Video.objects.filter(video_id__in=[video_1_id, video_2_id]).delete()

    logout(driver)
Example #7
0
def test_rate_enable_all_weight_none(driver, django_db_blocker):
    """Test all features enabled mode."""

    login(driver)

    with django_db_blocker.unblock():
        # creating two videos
        video_1_id = create_test_video()
        video_2_id = create_test_video()

        # setting user preferences
        up = UserPreferences.objects.get(user__username=test_username)

        # disabling all features, except for the first one
        setattr(up, f"{VIDEO_FIELDS[0]}_enabled", True)
        for f in VIDEO_FIELDS[1:]:
            setattr(up, f"{f}_enabled", False)

        # setting mode to enable_all
        up.rating_mode = "enable_all"

        up.save()

    driver.get(web_url + f'/rate/{video_1_id}/{video_2_id}')

    # waiting for the page to load
    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located((By.ID, 'id_no_pending_expert')))

    check_feature_visibility(up, driver)

    print("Submitting the rating...")
    expert_submit_btn = driver.find_element_by_id('expert_submit_btn')
    expert_submit_btn.click()

    with django_db_blocker.unblock():
        obj = get_object_with_timeout(ExpertRating,
                                      video_1__video_id=video_1_id,
                                      video_2__video_id=video_2_id,
                                      user__user__username=test_username)

        # checking that weights are 1 for the first feature and 0 for the rest
        for i, f in enumerate(VIDEO_FIELDS):
            val = 1.0 if (i == 0) else 0.0
            assert getattr(obj, f"{f}_weight") == val

        # now, setting first value to None
        # and first weight to None

        setattr(obj, VIDEO_FIELDS[0], None)
        setattr(obj, VIDEO_FIELDS[0] + "_weight", 0.0)
        obj.save()

    # editing the rating with default None values and wrong weights
    driver.refresh()

    print(video_1_id, video_2_id)

    # waiting for the page to load
    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located((By.ID, 'id_no_pending_expert')))

    print("Submitting the rating...")
    expert_submit_btn = driver.find_element_by_id('expert_submit_btn')
    expert_submit_btn.click()

    with django_db_blocker.unblock():
        obj = get_object_with_timeout(ExpertRating,
                                      video_1__video_id=video_1_id,
                                      video_2__video_id=video_2_id,
                                      user__user__username=test_username,
                                      **{VIDEO_FIELDS[0] + "_weight__gt": 0.5})

        # checking that weights are 1 for the first feature and 0 for the rest
        for i, f in enumerate(VIDEO_FIELDS):
            val = 1.0 if (i == 0) else 0.0
            assert getattr(obj, f"{f}_weight") == val

        assert getattr(obj, VIDEO_FIELDS[0]) is not None

    with django_db_blocker.unblock():
        Video.objects.filter(video_id__in=[video_1_id, video_2_id]).delete()

    logout(driver)
Example #8
0
def test_set_privacy_settings(driver, django_db_blocker):
    cleanup_rate_later(django_db_blocker)

    with django_db_blocker.unblock():
        video_id1 = create_test_video()
        video_id2 = create_test_video()
        u = DjangoUser.objects.get(username=test_username)
        ui, _ = UserInformation.objects.get_or_create(user=u)
        ui.show_my_profile = True
        ui.save()

        up, _ = UserPreferences.objects.get_or_create(user=u)
        EmailDomain.objects.create(domain="@tournesol.app",
                                   status=EmailDomain.STATUS_ACCEPTED)
        VerifiableEmail.objects.create(user=ui,
                                       email="*****@*****.**",
                                       is_verified=True)
        ExpertRating.objects.create(
            user=up,
            video_1=Video.objects.get(video_id=video_id1),
            video_2=Video.objects.get(video_id=video_id2))
        Video.recompute_computed_properties(only_pending=True)

    login(driver)

    fill_rate_later(django_db_blocker)

    set_all_features_enabled(django_db_blocker)

    driver.get(web_url + '/rate/' + video_id1 + '/' + video_id2)

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located((By.ID, 'id_expert_rating_page')))

    def check_privacy_status(video_id1,
                             is_private,
                             check_db=True,
                             check_api=False):
        with django_db_blocker.unblock():
            Video.recompute_computed_properties(only_pending=True)

        priv_public = 'private' if is_private else 'public'
        WebDriverWait(driver, TIME_WAIT).until(
            EC.presence_of_element_located(
                (By.ID, f'id_video_{video_id1}_{priv_public}')))

        if check_db:
            with django_db_blocker.unblock():
                get_object_with_timeout(VideoRatingPrivacy,
                                        video__video_id=video_id1,
                                        user=up,
                                        is_public=not is_private)

        if check_api:
            pe = do_api_call_v2(driver, '/videos/?video_id=' +
                                video_id1)['results'][0]['public_experts']
            if is_private:
                assert len(pe) == 0
            else:
                assert len(pe) == 1, pe
                assert pe[0]['username'] == test_username

    def set_privacy(video_id1, is_private):
        # opening the privacy menu...
        WebDriverWait(driver, TIME_WAIT).until(
            EC.presence_of_element_located(
                (By.ID, f'id_open_privacy_menu_{video_id1}')))

        driver.find_element_by_id(f'id_open_privacy_menu_{video_id1}').click()

        priv_true_false = 'true' if is_private else 'false'

        WebDriverWait(driver, TIME_WAIT).until(
            EC.presence_of_element_located(
                (By.ID, f'menu_set_private_{priv_true_false}_{video_id1}')))

        driver.find_element_by_id(
            f'menu_set_private_{priv_true_false}_{video_id1}').click()

        WebDriverWait(driver, TIME_WAIT).until(
            EC.element_to_be_clickable(
                (By.ID, f'id_open_privacy_menu_{video_id1}')))

    original_is_private = not VideoRatingPrivacy.DEFAULT_VALUE_IS_PUBLIC
    check_privacy_status(video_id1, original_is_private, check_db=False)

    set_privacy(video_id1, not original_is_private)
    check_privacy_status(video_id1, not original_is_private, check_api=True)

    set_privacy(video_id1, original_is_private)
    check_privacy_status(video_id1, original_is_private, check_api=True)

    logout(driver)

    cleanup_rate_later(django_db_blocker)
Example #9
0
def test_insert_video_id(driver, django_db_blocker):
    """Test that we can insert videos into the Video ID field in VideoSelector."""

    cleanup_rate_later(django_db_blocker)
    set_all_features_enabled(django_db_blocker)

    # format: text to insert -> resulting stored ID or None if no record should exist
    ids_to_insert = {
        'https://www.youtube.com/watch?v=gU-mkuMU428&ab_channel=LexFridman':
        'gU-mkuMU428',
        'https://youtu.be/gU-mkuMU428':
        'gU-mkuMU428',
        'https://www.youtube.com/embed/gU-mkuMU428':
        'gU-mkuMU428',
        'gU-mkuMU428':
        'gU-mkuMU428',
        '@@@-':
        '-',
        'ghslkdfjghklsdjfghksldjfdskljfghskdljfghlskdjfghsldkfjghsldkfjghsfldgjkshdlkfg':
        'ghslkdfjghklsdjfghks',
        '$$$$$????++++-':
        '-',
        '| rm -rf / ':
        'rm-rf',
        '"""-':
        '-'
    }

    login(driver)

    print("Going to the expert interface...")
    expert_interface_btn = driver.find_element_by_id('expert_interface')
    expert_interface_btn.click()

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located((By.ID, 'id_expert_rating_page')))

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located((By.ID, 'id_no_pending_expert')))

    def get_input_elem(vid):
        """Get the input element for a video selector."""
        print("Processing selector", vid)

        WebDriverWait(driver, TIME_WAIT).until(
            EC.presence_of_element_located((By.ID, vid)))

        # refreshing videos
        selector = driver.find_element_by_id(vid)

        WebDriverWait(driver, TIME_WAIT).until(
            EC.presence_of_element_located(
                (By.CLASS_NAME, 'video_id_text_field')))

        print("Obtaining element...")
        elem = selector.find_element_by_class_name('video_id_text_field')
        elem = elem.find_element_by_tag_name('input')

        return elem

    # creating the left video
    with django_db_blocker.unblock():
        video_id_left = create_test_video()

    def process_video_selector(vid, video_enter):
        """Load new video."""
        elem = get_input_elem(vid)
        elem.clear()
        clipboard.copy(video_enter)
        print("Copying text", video_enter, "into", vid)
        elem.send_keys(Keys.LEFT_CONTROL, "v")

    for text_enter, resulting_id in ids_to_insert.items():
        with django_db_blocker.unblock():
            ExpertRating.objects.filter(
                user__user__username=test_username).delete()

        print("Entering", text_enter, "expecting", resulting_id)

        process_video_selector('video-left', video_id_left)

        WebDriverWait(driver, TIME_WAIT).until(
            EC.presence_of_element_located((By.ID, 'id_no_pending_expert')))

        process_video_selector('video-right', text_enter)

        WebDriverWait(driver, TIME_WAIT).until(
            EC.presence_of_element_located((By.ID, 'id_no_pending_expert')))

        print("Submitting the rating...")
        expert_submit_btn = driver.find_element_by_id('expert_submit_btn')
        expert_submit_btn.click()

        WebDriverWait(driver, TIME_WAIT).until(
            EC.presence_of_element_located((By.ID, 'id_no_pending_expert')))

        WebDriverWait(driver, TIME_WAIT).until(
            EC.presence_of_element_located((By.ID, 'id_no_pending_submit')))

        if resulting_id is not None:
            with django_db_blocker.unblock():
                get_object_with_timeout(ExpertRating,
                                        video_1__video_id=video_id_left,
                                        video_2__video_id=resulting_id,
                                        user__user__username=test_username)
        else:
            with django_db_blocker.unblock():
                assert ExpertRating.objects.filter(
                    user__user__username=test_username).count() == 0

    logout(driver)
Example #10
0
def test_cyclic_create_view_resolve(driver, django_db_blocker):
    # creating 3 videos
    video_ids = []
    with django_db_blocker.unblock():
        for _ in range(3):
            video_ids.append(create_test_video())
        videos = [Video.objects.get(video_id=vid) for vid in video_ids]

    login(driver)

    with django_db_blocker.unblock():
        me = UserPreferences.objects.get(user__username=test_username)

    # creating ratings
    feature = VIDEO_FIELDS[0]
    other_values = {k: 50 for k in VIDEO_FIELDS if k != feature}
    with django_db_blocker.unblock():
        ExpertRating.objects.create(video_1=videos[0],
                                    video_2=videos[1],
                                    **other_values,
                                    **{feature: 0},
                                    user=me)  # left is better
        ExpertRating.objects.create(video_1=videos[1],
                                    video_2=videos[2],
                                    **other_values,
                                    **{feature: 0},
                                    user=me)  # left is better
        ExpertRating.objects.create(video_1=videos[2],
                                    video_2=videos[0],
                                    **other_values,
                                    **{feature: 0},
                                    user=me)  # left is better

    open_more_menu(driver)

    WebDriverWait(driver, TIME_WAIT).until(
        EC.visibility_of_element_located((By.ID, 'inconsistencies_menu')))

    driver.find_element_by_id('inconsistencies_menu').click()

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located((By.CLASS_NAME, 'inconsistency')))

    incons = driver.find_elements_by_class_name('inconsistency')

    assert len(incons) > 0

    for inc in incons:
        vids = inc.get_attribute('id').split('_')
        assert len(vids) == 2
        assert all([v in video_ids for v in vids])

    incons[0].find_element_by_class_name('inconsistency_slider')

    set_slider_value(
        driver,
        slider=incons[0].find_element_by_class_name('inconsistency_slider'),
        value=100)

    WebDriverWait(driver, TIME_WAIT).until(
        EC.element_to_be_clickable((By.CLASS_NAME, 'inconsistency_submit')))

    driver.find_element_by_class_name('inconsistency_submit').click()

    driver.refresh()

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located((By.ID, 'id_all_inconsistencies')))

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located(
            (By.ID, 'id_inconsistencies_not_loading')))

    incons = driver.find_elements_by_class_name('inconsistency')
    assert not incons

    with django_db_blocker.unblock():
        assert ExpertRatingSliderChanges.objects.filter(
            context='INC').count() > 0

    logout(driver)
Example #11
0
def test_mention(driver, django_db_blocker):
    login(driver)

    with django_db_blocker.unblock():
        video_id = create_test_video()
        domain = EmailDomain.objects.create(status=EmailDomain.STATUS_ACCEPTED,
                                            domain="@" +
                                            random_alphanumeric() + ".com")
        ve = VerifiableEmail.objects.create(
            user=UserInformation.objects.get(user__username=test_username),
            email="aba" + domain.domain,
            is_verified=True)

    open_more_menu(driver)

    WebDriverWait(driver, TIME_WAIT).until(
        EC.visibility_of_element_located((By.ID, 'video_details_menu')))

    print("Going to the details page")
    expert_interface_btn = driver.find_element_by_id('video_details_menu')
    expert_interface_btn.click()

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located((By.CLASS_NAME, 'video_id_text_field')))

    elem = driver.find_element_by_class_name('video_id_text_field')
    elem = elem.find_element_by_tag_name('input')

    # setting the video ID
    elem.clear()
    elem.send_keys(video_id, Keys.HOME)
    if elem.get_attribute('value') != video_id:
        elem.send_keys(3 * [Keys.DELETE])

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located(
            (By.CLASS_NAME, f'comment_editor_{video_id}_undefined')))

    # sending the comment
    editor = driver.find_element_by_class_name(
        f'comment_editor_{video_id}_undefined')
    editor.find_element_by_class_name('public-DraftEditor-content').send_keys(
        '@' + test_username)

    # selecting the mention suggestion
    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located(
            (By.CLASS_NAME, 'rdw-suggestion-option')))

    elems = driver.find_elements_by_class_name('rdw-suggestion-option')
    elems = [x for x in elems if test_username in x.text]
    assert len(elems) == 1

    WebDriverWait(driver, TIME_WAIT).until(EC.visibility_of(elems[0]))

    elems[0].click()

    action = webdriver.common.action_chains.ActionChains(driver)
    action.move_to_element_with_offset(elems[0], elems[0].rect['width'] / 2,
                                       elems[0].rect['height'] / 2)
    action.click()
    action.perform()
    WebDriverWait(driver,
                  TIME_WAIT).until(EC.invisibility_of_element(elems[0]))

    driver.find_elements_by_class_name(
        f'comment_editor_submit_{video_id}_undefined')[0].click()

    with django_db_blocker.unblock():
        assert get_object_with_timeout(VideoComment, video__video_id=video_id)

    # going to mentions...
    driver.find_element_by_id('personal_info_menu').click()

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located((By.ID, 'id_mentions')))

    driver.find_element_by_id('id_mentions').click()

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located(
            (By.CLASS_NAME, 'class_li_comment_mention')))

    assert len(
        driver.find_elements_by_class_name('class_li_comment_mention')) == 1

    logout(driver)

    with django_db_blocker.unblock():
        Video.objects.filter(video_id=video_id).delete()
        ve.delete()
Example #12
0
def test_thank_unthank(driver, django_db_blocker):
    with django_db_blocker.unblock():
        video_id = create_test_video()
        video = Video.objects.get(video_id=video_id)

        video_id1 = create_test_video()
        video1 = Video.objects.get(video_id=video_id1)

        domain = EmailDomain.objects.create(status=EmailDomain.STATUS_ACCEPTED,
                                            domain="@" +
                                            random_alphanumeric() + ".com")

        # creating a certified user with ratings of the video
        other_user = DjangoUser.objects.create_user(
            username=random_alphanumeric(), is_active=True)
        oup = UserPreferences.objects.create(user=other_user)
        oui = UserInformation.objects.create(user=other_user)

        ExpertRating.objects.create(user=oup, video_1=video, video_2=video1)

        ve = VerifiableEmail.objects.create(user=oui,
                                            email="aba" + domain.domain,
                                            is_verified=True)

    login(driver)

    open_more_menu(driver)

    WebDriverWait(driver, TIME_WAIT).until(
        EC.visibility_of_element_located((By.ID, 'video_details_menu')))

    print("Going to the details page")
    expert_interface_btn = driver.find_element_by_id('video_details_menu')
    expert_interface_btn.click()

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located((By.CLASS_NAME, 'video_id_text_field')))

    elem = driver.find_element_by_class_name('video_id_text_field')
    elem = elem.find_element_by_tag_name('input')

    # setting the video ID
    elem.clear()
    elem.send_keys(video_id, Keys.HOME)
    if elem.get_attribute('value') != video_id:
        elem.send_keys(3 * [Keys.DELETE])

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located((By.ID, f'id_{video_id}_thank')))

    driver.find_element_by_id(f'id_{video_id}_thank').click()

    with django_db_blocker.unblock():
        assert get_object_with_timeout(
            VideoRatingThankYou,
            video__video_id=video_id,
            thanks_from__user__username=test_username,
            thanks_to__user__username=other_user.username)
    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located((By.ID, f'id_{video_id}_unthank')))

    driver.find_element_by_id(f'id_{video_id}_unthank').click()

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located((By.ID, f'id_{video_id}_thank')))

    with django_db_blocker.unblock():
        assert VideoRatingThankYou.objects.filter(
            video__video_id=video_id,
            thanks_from__user__username=test_username,
            thanks_to__user__username=other_user.username).count() == 0

    logout(driver)

    with django_db_blocker.unblock():
        Video.objects.filter(video_id=video_id).delete()
        Video.objects.filter(video_id=video_id1).delete()

        ve.delete()
        other_user.delete()
Example #13
0
def test_comments(driver, django_db_blocker):
    # creating a video

    with django_db_blocker.unblock():
        video_id = create_test_video()

    login(driver)

    open_more_menu(driver)

    with django_db_blocker.unblock():
        UserInformation.objects.filter(user__username=test_username).update(
            comment_anonymously=False)

    WebDriverWait(driver, TIME_WAIT).until(
        EC.visibility_of_element_located((By.ID, 'video_details_menu')))

    print("Going to the details page")
    expert_interface_btn = driver.find_element_by_id('video_details_menu')
    expert_interface_btn.click()

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located((By.CLASS_NAME, 'video_id_text_field')))

    elem = driver.find_element_by_class_name('video_id_text_field')
    elem = elem.find_element_by_tag_name('input')

    # setting the video ID
    elem.clear()
    elem.send_keys(video_id, Keys.HOME)
    if elem.get_attribute('value') != video_id:
        elem.send_keys(3 * [Keys.DELETE])

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located(
            (By.CLASS_NAME, f'comment_editor_{video_id}_undefined')))

    # sending the comment
    editor = driver.find_element_by_class_name(
        f'comment_editor_{video_id}_undefined')
    editor.find_element_by_class_name('public-DraftEditor-content').send_keys(
        'sdf')
    driver.find_elements_by_class_name(
        f'comment_editor_submit_{video_id}_undefined')[0].click()

    # checking results
    with django_db_blocker.unblock():
        comment = get_object_with_timeout(VideoComment,
                                          video__video_id=video_id,
                                          parent_comment=None)
        assert comment.comment == "<p>sdf</p>"
        assert not comment.anonymous
        cid = VideoComment.objects.filter(video__video_id=video_id).get().id

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located(
            (By.CLASS_NAME, f'comment_{cid}_reply')))

    # replying to a comment
    driver.find_element_by_class_name(f'comment_{cid}_reply').click()
    driver.find_element_by_class_name(
        f'comment_editor_{video_id}_{cid}').find_element_by_class_name(
            'public-DraftEditor-content').send_keys('aba')
    driver.find_elements_by_class_name(
        f'comment_editor_submit_{video_id}_{cid}')[0].click()

    with django_db_blocker.unblock():
        subcid = get_object_with_timeout(VideoComment,
                                         video__video_id=video_id,
                                         parent_comment__id=cid).id

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located(
            (By.CLASS_NAME, f'comment_{subcid}_reply')))

    # replying to a reply anonymously
    driver.find_element_by_class_name(f'comment_{subcid}_reply').click()

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located(
            (By.CLASS_NAME, f'comment_editor_{video_id}_{subcid}')))

    driver.find_element_by_class_name(
        f'comment_editor_{video_id}_{subcid}').find_element_by_class_name(
            'public-DraftEditor-content').send_keys('zzzaaa')
    checkbox = driver.find_element_by_class_name(
        f'anonymous_comment_checkbox_class_{video_id}_{subcid}')
    if not checkbox.find_element_by_tag_name('input').get_property('checked'):
        checkbox.click()
    driver.find_elements_by_class_name(
        f'comment_editor_submit_{video_id}_{subcid}')[0].click()

    with django_db_blocker.unblock():
        assert get_object_with_timeout(
            VideoComment, video__video_id=video_id,
            parent_comment__id=cid).comment == '<p>aba</p>'

        subsubc = get_object_with_timeout(VideoComment,
                                          video__video_id=video_id,
                                          parent_comment_id=subcid)
        assert subsubc.anonymous
        assert subsubc.comment == '<p>zzzaaa</p>'
    # editing the subcomment
    with django_db_blocker.unblock():
        ecid = get_object_with_timeout(VideoComment,
                                       video__video_id=video_id,
                                       parent_comment__id=cid).id

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located(
            (By.CLASS_NAME, f'comment_{ecid}_edit')))

    driver.find_element_by_class_name(f'comment_{ecid}_edit').click()
    elem = driver.find_element_by_class_name(
        f'comment_editor_cid_{ecid}').find_element_by_class_name(
            'public-DraftEditor-content')

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located(
            (By.CLASS_NAME, f'comment_editor_cid_{ecid}_editing')))

    elem.click()
    elem.send_keys('xyz')
    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located(
            (By.CLASS_NAME, f'comment_{ecid}_save_edits')))

    driver.find_element_by_class_name(f'comment_{ecid}_save_edits').click()
    with django_db_blocker.unblock():
        assert get_object_with_timeout(
            VideoComment, video__video_id=video_id,
            parent_comment__id=cid).comment.strip() == '<p>xyzaba</p>'

    # comment markers
    with django_db_blocker.unblock():
        assert VideoComment.objects.filter(
            video__video_id=video_id,
            parent_comment__id=cid).get().votes_plus == 0
    driver.find_element_by_class_name(f'vote_plus_comment_{ecid}').click()
    with django_db_blocker.unblock():
        assert VideoComment.objects.filter(
            video__video_id=video_id,
            parent_comment__id=cid).get().votes_plus == 1
    driver.find_element_by_class_name(f'vote_plus_comment_{ecid}').click()
    with django_db_blocker.unblock():
        assert VideoComment.objects.filter(
            video__video_id=video_id,
            parent_comment__id=cid).get().votes_plus == 0

    logout(driver)
def test_create_view_reports(driver, django_db_blocker):
    # creating a video

    with django_db_blocker.unblock():
        video_id = create_test_video()

    login(driver)

    open_more_menu(driver)

    WebDriverWait(driver, TIME_WAIT).until(
        EC.visibility_of_element_located((By.ID, 'video_details_menu')))

    print("Going to the details page")
    expert_interface_btn = driver.find_element_by_id('video_details_menu')
    expert_interface_btn.click()

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located((By.CLASS_NAME, 'video_id_text_field')))

    elem = driver.find_element_by_class_name('video_id_text_field')
    elem = elem.find_elements_by_tag_name('input')[0]
    elem.clear()
    elem.send_keys(video_id, Keys.HOME)
    if elem.get_attribute('value') != video_id:
        elem.send_keys(3 * [Keys.DELETE])
    print("target id", video_id)
    assert elem.get_attribute('value') == video_id

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located(
            (By.CLASS_NAME, 'button_video_reports')))

    # going to reports page
    driver.find_element_by_class_name('button_video_reports').click()

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located((By.CLASS_NAME, 'report_explanation')))

    assert not driver.find_elements_by_class_name('video_report_one_item')

    checked = {k: np.random.choice([True, False]) for k in VIDEO_REPORT_FIELDS}

    for k in VIDEO_REPORT_FIELDS:
        checkbox = driver.find_element_by_class_name(f'report_{k}_checkbox')
        if checked[k]:
            checkbox.click()
        assert checkbox.find_element_by_tag_name('input').get_property(
            'checked') == checked[k]

    driver.find_element_by_class_name(
        'report_explanation').find_element_by_tag_name('textarea').send_keys(
            "Test explanation")

    driver.find_element_by_class_name('report_submit').click()

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located((By.ID, 'id_report_submission_ok')))

    driver.refresh()

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located(
            (By.CLASS_NAME, 'video_report_one_item')))

    assert len(
        driver.find_elements_by_class_name('video_report_one_item')) == 1

    with django_db_blocker.unblock():
        report = VideoReports.objects.get(video__video_id=video_id)
    assert report.explanation == "Test explanation"
    for k in VIDEO_REPORT_FIELDS:
        assert checked[k] == getattr(report, k)

    driver.refresh()

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located((By.CLASS_NAME, 'report_explanation')))

    # REPORT EDITING
    checked_old = checked
    checked = {k: np.random.choice([True, False]) for k in VIDEO_REPORT_FIELDS}

    for k in VIDEO_REPORT_FIELDS:
        checkbox = driver.find_element_by_class_name(f'report_{k}_checkbox')
        if checked_old[k] != checked[k]:
            checkbox.click()
        assert checkbox.find_element_by_tag_name('input').get_property(
            'checked') == checked[k]

    elem = driver.find_element_by_class_name(
        'report_explanation').find_element_by_tag_name('textarea')
    elem.send_keys(" II")

    driver.find_element_by_class_name('report_submit').click()

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located((By.ID, 'id_report_submission_ok')))

    driver.refresh()

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located((By.CLASS_NAME, 'report_explanation')))

    assert len(
        driver.find_elements_by_class_name('video_report_one_item')) == 1

    with django_db_blocker.unblock():
        report = VideoReports.objects.get(video__video_id=video_id)
    assert report.explanation == "Test explanation II"
    for k in VIDEO_REPORT_FIELDS:
        assert checked[k] == getattr(report, k)

    logout(driver)
Example #15
0
def test_filters(driver, django_db_blocker):
    login(driver)

    ui_button = driver.find_element_by_id('user_interface')
    ui_button.click()

    unique_substr = str(uuid1())

    # creating videos
    with django_db_blocker.unblock():
        video_ids = [create_test_video() for _ in range(3)]
        videos = [Video.objects.get(video_id=vid) for vid in video_ids]
        for v in videos:
            v.name = unique_substr + " " + v.name
            for f in VIDEO_FIELDS:
                setattr(v, f, 1e10)
            v.save()

        videos[0].duration = datetime.timedelta(minutes=18)
        videos[0].views = 9999
        videos[0].publication_date = datetime.datetime.now(
        ) - datetime.timedelta(days=1)
        videos[0].language = 'en'
        videos[0].save()

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located((By.ID, 'search_phrase')))

    # setting search field
    search_phrase_field = driver.find_element_by_id('search_phrase')
    search_phrase_field.clear()
    search_phrase_field.send_keys(unique_substr)

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located((By.ID, 'id_search_not_loading')))

    # can get all videos
    print("Loading recommendations")
    load_rec_btn = driver.find_element_by_id("load_recommendations")
    load_rec_btn.click()

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located((By.ID, 'id_search_not_loading')))

    target_classname = f'video_card_id_{video_ids[-1]}'
    print(video_ids, video_ids[-1], target_classname)
    WebDriverWait(driver, TIME_WAIT * 5).until(
        EC.presence_of_element_located((By.CLASS_NAME, target_classname)))

    videos_out = [
        x for video_id in video_ids for x in
        driver.find_elements_by_class_name(f'video_card_id_{video_id}')
    ]
    print(videos_out)
    assert len(videos_out) == len(videos)

    # target search options
    values = {
        'Minimum Duration': '15 min',
        'Maximum Duration': '30 min',
        'Minimum Number of Views': '0 views',
        'Maximum Number of Views': '10k views',
        'Publication Date': 'Last month',
        'Language': 'English'
    }

    # opening search options
    driver.find_element_by_class_name('search_options').click()

    # setting options
    for key, value in values.items():
        select_options(driver, key, value)

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located((By.ID, 'id_search_not_loading')))

    print("Loading recommendations")
    load_rec_btn = driver.find_element_by_id("load_recommendations")
    load_rec_btn.click()

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located((By.ID, 'id_search_not_loading')))

    target_classname = f'video_card_id_{video_ids[0]}'
    print(video_ids, target_classname)
    WebDriverWait(driver, TIME_WAIT * 5).until(
        EC.presence_of_element_located((By.CLASS_NAME, target_classname)))

    # now will only see 1 video
    videos_out = [
        x for video_id in video_ids for x in
        driver.find_elements_by_class_name(f'video_card_id_{video_id}')
    ]
    assert len(videos_out) == 1

    logout(driver)
Example #16
0
def test_rate_confidence(driver, django_db_blocker):
    """Test skips mode."""

    login(driver)

    with django_db_blocker.unblock():
        # creating two videos
        video_1_id = create_test_video()
        video_2_id = create_test_video()

        # setting user preferences
        up = UserPreferences.objects.get(user__username=test_username)

        # enabling two features
        for f in VIDEO_FIELDS[:4]:
            setattr(up, f"{f}_enabled", True)
        for f in VIDEO_FIELDS[4:]:
            setattr(up, f"{f}_enabled", False)

        f0, f1 = VIDEO_FIELDS[:2]

        # setting mode to enable_all
        up.rating_mode = "confidence"

        up.save()

    driver.get(web_url + f'/rate/{video_1_id}/{video_2_id}')

    # waiting for the page to load
    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located((By.ID, 'id_no_pending_expert')))

    check_feature_visibility(up, driver)

    # setting stars
    stars_set_value(driver, VIDEO_FIELDS[0] + "_confidence", 0)
    stars_set_value(driver, VIDEO_FIELDS[1] + "_confidence", 1)
    stars_set_value(driver, VIDEO_FIELDS[2] + "_confidence", 2)
    stars_set_value(driver, VIDEO_FIELDS[3] + "_confidence", 3)

    print("Submitting the rating...")
    expert_submit_btn = driver.find_element_by_id('expert_submit_btn')
    expert_submit_btn.click()

    with django_db_blocker.unblock():
        obj = get_object_with_timeout(ExpertRating,
                                      video_1__video_id=video_1_id,
                                      video_2__video_id=video_2_id,
                                      user__user__username=test_username)

        # checking weight
        assert getattr(obj, f"{VIDEO_FIELDS[0]}_weight") == 0.0
        assert getattr(obj, f"{VIDEO_FIELDS[1]}_weight") == 0.5
        assert getattr(obj, f"{VIDEO_FIELDS[2]}_weight") == 1.0
        assert getattr(obj, f"{VIDEO_FIELDS[3]}_weight") == 1.5
        for f in VIDEO_FIELDS[4:]:
            assert getattr(obj, f"{f}_weight") == 0.0

        # now, setting second value to None
        setattr(obj, VIDEO_FIELDS[1], None)
        obj.save()

    # editing the rating with default None values and wrong weights
    driver.refresh()

    # waiting for the page to load
    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located((By.ID, 'id_no_pending_expert')))

    print("Submitting the rating...")
    expert_submit_btn = driver.find_element_by_id('expert_submit_btn')
    expert_submit_btn.click()

    with django_db_blocker.unblock():
        obj = get_object_with_timeout(
            ExpertRating,
            video_1__video_id=video_1_id,
            video_2__video_id=video_2_id,
            user__user__username=test_username,
            **{VIDEO_FIELDS[0] + "_weight__lte": 0.5})

        # checking that weights are 1 for the first feature and 0 for the rest
        assert getattr(obj, f"{VIDEO_FIELDS[0]}_weight") == 0.0
        assert getattr(obj, f"{VIDEO_FIELDS[1]}_weight") == 0.0
        assert getattr(obj, f"{VIDEO_FIELDS[2]}_weight") == 1.0
        assert getattr(obj, f"{VIDEO_FIELDS[3]}_weight") == 1.5
        for f in VIDEO_FIELDS[4:]:
            assert getattr(obj, f"{f}_weight") == 0.0

        assert getattr(obj, VIDEO_FIELDS[0]) is not None

    with django_db_blocker.unblock():
        Video.objects.filter(video_id__in=[video_1_id, video_2_id]).delete()

    logout(driver)
def test_add_delete(driver, django_db_blocker):
    """Add/delete videos to/from rate later."""
    login(driver)

    n_videos = 15
    limit = 5

    with django_db_blocker.unblock():
        up = UserPreferences.objects.get(user__username=test_username)
        video_ids = [create_test_video() for _ in range(n_videos)]
        videos = [Video.objects.get(video_id=vid) for vid in video_ids]
        vrls = [VideoRateLater.objects.create(user=up, video=v) for v in videos]
        vrls_reverse = vrls[::-1]

    print("Going to the rate later page")
    expert_interface_btn = driver.find_element_by_id('rate_later_menu')
    expert_interface_btn.click()

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located((By.CLASS_NAME, 'class_rate_later_list')))

    # should get 5 "remove from rate later" buttons
    offset = 0
    for v in vrls_reverse[offset:offset + limit]:
        WebDriverWait(driver, TIME_WAIT).until(
            EC.presence_of_element_located((By.ID, f'id_{v.video.video_id}_remove_rate_later')))

    # removing the first one
    driver.find_element_by_id(f'id_{vrls_reverse[0].video.video_id}_remove_rate_later').click()

    # waiting until the 'add' button appears
    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located((By.ID,
                                        f'id_{vrls_reverse[0].video.video_id}_rate_later')))

    # checking that there is no corresponding vrl
    with django_db_blocker.unblock():
        assert VideoRateLater.objects.filter(video=vrls_reverse[0].video,
                                             user=up).count() == 0

    # adding to Rate Later again
    driver.find_element_by_id(f'id_{vrls_reverse[0].video.video_id}_rate_later').click()

    # waiting until the 'remove' button appears
    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located((By.ID,
                                        f'id_{vrls_reverse[0].video.video_id}_remove_rate_later')))

    # checking that there is a corresponding entry
    with django_db_blocker.unblock():
        assert VideoRateLater.objects.filter(video=vrls_reverse[0].video,
                                             user=up).count() == 1

    # clicking on the 'next' button
    driver.find_element_by_id('id_rate_later_next').click()

    # waiting for videos...
    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located((By.CLASS_NAME, 'class_rate_later_list')))

    # verifying the new list
    offset = 5
    for v in vrls_reverse[offset:offset + limit]:
        WebDriverWait(driver, TIME_WAIT).until(
            EC.presence_of_element_located((By.ID, f'id_{v.video.video_id}_remove_rate_later')))

    # going back
    driver.find_element_by_id('id_rate_later_prev').click()

    # waiting for videos...
    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located((By.CLASS_NAME, 'class_rate_later_list')))

    # should get 5 "remove from rate later" buttons, like before
    offset = 0
    for v in vrls_reverse[offset:offset + limit]:
        WebDriverWait(driver, TIME_WAIT).until(
            EC.presence_of_element_located((By.ID, f'id_{v.video.video_id}_remove_rate_later')))

    logout(driver)

    with django_db_blocker.unblock():
        for v in videos:
            v.delete()
Example #18
0
def create_toy_data(django_db_blocker, driver,
                    n_users=10, n_videos=10,
                    n_ratings=10):
    """Create a random database."""

    with django_db_blocker.unblock():
        users = [DjangoUser.objects.create_user(
                username=random_alphanumeric(), is_active=True)
                for u in range(n_users)]

        video_ids = [create_test_video() for v in range(n_videos)]

    # creating user preferences and user informations
    login(driver)
    logout(driver)

    # creating email domains
    status_to_domain = {EmailDomain.STATUS_ACCEPTED: "@accepted.com",
                        EmailDomain.STATUS_REJECTED: "@rejected.com",
                        EmailDomain.STATUS_PENDING: "@pending.com"}
    with django_db_blocker.unblock():
        for status, domain in status_to_domain.items():
            EmailDomain.objects.create(domain=domain, status=status)

    # obtaining user information/user preferences
    with django_db_blocker.unblock():
        ups = [UserPreferences.objects.get(user__username=u.username)
               for u in users]
        uis = [UserInformation.objects.get(user__username=u.username)
               for u in users]

    # setting show_my_profile and show_online_presence to random values
    with django_db_blocker.unblock():
        for ui in uis:
            ui.show_my_profile = np.random.rand() > 0.5
            ui.show_online_presence = np.random.rand() > 0.5

    # filling in user informations
    with django_db_blocker.unblock():
        for ui in uis:
            # filling online presence
            for field in UserInformation.ONLINE_FIELDS:
                domain = UserInformation._domain_startswith.get(field, "mydomain.com")
                setattr(ui, field, f"https://{domain}/{random_alphanumeric()}")

            # filling personal data
            for field in UserInformation.PROFILE_FIELDS:
                setattr(ui, field, random_alphanumeric())

            # filling in protected attributes
            protected_map = {
                    'birth_year': 1990,
                    'gender': 'Male',
                    'nationality': 'Swiss',
                    'residence': 'Switzerland',
                    'race': 'Latino or Hispanic',
                    'political_affiliation': 'Centrist',
                    'religion': 'Atheist',
                    'degree_of_political_engagement': 'Light',
                    'moral_philosophy': 'Utilitatian'
            }

            for key, val in protected_map.items():
                setattr(ui, key, val)

            ui.save()

    # assigning random emails
    with django_db_blocker.unblock():
        for ui in uis:
            domain = np.random.choice(list(status_to_domain.values()))
            email = f"{random_alphanumeric()}{domain}"
            verified = np.random.rand() > 0.8
            VerifiableEmail.objects.create(email=email, user=ui, is_verified=verified)

    # creating random ratings
    with django_db_blocker.unblock():
        for up in ups:

            for _ in range(n_ratings):
                fields = {}

                for f in VIDEO_FIELDS:
                    fields[f] = np.random.rand() * 100
                    fields[f + "_weight"] = np.random.rand() + 1

                vid1 = np.random.choice(video_ids)
                vid2 = np.random.choice(video_ids)

                v1 = Video.objects.get(video_id=vid1)
                v2 = Video.objects.get(video_id=vid2)

                try:
                    ExpertRating.objects.create(user=up, video_1=v1, video_2=v2, **fields)
                except IntegrityError:
                    print("Duplicate random comparison (OK)")
                    pass

    # assigning random privacy settings
    with django_db_blocker.unblock():
        for up in ups:
            for video_id in video_ids:
                if np.random.rand() > 0.5:
                    continue

                public = np.random.rand() > 0.8

                VideoRatingPrivacy.objects.create(
                        video=Video.objects.get(video_id=video_id),
                        user=up, is_public=public)
def test_representative(driver, django_db_blocker):
    # creating 2 videos
    video_ids = []
    with django_db_blocker.unblock():
        for _ in range(2):
            video_ids.append(create_test_video())
        videos = [Video.objects.get(video_id=vid) for vid in video_ids]

    login(driver)

    with django_db_blocker.unblock():
        me = UserPreferences.objects.get(user__username=test_username)

    # creating ratings
    feature = VIDEO_FIELDS[0]
    other_values = {k: 50 for k in VIDEO_FIELDS if k != feature}
    with django_db_blocker.unblock():
        ExpertRating.objects.create(video_1=videos[0],
                                    video_2=videos[1],
                                    **other_values,
                                    **{feature: 0},
                                    user=me)  # left is better

        VideoRating.objects.create(video=videos[0],
                                   user=me,
                                   **{feature: 0},
                                   **other_values)
        VideoRating.objects.create(video=videos[1],
                                   user=me,
                                   **{feature: 100},
                                   **other_values)

    open_more_menu(driver)

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located((By.ID, 'representative_menu')))

    driver.find_element_by_id('representative_menu').click()

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located(
            (By.CLASS_NAME, 'representative_debug_slider')))

    sliders = driver.find_elements_by_class_name('representative_debug_slider')
    assert len(sliders) == 1

    set_slider_value(driver, slider=sliders[0], value=100)

    driver.find_element_by_class_name('representative_debug_submit').click()

    driver.refresh()

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located(
            (By.ID, 'id_representative_interface_all')))

    WebDriverWait(driver, TIME_WAIT).until(
        EC.presence_of_element_located(
            (By.ID, 'id_representative_not_loading')))

    sliders = driver.find_elements_by_class_name('representative_debug_slider')
    assert len(sliders) == 0

    with django_db_blocker.unblock():
        assert ExpertRatingSliderChanges.objects.filter(
            context='DIS').count() > 0

    logout(driver)