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)
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 == "/"
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
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
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
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)))
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
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")
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
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
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]
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