Exemplo n.º 1
0
def test_get_meeting_requests(app, database, session):
    pref = UserSubscriptionPreferences(subscription=database.sub,
                                       preference=database.prefs[0])
    user = User(email='*****@*****.**',
                meta_data={'department': 'dept'},
                subscription_preferences=[pref])
    mr = MeetingRequest(user=user, meeting_spec=database.specs[0])

    session.add(pref)
    session.add(user)
    session.add(mr)
    session.commit()

    with app.test_request_context('/v1/metrics/meeting_requests'):
        requests = meeting_requests().json
    assert requests == [{'title': 'Yelp Weekly', 'user': '******'}]
Exemplo n.º 2
0
def test_filter_subscriptions_by_user_data_none(database, session):
    session.add(database.sub)
    preference = UserSubscriptionPreferences(
        subscription=database.sub,
        preference=database.prefs[0],
    )
    session.add(preference)
    user = User(email='*****@*****.**', subscription_preferences=[preference])
    session.add(user)
    session.commit()

    merged_preferences = merge_subscriptions_with_preferences(user)
    subscriptions = filter_subscriptions_by_user_data(merged_preferences, user)

    assert len(subscriptions) == 1
    assert subscriptions[0]['id'] == database.sub.id
Exemplo n.º 3
0
def test_generate_meetings_same_department(minimal_database, subscription):
    preference = subscription.datetime[0]
    user_pref = UserSubscriptionPreferences(
        preference=preference, subscription=subscription.key).put()
    user1 = User(email='*****@*****.**',
                 metadata={'department': 'dept'},
                 subscription_preferences=[user_pref])
    user1.put()
    user2 = User(email='*****@*****.**',
                 metadata={'department': 'dept'},
                 subscription_preferences=[user_pref])
    user2.put()
    user_list = [user1, user2]

    _, specs = get_specs_from_subscription(subscription)
    matches, unmatched = generate_meetings(user_list, specs[0])
    assert len(unmatched) == 2
    assert len(matches) == 0
Exemplo n.º 4
0
def test_user_preference(session, subscription):
    preference = subscription.datetime[0]
    user_pref = UserSubscriptionPreferences(
        preference=preference,
        subscription=subscription,
    )
    session.add(user_pref)
    user = User(email='*****@*****.**',
                meta_data={'department': 'dept'},
                subscription_preferences=[user_pref])
    session.add(user)
    meeting_spec = MeetingSpec(meeting_subscription=subscription,
                               datetime=subscription.datetime[0].datetime)
    session.add(meeting_spec)
    session.commit()

    assert user_pref == user_preference(user, meeting_spec)
Exemplo n.º 5
0
def test_get_previous_multi_meetings(minimal_database):
    pref_1 = SubscriptionDateTime(datetime=datetime.now() - timedelta(weeks=MEETING_COOLDOWN_WEEKS - 1)).put()
    subscription = MeetingSubscription(title='all engineering weekly', datetime=[pref_1]).put()
    user_pref = UserSubscriptionPreferences(preference=pref_1, subscription=subscription).put()
    user1 = User(email='*****@*****.**', metadata={'department': 'dept'}, subscription_preferences=[user_pref]).put()
    user2 = User(email='*****@*****.**', metadata={'department': 'dept2'}, subscription_preferences=[user_pref]).put()
    meeting_spec = MeetingSpec(meeting_subscription=subscription, datetime=pref_1.get().datetime).put()
    meeting1 = Meeting(meeting_spec=meeting_spec, cancelled=False).put()
    meeting2 = Meeting(meeting_spec=meeting_spec, cancelled=False).put()
    MeetingParticipant(meeting=meeting1, user=user2).put()
    MeetingParticipant(meeting=meeting1, user=user1).put()
    MeetingParticipant(meeting=meeting2, user=user2).put()
    MeetingParticipant(meeting=meeting2, user=user1).put()

    assert get_previous_meetings(subscription) == set([(user1.id(), user2.id()), (user1.id(), user2.id())])
