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.
182 lines
8.3 KiB
Plaintext
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
|