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': '******'}]
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
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
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)
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())])
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'
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)
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() == []
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
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}
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', }
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')
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
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)
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]
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()
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
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)
def test_mark_terminated_employees(database, fake_user): mark_termed_employees([fake_user]) user = User.query().get() assert user.terminated
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])
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))