Exemplo n.º 6
0
def test_weekly_opt_in(session, subscription):
    preference = subscription.datetime[0]
    user_pref = UserSubscriptionPreferences(
        preference=preference,
        subscription=subscription,
    )
    user1 = User(email="*****@*****.**",
                 meta_data={'department': 'dept'},
                 subscription_preferences=[user_pref])

    session.add(preference)
    session.add(user_pref)
    session.add(user1)
    session.commit()

    response = weekly_opt_in()
    assert response == 'OK'
Exemplo n.º 7
0
def test_add_preferences_adds_multiple_on_opt_in(session, subscription):
    preference_1 = subscription.datetime[0]
    preference_2 = subscription.datetime[1]
    user = User(email='*****@*****.**', meta_data={'department': 'dept'})
    session.add(user)
    session.commit()

    updated_preferences = {preference_1.id: True, preference_2.id: True}
    assert len(user.subscription_preferences) == 0
    added = add_preferences(user, updated_preferences, subscription.id)
    assert preference_1.id in added
    assert preference_2.id in added
    assert len(user.subscription_preferences) == 2
    user = User.query.filter(User.id == user.id).one()
    assert user.subscription_preferences[0].preference in (preference_1,
                                                           preference_2)
    assert user.subscription_preferences[1].preference in (preference_1,
                                                           preference_2)
Exemplo n.º 8
0
def test_remove_preferences_removes_on_opt_out(session, subscription):
    preference = subscription.datetime[0]
    user_pref = UserSubscriptionPreferences(
        preference=preference,
        subscription=subscription,
    )
    session.add(user_pref)
    user = User(email='*****@*****.**',
                meta_data={'department': 'dept'},
                subscription_preferences=[user_pref])
    session.add(user)
    session.commit()

    assert user.subscription_preferences == [user_pref]
    updated_preferences = {preference.id: False}
    removed = remove_preferences(user, updated_preferences, subscription.id)
    assert removed == {user_pref.preference_id}
    user = User.query.filter(User.id == user.id).one()
    assert user.subscription_preferences == []
    assert UserSubscriptionPreferences.query.all() == []
Exemplo n.º 9
0
def test_remove_preferences_does_not_remove_on_opt_in(session, subscription):
    preference = subscription.datetime[0]
    user_pref = UserSubscriptionPreferences(
        preference=preference,
        subscription=subscription,
    )
    session.add(user_pref)
    user = User(email='*****@*****.**',
                meta_data={'department': 'dept'},
                subscription_preferences=[user_pref])
    session.add(user)
    session.commit()

    assert user.subscription_preferences == [user_pref]
    updated_preferences = {preference.id: True}
    removed = remove_preferences(user, updated_preferences, subscription)
    assert removed == set()
    user = User.query.filter(User.id == user.id).one()
    assert user.subscription_preferences == [user_pref]
    assert len(UserSubscriptionPreferences.query.all()) == 1
Exemplo n.º 10
0
def test_generate_group_meetings_invalid_number_of_users():
    pref_1 = SubscriptionDateTime(
        datetime=datetime.now() -
        timedelta(weeks=MEETING_COOLDOWN_WEEKS - 1)).put()
    subscription = MeetingSubscription(title='all engineering weekly',
                                       datetime=[pref_1]).put()
    user_pref = UserSubscriptionPreferences(preference=pref_1,
                                            subscription=subscription).put()
    user1 = User(email='*****@*****.**',
                 metadata={
                     'department': 'dept'
                 },
                 subscription_preferences=[user_pref]).put()
    user2 = User(email='*****@*****.**',
                 metadata={
                     'department': 'dept2'
                 },
                 subscription_preferences=[user_pref]).put()
    meeting_spec = MeetingSpec(meeting_subscription=subscription,
                               datetime=pref_1.get().datetime).put()
    meeting = Meeting(meeting_spec=meeting_spec, cancelled=False).put()
    MeetingParticipant(meeting=meeting, user=user2).put()
    MeetingParticipant(meeting=meeting, user=user1).put()

    matched, unmatched = generate_group_meetings([], meeting_spec.get(), 3, 10,
                                                 5)
    assert matched == []
    assert unmatched == []

    matched, unmatched = generate_group_meetings([user1.get()],
                                                 meeting_spec.get(), 3, 10, 5)
    assert matched == []
    assert unmatched == [user1.get()]

    matched, unmatched = generate_group_meetings(
        [user1.get(), user2.get()], meeting_spec.get(), 3, 10, 5)
    assert matched == []
    assert set(user.key for user in unmatched) == {user1, user2}
