def test_login(client):
    tested_app, app = client

    # creates '*****@*****.**' with psw '123456'
    assert create_user(tested_app).status_code == 200

    # in the db exists '*****@*****.**' and '*****@*****.**' (the admin)
    # try to login with incorrect mail
    reply = login(tested_app, email='*****@*****.**', password='******')
    assert reply.status_code == 401

    # try to login with incorrect mail and incorrect password
    reply = login(tested_app, email='*****@*****.**', password='******')
    assert reply.status_code == 401

    # try to login with incorrect password only
    reply = login(tested_app, email='*****@*****.**', password='******')
    assert reply.status_code == 401

    # logging in correctly
    reply = login(tested_app, email='*****@*****.**', password='******')
    assert reply.status_code == 200

    # cannot login if already logged in
    reply = login(tested_app, email='*****@*****.**', password='******')
    assert reply.status_code == 403
def test_statistics(client):
    tested_app, app = client

    reply = create_user(tested_app)
    assert reply.status_code == 200

    with app.app_context():
        q = db.session.query(User).filter(User.email == '*****@*****.**')
        user = q.first()
        run1 = new_predefined_run(user)  # run with id 1
        run2 = new_predefined_run(user)  # run with id 2
        run3 = new_predefined_run(user)  # run with id 3
        run4 = new_predefined_run(user)  # run with id 4
        run5 = new_predefined_run(user)  # run with id 5

        reply = tested_app.get('/statistics')
        assert reply.status_code == 401

        assert login(tested_app, email='*****@*****.**',
                     password='******').status_code == 200

        reply = tested_app.get('/statistics')
        assert reply.status_code == 200

        # check the correctness of the fields
        assert get_element_by_id(str(run1.id),
                                 str(reply.data)) == str(run1.name)
        assert get_element_by_id(str(run2.id),
                                 str(reply.data)) == str(run2.name)
        assert get_element_by_id(str(run3.id),
                                 str(reply.data)) == str(run3.name)
        assert get_element_by_id(str(run4.id),
                                 str(reply.data)) == str(run4.name)
        assert get_element_by_id(str(run5.id),
                                 str(reply.data)) == str(run5.name)
def test_average_speed(client):
    tested_app, app = client

    # prepare the database creating a new user
    reply = create_user(
        tested_app)  # creates a user with '*****@*****.**' as email, default
    assert reply.status_code == 200

    # login as new user
    reply = login(tested_app, email='*****@*****.**', password='******')
    assert reply.status_code == 200

    # retrieve the user object and login
    with app.app_context():
        q = db.session.query(User).filter(User.email == '*****@*****.**')
        user = q.first()
        user.strava_token = "fake_token"
        db.session.commit()

    # The average speed should be 0 if there are no runs
    reply = tested_app.get('/')
    assert reply.status_code == 200
    assert get_element_by_id('total_average_speed', str(reply.data)) == str(0)

    # add a run
    with app.app_context():
        new_run(user)

    # retrieve the run
    with app.app_context():
        q = db.session.query(Run).filter(Run.id == 1)  # should be the first
        run1 = q.first()

    # with only a run the average speed should be the average speed of the run
    reply = tested_app.get('/')
    assert reply.status_code == 200
    assert get_element_by_id('total_average_speed', str(reply.data)) == str(
        round(run1.average_speed, 2))

    # add another run
    with app.app_context():
        new_run(user)

    # retrieve the runs list
    with app.app_context():
        runs = db.session.query(
            Run).filter()  # should be all owned by our user

    # with multiples runs the average speed should be the average of the average speed of each run
    total_average_speed = 0
    for run in runs:
        total_average_speed += run.average_speed
    total_average_speed /= runs.count()

    reply = tested_app.get('/')
    assert reply.status_code == 200
    assert get_element_by_id('total_average_speed', str(reply.data)) == str(
        round(total_average_speed, 2))
