Beispiel #1
0
def test_orphaned_delete(client_fixture: fixture) -> None:
    response = client_fixture.get("/dash/orphans/delete",
                                  follow_redirects=True)
    assert response.status_code == 200

    assert "Failed to delete orphans. Scheduler offline." in response.get_data(
        as_text=True)
def test_duplicate_task(client_fixture: fixture) -> None:

    # test invalid task
    page = client_fixture.get(url_for("task_controls_bp.duplicate_task",
                                      task_id=99),
                              follow_redirects=True)
    assert page.status_code == 200
    assert "Task does not exist" in page.get_data(as_text=True)

    _, t_id = create_demo_task()
    page = client_fixture.get(url_for("task_controls_bp.duplicate_task",
                                      task_id=t_id),
                              follow_redirects=True)
    assert page.status_code == 200

    assert "- Duplicated" in page.get_data(as_text=True)
def test_table_tasks_files(client_fixture: fixture) -> None:
    from web.model import Task

    task = Task.query.first()
    if task:
        assert (client_fixture.get("/table/task/" + str(task.id) +
                                   "/files").status_code == 200)
def test_enable_task(client_fixture: fixture) -> None:
    _, t_id = create_demo_task()
    page = client_fixture.get(url_for("task_controls_bp.enable_task",
                                      task_id=t_id),
                              follow_redirects=True)
    assert page.status_code == 200
    assert "enabling task" in page.get_data(as_text=True)
def test_run_task(client_fixture: fixture) -> None:

    # test invalid task
    page = client_fixture.get(url_for("task_controls_bp.run_task", task_id=99),
                              follow_redirects=True)
    assert page.status_code == 200
    assert "Task does not exist." in page.get_data(as_text=True)
    assert request.path == url_for("project_bp.new_project_form")

    _, t_id = create_demo_task(2025)

    page = client_fixture.get(url_for("task_controls_bp.run_task",
                                      task_id=t_id),
                              follow_redirects=True)
    assert page.status_code == 200
    assert request.path == url_for("task_bp.one_task", task_id=t_id)
    assert "Failed to run task." in page.get_data(as_text=True)
def test_reset(client_fixture: fixture) -> None:

    # test invalid task
    page = client_fixture.get(url_for("task_controls_bp.reset_task",
                                      task_id=99),
                              follow_redirects=True)
    assert page.status_code == 200
    assert request.path == url_for("task_bp.all_tasks")
    assert "Task does not exist." in page.get_data(as_text=True)

    _, t_id = create_demo_task()
    page = client_fixture.get(url_for("task_controls_bp.reset_task",
                                      task_id=t_id),
                              follow_redirects=True)
    assert page.status_code == 200

    assert "Task has been reset to completed." in page.get_data(as_text=True)
Beispiel #7
0
def test_home_with_project(client_fixture: fixture) -> None:
    # add a task and project
    create_demo_task(2025)

    response = client_fixture.get("/", follow_redirects=True)
    assert response.status_code == 200
    # verify we are on the user project page
    assert response.request.path == "/"
Beispiel #8
0
def test_orphaned_delete_with_scheduler(
        client_fixture: fixture,
        client_fixture_with_scheduler: fixture) -> None:
    response = client_fixture.get("/dash/orphans/delete",
                                  follow_redirects=True)
    assert response.status_code == 200

    assert "Scheduler: orphans deleted!" in response.get_data(as_text=True)
def login(client_fixture: fixture, username: str, password: str) -> Response:
    # 302 becuase tests autologin.
    assert client_fixture.get("/login").status_code == 302

    return client_fixture.post(
        url_for("auth_bp.login"),
        data=dict(user=username, password=password),
        follow_redirects=True,
    )
def test_end_retry(client_fixture: fixture) -> None:

    # test invalid task
    page = client_fixture.get(url_for("task_controls_bp.task_endretry",
                                      task_id=99),
                              follow_redirects=True)
    assert page.status_code == 200
    assert request.path == url_for("task_bp.all_tasks")
    assert "Task does not exist." in page.get_data(as_text=True)

    _, t_id = create_demo_task()
    page = client_fixture.get(url_for("task_controls_bp.task_endretry",
                                      task_id=t_id),
                              follow_redirects=True)
    assert page.status_code == 200

    # this will show in executor messages
    executor = client_fixture.get(url_for("executors_bp.executor_status"))
    assert b"Failed to disable" in executor.data
