|
|
|
|
@ -6,7 +6,6 @@ Run with:
|
|
|
|
|
pytest src/testing/integration_test.py -v
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
import pytest
|
|
|
|
|
import requests
|
|
|
|
|
|
|
|
|
|
BASE_URL = "http://100.125.115.116:8000/optimumoh"
|
|
|
|
|
@ -22,17 +21,13 @@ HEADERS = {
|
|
|
|
|
|
|
|
|
|
# Placeholder IDs — replace with real values from your database before running
|
|
|
|
|
OVERHAUL_SESSION_ID = "3704c82c-cfc5-47f7-813a-1661f89b0738"
|
|
|
|
|
# OVERHAUL_EQUIPMENT_ID = 1 ## Source code got commented
|
|
|
|
|
SCOPE_JOB_ID = "db590764-72cb-4eb1-a30f-014116df0472"
|
|
|
|
|
CALCULATION_ID = "44f483f3-bfe4-4094-a59f-b97a10f2fea6"
|
|
|
|
|
BUDGET_THRESHOLD = 100000
|
|
|
|
|
RISK_COST = 1
|
|
|
|
|
LOCATION_TAG = "3AL-F501A"
|
|
|
|
|
SCOPE_NAME = "A"
|
|
|
|
|
# OVERHAUL_SESSION_HISTORY_ID = 1
|
|
|
|
|
ASSET_NUM = "A19825"
|
|
|
|
|
# SCOPE_EQUIPMENT_JOB_ID = 1 ## Source code got commented
|
|
|
|
|
# EQUIPMENT_ACTIVITY_ID = 1 ## Source code got commented
|
|
|
|
|
EAF_INPUT = 0.85
|
|
|
|
|
DURATION = 17520
|
|
|
|
|
SCOPE_EQUIPMENT_ACTIVITY_ID = "4527eb2b-0bc4-46b3-80a1-e1d2f67882f8"
|
|
|
|
|
@ -102,8 +97,6 @@ def get_csrf_token(path: str, auth_token: str) -> str:
|
|
|
|
|
# def test_get_overhaul_gantt():
|
|
|
|
|
# """GET /overhaul-gantt — no role guard; all roles allowed"""
|
|
|
|
|
# for user in USER_LIST:
|
|
|
|
|
# res = requests.get(f"{BASE_URL}/overhaul-gantt", headers=user_auth_headers(user["authorization_token"]))
|
|
|
|
|
# assert res.status_code == 200, f"[{user['name']}] expected 200, got {res.status_code}"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -113,30 +106,13 @@ def get_csrf_token(path: str, auth_token: str) -> str:
|
|
|
|
|
|
|
|
|
|
# # [[Source code got commented]]
|
|
|
|
|
# def test_get_overhaul_session():
|
|
|
|
|
# """GET /overhaul-session?all=1 — require_any_role blocks Management"""
|
|
|
|
|
# for user in USER_LIST:
|
|
|
|
|
# res = requests.get(f"{BASE_URL}/overhaul-session?all=1", headers=user_auth_headers(user["authorization_token"]))
|
|
|
|
|
# expected = 200 if user["name"] in NON_MANAGEMENT else 403
|
|
|
|
|
# print(f"[{user['name']}] expected {expected}, got {res.status_code}, response: {res.text}")
|
|
|
|
|
# assert res.status_code == expected, f"[{user['name']}] expected {expected}, got {res.status_code}"
|
|
|
|
|
|
|
|
|
|
# # [[Source code got commented]]
|
|
|
|
|
# def test_post_overhaul_session():
|
|
|
|
|
# """POST /overhaul-session — require_any_role + CREATE blocks Management"""
|
|
|
|
|
# payload = {
|
|
|
|
|
# "type": "Major",
|
|
|
|
|
# "start_date": "2025-01-01",
|
|
|
|
|
# "end_date": "2025-12-31",
|
|
|
|
|
# }
|
|
|
|
|
# for user in USER_LIST:
|
|
|
|
|
# csrf_token = get_csrf_token("/overhaul-session", user["authorization_token"])
|
|
|
|
|
# headers = {**user_auth_headers(user["authorization_token"]), "X-CSRF-Token": csrf_token}
|
|
|
|
|
# res = requests.post(f"{BASE_URL}/overhaul-session", json=payload, headers=headers)
|
|
|
|
|
# print(f"[{user['name']}], got {res.status_code}, response: {res.text}")
|
|
|
|
|
# if user["name"] in NON_MANAGEMENT:
|
|
|
|
|
# assert res.status_code in (200, 201), f"[{user['name']}] expected 200/201, got {res.status_code}"
|
|
|
|
|
# else:
|
|
|
|
|
# assert res.status_code == 403, f"[{user['name']}] expected 403, got {res.status_code}"
|
|
|
|
|
|
|
|
|
|
# # ─────────────────────────────────────────────
|
|
|
|
|
# # Overhaul Schedules
|
|
|
|
|
@ -145,39 +121,15 @@ def get_csrf_token(path: str, auth_token: str) -> str:
|
|
|
|
|
# # [[Attribute error]]
|
|
|
|
|
# def test_post_overhaul_schedules():
|
|
|
|
|
# """POST /overhaul-schedules — require_any_role + CREATE blocks Management"""
|
|
|
|
|
# payload = {
|
|
|
|
|
# "start_date": "2024-06-01T00:00:00Z",
|
|
|
|
|
# "end_date": "2024-06-30T23:59:59Z",
|
|
|
|
|
# "duration_oh": 720,
|
|
|
|
|
# "crew_number": 10,
|
|
|
|
|
# "status": "Upcoming"
|
|
|
|
|
# }
|
|
|
|
|
# for user in USER_LIST:
|
|
|
|
|
# print(f"Testing payload: {payload}, headers: {user_auth_headers(user['authorization_token'])}")
|
|
|
|
|
# csrf_token = get_csrf_token("/overhaul-schedules", user["authorization_token"])
|
|
|
|
|
# headers = {**user_auth_headers(user["authorization_token"]), "X-CSRF-Token": csrf_token}
|
|
|
|
|
# res = requests.post(f"{BASE_URL}/overhaul-schedules", json=payload, headers=headers)
|
|
|
|
|
# print(f"[{user['name']}], got {res.status_code}, response: {res.text}")
|
|
|
|
|
# if user["name"] in NON_MANAGEMENT:
|
|
|
|
|
# assert res.status_code in (200, 201), f"[{user['name']}] expected 200/201, got {res.status_code}"
|
|
|
|
|
# else:
|
|
|
|
|
# assert res.status_code == 403, f"[{user['name']}] expected 403, got {res.status_code}"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# # [[Source code got commented]]
|
|
|
|
|
# def test_delete_overhaul_schedule():
|
|
|
|
|
# """POST /overhaul-schedules/delete/{scope_id} — require_any_role + DELETE blocks Management. CSRF required."""
|
|
|
|
|
# for user in USER_LIST:
|
|
|
|
|
# csrf_token = get_csrf_token("/overhaul-schedules/delete", user["authorization_token"])
|
|
|
|
|
# headers = {**user_auth_headers(user["authorization_token"]), "X-CSRF-Token": csrf_token}
|
|
|
|
|
# res = requests.post(
|
|
|
|
|
# f"{BASE_URL}/overhaul-schedules/delete/{OVERHAUL_SCHEDULE_ID}",
|
|
|
|
|
# headers=headers,
|
|
|
|
|
# )
|
|
|
|
|
# if user["name"] in NON_MANAGEMENT:
|
|
|
|
|
# assert res.status_code in (200, 204, 404), f"[{user['name']}] expected 200/204/404, got {res.status_code}"
|
|
|
|
|
# else:
|
|
|
|
|
# assert res.status_code == 403, f"[{user['name']}] expected 403, got {res.status_code}"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -188,19 +140,7 @@ def get_csrf_token(path: str, auth_token: str) -> str:
|
|
|
|
|
|
|
|
|
|
# # [[Source code got commented]]
|
|
|
|
|
# def test_post_overhaul_jobs():
|
|
|
|
|
# """POST /overhaul-jobs/{overhaul_equipment_id} — no role guard; all roles allowed"""
|
|
|
|
|
# payload = {
|
|
|
|
|
# "job_ids": [],
|
|
|
|
|
# }
|
|
|
|
|
# for user in USER_LIST:
|
|
|
|
|
# csrf_token = get_csrf_token("/overhaul-jobs", user["authorization_token"])
|
|
|
|
|
# headers = {**user_auth_headers(user["authorization_token"]), "X-CSRF-Token": csrf_token}
|
|
|
|
|
# res = requests.post(
|
|
|
|
|
# f"{BASE_URL}/overhaul-jobs/{SCOPE_JOB_ID}",
|
|
|
|
|
# json=payload,
|
|
|
|
|
# headers=headers,
|
|
|
|
|
# )
|
|
|
|
|
# assert res.status_code in (200, 201), f"[{user['name']}] expected 200/201, got {res.status_code}"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# ─────────────────────────────────────────────
|
|
|
|
|
@ -210,32 +150,14 @@ def get_csrf_token(path: str, auth_token: str) -> str:
|
|
|
|
|
# # [[Database error: Unconsumed column names: scope_overhaul, assetnum, type, removal_date]]
|
|
|
|
|
# def test_post_scope_equipments():
|
|
|
|
|
# """POST /scope-equipments — require_any_role blocks Management"""
|
|
|
|
|
# payload = {
|
|
|
|
|
# "assetnums": ["A26312", "A26313", "A26314"],
|
|
|
|
|
# "scope_name": "A"
|
|
|
|
|
# }
|
|
|
|
|
# for user in USER_LIST:
|
|
|
|
|
# csrf_token = get_csrf_token("/scope-equipments", user["authorization_token"])
|
|
|
|
|
# headers = {**user_auth_headers(user["authorization_token"]), "X-CSRF-Token": csrf_token}
|
|
|
|
|
# res = requests.post(f"{BASE_URL}/scope-equipments", json=payload, headers=headers)
|
|
|
|
|
# print(f"[{user['name']}], got {res.status_code}, response: {res.text}")
|
|
|
|
|
# if user["name"] in NON_MANAGEMENT:
|
|
|
|
|
# assert res.status_code in (200, 201), f"[{user['name']}] expected 200/201, got {res.status_code}"
|
|
|
|
|
# else:
|
|
|
|
|
# assert res.status_code == 403, f"[{user['name']}] expected 403, got {res.status_code}"
|
|
|
|
|
|
|
|
|
|
# # [[No endpoint exists]]
|
|
|
|
|
# def test_delete_scope_equipment():
|
|
|
|
|
# """DELETE /scope-equipments/delete/{id} — require_any_role blocks Management"""
|
|
|
|
|
# for user in USER_LIST:
|
|
|
|
|
# res = requests.delete(
|
|
|
|
|
# f"{BASE_URL}/scope-equipments/delete/{OVERHAUL_EQUIPMENT_ID}",
|
|
|
|
|
# headers=user_auth_headers(user["authorization_token"]),
|
|
|
|
|
# )
|
|
|
|
|
# if user["name"] in NON_MANAGEMENT:
|
|
|
|
|
# assert res.status_code in (200, 204, 404), f"[{user['name']}] expected 200/204/404, got {res.status_code}"
|
|
|
|
|
# else:
|
|
|
|
|
# assert res.status_code == 403, f"[{user['name']}] expected 403, got {res.status_code}"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# # ─────────────────────────────────────────────
|
|
|
|
|
@ -244,31 +166,11 @@ def get_csrf_token(path: str, auth_token: str) -> str:
|
|
|
|
|
|
|
|
|
|
# # [[Source code got commented]]
|
|
|
|
|
# def test_post_scope_equipment_jobs():
|
|
|
|
|
# """POST /scope-equipment-jobs/{assetnum} — no role guard; all roles allowed"""
|
|
|
|
|
# payload = {
|
|
|
|
|
# "job_ids": [],
|
|
|
|
|
# }
|
|
|
|
|
# for user in USER_LIST:
|
|
|
|
|
# csrf_token = get_csrf_token("/scope-equipment-jobs", user["authorization_token"])
|
|
|
|
|
# headers = {**user_auth_headers(user["authorization_token"]), "X-CSRF-Token": csrf_token}
|
|
|
|
|
# res = requests.post(
|
|
|
|
|
# f"{BASE_URL}/scope-equipment-jobs/{ASSET_NUM}",
|
|
|
|
|
# json=payload,
|
|
|
|
|
# headers=headers,
|
|
|
|
|
# )
|
|
|
|
|
# assert res.status_code in (200, 201), f"[{user['name']}] expected 200/201, got {res.status_code}"
|
|
|
|
|
|
|
|
|
|
# # [[Source code got commented]]
|
|
|
|
|
# def test_delete_scope_equipment_job():
|
|
|
|
|
# """POST /equipment-workscopes/delete/{scope_job_id} — no role guard; all roles allowed"""
|
|
|
|
|
# for user in USER_LIST:
|
|
|
|
|
# csrf_token = get_csrf_token("/equipment-workscopes/delete", user["authorization_token"])
|
|
|
|
|
# headers = {**user_auth_headers(user["authorization_token"]), "X-CSRF-Token": csrf_token}
|
|
|
|
|
# res = requests.post(
|
|
|
|
|
# f"{BASE_URL}/equipment-workscopes/delete/{SCOPE_EQUIPMENT_JOB_ID}",
|
|
|
|
|
# headers=headers,
|
|
|
|
|
# )
|
|
|
|
|
# assert res.status_code in (200, 204, 404), f"[{user['name']}] expected 200/204/404, got {res.status_code}"
|
|
|
|
|
|
|
|
|
|
# # ─────────────────────────────────────────────
|
|
|
|
|
# # Overhaul Jobs
|
|
|
|
|
@ -276,43 +178,16 @@ def get_csrf_token(path: str, auth_token: str) -> str:
|
|
|
|
|
|
|
|
|
|
# # [[Source code got commented]]
|
|
|
|
|
# def test_get_overhaul_jobs():
|
|
|
|
|
# """GET /overhaul-jobs/{overhaul_equipment_id} — no role guard; all roles allowed"""
|
|
|
|
|
# for user in USER_LIST:
|
|
|
|
|
# res = requests.get(
|
|
|
|
|
# f"{BASE_URL}/overhaul-jobs/{OVERHAUL_EQUIPMENT_ID}",
|
|
|
|
|
# headers=user_auth_headers(user["authorization_token"]),
|
|
|
|
|
# )
|
|
|
|
|
# assert res.status_code == 200, f"[{user['name']}] expected 200, got {res.status_code}"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# # ─────────────────────────────────────────────
|
|
|
|
|
# # Calculation — Budget Constraint
|
|
|
|
|
# # ─────────────────────────────────────────────
|
|
|
|
|
|
|
|
|
|
# # [[AttributeError]]
|
|
|
|
|
# def test_post_calculation_time_constraint():
|
|
|
|
|
# """POST /calculation/time-constraint — required_permission(CREATE); Management has no CREATE"""
|
|
|
|
|
# payload = {
|
|
|
|
|
# "ohSessionId": OVERHAUL_SESSION_ID,
|
|
|
|
|
# "costPerFailure": 0,
|
|
|
|
|
# "overhaulCost": 0,
|
|
|
|
|
# }
|
|
|
|
|
# params = {
|
|
|
|
|
# "with_results": 0,
|
|
|
|
|
# }
|
|
|
|
|
# for user in USER_LIST:
|
|
|
|
|
# csrf_token = get_csrf_token("/calculation/time-constraint", user["authorization_token"])
|
|
|
|
|
# headers = {**user_auth_headers(user["authorization_token"]), "X-CSRF-Token": csrf_token}
|
|
|
|
|
# res = requests.post(
|
|
|
|
|
# f"{BASE_URL}/calculation/time-constraint",
|
|
|
|
|
# json=payload,
|
|
|
|
|
# params=params,
|
|
|
|
|
# headers=headers,
|
|
|
|
|
# )
|
|
|
|
|
# if user["name"] in NON_MANAGEMENT:
|
|
|
|
|
# assert res.status_code in (200, 201), f"[{user['name']}] expected 200/201, got {res.status_code}"
|
|
|
|
|
# else:
|
|
|
|
|
# assert res.status_code == 403, f"[{user['name']}] expected 403, got {res.status_code}"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# # ─────────────────────────────────────────────
|
|
|
|
|
@ -324,18 +199,7 @@ def get_csrf_token(path: str, auth_token: str) -> str:
|
|
|
|
|
# """POST /equipment-activities — no role guard; all roles allowed
|
|
|
|
|
# Note: route commented out in api.py; active equivalent is POST /overhaul-activity/{session_id}
|
|
|
|
|
# """
|
|
|
|
|
# payload = {
|
|
|
|
|
# "location_tags": [LOCATION_TAG],
|
|
|
|
|
# }
|
|
|
|
|
# for user in USER_LIST:
|
|
|
|
|
# csrf_token = get_csrf_token("/equipment-activities", user["authorization_token"])
|
|
|
|
|
# headers = {**user_auth_headers(user["authorization_token"]), "X-CSRF-Token": csrf_token}
|
|
|
|
|
# res = requests.post(
|
|
|
|
|
# f"{BASE_URL}/equipment-activities",
|
|
|
|
|
# json=payload,
|
|
|
|
|
# headers=headers,
|
|
|
|
|
# )
|
|
|
|
|
# assert res.status_code in (200, 201), f"[{user['name']}] expected 200/201, got {res.status_code}"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# # [[Source code got commented]]
|
|
|
|
|
@ -344,13 +208,6 @@ def get_csrf_token(path: str, auth_token: str) -> str:
|
|
|
|
|
# Note: route commented out in api.py; active equivalent is POST /overhaul-activity/delete/{session}/{location_tag}
|
|
|
|
|
# """
|
|
|
|
|
# for user in USER_LIST:
|
|
|
|
|
# csrf_token = get_csrf_token("/equipment-activities/delete", user["authorization_token"])
|
|
|
|
|
# headers = {**user_auth_headers(user["authorization_token"]), "X-CSRF-Token": csrf_token}
|
|
|
|
|
# res = requests.post(
|
|
|
|
|
# f"{BASE_URL}/equipment-activities/delete/{EQUIPMENT_ACTIVITY_ID}",
|
|
|
|
|
# headers=headers,
|
|
|
|
|
# )
|
|
|
|
|
# assert res.status_code in (200, 204, 404), f"[{user['name']}] expected 200/204/404, got {res.status_code}"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# # ─────────────────────────────────────────────
|
|
|
|
|
@ -361,29 +218,17 @@ def get_csrf_token(path: str, auth_token: str) -> str:
|
|
|
|
|
# def test_get_jobs():
|
|
|
|
|
# """GET /jobs — no role guard; all roles allowed"""
|
|
|
|
|
# for user in USER_LIST:
|
|
|
|
|
# res = requests.get(f"{BASE_URL}/jobs", headers=user_auth_headers(user["authorization_token"]))
|
|
|
|
|
# assert res.status_code == 200, f"[{user['name']}] expected 200, got {res.status_code}"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# ─────────────────────────────────────────────
|
|
|
|
|
# Overhauls sub-routes
|
|
|
|
|
# ─────────────────────────────────────────────
|
|
|
|
|
|
|
|
|
|
# # [[TypeError]]
|
|
|
|
|
# def test_get_overhauls_schedules():
|
|
|
|
|
# """GET /overhauls/schedules — required_permission(READ); Management has READ"""
|
|
|
|
|
# for user in USER_LIST:
|
|
|
|
|
# res = requests.get(f"{BASE_URL}/overhauls/schedules", headers=user_auth_headers(user["authorization_token"]))
|
|
|
|
|
# print(f"[{user['name']}], got {res.status_code}, response: {res.text}")
|
|
|
|
|
# assert res.status_code == 200, f"[{user['name']}] expected 200, got {res.status_code}: {res.text}"
|
|
|
|
|
|
|
|
|
|
# # [[TypeError]]
|
|
|
|
|
# def test_get_overhauls_critical_parts():
|
|
|
|
|
# """GET /overhauls/critical-parts — required_permission(READ); Management has READ"""
|
|
|
|
|
# for user in USER_LIST:
|
|
|
|
|
# res = requests.get(f"{BASE_URL}/overhauls/critical-parts", headers=user_auth_headers(user["authorization_token"]))
|
|
|
|
|
# print(f"[{user['name']}], got {res.status_code}, response: {res.text}")
|
|
|
|
|
# assert res.status_code == 200, f"[{user['name']}] expected 200, got {res.status_code}: {res.text}"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# # ─────────────────────────────────────────────
|
|
|
|
|
@ -392,113 +237,50 @@ def get_csrf_token(path: str, auth_token: str) -> str:
|
|
|
|
|
|
|
|
|
|
# # [[Attribute Error]]
|
|
|
|
|
# def test_get_overhaul_activity_by_assetnum():
|
|
|
|
|
# """GET /overhaul-activity/{overhaul_session}/{assetnum} — require_any_role blocks Management"""
|
|
|
|
|
# for user in USER_LIST:
|
|
|
|
|
# res = requests.get(
|
|
|
|
|
# f"{BASE_URL}/overhaul-activity/{OVERHAUL_SESSION_ID}/{ASSET_NUM}",
|
|
|
|
|
# headers=user_auth_headers(user["authorization_token"]),
|
|
|
|
|
# )
|
|
|
|
|
# expected = 200 if user["name"] in NON_MANAGEMENT else 403
|
|
|
|
|
# assert res.status_code == expected, f"[{user['name']}] expected {expected}, got {res.status_code}: {res.text}"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# # ─────────────────────────────────────────────
|
|
|
|
|
# # Workscopes
|
|
|
|
|
# # ─────────────────────────────────────────────
|
|
|
|
|
|
|
|
|
|
# # [[TypeError]]
|
|
|
|
|
# def test_post_workscopes():
|
|
|
|
|
# """POST /workscopes — no role guard; all roles allowed
|
|
|
|
|
# Payload: workscope (str)
|
|
|
|
|
# """
|
|
|
|
|
# payload = {
|
|
|
|
|
# # "workscope": "Test workscope description",
|
|
|
|
|
# # "system": "Test system",
|
|
|
|
|
# # "subsystem": "Test subsystem",
|
|
|
|
|
# # "tasks": "Test task",
|
|
|
|
|
# # "equipment_workscope_groups": "Test group",
|
|
|
|
|
# # "oh_types": "Test OH type",
|
|
|
|
|
# "description": "Test description",
|
|
|
|
|
# # "job_id": SCOPE_JOB_ID,
|
|
|
|
|
# }
|
|
|
|
|
# for user in USER_LIST:
|
|
|
|
|
# csrf_token = get_csrf_token("/workscopes", user["authorization_token"])
|
|
|
|
|
# headers = {**user_auth_headers(user["authorization_token"]), "X-CSRF-Token": csrf_token}
|
|
|
|
|
# res = requests.post(f"{BASE_URL}/workscopes", json=payload, headers=headers)
|
|
|
|
|
# print(f"[{user['name']}], got {res.status_code}, response: {res.text}")
|
|
|
|
|
# assert res.status_code in (200, 201), f"[{user['name']}] expected 200/201, got {res.status_code}"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# ─────────────────────────────────────────────
|
|
|
|
|
# Equipment Workscopes
|
|
|
|
|
# ─────────────────────────────────────────────
|
|
|
|
|
|
|
|
|
|
# # [[NameError]]
|
|
|
|
|
# def test_post_equipment_workscopes_delete():
|
|
|
|
|
# """POST /equipment-workscopes/delete/{scope_job_id} — no role guard; all roles allowed
|
|
|
|
|
# No body required.
|
|
|
|
|
# """
|
|
|
|
|
# for user in USER_LIST:
|
|
|
|
|
# csrf_token = get_csrf_token("/equipment-workscopes/delete", user["authorization_token"])
|
|
|
|
|
# headers = {**user_auth_headers(user["authorization_token"]), "X-CSRF-Token": csrf_token}
|
|
|
|
|
# res = requests.post(
|
|
|
|
|
# f"{BASE_URL}/equipment-workscopes/delete/{SCOPE_JOB_ID}",
|
|
|
|
|
# headers=headers,
|
|
|
|
|
# )
|
|
|
|
|
# print(f"[{user['name']}], got {res.status_code}, response: {res.text}")
|
|
|
|
|
# assert res.status_code in (200, 204, 404), f"[{user['name']}] expected 200/204/404, got {res.status_code}"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# # ─────────────────────────────────────────────
|
|
|
|
|
# # Calculation — Time Constraint
|
|
|
|
|
# # ─────────────────────────────────────────────
|
|
|
|
|
|
|
|
|
|
# # [[AttributeError]]
|
|
|
|
|
# def test_post_calculation_time_constraint():
|
|
|
|
|
# """POST /calculation/time-constraint — required_permission(CREATE); Management has no CREATE
|
|
|
|
|
# Payload: overhaulCost (float), ohSessionId (UUID), costPerFailure (float)
|
|
|
|
|
# Query params: scope_calculation_id (optional), with_results (optional int), simulation_id (optional)
|
|
|
|
|
# """
|
|
|
|
|
# payload = {
|
|
|
|
|
# "overhaulCost": 0,
|
|
|
|
|
# "ohSessionId": OVERHAUL_SESSION_ID,
|
|
|
|
|
# "costPerFailure": 0,
|
|
|
|
|
# }
|
|
|
|
|
# for user in USER_LIST:
|
|
|
|
|
# csrf_token = get_csrf_token("/calculation/time-constraint", user["authorization_token"])
|
|
|
|
|
# headers = {**user_auth_headers(user["authorization_token"]), "X-CSRF-Token": csrf_token}
|
|
|
|
|
# res = requests.post(
|
|
|
|
|
# f"{BASE_URL}/calculation/time-constraint",
|
|
|
|
|
# json=payload,
|
|
|
|
|
# headers=headers,
|
|
|
|
|
# )
|
|
|
|
|
# print(f"[{user['name']}], got {res.status_code}, response: {res.text}")
|
|
|
|
|
# if user["name"] in NON_MANAGEMENT:
|
|
|
|
|
# assert res.status_code in (200, 201), f"[{user['name']}] expected 200/201, got {res.status_code}"
|
|
|
|
|
# else:
|
|
|
|
|
# assert res.status_code == 403, f"[{user['name']}] expected 403, got {res.status_code}"
|
|
|
|
|
|
|
|
|
|
# # [[AttributeError]]
|
|
|
|
|
# def test_get_calculation_time_constraint_parameters():
|
|
|
|
|
# """GET /calculation/time-constraint/parameters — required_permission(READ); Management has READ
|
|
|
|
|
# Query params: calculation_id (optional)
|
|
|
|
|
# """
|
|
|
|
|
# for user in USER_LIST:
|
|
|
|
|
# res = requests.get(
|
|
|
|
|
# f"{BASE_URL}/calculation/time-constraint/parameters",
|
|
|
|
|
# headers=user_auth_headers(user["authorization_token"]),
|
|
|
|
|
# )
|
|
|
|
|
# assert res.status_code == 200, f"[{user['name']}] expected 200, got {res.status_code}: {res.text}"
|
|
|
|
|
|
|
|
|
|
# # [[AttributeError]]
|
|
|
|
|
# def test_get_calculation_time_constraint_by_id_and_assetnum():
|
|
|
|
|
# """GET /calculation/time-constraint/{calculation_id}/{assetnum} — required_permission(READ); Management has READ"""
|
|
|
|
|
# for user in USER_LIST:
|
|
|
|
|
# res = requests.get(
|
|
|
|
|
# f"{BASE_URL}/calculation/time-constraint/{CALCULATION_ID}/{ASSET_NUM}",
|
|
|
|
|
# headers=user_auth_headers(user["authorization_token"]),
|
|
|
|
|
# )
|
|
|
|
|
# assert res.status_code in (200, 404), f"[{user['name']}] expected 200/404, got {res.status_code}: {res.text}"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -507,15 +289,8 @@ def get_csrf_token(path: str, auth_token: str) -> str:
|
|
|
|
|
# # Calculation — Budget Constraint
|
|
|
|
|
# # ─────────────────────────────────────────────
|
|
|
|
|
|
|
|
|
|
# # [[AttributeError]]
|
|
|
|
|
# def test_get_calculation_budget_constraint():
|
|
|
|
|
# """GET /calculation/budget-constraint/{session_id} — require_any_role blocks Management
|
|
|
|
|
# Query params: cost_threshold (float, default 100)
|
|
|
|
|
# """
|
|
|
|
|
# for user in USER_LIST:
|
|
|
|
|
# res = requests.get(
|
|
|
|
|
# f"{BASE_URL}/calculation/budget-constraint/{OVERHAUL_SESSION_ID}?cost_threshold={BUDGET_THRESHOLD}",
|
|
|
|
|
# headers=user_auth_headers(user["authorization_token"]),
|
|
|
|
|
# )
|
|
|
|
|
# expected = 200 if user["name"] in NON_MANAGEMENT else 403
|
|
|
|
|
# assert res.status_code == expected, f"[{user['name']}] expected {expected}, got {res.status_code}: {res.text}"
|
|
|
|
|
|