Exemplo n.º 11
0
def test_get_meeting_participants(app, database):
    pref = UserSubscriptionPreferences(subscription=database.sub.key,
                                       preference=database.prefs[0].key)
    pref.put()
    user1 = User(email='*****@*****.**',
                 metadata={'department': 'dept'},
                 subscription_preferences=[pref.key])
    user1.put()
    user2 = User(email='*****@*****.**',
                 metadata={'department': 'dept'},
                 subscription_preferences=[pref.key])
    user2.put()
    meeting1 = Meeting(meeting_spec=database.specs[0].key,
                       cancelled=False).put()
    MeetingParticipant(meeting=meeting1, user=user1.key).put()
    MeetingParticipant(meeting=meeting1, user=user2.key).put()
    with app.test_request_context('/v1/metrics/meeting_participants'):
        participants = meeting_participants().json
        assert len(participants) == 2
        assert set(participants[0].keys()) == set(
            ['date', 'meeting', 'meeting_title', 'participant', 'time'])
        assert participants[0]['date'] == database.specs[0].datetime.isoformat(
        )

        participant_lookup = {
            participant['participant']: participant
            for participant in participants
        }

        assert participant_lookup[user1.email] == {
            'date': database.specs[0].datetime.isoformat(),
            'meeting': meeting1.urlsafe(),
            'meeting_title':
            database.specs[0].meeting_subscription.get().title,
            'participant': user1.email,
            'time': '04:00PM',
        }
Exemplo n.º 12
0
def test_get_meeting_participants(app, database):
    pref = UserSubscriptionPreferences(subscription=database.sub.key, preference=database.prefs[0].key)
    pref.put()
    user1 = User(
        email='*****@*****.**',
        metadata={'department': 'dept'},
        subscription_preferences=[pref.key]
    )
    user1.put()
    user2 = User(
        email='*****@*****.**',
        metadata={'department': 'dept'},
        subscription_preferences=[pref.key]
    )
    user2.put()
    meeting1 = Meeting(meeting_spec=database.specs[0].key, cancelled=False).put()
    MeetingParticipant(meeting=meeting1, user=user1.key).put()
    MeetingParticipant(meeting=meeting1, user=user2.key).put()
    with app.test_request_context('/v1/metrics/meeting_participants'):
        participants = json.loads(meeting_participants())
        assert len(participants) == 2
        assert set(participants[0].keys()) == set(['date', 'meeting', 'meeting_title', 'participant', 'time'])
        assert participants[0]['date'] == database.specs[0].datetime.isoformat()
        assert participants[0]['time'] == database.specs[0].datetime.strftime('%I:%M%p')
Exemplo n.º 13
0
def test_filter_subscriptions_by_user_data_none_when_rules_exist(
        database, session):
    rule = Rule(name="department", value="b")
    session.add(rule)
    database.sub.user_rules = [rule]
    database.sub.rule_logic = 'none'
    session.add(database.sub)
    preference = UserSubscriptionPreferences(
        subscription=database.sub,
        preference=database.prefs[0],
    )
    session.add(preference)
    user = User(email='*****@*****.**',
                subscription_preferences=[preference],
                meta_data={'department': 'a'})
    session.add(user)
    session.commit()

    merged_preferences = merge_subscriptions_with_preferences(user)
    subscriptions = filter_subscriptions_by_user_data(merged_preferences, user)

    assert len(subscriptions) == 1
    assert subscriptions[0]['id'] == database.sub.id
