Beispiel #1
0
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))
Beispiel #2
0
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))
Beispiel #3
0
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))
Beispiel #4
0
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))
Beispiel #5
0
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
Beispiel #6
0
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))
Beispiel #7
0
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))
Beispiel #8
0
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
Beispiel #9
0
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))
Beispiel #10
0
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
Beispiel #11
0
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
Beispiel #12
0
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"
Beispiel #13
0
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"
Beispiel #14
0
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
Beispiel #15
0
 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))