Files
BanGUI/e2e/tests/05_jails.robot
Lukas 0d21e3253e test(e2e): split suite by feature area with shared resources
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.
2026-06-21 07:55:19 +02:00

182 lines
8.3 KiB
Plaintext

*** Settings ***
Documentation Jail Management feature coverage — list, detail, controls,
... ban/unban, currently banned, IP lookup, ignore list.
Resource ${CURDIR}/../resources/common.resource
Resource ${CURDIR}/../resources/auth.resource
Suite Setup Wait For Backend Health
*** Test Cases ***
Jails Page Lists Active Jails
[Documentation] Jails page shows active jails with name and metrics.
Login As Admin
Go To ${FRONTEND_URL}/jails
Wait For Elements State css=[data-testid="jails-page"] visible timeout=15s
Page Should Contain Jails
Close Browser
Jails API Returns Active Jails
Set Random Xff Header
Login Via HTTP
${headers}= Create Dictionary X-BanGUI-Request 1
Set To Dictionary ${headers} X-Forwarded-For ${XFF_HEADER}
${resp}= GET On Session bangsess /api/v1/jails headers=${headers} expected_status=200
${body}= Set Variable ${resp.json()}
Dictionary Should Contain Key ${body} items
Jail Detail Page Loads For First Active Jail
[Documentation] Visiting /jails/<name> for a real active jail shows the detail view.
Login As Admin
Set Random Xff Header
Login Via HTTP
${jail}= Get First Active Jail Name
Log Using jail: ${jail}
Go To ${FRONTEND_URL}/jails/${jail}
Wait For Load State domcontentloaded
FOR ${i} IN RANGE 1 16
${found}= Run Keyword And Return Status
... Wait For Elements State css=[data-testid="jail-detail-page"] visible timeout=2s
IF ${found} BREAK
Sleep 1s
END
Page Should Contain ${jail}
Close Browser
Ban An IP Via API
[Documentation] POST /api/v1/bans bans an IP in a specific jail.
Set Random Xff Header
Login Via HTTP
${jail}= Get First Active Jail Name
${ip}= Generate Unique Ip
${headers}= Create Dictionary X-BanGUI-Request 1
Set To Dictionary ${headers} X-Forwarded-For ${XFF_HEADER}
${payload}= Create Dictionary jail ${jail} ip ${ip}
${resp}= POST On Session bangsess /api/v1/bans json=${payload}
... headers=${headers} expected_status=any
Should Be True ${resp.status_code} in [200, 201, 204] msg=Unexpected ban status: ${resp.status_code}
Set Suite Variable ${BANNED_IP} ${ip}
Set Suite Variable ${BANNED_JAIL} ${jail}
Unban The IP We Just Banned
[Documentation] DELETE /api/v1/bans removes an IP from a specific jail.
Set Random Xff Header
Login Via HTTP
${headers}= Create Dictionary X-BanGUI-Request 1
Set To Dictionary ${headers} X-Forwarded-For ${XFF_HEADER}
${payload}= Create Dictionary jail ${BANNED_JAIL} ip ${BANNED_IP}
${resp}= DELETE On Session bangsess /api/v1/bans json=${payload}
... headers=${headers} expected_status=any
Should Be True ${resp.status_code} in [200, 204] msg=Unexpected unban status: ${resp.status_code}
Unban All Endpoint Accepts Request
Set Random Xff Header
Login Via HTTP
${headers}= Create Dictionary X-BanGUI-Request 1
Set To Dictionary ${headers} X-Forwarded-For ${XFF_HEADER}
${resp}= DELETE On Session bangsess /api/v1/bans/all
... headers=${headers} expected_status=any
Should Be True ${resp.status_code} in [200, 204, 429] msg=Unexpected unban-all status: ${resp.status_code}
Active Bans Endpoint Returns List
Set Random Xff Header
Login Via HTTP
${headers}= Create Dictionary X-BanGUI-Request 1
Set To Dictionary ${headers} X-Forwarded-For ${XFF_HEADER}
${resp}= GET On Session bangsess /api/v1/bans/active
... headers=${headers} expected_status=any
Should Be True ${resp.status_code} in [200, 204]
IP Lookup Endpoint Returns Geo
[Documentation] GET /api/v1/geo/lookup/{ip} returns enrichment data.
Set Random Xff Header
Login Via HTTP
${ip}= Generate Unique Ip
${headers}= Create Dictionary X-BanGUI-Request 1
Set To Dictionary ${headers} X-Forwarded-For ${XFF_HEADER}
${resp}= GET On Session bangsess /api/v1/geo/lookup/${ip}
... headers=${headers} expected_status=any
Should Be True ${resp.status_code} in [200, 404] msg=Unexpected lookup status: ${resp.status_code}
Ignore List Add And Remove Via API
[Documentation] POST /api/v1/jails/{name}/ignoreip adds an IP to the ignore list.
Set Random Xff Header
Login Via HTTP
${jail}= Get First Active Jail Name
${ip}= Generate Unique Ip
${headers}= Create Dictionary X-BanGUI-Request 1
Set To Dictionary ${headers} X-Forwarded-For ${XFF_HEADER}
${payload}= Create Dictionary ip ${ip}
${add_resp}= POST On Session bangsess /api/v1/jails/${jail}/ignoreip
... json=${payload} headers=${headers} expected_status=any
Should Be True ${add_resp.status_code} in [200, 201, 204]
${del_resp}= DELETE On Session bangsess /api/v1/jails/${jail}/ignoreip
... json=${payload} headers=${headers} expected_status=any
Should Be True ${del_resp.status_code} in [200, 204]
Ignore Self Toggle Via API
Set Random Xff Header
Login Via HTTP
${jail}= Get First Active Jail Name
${headers}= Create Dictionary X-BanGUI-Request 1
Set To Dictionary ${headers} X-Forwarded-For ${XFF_HEADER}
${resp}= POST On Session bangsess /api/v1/jails/${jail}/ignoreself
... json=${EMPTY} headers=${headers} expected_status=any
Should Be True ${resp.status_code} in [200, 204]
Jail Reload Endpoint Works
Set Random Xff Header
Login Via HTTP
${jail}= Get First Active Jail Name
${headers}= Create Dictionary X-BanGUI-Request 1
Set To Dictionary ${headers} X-Forwarded-For ${XFF_HEADER}
${resp}= POST On Session bangsess /api/v1/jails/${jail}/reload
... json=${EMPTY} headers=${headers} expected_status=any
Should Be True ${resp.status_code} in [200, 204]
Jail Stop Endpoint Works
Set Random Xff Header
Login Via HTTP
${jail}= Get First Active Jail Name
${headers}= Create Dictionary X-BanGUI-Request 1
Set To Dictionary ${headers} X-Forwarded-For ${XFF_HEADER}
${resp}= POST On Session bangsess /api/v1/jails/${jail}/stop
... json=${EMPTY} headers=${headers} expected_status=any
Should Be True ${resp.status_code} in [200, 204, 400, 403] msg=Unexpected stop status: ${resp.status_code}
Jail Start Endpoint Works
Set Random Xff Header
Login Via HTTP
${jail}= Get First Active Jail Name
${headers}= Create Dictionary X-BanGUI-Request 1
Set To Dictionary ${headers} X-Forwarded-For ${XFF_HEADER}
${resp}= POST On Session bangsess /api/v1/jails/${jail}/start
... json=${EMPTY} headers=${headers} expected_status=any
Should Be True ${resp.status_code} in [200, 204, 400, 403]
Jail Idle Endpoint Works
Set Random Xff Header
Login Via HTTP
${jail}= Get First Active Jail Name
${headers}= Create Dictionary X-BanGUI-Request 1
Set To Dictionary ${headers} X-Forwarded-For ${XFF_HEADER}
${resp}= POST On Session bangsess /api/v1/jails/${jail}/idle
... json=${EMPTY} headers=${headers} expected_status=any
Should Be True ${resp.status_code} in [200, 204, 400, 403]
Reload All Jails Endpoint Works
Set Random Xff Header
Login Via HTTP
${headers}= Create Dictionary X-BanGUI-Request 1
Set To Dictionary ${headers} X-Forwarded-For ${XFF_HEADER}
${resp}= POST On Session bangsess /api/v1/jails/reload-all
... json=${EMPTY} headers=${headers} expected_status=any
Should Be True ${resp.status_code} in [200, 204]
Geo Stats Endpoint Returns Counters
Set Random Xff Header
Login Via HTTP
${headers}= Create Dictionary X-BanGUI-Request 1
Set To Dictionary ${headers} X-Forwarded-For ${XFF_HEADER}
${resp}= GET On Session bangsess /api/v1/geo/stats
... headers=${headers} expected_status=any
Should Be Equal As Integers ${resp.status_code} 200