Ejemplo n.º 1
0
def test__upload__upload_RadioField(client, faker, required, value, should_be_loaded):
    user = login(client, faker)
    study = faker.get_test_study(collaborator=user)

    field = faker.get_test_field(field_group=study.field_group, field_type=FieldType.get_radio(), choices="xy|z", required=required)

    _do_upload_field(client, faker, study, should_be_loaded, field, value)
Ejemplo n.º 2
0
def test__upload__upload_FileField(client, faker, required, allowed_file_extensions, file_sent, extension, should_be_loaded):
    user = login(client, faker)
    study = faker.get_test_study(collaborator=user)

    field = faker.get_test_field(field_group=study.field_group, field_type=FieldType.get_file(), allowed_file_extensions=allowed_file_extensions, required=required)

    content = faker.text()
    filename = faker.file_name(extension=extension)

    resp = _do_upload(
        client,
        faker,
        study.id,
        field_name=field.field_name,
        field_value=(
            BytesIO(content.encode('utf-8')),
            filename
        ),
    )

    if should_be_loaded:
        assert__redirect(resp, endpoint='ui.index')

        _assert_uploaded_file(study, field, filename=filename, content=content)

    else:
        assert resp.status_code == status.HTTP_200_OK

        assert__error__message(resp.soup, field.field_name)
        _assert_upload_not_saved(study)
Ejemplo n.º 3
0
def test__upload__upload_IntegerField(client, faker, required, value, should_be_loaded):
    user = login(client, faker)
    study = faker.get_test_study(collaborator=user)

    field = faker.get_test_field(field_group=study.field_group, field_type=FieldType.get_integer(), required=required)

    _do_upload_field(client, faker, study, should_be_loaded, field, value)
Ejemplo n.º 4
0
def test__study_csv__download(client, faker, upload_count):
    user = login(client, faker)
    uploads = []

    study = faker.get_test_study(owner=user)

    for _ in range(upload_count):
        upload = faker.get_test_upload(study=study, uploader=user)
        uploads.append(upload)

    resp = client.get(_url(study_id=study.id))

    assert resp.status_code == status.HTTP_200_OK

    decoded_content = resp.data.decode("utf-8")

    rows = list(csv.reader(StringIO(decoded_content), delimiter=","))

    assert rows[0] == [
        "upload_id",
        "study_name",
        "Study Number",
        "uploaded_by",
        "date_created",
    ]

    for u, row in zip(uploads, rows[1:]):
        assert row[0] == str(u.id)
        assert row[1] == u.study.name
        assert row[2] == u.study_number
        assert row[3] == u.uploader.full_name
        assert row[4] == u.date_created.strftime("%Y-%m-%d %H:%M:%S.%f")
Ejemplo n.º 5
0
def test__study_list__owned_study__upload_count(client, faker, outstanding,
                                                completed, deleted):
    user = login(client, faker)
    user2 = faker.get_test_user()

    study = faker.get_test_study(owner=user)
    study2 = faker.get_test_study(owner=user)

    # Cycle is used to alternately allocate
    # the uploads to a different user
    # thus we can test that we can see
    # uploads by users other than ourselves
    users = cycle([user, user2])

    for _ in range(outstanding):
        u = faker.get_test_upload(study=study, uploader=next(users))

    for _ in range(completed):
        u = faker.get_test_upload(study=study,
                                  completed=True,
                                  uploader=next(users))

    for _ in range(deleted):
        u = faker.get_test_upload(study=study,
                                  deleted=True,
                                  uploader=next(users))

    resp = get_and_assert_standards(client, _url(), user)

    assert resp.status_code == status.HTTP_200_OK

    study_row = resp.soup.find("td", string=study.name).parent

    assert study_row.find_all("td")[2].string == str(outstanding + completed)
    assert study_row.find_all("td")[3].string == str(outstanding)