Exemplo n.º 14
0
def test_generate_group_meeting_invalid_number_of_users(session):
    pref_1 = SubscriptionDateTime(datetime=datetime.now() - timedelta(weeks=MEETING_COOLDOWN_WEEKS - 1))
    subscription = MeetingSubscription(title='all engineering weekly', datetime=[pref_1])
    user_pref = UserSubscriptionPreferences(preference=pref_1, subscription=subscription)
    meeting_spec = MeetingSpec(meeting_subscription=subscription, datetime=pref_1.datetime)
    session.add(pref_1)
    session.add(subscription)
    session.add(user_pref)
    session.add(meeting_spec)

    users = []
    for i in range(0, 2):
        user = User(email='{}@yelp.com'.format(i), meta_data={
            'department': 'dept{}'.format(i)}, subscription_preferences=[user_pref])
        session.add(user)
        mr = MeetingRequest(user=user, meeting_spec=meeting_spec)
        session.add(mr)
        users.append(user)

    session.commit()
    matches, unmatched = generate_meetings(users, meeting_spec, prev_meeting_tuples=None, group_size=3)
    assert(len(matches) == 0)
    assert (len(unmatched) == 2)
Exemplo n.º 15
0
def test_generate_save_meetings(minimal_database, subscription):
    pref_1 = SubscriptionDateTime(datetime=datetime.now() - timedelta(weeks=MEETING_COOLDOWN_WEEKS - 1)).put()
    subscription = MeetingSubscription(title='all engineering weekly', datetime=[pref_1]).put()
    user_pref = UserSubscriptionPreferences(preference=pref_1, subscription=subscription).put()
    user1 = User(email='*****@*****.**', metadata={'department': 'dept'}, subscription_preferences=[user_pref]).put()
    user2 = User(email='*****@*****.**', metadata={'department': 'dept2'}, subscription_preferences=[user_pref]).put()
    meeting_spec = MeetingSpec(meeting_subscription=subscription, datetime=pref_1.get().datetime)
    meeting_spec.put()
    MeetingRequest(user=user1, meeting_spec=meeting_spec.key).put()
    MeetingRequest(user=user2, meeting_spec=meeting_spec.key).put()

    matches, unmatched = generate_meetings([user1.get(), user2.get()], meeting_spec)
    save_meetings(matches, meeting_spec)

    assert unmatched == []

    participants = [
        participant.user
        for participant in MeetingParticipant.query().fetch()
    ]

    assert participants == [user1, user2]
Exemplo n.º 16
0
def get_user(email=None):
    if email is None:
        current_user = google_user_api.get_current_user()
        email = current_user.email()

    return User.query(User.email == email).get()
Exemplo n.º 17
0
def test_generate_meetings_with_history(minimal_database, subscription):
    preference = subscription.datetime[0]
    user_pref = UserSubscriptionPreferences(
        preference=preference, subscription=subscription.key).put()

    user1 = User(email='*****@*****.**',
                 metadata={'department': 'dept'},
                 subscription_preferences=[user_pref])
    user1.put()
    user2 = User(email='*****@*****.**',
                 metadata={'department': 'dept2'},
                 subscription_preferences=[user_pref])
    user2.put()
    user3 = User(email='*****@*****.**',
                 metadata={'department': 'dept'},
                 subscription_preferences=[user_pref])
    user3.put()
    user4 = User(email='*****@*****.**',
                 metadata={'department': 'dept2'},
                 subscription_preferences=[user_pref])
    user4.put()

    user_list = [user1, user2, user3, user4]
    week_start, specs = get_specs_from_subscription(subscription)
    store_specs_from_subscription(subscription.key, week_start, specs)

    matches, unmatched = generate_meetings(user_list, specs[0])
    assert len(matches) == 2
    assert len(unmatched) == 0

    meeting_history = set([
        (user1.key.id(), user2.key.id()),
        (user3.key.id(), user4.key.id()),
        (user2.key.id(), user3.key.id()),
        (user1.key.id(), user4.key.id()),
    ])
    matches, unmatched = generate_meetings(user_list, specs[0],
                                           meeting_history)
    assert len(matches) == 0
    assert len(unmatched) == 4

    meeting_history = set([
        (user1.key.id(), user2.key.id()),
        (user3.key.id(), user4.key.id()),
        (user2.key.id(), user3.key.id()),
    ])
    matches, unmatched = generate_meetings(user_list, specs[0],
                                           meeting_history)
    assert len(matches) == 1
    assert len(unmatched) == 2
