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 test_delete_meeting_request(app, monkeypatch, database, fake_user): monkeypatch.setattr(meeting_requests, 'get_user', lambda: fake_user) meeting_spec_key = database.specs[0].key.urlsafe() meeting_request = MeetingRequest( meeting_spec=database.specs[0].key, user=fake_user.key ) meeting_request_key = meeting_request.put() meeting_request_key = meeting_request_key.urlsafe() requests = MeetingRequest.query().fetch() assert len(requests) == 1 with app.test_request_context( '/v1/meeting_request/', method='POST', data=json.dumps({ 'meeting_spec_key': meeting_spec_key, 'meeting_request_key': meeting_request_key }), content_type='application/json' ): response = create_delete_meeting_request() assert json.loads(response) == {'key': ''} requests = MeetingRequest.query().fetch() assert len(requests) == 0
def test_get_meeting_request(app, monkeypatch, database, fake_user): monkeypatch.setattr(meeting_requests, 'get_user', lambda (x): fake_user) meeting_spec_key = database.specs[0].key.urlsafe() meeting_request = MeetingRequest(meeting_spec=database.specs[0].key, user=fake_user.key) meeting_request_key = meeting_request.put() requests = MeetingRequest.query().fetch() assert len(requests) == 1 with app.test_request_context('/v1/meeting_request/' + meeting_spec_key): response = get_meeting_request(meeting_spec_key).json assert response == {'key': meeting_request_key.urlsafe()}
def create_delete_meeting_request(): data = request.json meeting_spec_key = data['meeting_spec_key'] meeting_request_key = data['meeting_request_key'] user = get_user(data['email']) if meeting_request_key == '': meeting_spec = MeetingSpec.query.filter( MeetingSpec.id == meeting_spec_key).first() if not meeting_spec: return 400 meeting_request = query_meeting_request(meeting_spec, user) if not meeting_request: meeting_request = MeetingRequest(meeting_spec=meeting_spec, user=user) db.session.add(meeting_request) db.session.commit() return jsonify({'key': meeting_request.id}) else: meeting_request = MeetingRequest.query.filter( MeetingRequest.id == meeting_request_key).one() db.session.delete(meeting_request) db.session.commit() return jsonify({'key': ''})
def test_delete_meeting_request(app, monkeypatch, database, fake_user, session): monkeypatch.setattr(meeting_requests, 'get_user', lambda x: fake_user) meeting_spec_key = database.specs[0].id meeting_request = MeetingRequest( meeting_spec=database.specs[0], user=fake_user ) session.add(meeting_request) session.commit() meeting_request_key = meeting_request.id requests = MeetingRequest.query.all() assert len(requests) == 1 with app.test_request_context( '/v1/meeting_request/', method='POST', data=json.dumps({ 'meeting_spec_key': meeting_spec_key, 'meeting_request_key': meeting_request_key, 'email': fake_user.email }), content_type='application/json' ): response = create_delete_meeting_request().json assert response == {'key': ''} requests = MeetingRequest.query.all() assert len(requests) == 0
def test_no_re_matches(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 = [] 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_pref]) session.add(user) mr = MeetingRequest(user=user, meeting_spec=meeting_spec) session.add(mr) users.append(user) session.commit() previous_meetings = {pair for pair in itertools.combinations([user.id for user in users], 2)} previous_meetings = previous_meetings - {(users[0].id, users[1].id)} matches, unmatched = generate_meetings(users, meeting_spec, previous_meetings) assert len(unmatched) == num_users - 2 assert [(match[0].id, match[1].id) for match in matches] == [(users[0].id, users[1].id)]
def test_generate_group_meeting(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 = [] num_users = 21 for i in range(0, num_users): 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) == 7) assert (len(unmatched) == 0) matches, unmatched = generate_meetings(users, meeting_spec, prev_meeting_tuples=None, group_size=5) assert(len(matches) == 4) assert (len(unmatched) == 1)
def test_no_re_matches(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() meeting_spec = MeetingSpec(meeting_subscription=subscription, datetime=pref_1.get().datetime) meeting_spec.put() users = [] num_users = 20 for i in range(0, num_users): user = User(email='{}@yelp.com'.format(i), metadata={'department': 'dept{}'.format(i)}, subscription_preferences=[user_pref]) user.put() MeetingRequest(user=user.key, meeting_spec=meeting_spec.key).put() users.append(user) previous_meetings = { pair for pair in itertools.combinations([user.key.id() for user in users], 2) } previous_meetings = previous_meetings - { (users[0].key.id(), users[1].key.id()) } matches, unmatched = generate_meetings(users, meeting_spec, previous_meetings) assert len(unmatched) == num_users - 2 assert [(match[0].key.id(), match[1].key.id()) for match in matches] == [(users[0].key.id(), users[1].key.id())]
def test_get_meeting_request_no_exist(app, monkeypatch, database, fake_user): monkeypatch.setattr(meeting_requests, 'get_user', lambda: fake_user) meeting_spec_key = database.specs[0].key.urlsafe() requests = MeetingRequest.query().fetch() assert len(requests) == 0 with app.test_request_context('/v1/meeting_request/' + meeting_spec_key): response = get_meeting_request(meeting_spec_key) assert json.loads(response) == {'key': ''}
def test_previous_meeting_penalty(minimal_database): pref_1 = SubscriptionDateTime(datetime=datetime.now() - timedelta(weeks=MEETING_COOLDOWN_WEEKS - 1)).put() pref_2 = SubscriptionDateTime(datetime=datetime.now() - timedelta(weeks=MEETING_COOLDOWN_WEEKS - 2)).put() pref_3 = SubscriptionDateTime(datetime=datetime.now() - timedelta(weeks=MEETING_COOLDOWN_WEEKS - 3)).put() subscription = MeetingSubscription(title='all engineering weekly', datetime=[pref_1, pref_2, pref_3]).put() user_pref1 = UserSubscriptionPreferences(preference=pref_1, subscription=subscription).put() user_pref2 = UserSubscriptionPreferences(preference=pref_2, subscription=subscription).put() user_pref3 = UserSubscriptionPreferences(preference=pref_3, subscription=subscription).put() meeting_spec1 = MeetingSpec(meeting_subscription=subscription, datetime=pref_1.get().datetime) meeting_spec1.put() meeting_spec2 = MeetingSpec(meeting_subscription=subscription, datetime=pref_2.get().datetime) meeting_spec2.put() meeting_spec3 = MeetingSpec(meeting_subscription=subscription, datetime=pref_3.get().datetime) meeting_spec3.put() users = [] num_users = 20 for i in range(0, num_users): user = User(email='{}@yelp.com'.format(i), metadata={ 'department': 'dept{}'.format(i)}, subscription_preferences=[user_pref1, user_pref2, user_pref3]) user.put() MeetingRequest(user=user.key, meeting_spec=meeting_spec1.key).put() MeetingRequest(user=user.key, meeting_spec=meeting_spec2.key).put() MeetingRequest(user=user.key, meeting_spec=meeting_spec3.key).put() users.append(user) meeting1 = Meeting(meeting_spec=meeting_spec1.key, cancelled=False).put() MeetingParticipant(meeting=meeting1, user=users[1].key).put() MeetingParticipant(meeting=meeting1, user=users[0].key).put() meeting2 = Meeting(meeting_spec=meeting_spec2.key, cancelled=False).put() MeetingParticipant(meeting=meeting2, user=users[1].key).put() MeetingParticipant(meeting=meeting2, user=users[0].key).put() meeting3 = Meeting(meeting_spec=meeting_spec3.key, cancelled=False).put() MeetingParticipant(meeting=meeting3, user=users[1].key).put() MeetingParticipant(meeting=meeting3, user=users[0].key).put() 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))
def test_get_meeting_requests(app, database): pref = UserSubscriptionPreferences(subscription=database.sub.key, preference=database.prefs[0].key) pref.put() user = User(email='*****@*****.**', metadata={'department': 'dept'}, subscription_preferences=[pref.key]) user.put() MeetingRequest(user=user.key, meeting_spec=database.specs[0].key).put() with app.test_request_context('/v1/metrics/meeting_requests'): requests = json.loads(meeting_requests()) assert requests == [{'title': 'Yelp Weekly', 'user': '******'}]
def get_meeting_requests(): requests = [] for spec in get_specs_for_current_week(): users = [ request.user.get().email for request in MeetingRequest.query( MeetingRequest.meeting_spec == spec.key).fetch() ] for user in users: requests.append({ 'title': spec.meeting_subscription.get().title, 'user': user, }) return requests
def test_generate_save_meetings(session, subscription): 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) user1 = User(email='*****@*****.**', meta_data={'department': 'dept'}, subscription_preferences=[user_pref]) user2 = User(email='*****@*****.**', meta_data={'department': 'dept2'}, subscription_preferences=[user_pref]) meeting_spec = MeetingSpec(meeting_subscription=subscription, datetime=pref_1.datetime) mr1 = MeetingRequest(user=user1, meeting_spec=meeting_spec) mr2 = MeetingRequest(user=user2, meeting_spec=meeting_spec) session.add(pref_1) session.add(subscription) session.add(user_pref) session.add(user1) session.add(user2) session.add(meeting_spec) session.add(mr1) session.add(mr2) session.commit() matches, unmatched = generate_meetings([user1, user2], meeting_spec) save_meetings(matches, meeting_spec) assert unmatched == [] participants = [ participant.user for participant in MeetingParticipant.query.all() ] assert participants == [user1, user2]
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_get_meeting_request(app, monkeypatch, database, fake_user, session): monkeypatch.setattr(meeting_requests, 'get_user', lambda x: fake_user) meeting_spec_key = database.specs[0].id meeting_request = MeetingRequest( meeting_spec=database.specs[0], user=fake_user ) session.add(meeting_request) session.commit() meeting_request_key = meeting_request.id requests = MeetingRequest.query.all() assert len(requests) == 1 with app.test_request_context('/v1/meeting_request/{}'.format(meeting_spec_key)): response = get_meeting_request(meeting_spec_key).json assert response == {'key': meeting_request_key}
def test_generate_group_meeting_invalid_number_of_users(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() meeting_spec = MeetingSpec(meeting_subscription=subscription, datetime=pref_1.get().datetime) meeting_spec.put() users = [] for i in range(0, 2): user = User(email='{}@yelp.com'.format(i), metadata={ 'department': 'dept{}'.format(i)}, subscription_preferences=[user_pref]) user.put() MeetingRequest(user=user.key, meeting_spec=meeting_spec.key).put() users.append(user) matches, unmatched = generate_meetings(users, meeting_spec, prev_meeting_tuples=None, group_size=3) assert(len(matches) == 0) assert (len(unmatched) == 2)
def match_employees(): specs = get_specs_for_current_week() for spec in specs: logging.info('Spec Datetime: ') logging.info(get_meeting_datetime(spec).strftime("%Y-%m-%d %H:%M")) users = [ request.user.get() for request in MeetingRequest.query( MeetingRequest.meeting_spec == spec.key).fetch() ] logging.info('Users: ') logging.info([user.get_username() for user in users]) matches, unmatched = generate_meetings(users, spec) save_meetings(matches, spec) send_batch_unmatched_email(unmatched) send_batch_meeting_confirmation_email(matches, spec) return "OK"
def test_create_meeting_request(app, monkeypatch, database, fake_user): monkeypatch.setattr(meeting_requests, 'get_user', lambda (x): fake_user) meeting_spec_key = database.specs[0].key.urlsafe() with app.test_request_context('/v1/meeting_request/', method='POST', data=json.dumps({ 'meeting_spec_key': meeting_spec_key, 'meeting_request_key': '', 'email': fake_user.email }), content_type='application/json'): response = create_delete_meeting_request().json assert response['key'] != '' requests = MeetingRequest.query().fetch() assert len(requests) == 1 assert requests[0].user == fake_user.key assert requests[0].meeting_spec == database.specs[0].key
def create_delete_meeting_request(): user = get_user() data = request.json meeting_spec_key = data['meeting_spec_key'] meeting_request_key = data['meeting_request_key'] if meeting_request_key == '': meeting_spec = ndb.Key(urlsafe=meeting_spec_key) if not meeting_spec: return 400 meeting_request = query_meeting_request(meeting_spec, user) if not meeting_request: meeting_request = MeetingRequest(meeting_spec=meeting_spec, user=user.key) meeting_request.put() return json.dumps({'key': meeting_request.key.urlsafe()}) else: meeting_request = ndb.Key(urlsafe=meeting_request_key) meeting_request.delete() return json.dumps({'key': ''})
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))
def query_meeting_request(meeting_spec, user): return MeetingRequest().query(MeetingRequest.meeting_spec == meeting_spec, MeetingRequest.user == user.key).get()