Ejemplo n.º 6
0
def test__upload__form_dynamic_multiple(client, faker):
    user = login(client, faker)

    study = faker.get_test_study(collaborator=user)

    field1 = faker.get_test_field(
        field_type=FieldType.get_textarea(),
        field_group=study.field_group,
        order=1,
    )
    field2 = faker.get_test_field(
        field_type=FieldType.get_string(),
        field_group=study.field_group,
        order=2,
    )

    resp = _get(client, _url(study_id=study.id), user, study)

    f1 = resp.soup.find(id=field1.field_name)

    assert f1
    assert f1.name == "textarea"

    f2 = f1.find_next(id=field2.field_name)

    assert f2
    assert f2.name == "input"
    assert f2["type"] == "text"
Ejemplo n.º 7
0
def test__my_uploads__search__pages(client, faker, uploads):
    user = login(client, faker)
    study = faker.get_test_study(collaborator=user)
    my_uploads = [faker.get_test_upload(study=study, uploader=user, study_number="fred") for _ in range(uploads)]
    other = [faker.get_test_upload(study=study, uploader=user, study_number="margaret") for _ in range(100)]

    assert__page_navigation(client, _url(study_id=study.id, search='fred', _external=False), uploads)
Ejemplo n.º 8
0
def test__my_uploads(client, faker, mine, others, deleted):
    user = login(client, faker)

    user2 = faker.get_test_user()
    study = faker.get_test_study(collaborator=user)

    uploads = []

    for _ in range(mine):
        u = faker.get_test_upload(study=study, uploader=user)
        uploads.append(u)

    for _ in range(others):
        u = faker.get_test_upload(completed=True, uploader=user2)

    # Cycle is used to alternately allocate
    # the uploads to a different user
    # thus we can test that we can see
    # uploads by users other than ourselves
    users = cycle([user, user2])

    for _ in range(deleted):
        u = faker.get_test_upload(uploader=next(users), deleted=True)

    resp = _get(client, _url(study_id=study.id), user, study)

    _assert_response(resp, study, uploads)
Ejemplo n.º 9
0
def test__upload__upload_StringField(client, faker, required, max_length, value, should_be_loaded):
    user = login(client, faker)
    study = faker.get_test_study(collaborator=user)

    field = faker.get_test_field(field_group=study.field_group, field_type=FieldType.get_string(), max_length=max_length, required=required)

    _do_upload_field(client, faker, study, should_be_loaded, field, value)
Ejemplo n.º 10
0
def test_user_meta_update_web(db, app):
    users = [create_user(db) for x in range(0, 8)]
    old_onlines = {}

    for user in users:
        with app.test_client() as client:
            old_onlines[user.id] = user.last_online.timestamp()
            login(user.username, "password", client=client)
            rv = client.get("/")
            assert rv.status_code == 200

    update_user_meta()
    db.expire_all()

    for uid, oldtime in old_onlines.items():
        updated = db.query(User).filter(User.id == uid).one()
        check_valid_time(oldtime, updated.last_online.timestamp())
Ejemplo n.º 11
0
def test_user_meta_update_web(db, app):
    users = [create_user(db) for x in range(0, 8)]
    old_onlines = {}

    for user in users:
        with app.test_client() as client:
            old_onlines[user.id] = user.last_online.timestamp()
            login(user.username, "password", client=client)
            rv = client.get("/")
            assert rv.status_code == 200

    update_user_meta()
    db.expire_all()

    for uid, oldtime in old_onlines.items():
        updated = db.query(User).filter(User.id == uid).one()
        check_valid_time(oldtime, updated.last_online.timestamp())
Ejemplo n.º 12
0
def test__study_list__no_studies__no_display(client, faker):
    user = login(client, faker)

    resp = get_and_assert_standards(client, _url(), user)

    assert resp.status_code == status.HTTP_200_OK
    assert resp.soup.find("h2", string="Owned Studies") is None
    assert resp.soup.find("h2", string="Collaborating Studies") is None
    assert len(resp.soup.find_all("table", "table study_list")) == 0
Ejemplo n.º 13
0
def test__upload__form_study_number(client, faker):
    user = login(client, faker)

    study = faker.get_test_study(collaborator=user)

    resp = _get(client, _url(study_id=study.id), user, study)

    sn = resp.soup.find("input", id="study_number")

    assert sn
    assert sn["type"] == "text"
