Restructure 5 existing .robot files into 10 numbered files, one per feature area in Docs/Features.md. Each file is independently runnable. Add api.resource + data.resource for CSRF/XFF-aware wrappers and RFC5737 IP generators. Coverage: 110 new tests across login, dashboard, map, jails, config, history, blocklists, layout. Uses existing data-testid/aria-label/role selectors only — no frontend changes. Tests bypass per-IP rate limits via X-Forwarded-For header rotation. Hard rule preserved: failures are findings, never app-code fixes.
79 lines
3.3 KiB
Plaintext
79 lines
3.3 KiB
Plaintext
*** Settings ***
|
|
Documentation Lightweight wrappers around RequestsLibrary that auto-inject
|
|
... the CSRF X-BanGUI-Request header and rotate X-Forwarded-For
|
|
... to bypass per-IP rate limits. Requires a logged-in session
|
|
... named 'bangsess' (created via Login Via HTTP in auth.resource).
|
|
|
|
*** Keywords ***
|
|
Build Headers
|
|
[Documentation] Returns a headers dict with X-BanGUI-Request always set
|
|
... and X-Forwarded-For rotated if ${XFF_HEADER} is set.
|
|
[Arguments] ${extra_headers}=${None}
|
|
${headers}= Create Dictionary X-BanGUI-Request 1
|
|
IF "${XFF_HEADER}" != ""
|
|
Set To Dictionary ${headers} X-Forwarded-For ${XFF_HEADER}
|
|
END
|
|
IF "${extra_headers}" != "${None}"
|
|
FOR ${key} IN @{extra_headers.keys()}
|
|
Set To Dictionary ${headers} ${key} ${extra_headers}[${key}]
|
|
END
|
|
END
|
|
RETURN ${headers}
|
|
|
|
Api Get
|
|
[Documentation] GET wrapper that injects CSRF + XFF headers.
|
|
[Arguments] ${url_path} ${expected_status}=200 ${params}=${None}
|
|
${headers}= Build Headers
|
|
${kwargs}= Create Dictionary headers ${headers} expected_status ${expected_status}
|
|
IF "${params}" != "${None}"
|
|
Set To Dictionary ${kwargs} params ${params}
|
|
END
|
|
${resp}= GET On Session bangsess ${url_path} &{kwargs}
|
|
RETURN ${resp}
|
|
|
|
Api Post
|
|
[Documentation] POST wrapper that injects CSRF + XFF headers.
|
|
[Arguments] ${url_path} ${payload}=${EMPTY} ${expected_status}=200
|
|
${headers}= Build Headers
|
|
IF "${payload}" != "${EMPTY}"
|
|
${resp}= POST On Session bangsess ${url_path}
|
|
... json=${payload} headers=${headers} expected_status=${expected_status}
|
|
ELSE
|
|
${resp}= POST On Session bangsess ${url_path}
|
|
... headers=${headers} expected_status=${expected_status}
|
|
END
|
|
RETURN ${resp}
|
|
|
|
Api Put
|
|
[Documentation] PUT wrapper that injects CSRF + XFF headers.
|
|
[Arguments] ${url_path} ${payload} ${expected_status}=200
|
|
${headers}= Build Headers
|
|
${resp}= PUT On Session bangsess ${url_path}
|
|
... json=${payload} headers=${headers} expected_status=${expected_status}
|
|
RETURN ${resp}
|
|
|
|
Api Delete
|
|
[Documentation] DELETE wrapper that injects CSRF + XFF headers.
|
|
[Arguments] ${url_path} ${payload}=${EMPTY} ${expected_status}=200
|
|
${headers}= Build Headers
|
|
IF "${payload}" != "${EMPTY}"
|
|
${resp}= DELETE On Session bangsess ${url_path}
|
|
... json=${payload} headers=${headers} expected_status=${expected_status}
|
|
ELSE
|
|
${resp}= DELETE On Session bangsess ${url_path}
|
|
... headers=${headers} expected_status=${expected_status}
|
|
END
|
|
RETURN ${resp}
|
|
|
|
Status Is Acceptable
|
|
[Documentation] Returns True if the response status is one of the accepted codes.
|
|
[Arguments] ${response} @{accepted_codes}
|
|
${ok}= Set Variable ${FALSE}
|
|
FOR ${code} IN @{accepted_codes}
|
|
IF ${response.status_code} == ${code}
|
|
${ok}= Set Variable ${TRUE}
|
|
EXIT FOR LOOP
|
|
END
|
|
END
|
|
RETURN ${ok}
|