Beispiel #11
0
def test_one_project(client_fixture: fixture) -> None:
    # get invalid project
    # should redirect to project page and flash error
    page = client_fixture.get(url_for("project_bp.one_project", project_id=99))
    assert page.status_code == 302
    page = client_fixture.get(url_for("project_bp.one_project", project_id=99),
                              follow_redirects=True)
    # no projects exist so go to new project page
    assert page.status_code == 200
    assert request.path == url_for("project_bp.all_projects")
    # print(page.get_data(as_text=True))
    assert "The project does not exist" in page.get_data(as_text=True)

    # try with valid project and task
    p_id, _ = create_demo_task()
    page = client_fixture.get(
        url_for("project_bp.one_project", project_id=p_id))

    assert request.path == url_for("project_bp.one_project", project_id=p_id)
def test_delete_task(client_fixture: fixture) -> None:
    p_id, t_id = create_demo_task()
    page = client_fixture.get(f"/api/add/{t_id}")
    assert page.json == {"message": "Scheduler: task job added!"}
    assert page.status_code == 200

    page = client_fixture.get(f"/api/delete/{t_id}")
    assert page.json == {"message": "Scheduler: task job deleted!"}
    assert page.status_code == 200

    # delete a non-existing job.. all deletions are successful
    page = client_fixture.get(f"/api/delete/-1")
    assert page.json == {"message": "Scheduler: failed to delete job!"}
    assert page.status_code == 200

    # delete a non-existing job.. all deletions are successful
    page = client_fixture.get(f"/api/delete/asdf")
    assert page.json == {"message": "Scheduler: failed to delete job!"}
    assert page.status_code == 200
Beispiel #13
0
def test_edit_project_form(client_fixture: fixture) -> None:
    # test with invalid project
    page = client_fixture.get(
        url_for("project_bp.edit_project_form", project_id=99))
    assert page.status_code == 302
    page = client_fixture.get(url_for("project_bp.edit_project_form",
                                      project_id=99),
                              follow_redirects=True)
    assert page.status_code == 200
    # should be directed to new project if none exist
    assert request.path == url_for("project_bp.all_projects")
    assert "The project does not exist" in page.get_data(as_text=True)

    # try with valid project and task
    p_id, _ = create_demo_task()
    page = client_fixture.get(
        url_for("project_bp.edit_project_form", project_id=p_id))
    assert request.path == url_for("project_bp.edit_project_form",
                                   project_id=p_id)
    assert "Editing" in page.get_data(as_text=True)
def test_delete_task_with_scheduler(
        client_fixture_with_scheduler: fixture) -> None:

    p_id, t_id = create_demo_task()
    page = client_fixture_with_scheduler.get(url_for(
        "task_controls_bp.delete_task", task_id=t_id),
                                             follow_redirects=True)
    assert page.status_code == 200

    assert "Deleting task." in page.get_data(as_text=True)
    assert request.path == url_for("project_bp.one_project", project_id=p_id)
def test_index(client_fixture: fixture) -> None:
    """Verify that redirection to login page works.

    Parameters:
        client_fixture: client fixture
    """
    res = client_fixture.get("/")
    # should redirect to login page
    if not client_fixture.application.config.get("TEST"):
        assert res.status_code == 302
        assert "/login" in res.get_data(as_text=True)
def test_scheduler_task(client_fixture: fixture) -> None:

    # test invalid task
    page = client_fixture.get(url_for("task_controls_bp.schedule_task",
                                      task_id=99),
                              follow_redirects=True)
    assert page.status_code == 200
    assert "Task does not exist." in page.get_data(as_text=True)
    assert request.path == url_for("task_bp.all_tasks")

    _, t_id = create_demo_task(2025)

    page = client_fixture.get(url_for("task_controls_bp.schedule_task",
                                      task_id=t_id),
                              follow_redirects=True)
    assert page.status_code == 200
    assert request.path == url_for("task_bp.one_task", task_id=t_id)
    assert "Scheduling task." in page.get_data(as_text=True)
    # failure message will be in executor.
    executor = client_fixture.get(url_for("executors_bp.executor_status"))
    assert b"Failed to schedule" in executor.data
Beispiel #17
0
def test_get_home(API_test: pytest.fixture) -> None:
    """
    GIVEN a Flask application
    WHEN the '/' page is requested (GET)
    THEN check that {"TASK_LINE": {...}} in response
    """
    response = API_test.get('/')
    data = json.loads(response.data)

    assert response.status_code == 200
    assert "TASK_LINE" in data
    assert data['TASK_LINE'].keys() == tasks.TASK_LINE.keys()