def test_users_list(client):
    tested_app, app = client

    assert login(tested_app, email='*****@*****.**',
                 password='******').status_code == 200

    # only admin can get this page
    assert tested_app.get('/users').status_code == 200

    reply = logout(tested_app)
    assert reply.status_code == 200

    assert create_user(tested_app).status_code == 200

    assert login(tested_app, email='*****@*****.**',
                 password='******').status_code == 200

    # [email protected] is not admin
    assert tested_app.get('/users').status_code == 401
def test_create_user(client):
    tested_app, app = client

    assert tested_app.get('/create_user').status_code == 200

    assert tested_app.post('/create_user', data=None).status_code == 400

    reply = tested_app.post('/create_user',
                            data=dict(email='*****@*****.**',
                                      firstname='andrea',
                                      lastname='bongiorno',
                                      password='******',
                                      age=23,
                                      weight=70,
                                      max_hr=120,
                                      rest_hr=60,
                                      vo2max=99),
                            follow_redirects=True)

    assert reply.status_code == 200  # create_user success (it also redirect to login)

    assert login(tested_app, '*****@*****.**', '123456').status_code == 200

    # cannot create a user when already logged in
    assert create_user(tested_app).status_code == 403

    with app.app_context():
        user = db.session.query(User).filter(
            User.email == '*****@*****.**').first()
        assert user is not None
        assert user.email == '*****@*****.**'
        assert user.firstname == 'andrea'
        assert user.lastname == 'bongiorno'
        assert check_password_hash(user.password, '123456') is True
        assert user.age == 23
        assert user.weight == 70
        assert user.max_hr == 120
        assert user.rest_hr == 60
        assert user.vo2max == 99

    logout(tested_app)

    # cannot create a user with the same email
    reply = tested_app.post('/create_user',
                            data=dict(email='*****@*****.**',
                                      firstname='andrea',
                                      lastname='bongiorno',
                                      password='******',
                                      age=23,
                                      weight=70,
                                      max_hr=120,
                                      rest_hr=60,
                                      vo2max=99),
                            follow_redirects=False)
    assert reply.status_code == 409
def test_set_report(client):
    tested_app, app = client

    reply = tested_app.get('/settingreport')
    assert reply.status_code == 401

    create_user(tested_app,email='*****@*****.**', firstname='mariacristina', lastname='uccheddu', password='******',
                                              age=23,
                                              weight=70,
                                              max_hr=120,
                                              rest_hr=60,
                                              vo2max=99)

    reply = tested_app.get('/settingreport')
    assert reply.status_code == 401

    assert login(tested_app, '*****@*****.**', 'ciao').status_code == 200

    # now [email protected] is logged in
    with app.app_context():
        user = db.session.query(User).filter(User.email == '*****@*****.**').first()

        reply = tested_app.get('/settingreport')
        assert reply.status_code == 200

        reply = tested_app.post('/settingreport', data=dict(setting_mail='6'), follow_redirects=True)
        assert reply.status_code == 200
        mail = db.session.query(Report).filter(Report.runner_id == user.id).first()
        assert mail is not None
        assert mail.runner_id == user.id
        assert mail.choice_time == 21600.0

        reply = tested_app.post('/settingreport', data=dict(setting_mail='12'), follow_redirects=True)
        assert reply.status_code == 200
        mail = db.session.query(Report).filter(Report.runner_id == user.id).first()
        assert mail is not None
        assert mail.runner_id == user.id
        assert mail.choice_time == 43200.0

        reply = tested_app.post('/settingreport', data=dict(setting_mail='24'), follow_redirects=True)
        assert reply.status_code == 200
        mail = db.session.query(Report).filter(Report.runner_id == user.id).first()
        assert mail is not None
        assert mail.runner_id == user.id
        assert mail.choice_time == 86400.0

        reply = tested_app.post('/settingreport', data=dict(setting_mail=None), follow_redirects=True)
        reply.status_code == 400
