def test_weird_chars_large_set(db_test_client, random_roles=True):
    from application import db
    username = "******"
    password = "******"
    first = "ääöäöpöpäÖPLÄPLÄ"
    last = "ÄÅÄÖÖÖÄÅ,.1,.,ösa"
    db.insert_user(username, password, first, last)
    a1 = db.get_user(username, password)
    assert a1.first_name == first
    assert a1.last_name == last
    null = db.get_user("something", "something")
    assert null == None

    usernames = []
    passwords = []
    firsts = []
    lasts = []
    roles = []
    for i in range(20):
        username = get_random_unicode(30)
        password = get_random_unicode(30)

        first = get_random_unicode(20)
        last = get_random_unicode(35)

        usernames.append(username)
        passwords.append(password)
        firsts.append(first)
        lasts.append(last)
        if random_roles:
            role = choice(["USER", "TEACHER"])
        else:
            a = ["TEACHER", "USER"]
            role = a[i % 2]
        roles.append(role)

        db.insert_user(username, password, first, last, role=role)

    ids = []
    for username, password, first, last, role in zip(usernames, passwords,
                                                     firsts, lasts, roles):
        acc = db.get_user(username, password)
        assert acc is not None

        assert acc.last_name == last
        assert acc.first_name == first
        assert acc.role == role

        acc2 = db.get_user_by_id(acc.id)

        assert acc2.id == acc.id
        assert acc.id not in ids

        assert acc.last_name == acc2.last_name
        assert acc.first_name == acc2.first_name
        assert acc.role == acc2.role
        assert acc.name == acc2.name

        ids.append(acc.id)
    return ids
Exemple #2
0
def test_large_course_insert(db_test_client):
    from application import db
    teachers = []
    for _ in range(random.randint(18,23)):
        username = get_random_unicode(35)
        password = get_random_unicode(30)
        first = get_random_unicode(15)
        last = get_random_unicode(25)

        db.insert_user(username, password, first, last, role="TEACHER")
        acc = db.get_user(username, password)
        assert acc.name == username
        assert acc.role == "TEACHER"
        teachers.append(acc)
    teach_courses = {}
    for t in teachers:
        teach_courses[t.id]=[]
        for _ in range(random.randint(12,20)):
            course = Course(get_random_unicode(20), get_random_unicode(40), random_datetime())
            id, code = db.insert_course(course, t.id)
            course.id = id
            course.code = code
            teach_courses[t.id].append(course)
    random.shuffle(teachers)
    for t in teachers:
        db_courses = db.select_courses_teacher(t.id)
        assert len(db_courses)>=12
        case = unittest.TestCase()
        case.assertCountEqual(db_courses, teach_courses[t.id])
    return teachers
Exemple #3
0
def test_select_file_details_multiple(db_test_client):
    from application import db
    db.insert_user("turha", "turha", "turha", "turha", role="TEACHER")
    user_id = db.get_user("turha","turha").id
    case = unittest.TestCase()
    case.maxDiff = None
    c_id, _ =db.insert_course(Course("something","somthing", datetime.datetime.now()),user_id)
    for _ in range(20):

        id_dic = create_dummy(db, user_id=user_id, course=c_id)
        correct_files= []
        for i in range(20):
            rand_bytes= os.urandom(20)
            name = "task"+str(id_dic["task_id"])+str(i)
            id = file_insert_helper(db,binary_file=rand_bytes, task_id=id_dic["task_id"], name=name, user_id=user_id)
            correct_files.append(File(id, name, datetime.datetime.now()))
        files = db.select_file_details(task_id=id_dic["task_id"])
        assert len(files) == 20
        
        case.assertCountEqual(files, correct_files)
        
        correct_bytes, _ = db.get_file(id)
        assert rand_bytes == correct_bytes

        rand_bytes= os.urandom(20)
        id = file_insert_helper(db,binary_file=rand_bytes,submit_id=id_dic["submit_id"], name="submit_id"+str(id_dic["submit_id"]), user_id=user_id)
        sub_id = id_dic["submit_id"]
        files = db.select_file_details(submit_id=sub_id)
        assert len(files) == 1
        assert files[0].name == "submit_id"+str(id_dic["submit_id"])
        assert files[0].id == id
        correct_bytes, _ = db.get_file(id)
        assert rand_bytes == correct_bytes


        rand_bytes= os.urandom(20)
        id = file_insert_helper(db,binary_file=rand_bytes,assignment_id=id_dic["assignment_id"], name="assignment_id"+str(id_dic["task_id"]), user_id=user_id)
        files = db.select_file_details(assignment_id=id_dic["assignment_id"])
        assert len(files) == 1
        assert files[0].name == "assignment_id"+str(id_dic["assignment_id"])
        assert files[0].id == id
        correct_bytes, _ = db.get_file(id)
        assert rand_bytes == correct_bytes

        rand_bytes= os.urandom(20)
        id = file_insert_helper(db,binary_file=rand_bytes,answer_id=id_dic["answer_id"], name="answer_id"+str(id_dic["task_id"]), user_id=user_id)
        files = db.select_file_details(answer_id=id_dic["answer_id"])
        assert len(files) == 1
        assert files[0].name == "answer_id"+str(id_dic["answer_id"])
        assert files[0].id == id
        correct_bytes, _ = db.get_file(id)
        assert rand_bytes == correct_bytes