Ejemplo n.º 14
0
def test__my_uploads__search_study_number(client, faker):
    user = login(client, faker)

    study = faker.get_test_study(collaborator=user)

    upload_matching = faker.get_test_upload(study=study, study_number="fred", uploader=user)
    upload_unmatching = faker.get_test_upload(study=study, study_number="margaret", uploader=user)

    resp = _get(client, _url(study_id=study.id, search='fred'), user, study)

    _assert_response(resp, study, [upload_matching])
Ejemplo n.º 15
0
def test__upload__upload_study_number__duplicate_allowed(client, faker):
    user = login(client, faker)
    study = faker.get_test_study(collaborator=user, allow_duplicate_study_number=True)
    upload = faker.get_test_upload(study=study)

    resp = _do_upload(client, faker, upload.study.id, study_number=upload.study_number)
    assert__redirect(resp, endpoint='ui.index')

    assert Upload.query.filter(
        Upload.study_number == upload.study_number
    ).count() == 2
Ejemplo n.º 16
0
def test__upload__upload_study_number(client, faker):
    user = login(client, faker)
    study = faker.get_test_study(collaborator=user)

    study_number = faker.pystr(min_chars=5, max_chars=10)

    resp = _do_upload(client, faker, study.id, study_number=study_number)
    assert__redirect(resp, endpoint='ui.index')

    assert Upload.query.filter(
        Upload.study_number == study_number and Upload.study_id == study.id
    ).first()
Ejemplo n.º 17
0
def test__upload__upload_study_number__duplicate_on_other_study(client, faker):
    user = login(client, faker)
    study2 = faker.get_test_study(collaborator=user)
    study1 = faker.get_test_study(collaborator=user)
    upload = faker.get_test_upload(study=study1)

    resp = _do_upload(client, faker, study2.id, study_number=upload.study_number)
    assert__redirect(resp, endpoint='ui.index')

    assert Upload.query.filter(
        Upload.study_number == upload.study_number and Upload.study_id == study2.id
    ).first()
Ejemplo n.º 18
0
def test__upload__upload_study_number__matches_format(client, faker):
    user = login(client, faker)
    study = faker.get_test_study(collaborator=user, study_number_format='Tst\\d{8}[A-Z]')

    study_number = "Tst12345678X"

    resp = _do_upload(client, faker, study.id, study_number=study_number)
    assert__redirect(resp, endpoint='ui.index')

    assert Upload.query.filter(
        Upload.study_number == study_number and Upload.study_id == study.id
    ).first()
Ejemplo n.º 19
0
def test__upload__complete__must_be_owner(client, faker):
    user = login(client, faker)
    study = faker.get_test_study(collaborator=user)

    upload = faker.get_test_upload(study=study)

    resp = client.post(_url(upload_id=upload.id), data={"id": upload.id})

    assert resp.status_code == status.HTTP_403_FORBIDDEN

    changed_upload = Upload.query.get(upload.id)

    assert not changed_upload.completed
Ejemplo n.º 20
0
def test__upload__complete(client, faker):
    user = login(client, faker)
    study = faker.get_test_study(owner=user)
    upload = faker.get_test_upload(study=study)

    resp = client.post(
        _url(upload_id=upload.id),
        data={"id": upload.id},
        headers={'Referer': faker.test_referrer()},
    )
    assert__redirect(resp, url=faker.test_referrer())

    changed_upload = Upload.query.get(upload.id)

    assert changed_upload.completed
Ejemplo n.º 21
0
def test__upload__upload_study_number__duplicate_not_allowed(client, faker):
    user = login(client, faker)
    study = faker.get_test_study(collaborator=user)
    upload = faker.get_test_upload(study=study)

    resp = _do_upload(client, faker, upload.study.id, study_number=upload.study_number)

    assert resp.status_code == status.HTTP_200_OK

    e = resp.soup.find("div", class_="alert")
    assert 'Study Number' in e.text

    assert Upload.query.filter(
        Upload.study_number == upload.study_number
    ).count() == 1
Ejemplo n.º 22
0
def test__upload__upload_study_number__not_matches_format(client, faker):
    user = login(client, faker)
    study = faker.get_test_study(collaborator=user, study_number_format='Tst\\d{8}[A-Z]')

    study_number = "Tst12345678"

    resp = _do_upload(client, faker, study.id, study_number=study_number)

    assert resp.status_code == status.HTTP_200_OK

    e = resp.soup.find("div", class_="alert")
    assert 'Study Number' in e.text

    assert Upload.query.filter(
        Upload.study_number == study_number
    ).count() == 0
