def test_prev_time_index_ooa(client): with client.application.app_context(): start_of_first_index = client.application.config['TIMEPOINTS'][0][0] en_margin = client.application.config['TIMEPOINT_END_MARGIN'] res = mod_time(datetime.timedelta.resolution, en_margin) with pytest.raises(OutOfAcceptingHoursError): get_prev_time_index(mod_time(start_of_first_index, res))
def test_draw_all_invalid(client): """attempt to draw in not acceptable time target_url: /draw_all [POST] """ token = get_token(client, admin) def try_with_datetime(t): resp = draw_all(client, token, time=t) assert resp.status_code == 400 assert 'Not acceptable' in resp.get_json()['message'] outofhours1 = client.application.config['START_DATETIME'] - \ datetime.timedelta.resolution try_with_datetime(outofhours1) outofhours2 = client.application.config['END_DATETIME'] + \ datetime.timedelta.resolution try_with_datetime(outofhours2) timepoints = client.application.config['TIMEPOINTS'] ext = client.application.config['DRAWING_TIME_EXTENSION'] for i, (_, en) in enumerate(timepoints): res = datetime.timedelta.resolution try_with_datetime(mod_time(en, -res)) try_with_datetime(mod_time(en, +ext+res))
def test_draw_time_invalid(client): """attempt to draw in not acceptable time target_url: /draw_all [POST] """ with client.application.app_context(): target_lottery = Lottery.query.filter_by(id=1).first() def try_with_datetime(t): with mock.patch('api.time_management.get_current_datetime', return_value=t): resp = client.post(f'/lotteries/{target_lottery.id}/draw', headers={'Authorization': f'Bearer {token}'}) assert resp.status_code == 400 assert 'Not acceptable' in resp.get_json()['message'] token = login(client, admin['secret_id'], admin['g-recaptcha-response'])['token'] outofhours1 = client.application.config['START_DATETIME'] - \ datetime.timedelta.resolution try_with_datetime(outofhours1) outofhours2 = client.application.config['END_DATETIME'] + \ datetime.timedelta.resolution try_with_datetime(outofhours2) timepoints = client.application.config['TIMEPOINTS'] ext = client.application.config['DRAWING_TIME_EXTENSION'] _, en = timepoints[target_lottery.index] res = datetime.timedelta.resolution try_with_datetime(mod_time(en, -res)) try_with_datetime(mod_time(en, +ext + res))
def test_draw_time_invalid(client): """attempt to draw in not acceptable time target_url: /draw_all [POST] """ idx = 1 with client.application.app_context(): target_lottery = Lottery.query.get(idx) token = login(client, admin['secret_id'], admin['g-recaptcha-response'])['token'] def try_with_datetime(t): resp = draw(client, token, idx, time=t) assert resp.status_code == 400 assert 'Not acceptable' in resp.get_json()['message'] res = datetime.timedelta.resolution outofhours1 = client.application.config['START_DATETIME'] - res try_with_datetime(outofhours1) outofhours2 = client.application.config['END_DATETIME'] + res try_with_datetime(outofhours2) timepoints = client.application.config['TIMEPOINTS'] ext = client.application.config['DRAWING_TIME_EXTENSION'] _, en = timepoints[target_lottery.index] try_with_datetime(mod_time(en, -res)) try_with_datetime(mod_time(en, +ext+res))
def test_time_index_lim(client): with client.application.app_context(): timepoints = client.application.config['TIMEPOINTS'] for i, point in enumerate(timepoints): res = datetime.timedelta.resolution idx_l = get_time_index(mod_time(point[0], +res)) assert i == idx_l idx_r = get_time_index(mod_time(point[1], -res)) assert i == idx_r
def test_time_index_ooh(client): with client.application.app_context(): start = client.application.config['START_DATETIME'] end = client.application.config['END_DATETIME'] res = datetime.timedelta.resolution with pytest.raises(OutOfHoursError): get_time_index(mod_time(start, -res)) with pytest.raises(OutOfHoursError): get_time_index(mod_time(end, +res))
def test_time_index_ooa(client): with client.application.app_context(): timepoints = client.application.config['TIMEPOINTS'] res = datetime.timedelta.resolution en_margin = client.application.config['TIMEPOINT_END_MARGIN'] for i, point in enumerate(timepoints): with pytest.raises(OutOfAcceptingHoursError): get_time_index(mod_time(point[0], -res)) with pytest.raises(OutOfAcceptingHoursError): get_time_index(mod_time(point[1], +res+en_margin))
def test_draw_time_index_same(client): with client.application.app_context(): timepoints = client.application.config['TIMEPOINTS'] ext = client.application.config['DRAWING_TIME_EXTENSION'] en_margin = client.application.config['TIMEPOINT_END_MARGIN'] for i, (_, en) in enumerate(timepoints): idx_l = get_draw_time_index(mod_time(en, en_margin)) assert i == idx_l idx_r = get_draw_time_index(mod_time(en, +ext)) assert i == idx_r
def test_draw_time_index_ooa(client): with client.application.app_context(): timepoints = client.application.config['TIMEPOINTS'] ext = client.application.config['DRAWING_TIME_EXTENSION'] for i, (_, en) in enumerate(timepoints): res = datetime.timedelta.resolution with pytest.raises(OutOfAcceptingHoursError): get_draw_time_index(mod_time(en, -res)) with pytest.raises(OutOfAcceptingHoursError): get_draw_time_index(mod_time(en, +ext+res))
def test_draw_time_index_lim(client): with client.application.app_context(): timepoints = client.application.config['TIMEPOINTS'] ext = client.application.config['DRAWING_TIME_EXTENSION'] en_margin = client.application.config['TIMEPOINT_END_MARGIN'] for i, (_, en) in enumerate(timepoints): en_with_margin = mod_time(en, en_margin) res = datetime.timedelta.resolution idx_l = get_draw_time_index(mod_time(en_with_margin, +res)) assert i == idx_l idx_r = get_draw_time_index(mod_time(en, +ext-res)) assert i == idx_r
def test_prev_time_index_lim(client): with client.application.app_context(): res = datetime.timedelta.resolution en_margin = client.application.config['TIMEPOINT_END_MARGIN'] ends = [mod_time(tp[1], en_margin) for tp in client.application.config['TIMEPOINTS']] for i in range(len(ends)-1): idx_l = get_prev_time_index(ends[i]) assert i == idx_l idx_r = get_prev_time_index(mod_time(ends[i+1], -res)) assert i == idx_r idx_l = get_prev_time_index(ends[-1]) assert len(ends)-1 == idx_l
def test_draw_all(client): """attempt to draw all lotteries 1. make some applications to some lotteries 2. draws all the lotteries in one time index 3. test: status code 4. test: DB is properly changed target_url: /draw_all [POST] """ time_index = 1 with client.application.app_context(): target_lotteries = Lottery.query.filter_by(index=time_index) non_target_lotteries = Lottery.query.filter_by(index=time_index + 1) users = (user for user in User.query.all() if user.authority != "admin") for i, user in enumerate(users): target_lottery = target_lotteries[i % len(list(target_lotteries))] non_target_lottery = non_target_lotteries[i % len( list(non_target_lotteries))] application1 = Application(lottery=target_lottery, user_id=user.id) application2 = Application(lottery=non_target_lottery, user_id=user.id) db.session.add(application1) db.session.add(application2) db.session.commit() token = login(client, admin['secret_id'], admin['g-recaptcha-response'])['token'] _, en = client.application.config['TIMEPOINTS'][time_index] en_margin = client.application.config['TIMEPOINT_END_MARGIN'] draw_time = mod_time(en, en_margin) with mock.patch('api.time_management.get_current_datetime', return_value=draw_time): resp = client.post('/draw_all', headers={'Authorization': f'Bearer {token}'}) assert resp.status_code == 200 winners_id = [winner['id'] for winner in resp.get_json()] assert all(lottery.done for lottery in target_lotteries) assert all(not lottery.done for lottery in non_target_lotteries) with client.application.app_context(): users = User.query.all() for user in users: for lottery in target_lotteries: application = Application.query.filter_by( lottery=lottery, user_id=user.id).first() if application: status = 'won' if user.id in winners_id else 'lose' assert application.status == status for lottery in non_target_lotteries: application = Application.query.filter_by( lottery=lottery, user_id=user.id).first() if application: assert application.status == "pending"
def test_draw_all(client): """attempt to draw all lotteries 1. make some applications to some lotteries 2. draws all the lotteries in one time index 3. test: status code 4. test: DB is properly changed target_url: /draw_all [POST] """ time_index = 1 with client.application.app_context(): target_lotteries = Lottery.query.filter_by(index=time_index) non_target_lotteries = Lottery.query.filter_by(index=time_index+1) users = (user for user in User.query.all() if user.authority != "admin") for i, user in enumerate(users): target_lottery = target_lotteries[i % len(list(target_lotteries))] non_target_lottery = non_target_lotteries[i % len( list(non_target_lotteries))] application1 = Application(lottery=target_lottery, user_id=user.id) application2 = Application( lottery=non_target_lottery, user_id=user.id) db.session.add(application1) db.session.add(application2) db.session.commit() token = login(client, admin['secret_id'], admin['g-recaptcha-response'])['token'] _, en = client.application.config['TIMEPOINTS'][time_index] en_margin = client.application.config['TIMEPOINT_END_MARGIN'] draw_time = mod_time(en, en_margin) resp = draw_all(client, token, time=draw_time) assert resp.status_code == 200 winners_id = [winner['id'] for winner in resp.get_json()] with client.application.app_context(): users = User.query.all() for user in users: for lottery in target_lotteries: application = Application.query.filter_by( lottery=lottery, user_id=user.id).first() if application: if user.id in winners_id: assert application.status == "won" else: assert application.status in {"lose", "waiting"} for lottery in non_target_lotteries: application = Application.query.filter_by( lottery=lottery, user_id=user.id).first() if application: assert application.status == "pending"
def test_draw(client): """attempt to draw a lottery 1. make some applications to one lottery 2. draws the lottery 3. test: status code 4. test: DB is changed target_url: /lotteries/<id>/draw [POST] """ idx = 1 with client.application.app_context(): target_lottery = Lottery.query.get(idx) index = target_lottery.index users = User.query.all() for user in users: application = Application(lottery=target_lottery, user_id=user.id) db.session.add(application) db.session.commit() token = login(client, admin['secret_id'], admin['g-recaptcha-response'])['token'] _, end = client.application.config['TIMEPOINTS'][index] end_margin = client.application.config['TIMEPOINT_END_MARGIN'] end_with_margin = mod_time(end, end_margin) with mock.patch('api.time_management.get_current_datetime', return_value=end_with_margin): resp = client.post(f'/lotteries/{idx}/draw', headers={'Authorization': f'Bearer {token}'}) assert resp.status_code == 200 winners_id = [winner['id'] for winner in resp.get_json()] users = User.query.all() target_lottery = Lottery.query.filter_by(id=idx).first() assert target_lottery.done for user in users: application = Application.query.filter_by(lottery=target_lottery, user_id=user.id).first() if application: status = 'won' if user.id in winners_id else 'lose' assert application.status == status
def calc_end_of_drawing(self, lottery): index = lottery.index drawing_ext = current_app.config['DRAWING_TIME_EXTENSION'] time_ponit = current_app.config['TIMEPOINTS'][index][1] return str(mod_time(time_ponit, drawing_ext))