def test_tasks_user(client_fixture: fixture) -> None:
    # remove everyting
    db.session.query(Task).delete(synchronize_session=False)
    db.session.commit()
    db.session.query(Project).delete(synchronize_session=False)
    db.session.commit()
    # check with no tasks
    page = client_fixture.get("/task/user/1", follow_redirects=True)
    assert page.status_code == 200
    # no projects exists so go to new project
    assert request.path == url_for("project_bp.new_project")

    # add a task
    create_demo_task()
    page = client_fixture.get("/task/user/1", follow_redirects=False)
    assert page.status_code == 200

    # bad user
    page = client_fixture.get("/task/user/100", follow_redirects=True)
    assert page.status_code == 200
    assert b"That user does not exist." in page.data
def test_table_project_mine(client_fixture: fixture) -> None:
    page = client_fixture.get("/table/project/mine")
    assert page.status_code == 200
    # check json is usable
    assert len(json.loads(page.get_data(as_text=True)))

    # create a project
    _, t_id = create_demo_task()
    page = client_fixture.get("/table/project/1")
    assert page.status_code == 200
    # check json is usable
    assert len(json.loads(page.get_data(as_text=True)))

    # change task status
    Task.query.filter_by(id=t_id).status_id = 1
    db.session.commit()

    page = client_fixture.get("/table/project/all")
    assert page.status_code == 200
    # check json is usable
    assert len(json.loads(page.get_data(as_text=True)))

    # change task status
    Task.query.filter_by(id=t_id).status_id = 2
    db.session.commit()

    page = client_fixture.get("/table/project/all")
    assert page.status_code == 200
    # check json is usable
    assert len(json.loads(page.get_data(as_text=True)))

    # change task status
    Task.query.filter_by(id=t_id).enabled = 1
    db.session.commit()

    page = client_fixture.get("/table/project/all")
    assert page.status_code == 200
    # check json is usable
    assert len(json.loads(page.get_data(as_text=True)))
Beispiel #20
0
def test_projects_home(client_fixture: fixture) -> None:
    # having no projects should redirect to new project page
    page = client_fixture.get(url_for("project_bp.all_projects"))
    assert page.status_code == 302

    page = client_fixture.get("/project", follow_redirects=True)
    assert page.status_code == 200
    assert request.path == url_for("project_bp.new_project")

    # if we have a project, we should go to the project list page
    p_id, t_id = create_demo_task()
    page = client_fixture.get(url_for("project_bp.all_projects"),
                              follow_redirects=False)
    assert page.status_code == 200
    assert request.path == url_for("project_bp.all_projects")
    assert "Projects" in page.get_data(as_text=True)

    # cleanup
    db.session.delete(Task.query.get(t_id))
    db.session.delete(Project.query.get(p_id))

    db.session.commit()
def test_delete_orphans(client_fixture: fixture) -> None:
    # run without any orphans
    page = client_fixture.get(f"/api/delete-orphans")
    assert page.json == {"message": "Scheduler: orphans deleted!"}
    assert page.status_code == 200

    # manually add a job to scheduler
    atlas_scheduler.add_job(
        func=demo_task,
        trigger="interval",
        seconds=10,
        id="test job 2",
        name="test job 2",
        args=["99"],
        replace_existing=True,
    )

    assert len(atlas_scheduler.get_jobs()) == 1

    # job with no args
    atlas_scheduler.add_job(
        func=demo_task,
        trigger="interval",
        seconds=10,
        id="test job 3",
        name="test job 3",
        replace_existing=True,
    )

    assert len(atlas_scheduler.get_jobs()) == 2

    page = client_fixture.get(f"/api/delete-orphans")
    assert page.json == {"message": "Scheduler: orphans deleted!"}
    assert page.status_code == 200

    assert len(atlas_scheduler.get_jobs()) == 1
def test_scheduled(client_fixture: fixture) -> None:
    p_id, t_id = create_demo_task()
    page = client_fixture.get(f"/api/add/{t_id}")
    assert page.json == {"message": "Scheduler: task job added!"}
    assert page.status_code == 200

    # check that status is now enabled
    t = Task.query.get(t_id)
    assert t.enabled == 1

    # job with no args
    atlas_scheduler.add_job(
        func=demo_task,
        trigger="interval",
        seconds=10,
        id="test job 3",
        name="test job 3",
        replace_existing=True,
    )

    # job should be in list
    page = client_fixture.get(f"/api/scheduled")
    assert page.json == [t_id, t_id, t_id]  # we have three schedules
    assert page.status_code == 200
