def test_bonus_nodelay(client, treatment, synchron=True): # In real conditions, the tasks/webhook are delayed with +500 ms for _ in range(TASK_REPETITION): client = get_client() job_id = "test" resp_worker_id = generate_worker_id("bonus_resp") prop_worker_id = generate_worker_id("bonus_prop") _process_resp_tasks(client, treatment, worker_id=resp_worker_id, min_offer=MIN_OFFER, bonus_mode="random", synchron=synchron) _process_prop_round(client, treatment, worker_id=prop_worker_id, offer=OFFER, response_available=True, synchron=synchron) with app.app_context(): bonus_resp = get_worker_bonus(job_id, resp_worker_id) assert MIN_OFFER <= bonus_resp assert bonus_resp <= tasks.MAX_BONUS + (MAX_GAIN - OFFER) bonus_prop = get_worker_bonus(job_id, prop_worker_id) assert bonus_prop == OFFER
def test_prop_index(client, treatment, response_available=False, resp_feedback_fields=None): resp_worker_id = generate_worker_id("resp") job_id = "test" if not response_available: _process_resp(client, treatment, job_id=job_id, worker_id=resp_worker_id, min_offer=get_min_offer(), resp_feedback_fields=resp_feedback_fields) process_tasks(client, job_id=job_id, worker_id=resp_worker_id, bonus_mode="random", url_kwargs={ "auto_finalize": 1, "treatment": treatment }) time.sleep(WEBHOOK_DELAY) prop_worker_id = generate_worker_id("prop") res = client.get( f"/{treatment}/prop/?job_id={job_id}&worker_id={prop_worker_id}", follow_redirects=True).data assert b"PROPOSER" in res
def test_resp_done_both_models(client, treatment, completion_code_prefix="resp:", resp_feedback_fields=None): completion_code_prefix_bytes = completion_code_prefix.encode("utf-8") if completion_code_prefix else b"resp:" worker_id = generate_worker_id("resp") process_tasks(client, worker_id=worker_id) res = _process_resp(client, treatment, worker_id=worker_id, min_offer=get_min_offer(), resp_feedback_fields=resp_feedback_fields).data assert completion_code_prefix_bytes in res worker_id = generate_worker_id("resp") process_tasks(client, worker_id=worker_id) res = _process_resp(client, treatment, worker_id=worker_id, min_offer=get_min_offer(), resp_feedback_fields=resp_feedback_fields).data assert completion_code_prefix_bytes in res
def test_eff_bonus(client): with app.app_context(): worker_id = generate_worker_id("eff") res = _process_eff(client, worker_id=worker_id, bonus_mode="full") assert b"eff:" in res assert get_worker_bonus("test", worker_id) == eff.MAX_BONUS worker_id = generate_worker_id("eff") res = _process_eff(client, worker_id=worker_id, bonus_mode="random") assert b"eff:" in res worker_id = generate_worker_id("eff") res = _process_eff(client, worker_id=worker_id, bonus_mode="none") assert b"eff:" in res assert get_worker_bonus("test", worker_id) == 0
def test_goat_bonus(client): with app.app_context(): worker_id = generate_worker_id("goat") res = _process_goat(client, worker_id=worker_id, bonus_mode="full") assert b"goat:" in res assert get_worker_bonus("test", worker_id) == goat.MAX_BONUS worker_id = generate_worker_id("goat") res = _process_goat(client, worker_id=worker_id, bonus_mode="random") assert b"goat:" in res worker_id = generate_worker_id("goat") res = _process_goat(client, worker_id=worker_id, bonus_mode="none") assert b"goat:" in res assert get_worker_bonus("test", worker_id) == 0
def disabled__test_hexaco_bonus(): with app.app_context(): worker_id = generate_worker_id("hexaco") res = _process_hexaco(client, worker_id=worker_id) assert b"hexaco:" in res assert get_worker_bonus("test", worker_id) == 0 worker_id = generate_worker_id("hexaco") res = _process_hexaco(client, worker_id=worker_id) assert b"hexaco:" in res worker_id = generate_worker_id("hexaco") res = _process_hexaco(client, worker_id=worker_id) assert b"hexaco:" in res assert get_worker_bonus("test", worker_id) == 0
def test_index_auto(client, treatment, prefix=""): #takes the role assigned by the system and solves the corresponding tasks client = None job_id = "test_auto" for _ in range(TASK_REPETITION): auto_worker_id = generate_worker_id(f"{prefix}index_auto") path = f"/{treatment}/?worker_id={auto_worker_id}&job_id={job_id}" with app.test_request_context(path): client = get_client() res = client.get(path, follow_redirects=True) time.sleep(0.001) # Play as responder # print(res.data) if b"role of a RESPONDER" in res.data: # res = _process_resp(client, treatment, job_id=job_id, worker_id=auto_worker_id, min_offer=MIN_OFFER) # process_tasks(client, job_id=job_id, worker_id=auto_worker_id, bonus_mode="full", url_kwargs={"auto_finalize": 1, "treatment": treatment}) res = _process_resp_tasks(client, treatment, job_id=job_id, worker_id=auto_worker_id, min_offer=get_min_offer()) assert b"resp:" in res.data assert is_worker_available(auto_worker_id, get_table("resp", job_id=job_id, schema="result")) # Play a proposer elif b"role of a PROPOSER" in res.data: app.logger.warning("PROPOSER") res = client.get(path, follow_redirects=True) res = _process_prop_round(client, treatment, job_id=job_id, worker_id=auto_worker_id, offer=get_offer(), response_available=True) assert b"prop:" in res.data assert is_worker_available(auto_worker_id, get_table("resp", job_id=job_id, schema="result")) else: assert False, "Nooooooooooooooo" time.sleep(WEBHOOK_DELAY)
def test_index(client, treatment, prefix="", completion_code_prefix="resp:", resp_feedback_fields=None): client = None job_id = "test" completion_code_prefix_bytes = completion_code_prefix.encode("utf-8") if completion_code_prefix else b"resp:" for _ in range(TASK_REPETITION): client = get_client() resp_worker_id = generate_worker_id(f"{prefix}index_resp") path = f"/{treatment}/?worker_id={resp_worker_id}" with app.test_request_context(path): res = client.get(path, follow_redirects=True) assert b"RESPONDER" in res.data # res = _process_resp_tasks(client, worker_id=worker_id) res = _process_resp(client, treatment, job_id=job_id, worker_id=resp_worker_id, min_offer=get_min_offer(), resp_feedback_fields=resp_feedback_fields) process_tasks(client, job_id=job_id, worker_id=resp_worker_id, bonus_mode="random", url_kwargs={"auto_finalize": 1, "treatment": treatment}) assert completion_code_prefix_bytes in res.data time.sleep(WEBHOOK_DELAY) # let the auto-responder kick-in with app.app_context(): # let the auto-responder kick-in for _ in range(NB_MAX_AUTO_PLAY_RETRIES): if is_resp_in_prop_result(resp_worker_id, job_id, treatment): break time.sleep(AUTO_PROP_DELAY) assert is_resp_in_prop_result(resp_worker_id, job_id, treatment)
def test_webhook(client, treatment, resp_feedback_fields=None): # In real conditions, the tasks/webhook are delayed with +500 ms job_id = "test" resp_worker_id = generate_worker_id("webhook_resp") prop_worker_id = generate_worker_id("webhook_prop") process_tasks(client, job_id=job_id, worker_id=resp_worker_id, bonus_mode="random") _process_resp(client, treatment, job_id=job_id, worker_id=resp_worker_id, min_offer=get_min_offer(), resp_feedback_fields=resp_feedback_fields) emit_webhook(client, url=f"/{treatment}/webhook/", treatment=treatment, worker_id=resp_worker_id, by_get=True) time.sleep(WEBHOOK_DELAY) _process_prop(client, treatment, job_id=job_id, worker_id=prop_worker_id, offer=get_offer(), response_available=True) emit_webhook(client, url=f"/{treatment}/webhook/", treatment=treatment, worker_id=prop_worker_id, by_get=True) time.sleep(WEBHOOK_DELAY) with app.app_context(): assert is_worker_available( resp_worker_id, get_table("resp", job_id=job_id, schema="result", treatment=treatment)) assert is_worker_available( prop_worker_id, get_table("prop", job_id=job_id, schema="result", treatment=treatment))
def test_eff(client): with app.app_context(): job_id = "test" worker_id = generate_worker_id("task") res = _process_eff(client, job_id=job_id, worker_id=worker_id) assert b"eff:" in res assert is_worker_available(worker_id, get_table("eff", job_id, "result")) assert has_worker_and_features("eff", eff, job_id, worker_id)
def test_resp_done_both_models(client, treatment, resp_feedback_fields=None): worker_id = generate_worker_id("resp") process_tasks(client, worker_id=worker_id) res = _process_resp(client, treatment, worker_id=worker_id, min_offer=get_min_offer(), resp_feedback_fields=resp_feedback_fields).data assert b"resp:" in res worker_id = generate_worker_id("resp") process_tasks(client, worker_id=worker_id) res = _process_resp(client, treatment, worker_id=worker_id, min_offer=get_min_offer(), resp_feedback_fields=resp_feedback_fields).data assert b"resp:" in res
def test_index(client, treatment, prefix="", response_available=False, resp_feedback_fields=None): client = None job_id = "test" for _ in range(TASK_REPETITION): client = get_client() if not response_available: resp_worker_id = generate_worker_id(f"{prefix}index_resp") path = f"/{treatment}/?worker_id={resp_worker_id}" with app.test_request_context(path): res = client.get(path, follow_redirects=True) assert b"RESPONDER" in res.data # res = _process_resp_tasks(client, worker_id=worker_id) res = _process_resp(client, treatment, job_id=job_id, worker_id=resp_worker_id, min_offer=get_min_offer(), resp_feedback_fields=resp_feedback_fields) process_tasks(client, job_id=job_id, worker_id=resp_worker_id, bonus_mode="random", url_kwargs={ "auto_finalize": 1, "treatment": treatment }) assert b"resp:" in res.data prop_worker_id = generate_worker_id(f"{prefix}index_prop") time.sleep(WEBHOOK_DELAY) path = f"/{treatment}/?worker_id={prop_worker_id}" with app.test_request_context(path): res = client.get(path, follow_redirects=True) # assert b"PROPOSER" in res.data res = _process_prop_round(client, treatment, worker_id=prop_worker_id, offer=get_offer(), response_available=True) assert b"prop:" in res.data
def test_auto_finalize(client, treatment, resp_feedback_fields=None): # Test automatic webhook triggering to finalize tasks job_id = "test" resp_worker_id = generate_worker_id("auto_resp") prop_worker_id = generate_worker_id("auto_prop") _process_resp(client, treatment, job_id=job_id, worker_id=resp_worker_id, min_offer=get_min_offer(), resp_feedback_fields=resp_feedback_fields) process_tasks(client, job_id=job_id, worker_id=resp_worker_id, bonus_mode="random", url_kwargs={ "auto_finalize": 1, "treatment": treatment }) time.sleep(WEBHOOK_DELAY) res = _process_prop(client, treatment, job_id=job_id, worker_id=prop_worker_id, offer=get_offer(), response_available=True, auto_finalize=True) time.sleep(WEBHOOK_DELAY) with app.app_context(): assert is_worker_available( resp_worker_id, get_table("resp", job_id=job_id, schema="result", treatment=treatment)) assert is_worker_available( prop_worker_id, get_table("prop", job_id=job_id, schema="result", treatment=treatment))
def test_payment(client, treatment): with HTTMock(figure_eight_mock): job_id = "test" resp_worker_id = generate_worker_id("payment_resp") prop_worker_id = generate_worker_id("payment_prop") _process_resp_tasks(client, treatment, job_id=job_id, worker_id=resp_worker_id, min_offer=MIN_OFFER) time.sleep(WEBHOOK_DELAY) # _process_prop(client, treatment, job_id=job_id, worker_id=prop_worker_id, response_available=True, auto_finalize=True) _process_prop_round(client, treatment, job_id=job_id, worker_id=prop_worker_id, response_available=True) time.sleep(WEBHOOK_DELAY) for _ in range(5): emit_webhook(client, url=f"/{treatment}/webhook/", treatment=treatment, job_id="test", worker_id=prop_worker_id, by_get=False) emit_webhook(client, url=f"/{treatment}/webhook/", treatment=treatment, job_id="test", worker_id=resp_worker_id, by_get=False) time.sleep(WEBHOOK_DELAY) with app.app_context(): bonus_resp = get_worker_bonus(job_id, resp_worker_id) assert 0 == get_worker_bonus(job_id, resp_worker_id) assert MIN_OFFER <= get_worker_paid_bonus( job_id, resp_worker_id) <= tasks.MAX_BONUS + (MAX_GAIN - OFFER) assert 0 == get_worker_bonus(job_id, prop_worker_id) assert get_worker_paid_bonus(job_id, prop_worker_id) == OFFER
def test_payment(client, treatment, resp_feedback_fields=None): with HTTMock(figure_eight_mock): job_id = "test" resp_worker_id = generate_worker_id("payment_resp") _process_resp_tasks(client, treatment, job_id=job_id, worker_id=resp_worker_id, min_offer=MIN_OFFER, resp_feedback_fields=resp_feedback_fields) time.sleep(WEBHOOK_DELAY) for _ in range(5): emit_webhook(client, url=f"/{treatment}/webhook/", treatment=treatment, job_id="test", worker_id=resp_worker_id, by_get=False) time.sleep(WEBHOOK_DELAY) with app.app_context(): assert 0 == get_worker_bonus(job_id, resp_worker_id) worker_paid_bonus = get_worker_paid_bonus(job_id, resp_worker_id) assert 0 <= worker_paid_bonus <= tasks.MAX_BONUS + MAX_GAIN
def test_survey_drop(client, treatment): """ test if the submissed is dropped without control on other fields when <drop> is set to "1" """ with app.app_context(): worker_id = generate_worker_id("survey") path = f"/survey/{treatment}/?job_id=test&worker_id={worker_id}" with app.test_request_context(path): form = MainForm() form_data = {key: "" for key in form._fields} form_data["drop"] = "1" res = client.post(path, data=form_data, follow_redirects=True) assert b"dropped" in res.data
def test_prop_index(client, treatment, resp_feedback_fields=None): resp_worker_id = generate_worker_id("resp") job_id = "test" _process_resp(client, treatment, job_id=job_id, worker_id=resp_worker_id, min_offer=get_min_offer(), resp_feedback_fields=resp_feedback_fields) process_tasks(client, job_id=job_id, worker_id=resp_worker_id, bonus_mode="random", url_kwargs={"auto_finalize": 1, "treatment": treatment}) time.sleep(WEBHOOK_DELAY) time.sleep(WEBHOOK_DELAY) # let the auto-responder kick-in with app.app_context(): # let the auto-responder kick-in for _ in range(NB_MAX_AUTO_PLAY_RETRIES): if is_resp_in_prop_result(resp_worker_id, job_id, treatment): break time.sleep(AUTO_PROP_DELAY) assert is_resp_in_prop_result(resp_worker_id, job_id, treatment)
def test_index_feedback(client, treatment, prefix="", response_available=False, resp_feedback_fields=None): client = None job_id = "test" for _ in range(TASK_REPETITION): client = get_client() if not response_available: resp_worker_id = generate_worker_id(f"{prefix}index_feedback_resp") path = f"/{treatment}/?worker_id={resp_worker_id}" with app.test_request_context(path): res = client.get(path, follow_redirects=True) assert b"RESPONDER" in res.data # res = _process_resp_tasks(client, worker_id=worker_id) res = _process_resp(client, treatment, job_id=job_id, worker_id=resp_worker_id, min_offer=get_min_offer(), resp_feedback_fields=resp_feedback_fields) assert b"resp:" in res.data else: prop_worker_id = generate_worker_id(f"{prefix}index_prop") path = f"/{treatment}/?worker_id={prop_worker_id}" with app.test_request_context(path): res = client.get(path, follow_redirects=True) res = _process_prop_round(client, treatment, worker_id=prop_worker_id, offer=get_offer(), response_available=True, finalize_round=False) assert b"prop:" in res.data
def test_auto_finalize(client, treatment, resp_feedback_fields=None): # Test automatic webhook triggering to finalize tasks job_id = "test" resp_worker_id = generate_worker_id("auto_resp") _process_resp(client, treatment, job_id=job_id, worker_id=resp_worker_id, min_offer=get_min_offer(), resp_feedback_fields=resp_feedback_fields) process_tasks(client, job_id=job_id, worker_id=resp_worker_id, bonus_mode="random", url_kwargs={"auto_finalize": 1, "treatment": treatment}) time.sleep(WEBHOOK_DELAY) with app.app_context(): # let the auto-responder kick-in for _ in range(NB_MAX_AUTO_PLAY_RETRIES): if is_resp_in_prop_result(resp_worker_id, job_id, treatment): break time.sleep(AUTO_PROP_DELAY) assert is_worker_available(resp_worker_id, get_table("resp", job_id=job_id, schema="result", treatment=treatment)) assert is_resp_in_prop_result(resp_worker_id, job_id, treatment)
def test_webhook(client, treatment, resp_feedback_fields=None): # In real conditions, the tasks/webhook are delayed with +500 ms job_id = "test" resp_worker_id = generate_worker_id("webhook_resp") process_tasks(client, job_id=job_id, worker_id=resp_worker_id, bonus_mode="random") _process_resp(client, treatment, job_id=job_id, worker_id=resp_worker_id, min_offer=get_min_offer(), resp_feedback_fields=resp_feedback_fields) emit_webhook(client, url=f"/{treatment}/webhook/", job_id=job_id, treatment=treatment, worker_id=resp_worker_id, by_get=True) time.sleep(WEBHOOK_DELAY) with app.app_context(): # let the auto-responder kick-in for _ in range(NB_MAX_AUTO_PLAY_RETRIES): if is_resp_in_prop_result(resp_worker_id, job_id, treatment): break time.sleep(AUTO_PROP_DELAY) assert is_worker_available(resp_worker_id, get_table("resp", job_id=job_id, schema="result", treatment=treatment)) assert is_resp_in_prop_result(resp_worker_id, job_id, treatment)
def test_prop_check(client, treatment, response_available=False, resp_feedback_fields=None): worker_id = generate_worker_id("prop_check") path = f"/{treatment}/prop/?job_id=test&worker_id={worker_id}" if not response_available: _process_resp_tasks(client, treatment, worker_id=None, min_offer=get_min_offer(), resp_feedback_fields=resp_feedback_fields) with app.test_request_context(path): client.get(path, follow_redirects=True) res = client.get(f"{treatment}/prop/check/?offer={OFFER}", follow_redirects=True).data assert b"acceptance_probability" in res assert b"best_offer_probability" in res
def test_tasks_bonus(client): job_id = "test" worker_id = generate_worker_id("tasks") with app.app_context(): _process_cg(client, worker_id=worker_id, bonus_mode="full") exp_bonus = cg.MAX_BONUS print("worker_id:", worker_id, "bonus: ", exp_bonus) assert get_worker_bonus(job_id, worker_id) == exp_bonus _process_crt(client, worker_id=worker_id, bonus_mode="full") exp_bonus += crt.MAX_BONUS assert get_worker_bonus(job_id, worker_id) == exp_bonus _process_eff(client, worker_id=worker_id, bonus_mode="full") exp_bonus += eff.MAX_BONUS assert get_worker_bonus(job_id, worker_id) == exp_bonus _process_hexaco(client, worker_id=worker_id) exp_bonus += 0 #NO bonus for hexaco actually assert get_worker_bonus(job_id, worker_id) == exp_bonus _process_goat(client, worker_id=worker_id, bonus_mode="full") exp_bonus += goat.MAX_BONUS assert get_worker_bonus(job_id, worker_id) == exp_bonus
def test_bonus_nodelay(client, treatment, synchron=True, resp_feedback_fields=None): # In real conditions, the tasks/webhook are delayed with +500 ms # we make sure the offer is accepted! min_offer = 0 for _ in range(TASK_REPETITION): client = get_client() job_id = "test" resp_worker_id = generate_worker_id("bonus_resp") _process_resp_tasks(client, treatment, worker_id=resp_worker_id, min_offer=min_offer, bonus_mode="random", synchron=synchron, resp_feedback_fields=resp_feedback_fields) time.sleep(WEBHOOK_DELAY) with app.app_context(): # let the auto-responder kick-in for _ in range(NB_MAX_AUTO_PLAY_RETRIES): if is_resp_in_prop_result(resp_worker_id, job_id, treatment): break time.sleep(AUTO_PROP_DELAY) bonus_resp = get_worker_bonus(job_id, resp_worker_id) assert min_offer <= bonus_resp assert bonus_resp <= tasks.MAX_BONUS + (MAX_GAIN - OFFER) assert is_resp_in_prop_result(resp_worker_id, job_id, treatment)
def test_survey_no_workerid(client, treatment): for _ in range(TASK_REPETITION_LOWER): with app.app_context(): assignment_id = generate_worker_id().upper().replace("_", "") path = f"/survey/{treatment}/?assignment_id={assignment_id}&preview=true" with app.test_request_context(path): client.get(path, follow_redirects=True) form = MainForm() form_data = {} for field, item in form._fields.items(): if field in SURVEY_CONTROL_FIELDS: form_data[field] = "correct" elif field == SURVEY_MAIN_TASK_CODE_FIELD: form_data[field] = "resp:" elif field.startswith("code_"): form_data[field] = get_completion_code(field) elif field in SURVEY_CHOICE_FIELDS: form_data[field] = random.choice(item.choices)[0] else: form_data[field] = "abc" res = client.post(path, data=form_data, follow_redirects=True) print("RESULT", res.data)
def test_survey_prop(client, treatment): with app.app_context(): worker_id = generate_worker_id("survey") assignment_id = worker_id.upper().replace("_", "") path = f"/survey/{treatment}/?job_id=test&worker_id={worker_id}&assignment_id={assignment_id}" with app.test_request_context(path): client.get(path, follow_redirects=True) form = MainForm() form_data = {} for field, item in form._fields.items(): if field in SURVEY_CONTROL_FIELDS: form_data[field] = "correct" elif field == SURVEY_MAIN_TASK_CODE_FIELD: form_data[field] = "prop:" elif field.startswith("code_"): form_data[field] = "" elif field in SURVEY_CHOICE_FIELDS: form_data[field] = random.choice(item.choices)[0] else: form_data[field] = "abc" res = client.post(path, data=form_data, follow_redirects=True) assert b"Your survey completion code is:" in res.data assert b"dropped" not in res.data