def test_run(client):
    tested_app, app = client

    # prepare the database creating a new user
    reply = create_user(
        tested_app)  # creates a user with '*****@*****.**' as email, default
    assert reply.status_code == 200

    # login as new user
    reply = login(tested_app, email='*****@*****.**', password='******')
    assert reply.status_code == 200

    # retrieve the user object from db
    with app.app_context():
        q = db.session.query(User).filter(User.email == '*****@*****.**')
        user = q.first()

    # add the run
    with app.app_context():
        new_run(user)

    # retrieve the run
    with app.app_context():
        q = db.session.query(Run).filter(Run.id == 1)  # should be the first
        run = q.first()

    # retrieve run page
    reply = tested_app.get(
        '/run/1')  # should be one, because the database is empty
    assert reply.status_code == 200

    # check the correctness of the fields
    assert get_element_by_id('start_date',
                             str(reply.data)) == str(run.start_date)
    assert get_element_by_id('distance', str(reply.data)) == str(run.distance)
    assert get_element_by_id('elapsed_time',
                             str(reply.data)) == str(run.elapsed_time // 60)
    assert get_element_by_id('average_speed',
                             str(reply.data)) == str(run.average_speed)
    assert get_element_by_id('average_heartrate',
                             str(reply.data)) == str(run.average_heartrate)
    assert get_element_by_id('total_elevation_gain',
                             str(reply.data)) == str(run.total_elevation_gain)

    # retrieving not existing run
    reply = tested_app.get('/run/45678')
    assert reply.status_code == 404
Exemple #8
0
def test_prepare_body(client):
    tested_app, app = client

    reply = create_user(tested_app)  # creates a user with '*****@*****.**' as email, default
    assert reply.status_code == 200

    reply = login(tested_app, '*****@*****.**', '123456')
    assert reply.status_code == 200

    with app.app_context():
        user = db.session.query(User).filter(User.email == '*****@*****.**').first()
        run = new_predefined_run(user)
        assert db.session.query(Run).filter(Run.runner_id == user.id).first() is not None

    assert prepare_body(user, app) == "name: Run 10\ndistance: 50000.0\nstart_date: "+str(run.start_date)+"\n" \
                                      "average_speed: 12.820512820512821\nelapsed_time: 3900.0\naverage_heartrate: None" \
                                      "\ntotal_elevation_gain: 3.0\n\n\n"
def test_create_objective(client):
    tested_app, app = client

    # test for create_objective having not logged in
    reply = tested_app.post('/create_objective')
    assert reply.status_code == 401

    # create a new user
    reply = create_user(tested_app)
    assert reply.status_code == 200

    reply = login(tested_app, email='*****@*****.**', password='******')
    assert reply.status_code == 200

    # test for create_objective logged in but without data
    reply = tested_app.post('/create_objective')
    assert reply.status_code == 400

    # test for create_objective logged in with wrong data
    reply = tested_app.post('/create_objective',
                            data=dict(start_date="asd", name="Wrong test1"))
    assert reply.status_code == 400

    reply = tested_app.post('/create_objective',
                            data=dict(end_date="asd", name="Wrong test2"))
    assert reply.status_code == 400

    reply = tested_app.post('/create_objective',
                            data=dict(target_distance=-20, name="Wrong test3"))
    assert reply.status_code == 400

    # end date before start date
    reply = tested_app.post('/create_objective',
                            data=dict(start_date="2018-07-04",
                                      end_date="2017-07-04",
                                      name="Wrong test3"))
    assert reply.status_code == 400

    # test for create_objective logged in with wrong data
    reply = tested_app.post('/create_objective',
                            data=dict(start_date="2018-07-04",
                                      end_date="2018-07-05",
                                      target_distance=22,
                                      name="Test OK"))
    assert reply.status_code == 200
def test_runs_data(client):
    tested_app, app = client

    assert create_user(tested_app).status_code == 200

    # trying to retrieve data without logging in
    reply = tested_app.post('run/statistics',
                            data=json.dumps({
                                'runs': [1, 2, 3, 4, 5],
                                'params': [True, True, True]
                            }),
                            content_type='application/json')
    assert reply.status_code == 401

    assert login(tested_app, email='*****@*****.**',
                 password='******').status_code == 200

    # creating some fake runs
    with app.app_context():
        q = db.session.query(User).filter(User.email == '*****@*****.**')
        user = q.first()
        run1 = new_predefined_run(user)  # run with id 1
        run2 = new_predefined_run(user)  # run with id 2
        run3 = new_predefined_run(user)  # run with id 3
        run4 = new_predefined_run(user)  # run with id 4
        run5 = new_predefined_run(user)  # run with id 5

    reply = tested_app.post('run/statistics',
                            data=json.dumps({
                                'runs': [1, 2, 3, 4, 5],
                                'params': [True, True, True]
                            }),
                            content_type='application/json')

    assert reply.status_code == 200
    body = json.loads(str(reply.data, 'utf8'))
    assert body == {
        '1': [12.820512820512821, 50000.0, 3900.0, 'Run 10'],
        '2': [12.820512820512821, 50000.0, 3900.0, 'Run 10'],
        '3': [12.820512820512821, 50000.0, 3900.0, 'Run 10'],
        '4': [12.820512820512821, 50000.0, 3900.0, 'Run 10'],
        '5': [12.820512820512821, 50000.0, 3900.0, 'Run 10']
    }
def test_logout(client):
    tested_app, app = client

    # logout without log in
    assert logout(tested_app).status_code == 401

    # creates '*****@*****.**' with psw '123456'
    assert create_user(tested_app).status_code == 200

    # in the db exists '*****@*****.**' and '*****@*****.**' (the admin)

    # logging in correctly
    reply = login(tested_app, email='*****@*****.**', password='******')
    assert reply.status_code == 200

    # logout correctly
    assert logout(tested_app).status_code == 200

    # trying to access a page the require login
    assert tested_app.get('/delete_user').status_code == 401
def test_view_objectives(client):
    tested_app, app = client

    with app.app_context():
        # create a new user
        reply = create_user(tested_app)
        assert reply.status_code == 200

        reply = login(tested_app, email='*****@*****.**', password='******')
        assert reply.status_code == 200

        # retrieve the user object
        q = db.session.query(User).filter(User.email == '*****@*****.**')
        user = q.first()

        # add the objective
        new_objective(user, name="Test1")
        new_objective(user, name="Test2")
        new_objective(user, name="Test3")
        new_objective(user, name="Test4")

        # retrieve the objective table
        objectives = db.session.query(Objective)

        reply = tested_app.get('objectives')
        assert reply.status_code == 200

        for o in objectives.all():
            assert get_element_by_id("objective_%s_name" % (o.id),
                                     str(reply.data)) == str(o.name)
            assert get_element_by_id("objective_%s_start_date" % (o.id),
                                     str(reply.data)) == str(o.start_date)
            assert get_element_by_id("objective_%s_end_date" % (o.id),
                                     str(reply.data)) == str(o.end_date)
            assert get_element_by_id("objective_%s_target_distance" % (o.id),
                                     str(reply.data)) == str(o.target_distance)
            assert get_element_by_id("objective_%s_completion" % (o.id),
                                     str(reply.data)) == str(o.completion)
def test_check_objective_completion(client):
    tested_app, app = client

    # create a new user
    reply = create_user(tested_app)
    assert reply.status_code == 200

    # login as new user
    reply = login(tested_app, email='*****@*****.**', password='******')
    assert reply.status_code == 200

    with app.app_context():
        # retrieve the user object and login
        user = db.session.query(User).filter(
            User.email == '*****@*****.**').first()

        # check an objective with completion = 0%
        objective_1 = new_objective(user,
                                    start_date=datetime.now(),
                                    end_date=datetime.now() +
                                    timedelta(days=7),
                                    target_distance=3000)
        assert objective_1.completion == 0

        # create some test runs
        new_run(user,
                distance=500,
                elapsed_time=1024,
                start_date=datetime.now())
        new_run(user,
                distance=10,
                elapsed_time=660,
                start_date=datetime.now() + timedelta(days=2))
        new_run(user,
                distance=30,
                elapsed_time=2048,
                start_date=datetime.now() + timedelta(days=4))

        # check an objective with completion 50%
        objective_2 = new_objective(user,
                                    start_date=datetime.now(),
                                    end_date=datetime.now() +
                                    timedelta(days=1),
                                    target_distance=1000)
        assert objective_2.completion == 50

        # check an objective with completion of 100%
        objective_3 = new_objective(user,
                                    start_date=datetime.now(),
                                    end_date=datetime.now() +
                                    timedelta(days=1),
                                    target_distance=400)
        assert objective_3.completion == 100

        # check an objective with completion of 100% with exactly the km needed to complete it
        objective_4 = new_objective(user,
                                    start_date=datetime.now(),
                                    end_date=datetime.now() +
                                    timedelta(days=5),
                                    target_distance=540)
        assert objective_4.completion == 100
def test_create_challenge(client):
    tested_app, app = client

    # test for create_challenge having not logged in
    reply = tested_app.get('/create_challenge')
    assert reply.status_code == 401

    # test for /challenge , list of all user challenges having not logged in
    reply = tested_app.get('/challenge')
    assert reply.status_code == 401

    # test for comparison of runs in a challenge having not logged in
    reply = tested_app.get('/challenge/1')
    assert reply.status_code == 401

    reply = create_user(tested_app,
                        email='*****@*****.**',
                        firstname='mariacristina',
                        lastname='uccheddu',
                        password='******',
                        age=23,
                        weight=70,
                        max_hr=120,
                        rest_hr=60,
                        vo2max=99)

    assert login(tested_app, '*****@*****.**', 'ciao').status_code == 200

    # test for comparison of runs in a challenge logged in but the challenge doesn't exists
    reply = tested_app.get('/challenge/1')
    assert reply.status_code == 404

    # test for /challenge , list of all user challenges having logged in , return the vision of an empty list, you can see only the title of the page
    reply = tested_app.get('/challenge')
    assert reply.status_code == 200

    reply = tested_app.post('create_challenge',
                            data=dict(run_one="0", run_two="0"))
    assert reply.status_code == 400

    with app.app_context():
        query = db.session.query(User).filter(
            User.email == '*****@*****.**')
        user = query.first()
        new_run(user)
        new_run(user)
        new_run(user)

        var = 0
        reply = tested_app.post('create_challenge',
                                data=dict(run_one="1", run_two="1"))
        assert reply.status_code == 400

        reply = tested_app.post('create_challenge',
                                data=dict(run_one="1", run_two="2"))
        assert reply.status_code == 200
        var = var + 1

        challenge = db.session.query(Challenge).filter(
            Challenge.id == var).first()
        assert challenge.run_one == 1
        assert challenge.run_two == 2

        reply = tested_app.post('create_challenge',
                                data=dict(run_one="1", run_two="3"))
        assert reply.status_code == 200
        var = var + 1

        challenge = db.session.query(Challenge).filter(
            Challenge.id == var).first()
        assert challenge.run_one == 1
        assert challenge.run_two == 3

        reply = tested_app.post('create_challenge',
                                data=dict(run_one="1", run_two="40"))
        assert reply.status_code == 400

        reply = tested_app.post('create_challenge',
                                data=dict(run_one="40", run_two="0"))
        assert reply.status_code == 400

        reply = tested_app.post('create_challenge',
                                data=dict(run_one="90", run_two="90"))
        assert reply.status_code == 400

        # test for /challenge , list of all user challenges having logged in , return the vision of an empty list, you can see only the title of the page
        reply = tested_app.get('/challenge')
        assert reply.status_code == 200

        reply = tested_app.get('/challenge/1')
        assert reply.status_code == 200

        reply = tested_app.get('/challenge/40')
        assert reply.status_code == 404