Exemplo n.º 18
0
def sync_employees(employee_data):
    """
    Employee data must include:
        - email
        - first_name
        - last_name
        - photo_url
    All other information will be included in the data store as
    metadata.

    Parameters
    ----------
    remote_data = json

    Returns
    -------
    success: integer, 0 successful, 1 failure
    """
    validate_employee_data(employee_data)
    remote_employee_data = hash_employee_data(employee_data)

    # get data from local database
    local_employee_data = {
        employee.email: employee
        for employee in User.query().fetch()
    }

    local_employees = set(local_employee_data.keys())
    remote_employees = set(remote_employee_data.keys())

    new_employees = remote_employees - local_employees
    if new_employees:
        logging.info('Creating new employees.')
        new_employees_list = [
            remote_employee_data[employee] for employee in new_employees
        ]
        create_new_employees_from_list(new_employees_list)
        logging.info('{} employees added'.format(len(new_employees)))
        logging.info(new_employees)

    termed_employees = local_employees - remote_employees
    if termed_employees:
        logging.info('Marking termed employees')
        termed_employees_ndb = [
            local_employee_data[employee] for employee in termed_employees
        ]
        mark_termed_employees(termed_employees_ndb)
        logging.info('{} employees marked as termed'.format(
            len(termed_employees)))
        logging.info(termed_employees)

    current_employees = remote_employees.intersection(local_employees)
    if current_employees:
        logging.info('Updating current employees')
        remote_employee_data = {
            employee: remote_employee_data[employee]
            for employee in current_employees
        }
        local_employee_data = {
            employee: local_employee_data[employee]
            for employee in current_employees
        }
        update_current_employees(local_employee_data, remote_employee_data)
        logging.info('{} employees updated'.format(len(current_employees)))
        logging.info(current_employees)
Exemplo n.º 19
0
def test_mark_terminated_employees(database, fake_user):
    mark_termed_employees([fake_user])
    user = User.query().get()
    assert user.terminated
Exemplo n.º 20
0
def test_send_batch_meeting_confirmation_email(database):
    pref = UserSubscriptionPreferences(subscription=database.sub.key,
                                       preference=database.prefs[0].key)
    pref.put()
    user_a = User(
        email='*****@*****.**',
        photo_url=(
            'https://s3-media2.fl.yelpcdn.com/assets/srv0/yelp_large_assets/' +
            'a315bcce34b3/assets/img/illustrations/mascots/hammy.png'),
        first_name='Hammy',
        last_name='Yelp',
        metadata={'department': 'Engineering'},
        subscription_preferences=[pref.key])
    user_b = User(
        first_name='Darwin',
        last_name='Yelp',
        email='*****@*****.**',
        photo_url=(
            'https://s3-media4.fl.yelpcdn.com/assets/srv0/yelp_large_assets/' +
            '36a31704362e/assets/img/illustrations/mascots/darwin.png'),
        metadata={'department': 'Design'},
        subscription_preferences=[pref.key])
    user_c = User(
        first_name='Carmin',
        last_name='Yelp',
        email='*****@*****.**',
        photo_url=(
            'https://s3-media1.fl.yelpcdn.com/assets/srv0/yelp_large_assets/' +
            'd71947670be7/assets/img/illustrations/mascots/carmen.png'),
        metadata={'department': 'Design'},
        subscription_preferences=[pref.key])
    user_a.put()
    user_b.put()
    user_c.put()
    matches = [tuple((user_a, user_b, user_c, pref))]
    send_batch_meeting_confirmation_email(matches, database.specs[0])