Exemple #4
0
def test_db_file_insert_constraint(db_test_client):
    from application import db
    s="nothing"
    db.insert_user(s,s,s,s,role="TEACHER")
    user_id = db.get_user(s,s).get_id()

    with pytest.raises(IntegrityError):
        file_insert_helper(db, user_id=user_id, binary_file=io.BytesIO(b"helvetin turhia bitteja").read())

    sql = Select([db.file])
    with db.engine.connect() as conn:
        rs = conn.execute(sql)
        row = rs.first()
        assert row is None
Exemple #5
0
def test_select_file_details_single(db_test_client):
    from application import db
    db.insert_user("turha", "turha", "turha", "turha", role="TEACHER")
    user_id = db.get_user("turha","turha").id
    c_id, _ =db.insert_course(Course("something","somthing", datetime.datetime.now()),user_id)
    for _ in range(20):

        id_dic = create_dummy(db, user_id=user_id, course=c_id)
        rand_bytes= os.urandom(20)
        id = file_insert_helper(db,binary_file=rand_bytes, task_id=id_dic["task_id"], name="task"+str(id_dic["task_id"]), user_id=user_id)
        files = db.select_file_details(task_id=id_dic["task_id"])
        assert len(files) == 1
        assert files[0].name == "task"+str(id_dic["task_id"])
        assert files[0].id == id
        assert rand_bytes, _ == db.get_file(id)

        rand_bytes= os.urandom(20)
        id = file_insert_helper(db,binary_file=rand_bytes,submit_id=id_dic["submit_id"], name="submit_id"+str(id_dic["submit_id"]), user_id=user_id)
        sub_id = id_dic["submit_id"]
        files = db.select_file_details(submit_id=sub_id)
        assert len(files) == 1
        assert files[0].name == "submit_id"+str(id_dic["submit_id"])
        assert files[0].id == id
        assert rand_bytes, _ == db.get_file(id)


        rand_bytes= os.urandom(20)
        id = file_insert_helper(db,binary_file=rand_bytes,assignment_id=id_dic["assignment_id"], name="assignment_id"+str(id_dic["task_id"]), user_id=user_id)
        files = db.select_file_details(assignment_id=id_dic["assignment_id"])
        assert len(files) == 1
        assert files[0].name == "assignment_id"+str(id_dic["assignment_id"])
        assert files[0].id == id
        db_bytes, name = db.get_file(id)
        
        assert rand_bytes == db_bytes

        rand_bytes= os.urandom(20)
        id = file_insert_helper(db,binary_file=rand_bytes,answer_id=id_dic["answer_id"], name="answer_id"+str(id_dic["task_id"]), user_id=user_id)
        files = db.select_file_details(answer_id=id_dic["answer_id"])
        assert len(files) == 1
        assert files[0].name == "answer_id"+str(id_dic["answer_id"])
        assert files[0].id == id
        assert rand_bytes, _ == db.get_file(id)
def test_user_insert(db_test_client):
    from application import db
    db.insert_user("oppilas", "oppilas", "Tessa", "Testaaja")
    with pytest.raises(IntegrityError):
        db.insert_user("oppilas", "oppilas", "Tessa", "Testaaja")
    j = db.account.join(db.role)
    sql = Select([func.count(db.account.c.username),
                  db.role.c.name]).select_from(j)
    with db.engine.connect() as conn:
        rs = conn.execute(sql)
        row = rs.first()
        count = row[0]
        role = row[1]
        assert 1 == count
        assert "USER" == role
    db.insert_user("opettaja", "opettaja", "Essi", "Esimerkki", role="TEACHER")
    sql = Select([func.count(db.account.c.username), db.role.c.name
                  ]).select_from(j).where(db.role.c.name == "TEACHER")
    with db.engine.connect() as conn:
        rs = conn.execute(sql)
        row = rs.first()
        count = row[0]
        role = row[1]
        assert 1 == count
        assert "TEACHER" == role

    student = db.get_user_by_id(1)
    teacher = db.get_user_by_id(2)
    null = db.get_user_by_id(3)
    assert student.name == "oppilas"
    assert teacher.name == "opettaja"
    assert null == None
Exemple #7
0
def register():
    if request.method == "GET":
        return render_template("auth/register.html", form=RegisterForm())
    form = RegisterForm(request.form)
    if not form.validate():  # form validation checks if username is free
        return render_template("auth/register.html", form=form), 409
    try:

        if form.student.data:
            db.insert_user(form.username.data, form.password.data,
                           form.first_name.data, form.last_name.data)
        else:
            db.insert_user(form.username.data,
                           form.password.data,
                           form.first_name.data,
                           form.last_name.data,
                           role="TEACHER")
        return redirect(url_for("index"))
    except ValueError:
        return render_template("auth/register.html",
                               form=RegisterForm(),
                               error="Username in use"), 422