Beispiel #23
0
def test_send_verification_code(client: fixture,
                                mock_verification_code_email: fixture,
                                clear_db: fixture) -> None:
    url = SEND_VERIFICATION_CODE_URL

    # 没有数据
    r = client.get(url)
    assert r.status_code == 400
    response_data = json.loads(r.get_data())
    assert "Invalid email address" in response_data.get("message")

    # 错误的邮箱
    query = {"email": "@test.com"}
    r = client.get(url, query_string=query)
    assert r.status_code == 400
    response_data = json.loads(r.get_data())
    assert "Invalid email address" in response_data.get("message")

    # 正确的邮箱
    query = {"email": TEST_EMAIL}
    r = client.get(url, query_string=query)
    assert r.status_code == 200
    response_data = json.loads(r.get_data())
    assert "verification code" in response_data.get("message")
Beispiel #24
0
def test_delete_project(client_fixture: fixture) -> None:
    p_id, t_id = create_demo_task()

    # delete project
    page = client_fixture.get(url_for("project_bp.delete_project",
                                      project_id=p_id),
                              follow_redirects=True)

    # should redirect
    assert request.path == url_for("project_bp.all_projects")

    # should be no files, logs, tasks
    assert TaskLog.query.filter_by(task_id=t_id).first() is None
    assert Task.query.filter_by(id=t_id).first() is None
    assert TaskFile.query.filter_by(task_id=t_id).first() is None
    assert Project.query.filter_by(id=p_id).first() is None
def test_run_task_with_delay(client_fixture: fixture) -> None:
    p_id, t_id = create_demo_task()
    delay = 5
    page = client_fixture.get(f"/api/run/{t_id}/delay/{delay}")
    assert page.json == {"message": "Scheduler: task scheduled!"}
    assert page.status_code == 200

    # check that job is in scheduler
    scheduled_task = [
        x for x in atlas_scheduler.get_jobs()
        if len(x.args) > 0 and x.args[0] == str(t_id)
    ][0]
    assert (scheduled_task.next_run_time.replace(
        microsecond=0,
        second=0).isoformat() == (datetime.now() +
                                  timedelta(minutes=delay)).replace(
                                      microsecond=0,
                                      second=0,
                                      tzinfo=tzlocal()).isoformat())
def test_login_logout(client_fixture: fixture) -> None:
    """Make sure login and logout works."""

    logout(client_fixture)
    username = "******"
    password = ""

    page = login(client_fixture, username, password)
    assert page.status_code == 200
    assert b"Dashboard" in page.data

    assert current_user.get_id()

    # verify we stay logged in
    page = client_fixture.get("/login", follow_redirects=True)
    assert page.status_code == 200
    assert b"Dashboard" in page.data

    page = logout(client_fixture)
    assert page.status_code == 200
    assert b"Bye." in page.data
Beispiel #27
0
def test_register(
    client: fixture,
    mock_verification_code_email: fixture,
    clear_db: fixture,
    init_db: fixture,
) -> None:
    # 获取验证码
    r = client.get(SEND_VERIFICATION_CODE_URL,
                   query_string={"email": TEST_EMAIL})
    assert r.status_code == 200
    code = redis_get_str(TEST_EMAIL)

    # 尝试注册
    post_data = {
        "verification_code": code,
        "email": TEST_EMAIL,
        "password": TEST_PASSWORD,
        "username": TEST_USERNAME,
    }
    r = client.post(REGISTER_URL, data=post_data)
    assert r.status_code == 200
    response_data = json.loads(r.get_data())
    assert len(response_data.get("data", {}).get("token")) > 0
Beispiel #28
0
def test_run_all(client_fixture: fixture) -> None:
    p_id, t_id = create_demo_task()

    # manual enable
    Task.query.filter_by(id=t_id).update({"enabled": 1})
    db.session.commit()
    assert Task.query.filter_by(id=t_id).first().enabled == 1

    # attempt to run
    page = client_fixture.get(
        url_for("project_bp.run_all_project_tasks", project_id=p_id),
        follow_redirects=True,
    )
    assert page.status_code == 200
    assert request.path == url_for("project_bp.one_project", project_id=p_id)

    # scheduler is offline
    # check that task was rescheduled
    # wait a second to executor to run.
    time.sleep(1)

    assert TaskLog.query.filter_by(task_id=t_id, error=1, status_id=7).filter(
        TaskLog.message.like("%Failed to send task to runner.%")).first(
        ) is not None  # type: ignore[union-attr]