Exemplo n.º 21
0
def test_previous_meeting_penalty(session):
    pref_1 = SubscriptionDateTime(datetime=datetime.now() - timedelta(weeks=MEETING_COOLDOWN_WEEKS - 1))
    pref_2 = SubscriptionDateTime(datetime=datetime.now() - timedelta(weeks=MEETING_COOLDOWN_WEEKS - 2))
    pref_3 = SubscriptionDateTime(datetime=datetime.now() - timedelta(weeks=MEETING_COOLDOWN_WEEKS - 3))
    subscription = MeetingSubscription(title='all engineering weekly', datetime=[pref_1, pref_2, pref_3])
    user_pref1 = UserSubscriptionPreferences(preference=pref_1, subscription=subscription)
    user_pref2 = UserSubscriptionPreferences(preference=pref_2, subscription=subscription)
    user_pref3 = UserSubscriptionPreferences(preference=pref_3, subscription=subscription)
    meeting_spec1 = MeetingSpec(meeting_subscription=subscription, datetime=pref_1.datetime)
    meeting_spec2 = MeetingSpec(meeting_subscription=subscription, datetime=pref_2.datetime)
    meeting_spec3 = MeetingSpec(meeting_subscription=subscription, datetime=pref_3.datetime)
    session.add(pref_1)
    session.add(pref_2)
    session.add(pref_3)
    session.add(subscription)
    session.add(user_pref1)
    session.add(user_pref2)
    session.add(user_pref3)
    session.add(meeting_spec1)
    session.add(meeting_spec2)
    session.add(meeting_spec3)

    users = []
    num_users = 20
    for i in range(0, num_users):
        user = User(email='{}@yelp.com'.format(i), meta_data={
                    'department': 'dept{}'.format(i)}, subscription_preferences=[user_pref1, user_pref2, user_pref3])
        session.add(user)
        mr1 = MeetingRequest(user=user, meeting_spec=meeting_spec1)
        mr2 = MeetingRequest(user=user, meeting_spec=meeting_spec2)
        mr3 = MeetingRequest(user=user, meeting_spec=meeting_spec3)
        session.add(mr1)
        session.add(mr2)
        session.add(mr3)
        users.append(user)

    meeting1 = Meeting(meeting_spec=meeting_spec1, cancelled=False)
    mp1 = MeetingParticipant(meeting=meeting1, user=users[1])
    mp2 = MeetingParticipant(meeting=meeting1, user=users[0])
    session.add(meeting1)
    session.add(mp1)
    session.add(mp2)

    meeting2 = Meeting(meeting_spec=meeting_spec2, cancelled=False)
    mp1 = MeetingParticipant(meeting=meeting2, user=users[1])
    mp2 = MeetingParticipant(meeting=meeting2, user=users[0])
    session.add(meeting2)
    session.add(mp1)
    session.add(mp2)

    meeting3 = Meeting(meeting_spec=meeting_spec3, cancelled=False)
    mp1 = MeetingParticipant(meeting=meeting3, user=users[1])
    mp2 = MeetingParticipant(meeting=meeting3, user=users[0])
    session.add(meeting3)
    session.add(mp1)
    session.add(mp2)

    session.commit()

    for run in range(10):
        matches, unmatched = generate_meetings(users, meeting_spec1, prev_meeting_tuples=None, group_size=3)
        assert(len(matches) == 6)
        assert (len(unmatched) == 2)
        for matched_group in matches:
            assert(not (users[0] in matched_group and users[1] in matched_group))