Ejemplo n.º 23
0
def test__upload__upload_BooleanField(client, faker, required, value, should_be_loaded, saved_value):
    user = login(client, faker)
    study = faker.get_test_study(collaborator=user)

    field = faker.get_test_field(field_group=study.field_group, field_type=FieldType.get_boolean(), required=required)

    resp = _do_upload(client, faker, study.id, field_name=field.field_name, field_value=value)

    if should_be_loaded:
        assert__redirect(resp, endpoint='ui.index')

        _assert_uploaded(study, field, value=saved_value)
    else:
        assert resp.status_code == status.HTTP_200_OK

        assert__error__message(resp.soup, field.field_name)
        _assert_upload_not_saved(study)
Ejemplo n.º 24
0
def test__upload__form_dynamic_textarea(client, faker):
    user = login(client, faker)

    study = faker.get_test_study(collaborator=user)

    field = faker.get_test_field(
        field_type=FieldType.get_textarea(),
        field_group=study.field_group,
        order=1,
    )

    resp = _get(client, _url(study_id=study.id), user, study)

    sn = resp.soup.find(id=field.field_name)

    assert sn
    assert sn.name == "textarea"
Ejemplo n.º 25
0
def test__upload__form_dynamic_radio(client, faker):
    user = login(client, faker)

    study = faker.get_test_study(collaborator=user)

    field = faker.get_test_field(
        field_type=FieldType.get_radio(),
        field_group=study.field_group,
        order=1,
        choices="xy|z",
    )

    resp = _get(client, _url(study_id=study.id), user, study)

    sn = resp.soup.find(id=field.field_name)

    assert sn
    assert sn.name == "ul"
    assert sn.find("input", attrs={"type": "radio", "value": "xy"})
    assert sn.find("input", attrs={"type": "radio", "value": "z"})
Ejemplo n.º 26
0
def test__study_list__owns_mult_studies(client, faker, study_count):
    user = login(client, faker)
    studies = []

    for _ in range(study_count):
        studies.append(faker.get_test_study(owner=user))

    resp = get_and_assert_standards(client, _url(), user)

    assert resp.status_code == status.HTTP_200_OK
    assert resp.soup.find("h2", string="Owned Studies") is not None
    assert resp.soup.find("h2", string="Collaborating Studies") is None
    assert len(resp.soup.select("table.table")) == 1
    assert len(resp.soup.select("table.table > tbody > tr")) == study_count

    for s in studies:
        assert resp.soup.find("a", href=url_for("ui.study",
                                                study_id=s.id)) is not None
        assert (resp.soup.find("a",
                               href=url_for("ui.study_csv", study_id=s.id))
                is not None)
        assert resp.soup.find("td", string=s.name) is not None
Ejemplo n.º 27
0
def test__study_list__owns_1_study_redirects(client, faker):
    user = login(client, faker)
    study = faker.get_test_study(owner=user)

    resp = client.get(_url())
    assert__redirect(resp, endpoint='ui.study', study_id=study.id)
Ejemplo n.º 28
0
def test__my_uploads__pages(client, faker, uploads):
    user = login(client, faker)
    study = faker.get_test_study(collaborator=user)
    my_uploads = [faker.get_test_upload(study=study, uploader=user) for _ in range(uploads)]

    assert__page_navigation(client, _url(study_id=study.id, _external=False), uploads)
Ejemplo n.º 29
0
def test_account_login(client, normal_user):
    rv = login(normal_user.username, "password", client)
    assert b"log_out" in rv.data
Ejemplo n.º 30
0
def user_client(app, normal_user):
    with app.test_client() as client:
        login(normal_user.username, "password", client=client)
        client.user = normal_user
        yield client
Ejemplo n.º 31
0
def test_account_login(client, normal_user):
    rv = login(normal_user.username, "password", client)
    assert b"log_out" in rv.data
Ejemplo n.º 32
0
def admin_client(app, admin_user):
    with app.test_client() as client:
        login(admin_user.username, "password", client=client)
        client.user = admin_user
        yield client