Beispiel #29
0
def test_projects_user(client_fixture: fixture) -> None:
    # get my user
    my_user = User.query.filter_by(id=1).first()

    # having no projects should redirect to new project page
    page = client_fixture.get("/project/user")
    assert page.status_code == 302

    page = client_fixture.get("/project/user/1")
    assert page.status_code == 302

    page = client_fixture.get("/project/user", follow_redirects=True)
    assert page.status_code == 200
    assert request.path == url_for("project_bp.new_project_form")

    page = client_fixture.get("/project/user/1", follow_redirects=True)
    assert page.status_code == 200
    assert request.path == url_for("project_bp.new_project_form")

    # if we have a project, we should go to the project list page
    create_demo_task()
    page = client_fixture.get("/project/user", follow_redirects=False)
    assert page.status_code == 200
    assert request.path == url_for("project_bp.user_projects")
    assert "Projects" in page.get_data(as_text=True)
    assert my_user.full_name in page.get_data(as_text=True)

    page = client_fixture.get("/project/user/1", follow_redirects=False)
    assert page.status_code == 200
    assert request.path == url_for("project_bp.user_projects", user_id=1)
    assert "Projects" in page.get_data(as_text=True)
    assert my_user.full_name in page.get_data(as_text=True)

    # check invalid user
    page = client_fixture.get("/project/user/100", follow_redirects=True)
    assert page.status_code == 200
    assert b"That user doesn't exist." in page.data
def test_add_task(client_fixture: fixture) -> None:
    p_id, t_id = create_demo_task()

    page = client_fixture.get(f"/api/add/{t_id}")
    assert page.json == {"message": "Scheduler: task job added!"}
    assert page.status_code == 200

    # check that status is now enabled
    t = Task.query.get(t_id)
    assert t.enabled == 1

    # check that job is in the scheduler
    scheduled_task = atlas_scheduler.get_job(f"{p_id}-{t.id}-cron")
    assert scheduled_task.args[0] == str(t.id)
    assert (scheduled_task.next_run_time.isoformat() == datetime(
        2025, 1, 1, 0, 1, tzinfo=tzlocal()).isoformat())

    assert "cron[minute='1']" in str(scheduled_task.trigger)

    # check next run time
    assert (t.next_run.isoformat() == scheduled_task.next_run_time.replace(
        tzinfo=None).isoformat())

    # add a non-existing job
    page = client_fixture.get(f"/api/add/-1")
    assert page.json == {"error": "Invalid job."}
    assert page.status_code == 200

    # add a non-existing job
    page = client_fixture.get(f"/api/add/asdf")
    assert page.json == {"error": "Invalid job."}
    assert page.status_code == 200

    # enable and try to add
    Task.query.get(t_id).enabled = 1
    db.session.commit()

    t = Task.query.get(t_id)
    assert t.enabled == 1

    page = client_fixture.get(f"/api/add/{t_id}")
    assert page.json == {"message": "Scheduler: task job added!"}
    assert page.status_code == 200

    # add a cron
    p = get_or_create(
        db.session,
        Project,
        name="Project 1",
        cron=1,
        cron_min="1",
        cron_start_date=datetime(2000, 1, 1, tzinfo=tzlocal()),
        intv=0,
        ooff=0,
    )
    # create a task
    t = get_or_create(
        db.session,
        Task,
        name="Task 1",
        source_type_id=6,
        source_code="""select getdate()""",
        project_id=p.id,
        source_query_type_id=4,
        enabled=0,
    )
    page = client_fixture.get(f"/api/add/{t.id}")
    assert page.json == {"message": "Scheduler: task job added!"}
    assert page.status_code == 200

    # add a intv
    p = get_or_create(
        db.session,
        Project,
        name="Project 1",
        intv=1,
        intv_type="w",
        intv_start_date=datetime(2000, 1, 1, tzinfo=tzlocal()),
        cron=0,
        ooff=0,
    )
    # create a task
    t = get_or_create(
        db.session,
        Task,
        name="Task 1",
        source_type_id=6,
        source_code="""select getdate()""",
        project_id=p.id,
        source_query_type_id=4,
        enabled=0,
    )
    page = client_fixture.get(f"/api/add/{t.id}")
    assert page.json == {"message": "Scheduler: task job added!"}
    assert page.status_code == 200

    # add a ooff
    p = get_or_create(
        db.session,
        Project,
        name="Project 1",
        ooff=1,
        ooff_date=datetime(2000, 1, 1, tzinfo=tzlocal()),
        cron=0,
        intv=0,
    )
    # create a task
    t = get_or_create(
        db.session,
        Task,
        name="Task 1",
        source_type_id=6,
        source_code="""select getdate()""",
        project_id=p.id,
        source_query_type_id=4,
        enabled=0,
    )
    page = client_fixture.get(f"/api/add/{t.id}")
    assert page.json == {"message": "Scheduler: task job added!"}
    assert page.status_code == 200