Exemple #8
0
def test_large_assignment_timezone_helsinki(db_test_client, files=[]):
    from application import db
    db.insert_user("opettaja1", "opettaja", "Who", "Cares", role="TEACHER")
    db.insert_user("opettaja2", "opettaja", "Who", "Cares", role="TEACHER")
    db.insert_user("opettaja3", "opettaja", "Who", "Cares", role="TEACHER")
    db.insert_user("opettaja4", "opettaja", "Who", "Cares", role="TEACHER")

    teacher1 = db.get_user("opettaja1", "opettaja")
    teacher2 = db.get_user("opettaja2", "opettaja")
    teacher3 = db.get_user("opettaja3", "opettaja")
    teacher4 = db.get_user("opettaja4", "opettaja")
    teachers = [teacher1, teacher2, teacher3, teacher4]

    assert teacher1 is not None
    assert teacher2 is not None
    assert teacher3 is not None
    assert teacher4 is not None

    teacher_assigments = []
    for teacher in teachers:
        all_assignments = {}
        visible_assignments = {}
        course_ids = insert_random_courses(teacher.id, db)
        assert len(course_ids) > 0
        for _ in range(random.randint(12, 21)):  #insert assignments
            name = get_random_unicode(15)
            course_id = random.choice(course_ids)
            if random.randint(0, 1) or not visible_assignments.get(course_id):
                visible = True
                reveal = pytz.timezone("Europe/Helsinki").localize(
                    datetime.datetime.now()) - datetime.timedelta(minutes=1)
            else:
                visible = False
                reveal = pytz.timezone("Europe/Helsinki").localize(
                    datetime.datetime.now()) + datetime.timedelta(
                        hours=random.randint(3, 5), minutes=1)
            deadline = random_datetime(start=reveal,
                                       time_zone="Europe/Helsinki")

            assig_id = db.insert_assignment(teacher1.id, course_id, name,
                                            deadline, reveal, files)
            tasks = []
            for _ in range(random.randint(2, 15)):
                task = random_task(assig_id, files)
                task_id = db.insert_task(teacher.id, assig_id,
                                         task.description, task.points, files)
                task.id = task_id
                tasks.append(task)
            result_dict = {
                "teacher_id": teacher.id,
                "id": assig_id,
                "reveal": reveal,
                "deadline": deadline,
                "course_id": course_id,
                "name": name,
                "files": files,
                "tasks": tasks
            }
            if not all_assignments.get(course_id):
                all_assignments[course_id] = [result_dict]
            else:
                all_assignments[course_id].append(result_dict)
            if visible:
                if not visible_assignments.get(course_id):
                    visible_assignments[course_id] = [result_dict]
                else:
                    visible_assignments[course_id].append(result_dict)

        temp = (teacher.id, all_assignments, visible_assignments)
        teacher_assigments.append(temp)

    for teacher_id, all_assignments, visible_assignments in teacher_assigments:
        courses = db.select_courses_teacher(teacher_id)
        assert len(courses)
        course_ids = [c.id for c in courses]
        for key in all_assignments.keys():
            assert key in course_ids
        for course in courses:
            correct_assignments = all_assignments.get(course.id, [])
            correct_visible_assignments = visible_assignments.get(course.id)

            db.set_assignments(course, for_student=False)
            course.set_timezones("Europe/Helsinki")
            assert len(course.assignments) == len(
                correct_assignments), "wrong number of assignments"

            for a in course.assignments:
                assert isinstance(a, Assignment)
                assignment_dic = get_correct_assignment(
                    a.id, correct_assignments)
                assert assignment_dic, "\n".join(
                    format_error(a, correct_assignments))
                assert assignment_dic["id"] == a.id
                assert assignment_dic["teacher_id"] == teacher_id

                assert assignment_dic["course_id"] == course.id
                assert a.deadline == assignment_dic["deadline"]
                assert a.reveal == assignment_dic["reveal"]
                case = unittest.TestCase()
                case.assertCountEqual(assignment_dic["tasks"], a.tasks)

            db.set_assignments(course, for_student=True)
            for a in course.assignments:
                assert isinstance(a, Assignment)
                assignment_dic = get_correct_assignment(
                    a.id, correct_visible_assignments)
                assert assignment_dic, "\n".join(
                    format_error(a, correct_visible_assignments))
                assert assignment_dic["id"] == a.id
                assert assignment_dic["teacher_id"] == teacher_id

                assert assignment_dic["course_id"] == course.id
                assert a.deadline == assignment_dic["deadline"]
                assert a.reveal == assignment_dic["reveal"]
                case = unittest.TestCase()
                case.assertCountEqual(assignment_dic["tasks"], a.tasks)
    return teachers