Files
Aniworld/robot_output/output.xml

4074 lines
206 KiB
XML

<?xml version="1.0" encoding="UTF-8"?>
<robot generator="Robot 7.4.2 (Python 3.13.5 on linux)" generated="2026-06-27T13:55:22.606671" rpa="false" schemaversion="5">
<suite id="s1" name="Config" source="/home/lukas/Volume/repo/Aniworld/tests/robot/api/config.robot">
<test id="s1-t1" name="Get Default Config" line="19">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Create Anonymous Session" owner="common">
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:22.815361" level="INFO">Creating Session using : alias=anon, url=http://127.0.0.1:8765, headers={}, cookies={}, auth=None, timeout=None, proxies=None, verify=False, debug=0 </msg>
<arg>anon</arg>
<arg>${BASE_URL}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-06-27T13:55:22.815152" elapsed="0.000350"/>
</kw>
<doc>Create an unauthenticated HTTP session.</doc>
<status status="PASS" start="2026-06-27T13:55:22.814818" elapsed="0.000758"/>
</kw>
<kw name="Setup Master Password" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-06-27T13:55:22.816549" level="INFO">${payload} = {'master_password': 'TestPass123!', 'anime_directory': '/tmp/aniworld_test_anime', 'name': 'AniworldTest', 'data_dir': 'data', 'scheduler_enabled': 'False', 'logging_level': 'INFO', 'backup_enabled': ...</msg>
<var>${payload}</var>
<arg>master_password=${SETUP_PASSWORD}</arg>
<arg>anime_directory=/tmp/aniworld_test_anime</arg>
<arg>name=AniworldTest</arg>
<arg>data_dir=data</arg>
<arg>scheduler_enabled=False</arg>
<arg>logging_level=INFO</arg>
<arg>backup_enabled=False</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-06-27T13:55:22.816138" elapsed="0.000436"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:22.831204" level="INFO">POST Request : url=http://127.0.0.1:8765/api/auth/setup
path_url=/api/auth/setup
headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate, br', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Length': '208', 'Content-Type': 'application/json'}
body=b'{"master_password": "TestPass123!", "anime_directory": "/tmp/aniworld_test_anime", "name": "AniworldTest", "data_dir": "data", "scheduler_enabled": "False", "logging_level": "INFO", "backup_enabled": "False"}'
</msg>
<msg time="2026-06-27T13:55:22.831291" level="INFO">POST Response : url=http://127.0.0.1:8765/api/auth/setup
status=201, reason=Created
headers={'date': 'Sat, 27 Jun 2026 11:55:21 GMT', 'server': 'uvicorn', 'content-length': '51', 'content-type': 'application/json'}
body={"status":"ok","redirect":"/loading?phase=initial"}
</msg>
<msg time="2026-06-27T13:55:22.831395" level="INFO">${resp} = &lt;Response [201]&gt;</msg>
<var>${resp}</var>
<arg>anon</arg>
<arg>/api/auth/setup</arg>
<arg>json=${payload}</arg>
<arg>expected_status=any</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-06-27T13:55:22.816665" elapsed="0.014753"/>
</kw>
<if>
<branch type="IF" condition="'${resp.status_code}' == '429'">
<kw name="Sleep" owner="BuiltIn">
<arg>45s</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:22.832120" elapsed="0.000088"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>anon</arg>
<arg>/api/auth/setup</arg>
<arg>json=${payload}</arg>
<arg>expected_status=any</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:22.832314" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:22.831538" elapsed="0.000863"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:22.831510" elapsed="0.000926"/>
</if>
<if>
<branch type="IF" condition="'${resp.status_code}' == '429'">
<kw name="Sleep" owner="BuiltIn">
<arg>45s</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:22.832850" elapsed="0.000045"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>anon</arg>
<arg>/api/auth/setup</arg>
<arg>json=${payload}</arg>
<arg>expected_status=any</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:22.832969" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:22.832485" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:22.832472" elapsed="0.000598"/>
</if>
<if>
<branch type="IF" condition="'${resp.status_code}' == '400'">
<kw name="Convert String To Json" owner="JSONLibrary">
<var>${json}</var>
<arg>${resp.text}</arg>
<doc>Convert String to JSON object</doc>
<status status="NOT RUN" start="2026-06-27T13:55:22.833452" elapsed="0.000041"/>
</kw>
<kw name="Get Value From Json" owner="JSONLibrary">
<var>${detail}</var>
<arg>${json}</arg>
<arg>$.detail</arg>
<doc>Get Value From JSON using JSONPath</doc>
<status status="NOT RUN" start="2026-06-27T13:55:22.833564" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="'${detail}[0]' == 'Master password already configured'">
<return>
<status status="NOT RUN" start="2026-06-27T13:55:22.833719" elapsed="0.000048"/>
</return>
<status status="NOT RUN" start="2026-06-27T13:55:22.833655" elapsed="0.000142"/>
</branch>
<status status="NOT RUN" start="2026-06-27T13:55:22.833644" elapsed="0.000176"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Setup failed with 400: ${detail}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:22.833879" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:22.833110" elapsed="0.000838"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:22.833098" elapsed="0.000874"/>
</if>
<if>
<branch type="IF" condition="'${resp.status_code}' == '201'">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-06-27T13:55:22.834785" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${resp.status_code}</arg>
<arg>201</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-06-27T13:55:22.834356" elapsed="0.000482"/>
</kw>
<return>
<status status="PASS" start="2026-06-27T13:55:22.834884" elapsed="0.000073"/>
</return>
<status status="PASS" start="2026-06-27T13:55:22.834010" elapsed="0.000982"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:22.833999" elapsed="0.001019"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unexpected status ${resp.status_code} from /api/auth/setup</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:22.835087" elapsed="0.000045"/>
</kw>
<doc>Configure the master password via the setup endpoint.</doc>
<status status="PASS" start="2026-06-27T13:55:22.815814" elapsed="0.019378"/>
</kw>
<kw name="Create Authenticated Session" owner="common">
<kw name="Create Anonymous Session" owner="common">
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:22.835899" level="INFO">Creating Session using : alias=anon, url=http://127.0.0.1:8765, headers={}, cookies={}, auth=None, timeout=None, proxies=None, verify=False, debug=0 </msg>
<arg>anon</arg>
<arg>${BASE_URL}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-06-27T13:55:22.835774" elapsed="0.000234"/>
</kw>
<doc>Create an unauthenticated HTTP session.</doc>
<status status="PASS" start="2026-06-27T13:55:22.835584" elapsed="0.000480"/>
</kw>
<kw name="Is Auth Configured" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:22.838115" level="INFO">GET Request : url=http://127.0.0.1:8765/api/auth/status
path_url=/api/auth/status
headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate, br', 'Accept': '*/*', 'Connection': 'keep-alive'}
body=None
</msg>
<msg time="2026-06-27T13:55:22.838301" level="INFO">GET Response : url=http://127.0.0.1:8765/api/auth/status
status=200, reason=OK
headers={'date': 'Sat, 27 Jun 2026 11:55:21 GMT', 'server': 'uvicorn', 'content-length': '41', 'content-type': 'application/json'}
body={"configured":true,"authenticated":false}
</msg>
<msg time="2026-06-27T13:55:22.838386" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>anon</arg>
<arg>/api/auth/status</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-06-27T13:55:22.836364" elapsed="0.002042"/>
</kw>
<kw name="Convert String To Json" owner="JSONLibrary">
<msg time="2026-06-27T13:55:22.838915" level="INFO">${json} = {'configured': True, 'authenticated': False}</msg>
<var>${json}</var>
<arg>${resp.text}</arg>
<doc>Convert String to JSON object</doc>
<status status="PASS" start="2026-06-27T13:55:22.838515" elapsed="0.000422"/>
</kw>
<kw name="Get Value From Json" owner="JSONLibrary">
<msg time="2026-06-27T13:55:22.851319" level="INFO">${configured} = [True]</msg>
<var>${configured}</var>
<arg>${json}</arg>
<arg>$.configured</arg>
<doc>Get Value From JSON using JSONPath</doc>
<status status="PASS" start="2026-06-27T13:55:22.839030" elapsed="0.012323"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-06-27T13:55:22.851826" level="INFO">${configured_val} = True</msg>
<var>${configured_val}</var>
<arg>${configured}[0]</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-06-27T13:55:22.851473" elapsed="0.000376"/>
</kw>
<return>
<value>${configured_val}</value>
<status status="PASS" start="2026-06-27T13:55:22.851897" elapsed="0.000074"/>
</return>
<msg time="2026-06-27T13:55:22.852074" level="INFO">${configured} = True</msg>
<var>${configured}</var>
<doc>Check if the master password has already been configured.</doc>
<status status="PASS" start="2026-06-27T13:55:22.836169" elapsed="0.015923"/>
</kw>
<if>
<branch type="IF" condition="not ${configured}">
<kw name="Setup Master Password" owner="common">
<doc>Configure the master password via the setup endpoint.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:22.852469" elapsed="0.000051"/>
</kw>
<kw name="Login And Get Token" owner="common">
<var>${token}</var>
<doc>Log in with the master password and return the JWT access token.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:22.852665" elapsed="0.000092"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<arg>auth</arg>
<arg>${BASE_URL}</arg>
<arg>headers={'Authorization': 'Bearer ${token}'}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="NOT RUN" start="2026-06-27T13:55:22.852844" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:22.852148" elapsed="0.000778"/>
</branch>
<branch type="ELSE IF" condition="'${TOKEN}' == '${EMPTY}'">
<kw name="Login And Get Token" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-06-27T13:55:22.853919" level="INFO">${payload} = {'password': 'TestPass123!'}</msg>
<var>${payload}</var>
<arg>password=${SETUP_PASSWORD}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-06-27T13:55:22.853612" elapsed="0.000329"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:22.866251" level="INFO">POST Request : url=http://127.0.0.1:8765/api/auth/login
path_url=/api/auth/login
headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate, br', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Length': '28', 'Content-Type': 'application/json'}
body=b'{"password": "TestPass123!"}'
</msg>
<msg time="2026-06-27T13:55:22.866310" level="INFO">POST Response : url=http://127.0.0.1:8765/api/auth/login
status=200, reason=OK
headers={'date': 'Sat, 27 Jun 2026 11:55:21 GMT', 'server': 'uvicorn', 'content-length': '232', 'content-type': 'application/json'}
body={"access_token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJtYXN0ZXIiLCJleHAiOjE3ODI2NDc3MjIsImlhdCI6MTc4MjU2MTMyMn0.--vlbTAAA2hgaD0fZcM-E01gJMfeZI9wU6wqkY3O9Fs","token_type":"bearer","expires_at":"2026-06-28T11:55:22.863211Z"}
</msg>
<msg time="2026-06-27T13:55:22.866395" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>anon</arg>
<arg>/api/auth/login</arg>
<arg>json=${payload}</arg>
<arg>expected_status=any</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-06-27T13:55:22.854025" elapsed="0.012388"/>
</kw>
<if>
<branch type="IF" condition="'${resp.status_code}' == '429'">
<kw name="Sleep" owner="BuiltIn">
<arg>6s</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:22.867017" elapsed="0.000062"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>anon</arg>
<arg>/api/auth/login</arg>
<arg>json=${payload}</arg>
<arg>expected_status=any</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:22.867173" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:22.866499" elapsed="0.000766"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:22.866481" elapsed="0.000814"/>
</if>
<if>
<branch type="IF" condition="'${resp.status_code}' != '200'">
<kw name="Convert String To Json" owner="JSONLibrary">
<var>${json}</var>
<arg>${resp.text}</arg>
<doc>Convert String to JSON object</doc>
<status status="NOT RUN" start="2026-06-27T13:55:22.867709" elapsed="0.000061"/>
</kw>
<kw name="Get Value From Json" owner="JSONLibrary">
<var>${detail}</var>
<arg>${json}</arg>
<arg>$.detail</arg>
<doc>Get Value From JSON using JSONPath</doc>
<status status="NOT RUN" start="2026-06-27T13:55:22.867849" elapsed="0.000043"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${detail_val}</var>
<arg>${detail}[0]</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:22.867956" elapsed="0.000035"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>Login failed with ${resp.status_code}: ${detail_val}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:22.868050" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:22.867337" elapsed="0.000772"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:22.867325" elapsed="0.000807"/>
</if>
<kw name="Convert String To Json" owner="JSONLibrary">
<msg time="2026-06-27T13:55:22.868513" level="INFO">${json} = {'access_token': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJtYXN0ZXIiLCJleHAiOjE3ODI2NDc3MjIsImlhdCI6MTc4MjU2MTMyMn0.--vlbTAAA2hgaD0fZcM-E01gJMfeZI9wU6wqkY3O9Fs', 'token_type': 'bearer', 'expire...</msg>
<var>${json}</var>
<arg>${resp.text}</arg>
<doc>Convert String to JSON object</doc>
<status status="PASS" start="2026-06-27T13:55:22.868182" elapsed="0.000352"/>
</kw>
<kw name="Get Value From Json" owner="JSONLibrary">
<msg time="2026-06-27T13:55:22.878517" level="INFO">${token} = ['eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJtYXN0ZXIiLCJleHAiOjE3ODI2NDc3MjIsImlhdCI6MTc4MjU2MTMyMn0.--vlbTAAA2hgaD0fZcM-E01gJMfeZI9wU6wqkY3O9Fs']</msg>
<var>${token}</var>
<arg>${json}</arg>
<arg>$.access_token</arg>
<doc>Get Value From JSON using JSONPath</doc>
<status status="PASS" start="2026-06-27T13:55:22.868603" elapsed="0.009943"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-06-27T13:55:22.879036" level="INFO">${token_str} = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJtYXN0ZXIiLCJleHAiOjE3ODI2NDc3MjIsImlhdCI6MTc4MjU2MTMyMn0.--vlbTAAA2hgaD0fZcM-E01gJMfeZI9wU6wqkY3O9Fs</msg>
<var>${token_str}</var>
<arg>${token}[0]</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-06-27T13:55:22.878646" elapsed="0.000430"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-06-27T13:55:22.879595" level="INFO">${TOKEN} = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJtYXN0ZXIiLCJleHAiOjE3ODI2NDc3MjIsImlhdCI6MTc4MjU2MTMyMn0.--vlbTAAA2hgaD0fZcM-E01gJMfeZI9wU6wqkY3O9Fs</msg>
<arg>${TOKEN}</arg>
<arg>${token_str}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-06-27T13:55:22.879192" elapsed="0.000437"/>
</kw>
<return>
<value>${token_str}</value>
<status status="PASS" start="2026-06-27T13:55:22.879676" elapsed="0.000073"/>
</return>
<msg time="2026-06-27T13:55:22.879850" level="INFO">${token} = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJtYXN0ZXIiLCJleHAiOjE3ODI2NDc3MjIsImlhdCI6MTc4MjU2MTMyMn0.--vlbTAAA2hgaD0fZcM-E01gJMfeZI9wU6wqkY3O9Fs</msg>
<var>${token}</var>
<doc>Log in with the master password and return the JWT access token.</doc>
<status status="PASS" start="2026-06-27T13:55:22.853412" elapsed="0.026456"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:22.880165" level="INFO">Creating Session using : alias=auth, url=http://127.0.0.1:8765, headers={'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJtYXN0ZXIiLCJleHAiOjE3ODI2NDc3MjIsImlhdCI6MTc4MjU2MTMyMn0.--vlbTAAA2hgaD0fZcM-E01gJMfeZI9wU6wqkY3O9Fs'}, cookies={}, auth=None, timeout=None, proxies=None, verify=False, debug=0 </msg>
<arg>auth</arg>
<arg>${BASE_URL}</arg>
<arg>headers={'Authorization': 'Bearer ${token}'}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-06-27T13:55:22.879950" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-06-27T13:55:22.852956" elapsed="0.027355"/>
</branch>
<branch type="ELSE">
<kw name="Create Session" owner="RequestsLibrary">
<arg>auth</arg>
<arg>${BASE_URL}</arg>
<arg>headers={'Authorization': 'Bearer ${TOKEN}'}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="NOT RUN" start="2026-06-27T13:55:22.880456" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:22.880346" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:22.852135" elapsed="0.028421"/>
</if>
<doc>Create an authenticated HTTP session. Performs setup if needed, then logs in.
Skips setup/login if already authenticated (suite-level setup done).</doc>
<status status="PASS" start="2026-06-27T13:55:22.835358" elapsed="0.045234"/>
</kw>
<arg>Create Anonymous Session</arg>
<arg>AND</arg>
<arg>Setup Master Password</arg>
<arg>AND</arg>
<arg>Create Authenticated Session</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-06-27T13:55:22.814326" elapsed="0.066310"/>
</kw>
<kw name="GET API" owner="api_keywords">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:22.884351" level="INFO">GET Request : url=http://127.0.0.1:8765/api/config
path_url=/api/config
headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate, br', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJtYXN0ZXIiLCJleHAiOjE3ODI2NDc3MjIsImlhdCI6MTc4MjU2MTMyMn0.--vlbTAAA2hgaD0fZcM-E01gJMfeZI9wU6wqkY3O9Fs'}
body=None
</msg>
<msg time="2026-06-27T13:55:22.884408" level="INFO">GET Response : url=http://127.0.0.1:8765/api/config
status=200, reason=OK
headers={'date': 'Sat, 27 Jun 2026 11:55:21 GMT', 'server': 'uvicorn', 'content-length': '829', 'content-type': 'application/json'}
body={"name":"AniworldTest","data_dir":"data","scheduler":{"enabled":false,"interval_minutes":60,"schedule_time":"03:00","schedule_days":["mon","tue","wed","thu","fri","sat","sun"],"auto_download_after_rescan":false,"nfo_scan_after_rescan":true,"image_scan_after_rescan":true,"auto_download":null},"logging":{"level":"INFO","file":null,"max_bytes":null,"backup_count":3},"backup":{"enabled":false,"path":"data/backups","keep_days":30},"nfo":{"tmdb_api_key":null,"auto_create":true,"update_on_scan":true,"download_poster":true,"download_logo":true,"download_fanart":true,"image_size":"original"},"scan_key_overrides":{},"other":{"loading_complete":true,"master_password_hash":"$pbkdf2-sha256$29000$dm6NcU5JaU2p1dqbM2aMMQ$U4sJCHcdZe6kEYxBSqIoQ46pgtjyCt8N1flCTGj06tY","loading_started":true,"anime_directory":"/tmp/aniworld_test_anime"}}
</msg>
<msg time="2026-06-27T13:55:22.884494" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>${endpoint}</arg>
<arg>expected_status=${expected_status}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-06-27T13:55:22.880994" elapsed="0.003521"/>
</kw>
<return>
<value>${resp}</value>
<status status="PASS" start="2026-06-27T13:55:22.884577" elapsed="0.000193"/>
</return>
<msg time="2026-06-27T13:55:22.884904" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>/api/config</arg>
<doc>Perform an authenticated GET request and return the response.</doc>
<status status="PASS" start="2026-06-27T13:55:22.880772" elapsed="0.004154"/>
</kw>
<kw name="Response Should Have Status" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-06-27T13:55:22.886014" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>${expected_status}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-06-27T13:55:22.885444" elapsed="0.000619"/>
</kw>
<arg>${resp}</arg>
<arg>200</arg>
<doc>Assert that the response status code matches the expected value.</doc>
<status status="PASS" start="2026-06-27T13:55:22.885055" elapsed="0.001061"/>
</kw>
<kw name="Response Should Contain Keys" owner="api_keywords">
<kw name="Convert String To Json" owner="JSONLibrary">
<msg time="2026-06-27T13:55:22.887075" level="INFO">${json} = {'name': 'AniworldTest', 'data_dir': 'data', 'scheduler': {'enabled': False, 'interval_minutes': 60, 'schedule_time': '03:00', 'schedule_days': ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'], 'auto...</msg>
<var>${json}</var>
<arg>${response.text}</arg>
<doc>Convert String to JSON object</doc>
<status status="PASS" start="2026-06-27T13:55:22.886601" elapsed="0.000496"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${json}</arg>
<arg>${key}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-06-27T13:55:22.887513" elapsed="0.000152"/>
</kw>
<var name="${key}">name</var>
<status status="PASS" start="2026-06-27T13:55:22.887398" elapsed="0.000303"/>
</iter>
<iter>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${json}</arg>
<arg>${key}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-06-27T13:55:22.887924" elapsed="0.000135"/>
</kw>
<var name="${key}">data_dir</var>
<status status="PASS" start="2026-06-27T13:55:22.887797" elapsed="0.000294"/>
</iter>
<iter>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${json}</arg>
<arg>${key}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-06-27T13:55:22.888231" elapsed="0.000120"/>
</kw>
<var name="${key}">scheduler</var>
<status status="PASS" start="2026-06-27T13:55:22.888151" elapsed="0.000229"/>
</iter>
<iter>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${json}</arg>
<arg>${key}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-06-27T13:55:22.888510" elapsed="0.000114"/>
</kw>
<var name="${key}">logging</var>
<status status="PASS" start="2026-06-27T13:55:22.888434" elapsed="0.000217"/>
</iter>
<iter>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${json}</arg>
<arg>${key}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-06-27T13:55:22.888782" elapsed="0.000114"/>
</kw>
<var name="${key}">backup</var>
<status status="PASS" start="2026-06-27T13:55:22.888704" elapsed="0.000219"/>
</iter>
<iter>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${json}</arg>
<arg>${key}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-06-27T13:55:22.889199" elapsed="0.000141"/>
</kw>
<var name="${key}">nfo</var>
<status status="PASS" start="2026-06-27T13:55:22.889101" elapsed="0.000275"/>
</iter>
<var>${key}</var>
<value>@{keys}</value>
<status status="PASS" start="2026-06-27T13:55:22.887153" elapsed="0.002257"/>
</for>
<arg>${resp}</arg>
<arg>name</arg>
<arg>data_dir</arg>
<arg>scheduler</arg>
<arg>logging</arg>
<arg>backup</arg>
<arg>nfo</arg>
<doc>Assert that the JSON response contains all the specified top-level keys.</doc>
<status status="PASS" start="2026-06-27T13:55:22.886235" elapsed="0.003229"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary" type="TEARDOWN">
<msg time="2026-06-27T13:55:22.889705" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-06-27T13:55:22.889596" elapsed="0.000257"/>
</kw>
<msg time="2026-06-27T13:55:22.893570" level="INFO">Starting Browser process /home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js using at 127.0.0.1:50011</msg>
<doc>Retrieve the current configuration and verify its structure.</doc>
<status status="PASS" start="2026-06-27T13:55:22.813456" elapsed="0.076437"/>
</test>
<test id="s1-t2" name="Update Config" line="25">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Create Anonymous Session" owner="common">
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.325975" level="INFO">Creating Session using : alias=anon, url=http://127.0.0.1:8765, headers={}, cookies={}, auth=None, timeout=None, proxies=None, verify=False, debug=0 </msg>
<arg>anon</arg>
<arg>${BASE_URL}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-06-27T13:55:23.325645" elapsed="0.000583"/>
</kw>
<doc>Create an unauthenticated HTTP session.</doc>
<status status="PASS" start="2026-06-27T13:55:23.325326" elapsed="0.001011"/>
</kw>
<kw name="Setup Master Password" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-06-27T13:55:23.327674" level="INFO">${payload} = {'master_password': 'TestPass123!', 'anime_directory': '/tmp/aniworld_test_anime', 'name': 'AniworldTest', 'data_dir': 'data', 'scheduler_enabled': 'False', 'logging_level': 'INFO', 'backup_enabled': ...</msg>
<var>${payload}</var>
<arg>master_password=${SETUP_PASSWORD}</arg>
<arg>anime_directory=/tmp/aniworld_test_anime</arg>
<arg>name=AniworldTest</arg>
<arg>data_dir=data</arg>
<arg>scheduler_enabled=False</arg>
<arg>logging_level=INFO</arg>
<arg>backup_enabled=False</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-06-27T13:55:23.327279" elapsed="0.000423"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.331937" level="INFO">POST Request : url=http://127.0.0.1:8765/api/auth/setup
path_url=/api/auth/setup
headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate, br', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Length': '208', 'Content-Type': 'application/json'}
body=b'{"master_password": "TestPass123!", "anime_directory": "/tmp/aniworld_test_anime", "name": "AniworldTest", "data_dir": "data", "scheduler_enabled": "False", "logging_level": "INFO", "backup_enabled": "False"}'
</msg>
<msg time="2026-06-27T13:55:23.332001" level="INFO">POST Response : url=http://127.0.0.1:8765/api/auth/setup
status=400, reason=Bad Request
headers={'date': 'Sat, 27 Jun 2026 11:55:22 GMT', 'server': 'uvicorn', 'content-length': '47', 'content-type': 'application/json'}
body={"detail":"Master password already configured"}
</msg>
<msg time="2026-06-27T13:55:23.332093" level="INFO">${resp} = &lt;Response [400]&gt;</msg>
<var>${resp}</var>
<arg>anon</arg>
<arg>/api/auth/setup</arg>
<arg>json=${payload}</arg>
<arg>expected_status=any</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-06-27T13:55:23.327837" elapsed="0.004279"/>
</kw>
<if>
<branch type="IF" condition="'${resp.status_code}' == '429'">
<kw name="Sleep" owner="BuiltIn">
<arg>45s</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.332739" elapsed="0.000081"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>anon</arg>
<arg>/api/auth/setup</arg>
<arg>json=${payload}</arg>
<arg>expected_status=any</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.332919" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:23.332230" elapsed="0.000773"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.332207" elapsed="0.000831"/>
</if>
<if>
<branch type="IF" condition="'${resp.status_code}' == '429'">
<kw name="Sleep" owner="BuiltIn">
<arg>45s</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.333463" elapsed="0.000060"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>anon</arg>
<arg>/api/auth/setup</arg>
<arg>json=${payload}</arg>
<arg>expected_status=any</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.333620" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:23.333082" elapsed="0.000644"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.333070" elapsed="0.000690"/>
</if>
<if>
<branch type="IF" condition="'${resp.status_code}' == '400'">
<kw name="Convert String To Json" owner="JSONLibrary">
<msg time="2026-06-27T13:55:23.334533" level="INFO">${json} = {'detail': 'Master password already configured'}</msg>
<var>${json}</var>
<arg>${resp.text}</arg>
<doc>Convert String to JSON object</doc>
<status status="PASS" start="2026-06-27T13:55:23.334155" elapsed="0.000401"/>
</kw>
<kw name="Get Value From Json" owner="JSONLibrary">
<msg time="2026-06-27T13:55:23.346075" level="INFO">${detail} = ['Master password already configured']</msg>
<var>${detail}</var>
<arg>${json}</arg>
<arg>$.detail</arg>
<doc>Get Value From JSON using JSONPath</doc>
<status status="PASS" start="2026-06-27T13:55:23.334641" elapsed="0.011469"/>
</kw>
<if>
<branch type="IF" condition="'${detail}[0]' == 'Master password already configured'">
<return>
<status status="PASS" start="2026-06-27T13:55:23.346425" elapsed="0.000062"/>
</return>
<status status="PASS" start="2026-06-27T13:55:23.346204" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.346186" elapsed="0.000364"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Setup failed with 400: ${detail}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.346644" elapsed="0.000048"/>
</kw>
<status status="PASS" start="2026-06-27T13:55:23.333802" elapsed="0.012929"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.333790" elapsed="0.012993"/>
</if>
<if>
<branch type="IF" condition="'${resp.status_code}' == '201'">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${resp.status_code}</arg>
<arg>201</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.346966" elapsed="0.000053"/>
</kw>
<return>
<status status="NOT RUN" start="2026-06-27T13:55:23.347057" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-06-27T13:55:23.346828" elapsed="0.000292"/>
</branch>
<status status="NOT RUN" start="2026-06-27T13:55:23.346815" elapsed="0.000327"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unexpected status ${resp.status_code} from /api/auth/setup</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.347199" elapsed="0.000040"/>
</kw>
<doc>Configure the master password via the setup endpoint.</doc>
<status status="PASS" start="2026-06-27T13:55:23.326771" elapsed="0.020653"/>
</kw>
<kw name="Create Authenticated Session" owner="common">
<kw name="Create Anonymous Session" owner="common">
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.348202" level="INFO">Creating Session using : alias=anon, url=http://127.0.0.1:8765, headers={}, cookies={}, auth=None, timeout=None, proxies=None, verify=False, debug=0 </msg>
<arg>anon</arg>
<arg>${BASE_URL}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-06-27T13:55:23.348077" elapsed="0.000224"/>
</kw>
<doc>Create an unauthenticated HTTP session.</doc>
<status status="PASS" start="2026-06-27T13:55:23.347847" elapsed="0.000500"/>
</kw>
<kw name="Is Auth Configured" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.350366" level="INFO">GET Request : url=http://127.0.0.1:8765/api/auth/status
path_url=/api/auth/status
headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate, br', 'Accept': '*/*', 'Connection': 'keep-alive'}
body=None
</msg>
<msg time="2026-06-27T13:55:23.350415" level="INFO">GET Response : url=http://127.0.0.1:8765/api/auth/status
status=200, reason=OK
headers={'date': 'Sat, 27 Jun 2026 11:55:22 GMT', 'server': 'uvicorn', 'content-length': '41', 'content-type': 'application/json'}
body={"configured":true,"authenticated":false}
</msg>
<msg time="2026-06-27T13:55:23.350489" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>anon</arg>
<arg>/api/auth/status</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-06-27T13:55:23.348618" elapsed="0.001889"/>
</kw>
<kw name="Convert String To Json" owner="JSONLibrary">
<msg time="2026-06-27T13:55:23.351030" level="INFO">${json} = {'configured': True, 'authenticated': False}</msg>
<var>${json}</var>
<arg>${resp.text}</arg>
<doc>Convert String to JSON object</doc>
<status status="PASS" start="2026-06-27T13:55:23.350609" elapsed="0.000443"/>
</kw>
<kw name="Get Value From Json" owner="JSONLibrary">
<msg time="2026-06-27T13:55:23.362526" level="INFO">${configured} = [True]</msg>
<var>${configured}</var>
<arg>${json}</arg>
<arg>$.configured</arg>
<doc>Get Value From JSON using JSONPath</doc>
<status status="PASS" start="2026-06-27T13:55:23.351141" elapsed="0.011417"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-06-27T13:55:23.363116" level="INFO">${configured_val} = True</msg>
<var>${configured_val}</var>
<arg>${configured}[0]</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-06-27T13:55:23.362681" elapsed="0.000458"/>
</kw>
<return>
<value>${configured_val}</value>
<status status="PASS" start="2026-06-27T13:55:23.363190" elapsed="0.000101"/>
</return>
<msg time="2026-06-27T13:55:23.363398" level="INFO">${configured} = True</msg>
<var>${configured}</var>
<doc>Check if the master password has already been configured.</doc>
<status status="PASS" start="2026-06-27T13:55:23.348439" elapsed="0.014977"/>
</kw>
<if>
<branch type="IF" condition="not ${configured}">
<kw name="Setup Master Password" owner="common">
<doc>Configure the master password via the setup endpoint.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.363822" elapsed="0.000058"/>
</kw>
<kw name="Login And Get Token" owner="common">
<var>${token}</var>
<doc>Log in with the master password and return the JWT access token.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.364036" elapsed="0.000049"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<arg>auth</arg>
<arg>${BASE_URL}</arg>
<arg>headers={'Authorization': 'Bearer ${token}'}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.364167" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:23.363477" elapsed="0.000766"/>
</branch>
<branch type="ELSE IF" condition="'${TOKEN}' == '${EMPTY}'">
<kw name="Login And Get Token" owner="common">
<var>${token}</var>
<doc>Log in with the master password and return the JWT access token.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.364735" elapsed="0.000118"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<arg>auth</arg>
<arg>${BASE_URL}</arg>
<arg>headers={'Authorization': 'Bearer ${token}'}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.364931" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:23.364275" elapsed="0.000731"/>
</branch>
<branch type="ELSE">
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.365344" level="INFO">Creating Session using : alias=auth, url=http://127.0.0.1:8765, headers={'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJtYXN0ZXIiLCJleHAiOjE3ODI2NDc3MjIsImlhdCI6MTc4MjU2MTMyMn0.--vlbTAAA2hgaD0fZcM-E01gJMfeZI9wU6wqkY3O9Fs'}, cookies={}, auth=None, timeout=None, proxies=None, verify=False, debug=0 </msg>
<arg>auth</arg>
<arg>${BASE_URL}</arg>
<arg>headers={'Authorization': 'Bearer ${TOKEN}'}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-06-27T13:55:23.365124" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-06-27T13:55:23.365034" elapsed="0.000455"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.363463" elapsed="0.002053"/>
</if>
<doc>Create an authenticated HTTP session. Performs setup if needed, then logs in.
Skips setup/login if already authenticated (suite-level setup done).</doc>
<status status="PASS" start="2026-06-27T13:55:23.347614" elapsed="0.017936"/>
</kw>
<arg>Create Anonymous Session</arg>
<arg>AND</arg>
<arg>Setup Master Password</arg>
<arg>AND</arg>
<arg>Create Authenticated Session</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-06-27T13:55:23.324855" elapsed="0.040734"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-06-27T13:55:23.366016" level="INFO">${payload} = {'name': 'UpdatedAniworld', 'data_dir': 'data', 'scheduler': "{'enabled': False, 'schedule_time': '04:00', 'schedule_days': ['mon', 'tue']}", 'logging': "{'level': 'DEBUG', 'file': 'logs/test.log', 'm...</msg>
<var>${payload}</var>
<arg>name=UpdatedAniworld</arg>
<arg>data_dir=data</arg>
<arg>scheduler={'enabled': False, 'schedule_time': '04:00', 'schedule_days': ['mon', 'tue']}</arg>
<arg>logging={'level': 'DEBUG', 'file': 'logs/test.log', 'max_bytes': 1048576, 'backup_count': 5}</arg>
<arg>backup={'enabled': False}</arg>
<arg>nfo={'tmdb_api_key': '', 'auto_create': False, 'download_poster': False, 'download_logo': False, 'download_fanart': False}</arg>
<arg>other={'anime_directory': '/tmp/aniworld_test_anime'}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-06-27T13:55:23.365688" elapsed="0.000348"/>
</kw>
<kw name="Update Config" owner="api_keywords">
<kw name="PUT API" owner="api_keywords">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.371131" level="INFO">PUT Request : url=http://127.0.0.1:8765/api/config
path_url=/api/config
headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate, br', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJtYXN0ZXIiLCJleHAiOjE3ODI2NDc3MjIsImlhdCI6MTc4MjU2MTMyMn0.--vlbTAAA2hgaD0fZcM-E01gJMfeZI9wU6wqkY3O9Fs', 'Content-Length': '461', 'Content-Type': 'application/json'}
body=b'{"name": "UpdatedAniworld", "data_dir": "data", "scheduler": "{\'enabled\': False, \'schedule_time\': \'04:00\', \'schedule_days\': [\'mon\', \'tue\']}", "logging": "{\'level\': \'DEBUG\', \'file\': \'logs/test.log\', \'max_bytes\': 1048576, \'backup_count\': 5}", "backup": "{\'enabled\': False}", "nfo": "{\'tmdb_api_key\': \'\', \'auto_create\': False, \'download_poster\': False, \'download_logo\': False, \'download_fanart\': False}", "other": "{\'anime_directory\': \'/tmp/aniworld_test_anime\'}"}'
</msg>
<msg time="2026-06-27T13:55:23.371307" level="INFO">PUT Response : url=http://127.0.0.1:8765/api/config
status=200, reason=OK
headers={'date': 'Sat, 27 Jun 2026 11:55:22 GMT', 'server': 'uvicorn', 'content-length': '820', 'content-type': 'application/json'}
body={"name":"UpdatedAniworld","data_dir":"data","scheduler":{"enabled":false,"interval_minutes":60,"schedule_time":"04:00","schedule_days":["mon","tue"],"auto_download_after_rescan":false,"nfo_scan_after_rescan":true,"image_scan_after_rescan":true,"auto_download":null},"logging":{"level":"DEBUG","file":"logs/test.log","max_bytes":1048576,"backup_count":5},"backup":{"enabled":false,"path":"data/backups","keep_days":30},"nfo":{"tmdb_api_key":"","auto_create":false,"update_on_scan":false,"download_poster":false,"download_logo":false,"download_fanart":false,"image_size":"original"},"scan_key_overrides":{},"other":{"loading_complete":true,"master_password_hash":"$pbkdf2-sha256$29000$dm6NcU5JaU2p1dqbM2aMMQ$U4sJCHcdZe6kEYxBSqIoQ46pgtjyCt8N1flCTGj06tY","loading_started":true,"anime_directory":"/tmp/aniworld_test_anime"}}
</msg>
<msg time="2026-06-27T13:55:23.371407" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>${endpoint}</arg>
<arg>json=${payload}</arg>
<arg>expected_status=${expected_status}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-06-27T13:55:23.366642" elapsed="0.004785"/>
</kw>
<return>
<value>${resp}</value>
<status status="PASS" start="2026-06-27T13:55:23.371495" elapsed="0.000094"/>
</return>
<msg time="2026-06-27T13:55:23.371705" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>/api/config</arg>
<arg>${payload}</arg>
<doc>Perform an authenticated PUT request with JSON payload.</doc>
<status status="PASS" start="2026-06-27T13:55:23.366391" elapsed="0.005339"/>
</kw>
<return>
<value>${resp}</value>
<status status="PASS" start="2026-06-27T13:55:23.371773" elapsed="0.000057"/>
</return>
<msg time="2026-06-27T13:55:23.371920" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${payload}</arg>
<doc>PUT /api/config with the given payload.</doc>
<status status="PASS" start="2026-06-27T13:55:23.366140" elapsed="0.005799"/>
</kw>
<kw name="Response Should Have Status" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-06-27T13:55:23.372783" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>${expected_status}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-06-27T13:55:23.372331" elapsed="0.000499"/>
</kw>
<arg>${resp}</arg>
<arg>200</arg>
<doc>Assert that the response status code matches the expected value.</doc>
<status status="PASS" start="2026-06-27T13:55:23.372063" elapsed="0.000824"/>
</kw>
<kw name="Get Current Config" owner="api_keywords">
<kw name="GET API" owner="api_keywords">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.375827" level="INFO">GET Request : url=http://127.0.0.1:8765/api/config
path_url=/api/config
headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate, br', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJtYXN0ZXIiLCJleHAiOjE3ODI2NDc3MjIsImlhdCI6MTc4MjU2MTMyMn0.--vlbTAAA2hgaD0fZcM-E01gJMfeZI9wU6wqkY3O9Fs'}
body=None
</msg>
<msg time="2026-06-27T13:55:23.375884" level="INFO">GET Response : url=http://127.0.0.1:8765/api/config
status=200, reason=OK
headers={'date': 'Sat, 27 Jun 2026 11:55:22 GMT', 'server': 'uvicorn', 'content-length': '820', 'content-type': 'application/json'}
body={"name":"UpdatedAniworld","data_dir":"data","scheduler":{"enabled":false,"interval_minutes":60,"schedule_time":"04:00","schedule_days":["mon","tue"],"auto_download_after_rescan":false,"nfo_scan_after_rescan":true,"image_scan_after_rescan":true,"auto_download":null},"logging":{"level":"DEBUG","file":"logs/test.log","max_bytes":1048576,"backup_count":5},"backup":{"enabled":false,"path":"data/backups","keep_days":30},"nfo":{"tmdb_api_key":"","auto_create":false,"update_on_scan":false,"download_poster":false,"download_logo":false,"download_fanart":false,"image_size":"original"},"scan_key_overrides":{},"other":{"loading_complete":true,"master_password_hash":"$pbkdf2-sha256$29000$dm6NcU5JaU2p1dqbM2aMMQ$U4sJCHcdZe6kEYxBSqIoQ46pgtjyCt8N1flCTGj06tY","loading_started":true,"anime_directory":"/tmp/aniworld_test_anime"}}
</msg>
<msg time="2026-06-27T13:55:23.375965" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>${endpoint}</arg>
<arg>expected_status=${expected_status}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-06-27T13:55:23.373445" elapsed="0.002540"/>
</kw>
<return>
<value>${resp}</value>
<status status="PASS" start="2026-06-27T13:55:23.376041" elapsed="0.000110"/>
</return>
<msg time="2026-06-27T13:55:23.376280" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>/api/config</arg>
<doc>Perform an authenticated GET request and return the response.</doc>
<status status="PASS" start="2026-06-27T13:55:23.373233" elapsed="0.003069"/>
</kw>
<kw name="Convert String To Json" owner="JSONLibrary">
<msg time="2026-06-27T13:55:23.376809" level="INFO">${json} = {'name': 'UpdatedAniworld', 'data_dir': 'data', 'scheduler': {'enabled': False, 'interval_minutes': 60, 'schedule_time': '04:00', 'schedule_days': ['mon', 'tue'], 'auto_download_after_rescan': False, ...</msg>
<var>${json}</var>
<arg>${resp.text}</arg>
<doc>Convert String to JSON object</doc>
<status status="PASS" start="2026-06-27T13:55:23.376402" elapsed="0.000429"/>
</kw>
<return>
<value>${json}</value>
<status status="PASS" start="2026-06-27T13:55:23.376873" elapsed="0.000088"/>
</return>
<msg time="2026-06-27T13:55:23.377066" level="INFO">${config} = {'name': 'UpdatedAniworld', 'data_dir': 'data', 'scheduler': {'enabled': False, 'interval_minutes': 60, 'schedule_time': '04:00', 'schedule_days': ['mon', 'tue'], 'auto_download_after_rescan': False, ...</msg>
<var>${config}</var>
<doc>GET /api/config and return the parsed JSON.</doc>
<status status="PASS" start="2026-06-27T13:55:23.373000" elapsed="0.004085"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${config}[name]</arg>
<arg>UpdatedAniworld</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-06-27T13:55:23.377170" elapsed="0.000258"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary" type="TEARDOWN">
<msg time="2026-06-27T13:55:23.377664" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-06-27T13:55:23.377567" elapsed="0.000227"/>
</kw>
<doc>Update configuration fields and verify they are persisted.</doc>
<status status="PASS" start="2026-06-27T13:55:23.321361" elapsed="0.056476"/>
</test>
<test id="s1-t3" name="Validate Valid Config" line="43">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Create Anonymous Session" owner="common">
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.387238" level="INFO">Creating Session using : alias=anon, url=http://127.0.0.1:8765, headers={}, cookies={}, auth=None, timeout=None, proxies=None, verify=False, debug=0 </msg>
<arg>anon</arg>
<arg>${BASE_URL}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-06-27T13:55:23.387095" elapsed="0.000249"/>
</kw>
<doc>Create an unauthenticated HTTP session.</doc>
<status status="PASS" start="2026-06-27T13:55:23.386866" elapsed="0.000537"/>
</kw>
<kw name="Setup Master Password" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-06-27T13:55:23.388154" level="INFO">${payload} = {'master_password': 'TestPass123!', 'anime_directory': '/tmp/aniworld_test_anime', 'name': 'AniworldTest', 'data_dir': 'data', 'scheduler_enabled': 'False', 'logging_level': 'INFO', 'backup_enabled': ...</msg>
<var>${payload}</var>
<arg>master_password=${SETUP_PASSWORD}</arg>
<arg>anime_directory=/tmp/aniworld_test_anime</arg>
<arg>name=AniworldTest</arg>
<arg>data_dir=data</arg>
<arg>scheduler_enabled=False</arg>
<arg>logging_level=INFO</arg>
<arg>backup_enabled=False</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-06-27T13:55:23.387833" elapsed="0.000460"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.390142" level="INFO">POST Request : url=http://127.0.0.1:8765/api/auth/setup
path_url=/api/auth/setup
headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate, br', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Length': '208', 'Content-Type': 'application/json'}
body=b'{"master_password": "TestPass123!", "anime_directory": "/tmp/aniworld_test_anime", "name": "AniworldTest", "data_dir": "data", "scheduler_enabled": "False", "logging_level": "INFO", "backup_enabled": "False"}'
</msg>
<msg time="2026-06-27T13:55:23.390188" level="INFO">POST Response : url=http://127.0.0.1:8765/api/auth/setup
status=400, reason=Bad Request
headers={'date': 'Sat, 27 Jun 2026 11:55:22 GMT', 'server': 'uvicorn', 'content-length': '47', 'content-type': 'application/json'}
body={"detail":"Master password already configured"}
</msg>
<msg time="2026-06-27T13:55:23.390264" level="INFO">${resp} = &lt;Response [400]&gt;</msg>
<var>${resp}</var>
<arg>anon</arg>
<arg>/api/auth/setup</arg>
<arg>json=${payload}</arg>
<arg>expected_status=any</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-06-27T13:55:23.388401" elapsed="0.001881"/>
</kw>
<if>
<branch type="IF" condition="'${resp.status_code}' == '429'">
<kw name="Sleep" owner="BuiltIn">
<arg>45s</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.390769" elapsed="0.000054"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>anon</arg>
<arg>/api/auth/setup</arg>
<arg>json=${payload}</arg>
<arg>expected_status=any</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.390904" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:23.390357" elapsed="0.000624"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.390340" elapsed="0.000671"/>
</if>
<if>
<branch type="IF" condition="'${resp.status_code}' == '429'">
<kw name="Sleep" owner="BuiltIn">
<arg>45s</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.391406" elapsed="0.000044"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>anon</arg>
<arg>/api/auth/setup</arg>
<arg>json=${payload}</arg>
<arg>expected_status=any</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.391523" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:23.391053" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.391041" elapsed="0.000578"/>
</if>
<if>
<branch type="IF" condition="'${resp.status_code}' == '400'">
<kw name="Convert String To Json" owner="JSONLibrary">
<msg time="2026-06-27T13:55:23.392330" level="INFO">${json} = {'detail': 'Master password already configured'}</msg>
<var>${json}</var>
<arg>${resp.text}</arg>
<doc>Convert String to JSON object</doc>
<status status="PASS" start="2026-06-27T13:55:23.391978" elapsed="0.000375"/>
</kw>
<kw name="Get Value From Json" owner="JSONLibrary">
<msg time="2026-06-27T13:55:23.402533" level="INFO">${detail} = ['Master password already configured']</msg>
<var>${detail}</var>
<arg>${json}</arg>
<arg>$.detail</arg>
<doc>Get Value From JSON using JSONPath</doc>
<status status="PASS" start="2026-06-27T13:55:23.392441" elapsed="0.010119"/>
</kw>
<if>
<branch type="IF" condition="'${detail}[0]' == 'Master password already configured'">
<return>
<status status="PASS" start="2026-06-27T13:55:23.402859" elapsed="0.000061"/>
</return>
<status status="PASS" start="2026-06-27T13:55:23.402631" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.402617" elapsed="0.000366"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Setup failed with 400: ${detail}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.403062" elapsed="0.000046"/>
</kw>
<status status="PASS" start="2026-06-27T13:55:23.391656" elapsed="0.011486"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.391645" elapsed="0.011522"/>
</if>
<if>
<branch type="IF" condition="'${resp.status_code}' == '201'">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${resp.status_code}</arg>
<arg>201</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.403337" elapsed="0.000045"/>
</kw>
<return>
<status status="NOT RUN" start="2026-06-27T13:55:23.403420" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-06-27T13:55:23.403205" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-06-27T13:55:23.403194" elapsed="0.000319"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unexpected status ${resp.status_code} from /api/auth/setup</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.403568" elapsed="0.000087"/>
</kw>
<doc>Configure the master password via the setup endpoint.</doc>
<status status="PASS" start="2026-06-27T13:55:23.387607" elapsed="0.016100"/>
</kw>
<kw name="Create Authenticated Session" owner="common">
<kw name="Create Anonymous Session" owner="common">
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.404486" level="INFO">Creating Session using : alias=anon, url=http://127.0.0.1:8765, headers={}, cookies={}, auth=None, timeout=None, proxies=None, verify=False, debug=0 </msg>
<arg>anon</arg>
<arg>${BASE_URL}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-06-27T13:55:23.404359" elapsed="0.000226"/>
</kw>
<doc>Create an unauthenticated HTTP session.</doc>
<status status="PASS" start="2026-06-27T13:55:23.404138" elapsed="0.000498"/>
</kw>
<kw name="Is Auth Configured" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.406498" level="INFO">GET Request : url=http://127.0.0.1:8765/api/auth/status
path_url=/api/auth/status
headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate, br', 'Accept': '*/*', 'Connection': 'keep-alive'}
body=None
</msg>
<msg time="2026-06-27T13:55:23.406545" level="INFO">GET Response : url=http://127.0.0.1:8765/api/auth/status
status=200, reason=OK
headers={'date': 'Sat, 27 Jun 2026 11:55:22 GMT', 'server': 'uvicorn', 'content-length': '41', 'content-type': 'application/json'}
body={"configured":true,"authenticated":false}
</msg>
<msg time="2026-06-27T13:55:23.406615" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>anon</arg>
<arg>/api/auth/status</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-06-27T13:55:23.404922" elapsed="0.001712"/>
</kw>
<kw name="Convert String To Json" owner="JSONLibrary">
<msg time="2026-06-27T13:55:23.407255" level="INFO">${json} = {'configured': True, 'authenticated': False}</msg>
<var>${json}</var>
<arg>${resp.text}</arg>
<doc>Convert String to JSON object</doc>
<status status="PASS" start="2026-06-27T13:55:23.406757" elapsed="0.000519"/>
</kw>
<kw name="Get Value From Json" owner="JSONLibrary">
<msg time="2026-06-27T13:55:23.417014" level="INFO">${configured} = [True]</msg>
<var>${configured}</var>
<arg>${json}</arg>
<arg>$.configured</arg>
<doc>Get Value From JSON using JSONPath</doc>
<status status="PASS" start="2026-06-27T13:55:23.407360" elapsed="0.009681"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-06-27T13:55:23.417682" level="INFO">${configured_val} = True</msg>
<var>${configured_val}</var>
<arg>${configured}[0]</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-06-27T13:55:23.417390" elapsed="0.000314"/>
</kw>
<return>
<value>${configured_val}</value>
<status status="PASS" start="2026-06-27T13:55:23.417762" elapsed="0.000090"/>
</return>
<msg time="2026-06-27T13:55:23.417958" level="INFO">${configured} = True</msg>
<var>${configured}</var>
<doc>Check if the master password has already been configured.</doc>
<status status="PASS" start="2026-06-27T13:55:23.404750" elapsed="0.013227"/>
</kw>
<if>
<branch type="IF" condition="not ${configured}">
<kw name="Setup Master Password" owner="common">
<doc>Configure the master password via the setup endpoint.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.418458" elapsed="0.000168"/>
</kw>
<kw name="Login And Get Token" owner="common">
<var>${token}</var>
<doc>Log in with the master password and return the JWT access token.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.418810" elapsed="0.000122"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<arg>auth</arg>
<arg>${BASE_URL}</arg>
<arg>headers={'Authorization': 'Bearer ${token}'}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.419004" elapsed="0.000090"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:23.418042" elapsed="0.001081"/>
</branch>
<branch type="ELSE IF" condition="'${TOKEN}' == '${EMPTY}'">
<kw name="Login And Get Token" owner="common">
<var>${token}</var>
<doc>Log in with the master password and return the JWT access token.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.419647" elapsed="0.000046"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<arg>auth</arg>
<arg>${BASE_URL}</arg>
<arg>headers={'Authorization': 'Bearer ${token}'}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.419788" elapsed="0.000104"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:23.419150" elapsed="0.000776"/>
</branch>
<branch type="ELSE">
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.420302" level="INFO">Creating Session using : alias=auth, url=http://127.0.0.1:8765, headers={'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJtYXN0ZXIiLCJleHAiOjE3ODI2NDc3MjIsImlhdCI6MTc4MjU2MTMyMn0.--vlbTAAA2hgaD0fZcM-E01gJMfeZI9wU6wqkY3O9Fs'}, cookies={}, auth=None, timeout=None, proxies=None, verify=False, debug=0 </msg>
<arg>auth</arg>
<arg>${BASE_URL}</arg>
<arg>headers={'Authorization': 'Bearer ${TOKEN}'}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-06-27T13:55:23.420092" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-06-27T13:55:23.419952" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.418027" elapsed="0.002444"/>
</if>
<doc>Create an authenticated HTTP session. Performs setup if needed, then logs in.
Skips setup/login if already authenticated (suite-level setup done).</doc>
<status status="PASS" start="2026-06-27T13:55:23.403878" elapsed="0.016627"/>
</kw>
<arg>Create Anonymous Session</arg>
<arg>AND</arg>
<arg>Setup Master Password</arg>
<arg>AND</arg>
<arg>Create Authenticated Session</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-06-27T13:55:23.386423" elapsed="0.034122"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-06-27T13:55:23.420936" level="INFO">${schedule_days} = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun']</msg>
<var>${schedule_days}</var>
<arg>mon</arg>
<arg>tue</arg>
<arg>wed</arg>
<arg>thu</arg>
<arg>fri</arg>
<arg>sat</arg>
<arg>sun</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-06-27T13:55:23.420632" elapsed="0.000325"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-06-27T13:55:23.421400" level="INFO">${payload} = {'name': 'Aniworld', 'data_dir': 'data', 'scheduler': {'enabled': True, 'schedule_time': '03:00', 'schedule_days': ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun']}, 'logging': {'level': 'INFO', 'bac...</msg>
<var>${payload}</var>
<arg>json.loads('''{"name": "Aniworld", "data_dir": "data", "scheduler": {"enabled": true, "schedule_time": "03:00", "schedule_days": ["mon", "tue", "wed", "thu", "fri", "sat", "sun"]}, "logging": {"level": "INFO", "backup_count": 3}, "backup": {"enabled": false}, "nfo": {"tmdb_api_key": "", "auto_create": true, "download_poster": true, "download_logo": true, "download_fanart": true}, "other": {}}''')</arg>
<arg>modules=json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-06-27T13:55:23.421083" elapsed="0.000340"/>
</kw>
<kw name="Validate Config" owner="api_keywords">
<kw name="POST API" owner="api_keywords">
<if>
<branch type="IF" condition="$payload is ${NONE}">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${session}</arg>
<arg>${endpoint}</arg>
<arg>expected_status=${expected_status}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.422342" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:23.422135" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.425181" level="INFO">POST Request : url=http://127.0.0.1:8765/api/config/validate
path_url=/api/config/validate
headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate, br', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJtYXN0ZXIiLCJleHAiOjE3ODI2NDc3MjIsImlhdCI6MTc4MjU2MTMyMn0.--vlbTAAA2hgaD0fZcM-E01gJMfeZI9wU6wqkY3O9Fs', 'Content-Length': '381', 'Content-Type': 'application/json'}
body=b'{"name": "Aniworld", "data_dir": "data", "scheduler": {"enabled": true, "schedule_time": "03:00", "schedule_days": ["mon", "tue", "wed", "thu", "fri", "sat", "sun"]}, "logging": {"level": "INFO", "backup_count": 3}, "backup": {"enabled": false}, "nfo": {"tmdb_api_key": "", "auto_create": true, "download_poster": true, "download_logo": true, "download_fanart": true}, "other": {}}'
</msg>
<msg time="2026-06-27T13:55:23.425235" level="INFO">POST Response : url=http://127.0.0.1:8765/api/config/validate
status=200, reason=OK
headers={'date': 'Sat, 27 Jun 2026 11:55:22 GMT', 'server': 'uvicorn', 'content-length': '26', 'content-type': 'application/json'}
body={"valid":true,"errors":[]}
</msg>
<msg time="2026-06-27T13:55:23.425311" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>${endpoint}</arg>
<arg>json=${payload}</arg>
<arg>expected_status=${expected_status}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-06-27T13:55:23.422529" elapsed="0.002801"/>
</kw>
<status status="PASS" start="2026-06-27T13:55:23.422443" elapsed="0.002939"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.422122" elapsed="0.003290"/>
</if>
<return>
<value>${resp}</value>
<status status="PASS" start="2026-06-27T13:55:23.425445" elapsed="0.000138"/>
</return>
<msg time="2026-06-27T13:55:23.425694" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>/api/config/validate</arg>
<arg>${payload}</arg>
<arg>${expected_status}</arg>
<doc>Perform an authenticated POST request with optional JSON payload.</doc>
<status status="PASS" start="2026-06-27T13:55:23.421865" elapsed="0.003854"/>
</kw>
<return>
<value>${resp}</value>
<status status="PASS" start="2026-06-27T13:55:23.425769" elapsed="0.000116"/>
</return>
<msg time="2026-06-27T13:55:23.425973" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${payload}</arg>
<arg>200</arg>
<doc>POST /api/config/validate with the given payload.</doc>
<status status="PASS" start="2026-06-27T13:55:23.421540" elapsed="0.004630"/>
</kw>
<kw name="Response Should Have Status" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-06-27T13:55:23.427050" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>${expected_status}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-06-27T13:55:23.426586" elapsed="0.000508"/>
</kw>
<arg>${resp}</arg>
<arg>200</arg>
<doc>Assert that the response status code matches the expected value.</doc>
<status status="PASS" start="2026-06-27T13:55:23.426319" elapsed="0.000827"/>
</kw>
<kw name="Get JSON Value" owner="api_keywords">
<kw name="Convert String To Json" owner="JSONLibrary">
<msg time="2026-06-27T13:55:23.427853" level="INFO">${json} = {'valid': True, 'errors': []}</msg>
<var>${json}</var>
<arg>${response.text}</arg>
<doc>Convert String to JSON object</doc>
<status status="PASS" start="2026-06-27T13:55:23.427505" elapsed="0.000370"/>
</kw>
<kw name="Get Value From Json" owner="JSONLibrary">
<msg time="2026-06-27T13:55:23.438576" level="INFO">${values} = [True]</msg>
<var>${values}</var>
<arg>${json}</arg>
<arg>${json_path}</arg>
<doc>Get Value From JSON using JSONPath</doc>
<status status="PASS" start="2026-06-27T13:55:23.427961" elapsed="0.010647"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-06-27T13:55:23.439052" level="INFO">${value} = True</msg>
<var>${value}</var>
<arg>${values}[0]</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-06-27T13:55:23.438734" elapsed="0.000339"/>
</kw>
<return>
<value>${value}</value>
<status status="PASS" start="2026-06-27T13:55:23.439120" elapsed="0.000097"/>
</return>
<msg time="2026-06-27T13:55:23.439314" level="INFO">${valid} = True</msg>
<var>${valid}</var>
<arg>${resp}</arg>
<arg>$.valid</arg>
<doc>Extract a value from a JSON response using JSONPath.</doc>
<status status="PASS" start="2026-06-27T13:55:23.427266" elapsed="0.012066"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-06-27T13:55:23.439625" level="INFO">Argument types are:
&lt;class 'bool'&gt;
&lt;class 'str'&gt;</msg>
<arg>${valid}</arg>
<arg>True</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-06-27T13:55:23.439421" elapsed="0.000246"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary" type="TEARDOWN">
<msg time="2026-06-27T13:55:23.439911" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-06-27T13:55:23.439806" elapsed="0.000160"/>
</kw>
<doc>Validate a well-formed configuration.</doc>
<status status="PASS" start="2026-06-27T13:55:23.383227" elapsed="0.056775"/>
</test>
<test id="s1-t4" name="Validate Invalid Config Missing Name" line="52">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Create Anonymous Session" owner="common">
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.448048" level="INFO">Creating Session using : alias=anon, url=http://127.0.0.1:8765, headers={}, cookies={}, auth=None, timeout=None, proxies=None, verify=False, debug=0 </msg>
<arg>anon</arg>
<arg>${BASE_URL}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-06-27T13:55:23.447897" elapsed="0.000264"/>
</kw>
<doc>Create an unauthenticated HTTP session.</doc>
<status status="PASS" start="2026-06-27T13:55:23.447636" elapsed="0.000591"/>
</kw>
<kw name="Setup Master Password" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-06-27T13:55:23.449014" level="INFO">${payload} = {'master_password': 'TestPass123!', 'anime_directory': '/tmp/aniworld_test_anime', 'name': 'AniworldTest', 'data_dir': 'data', 'scheduler_enabled': 'False', 'logging_level': 'INFO', 'backup_enabled': ...</msg>
<var>${payload}</var>
<arg>master_password=${SETUP_PASSWORD}</arg>
<arg>anime_directory=/tmp/aniworld_test_anime</arg>
<arg>name=AniworldTest</arg>
<arg>data_dir=data</arg>
<arg>scheduler_enabled=False</arg>
<arg>logging_level=INFO</arg>
<arg>backup_enabled=False</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-06-27T13:55:23.448678" elapsed="0.000358"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.450976" level="INFO">POST Request : url=http://127.0.0.1:8765/api/auth/setup
path_url=/api/auth/setup
headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate, br', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Length': '208', 'Content-Type': 'application/json'}
body=b'{"master_password": "TestPass123!", "anime_directory": "/tmp/aniworld_test_anime", "name": "AniworldTest", "data_dir": "data", "scheduler_enabled": "False", "logging_level": "INFO", "backup_enabled": "False"}'
</msg>
<msg time="2026-06-27T13:55:23.451025" level="INFO">POST Response : url=http://127.0.0.1:8765/api/auth/setup
status=400, reason=Bad Request
headers={'date': 'Sat, 27 Jun 2026 11:55:22 GMT', 'server': 'uvicorn', 'content-length': '47', 'content-type': 'application/json'}
body={"detail":"Master password already configured"}
</msg>
<msg time="2026-06-27T13:55:23.451099" level="INFO">${resp} = &lt;Response [400]&gt;</msg>
<var>${resp}</var>
<arg>anon</arg>
<arg>/api/auth/setup</arg>
<arg>json=${payload}</arg>
<arg>expected_status=any</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-06-27T13:55:23.449129" elapsed="0.001989"/>
</kw>
<if>
<branch type="IF" condition="'${resp.status_code}' == '429'">
<kw name="Sleep" owner="BuiltIn">
<arg>45s</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.451636" elapsed="0.000055"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>anon</arg>
<arg>/api/auth/setup</arg>
<arg>json=${payload}</arg>
<arg>expected_status=any</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.451784" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:23.451198" elapsed="0.000670"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.451180" elapsed="0.000721"/>
</if>
<if>
<branch type="IF" condition="'${resp.status_code}' == '429'">
<kw name="Sleep" owner="BuiltIn">
<arg>45s</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.452308" elapsed="0.000046"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>anon</arg>
<arg>/api/auth/setup</arg>
<arg>json=${payload}</arg>
<arg>expected_status=any</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.452433" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:23.451944" elapsed="0.000564"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.451932" elapsed="0.000603"/>
</if>
<if>
<branch type="IF" condition="'${resp.status_code}' == '400'">
<kw name="Convert String To Json" owner="JSONLibrary">
<msg time="2026-06-27T13:55:23.453235" level="INFO">${json} = {'detail': 'Master password already configured'}</msg>
<var>${json}</var>
<arg>${resp.text}</arg>
<doc>Convert String to JSON object</doc>
<status status="PASS" start="2026-06-27T13:55:23.452898" elapsed="0.000359"/>
</kw>
<kw name="Get Value From Json" owner="JSONLibrary">
<msg time="2026-06-27T13:55:23.465987" level="INFO">${detail} = ['Master password already configured']</msg>
<var>${detail}</var>
<arg>${json}</arg>
<arg>$.detail</arg>
<doc>Get Value From JSON using JSONPath</doc>
<status status="PASS" start="2026-06-27T13:55:23.453337" elapsed="0.012688"/>
</kw>
<if>
<branch type="IF" condition="'${detail}[0]' == 'Master password already configured'">
<return>
<status status="PASS" start="2026-06-27T13:55:23.466471" elapsed="0.000063"/>
</return>
<status status="PASS" start="2026-06-27T13:55:23.466281" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.466258" elapsed="0.000346"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Setup failed with 400: ${detail}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.466703" elapsed="0.000079"/>
</kw>
<status status="PASS" start="2026-06-27T13:55:23.452573" elapsed="0.014245"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.452562" elapsed="0.014285"/>
</if>
<if>
<branch type="IF" condition="'${resp.status_code}' == '201'">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${resp.status_code}</arg>
<arg>201</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.467004" elapsed="0.000045"/>
</kw>
<return>
<status status="NOT RUN" start="2026-06-27T13:55:23.467088" elapsed="0.000039"/>
</return>
<status status="NOT RUN" start="2026-06-27T13:55:23.466890" elapsed="0.000262"/>
</branch>
<status status="NOT RUN" start="2026-06-27T13:55:23.466878" elapsed="0.000299"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unexpected status ${resp.status_code} from /api/auth/setup</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.467235" elapsed="0.000040"/>
</kw>
<doc>Configure the master password via the setup endpoint.</doc>
<status status="PASS" start="2026-06-27T13:55:23.448446" elapsed="0.018886"/>
</kw>
<kw name="Create Authenticated Session" owner="common">
<kw name="Create Anonymous Session" owner="common">
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.468058" level="INFO">Creating Session using : alias=anon, url=http://127.0.0.1:8765, headers={}, cookies={}, auth=None, timeout=None, proxies=None, verify=False, debug=0 </msg>
<arg>anon</arg>
<arg>${BASE_URL}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-06-27T13:55:23.467930" elapsed="0.000233"/>
</kw>
<doc>Create an unauthenticated HTTP session.</doc>
<status status="PASS" start="2026-06-27T13:55:23.467757" elapsed="0.000459"/>
</kw>
<kw name="Is Auth Configured" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.511071" level="INFO">GET Request : url=http://127.0.0.1:8765/api/auth/status
path_url=/api/auth/status
headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate, br', 'Accept': '*/*', 'Connection': 'keep-alive'}
body=None
</msg>
<msg time="2026-06-27T13:55:23.511132" level="INFO">GET Response : url=http://127.0.0.1:8765/api/auth/status
status=200, reason=OK
headers={'date': 'Sat, 27 Jun 2026 11:55:22 GMT', 'server': 'uvicorn', 'content-length': '41', 'content-type': 'application/json'}
body={"configured":true,"authenticated":false}
</msg>
<msg time="2026-06-27T13:55:23.511219" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>anon</arg>
<arg>/api/auth/status</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-06-27T13:55:23.468529" elapsed="0.042709"/>
</kw>
<kw name="Convert String To Json" owner="JSONLibrary">
<msg time="2026-06-27T13:55:23.511975" level="INFO">${json} = {'configured': True, 'authenticated': False}</msg>
<var>${json}</var>
<arg>${resp.text}</arg>
<doc>Convert String to JSON object</doc>
<status status="PASS" start="2026-06-27T13:55:23.511366" elapsed="0.000632"/>
</kw>
<kw name="Get Value From Json" owner="JSONLibrary">
<msg time="2026-06-27T13:55:23.522468" level="INFO">${configured} = [True]</msg>
<var>${configured}</var>
<arg>${json}</arg>
<arg>$.configured</arg>
<doc>Get Value From JSON using JSONPath</doc>
<status status="PASS" start="2026-06-27T13:55:23.512094" elapsed="0.010409"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-06-27T13:55:23.523113" level="INFO">${configured_val} = True</msg>
<var>${configured_val}</var>
<arg>${configured}[0]</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-06-27T13:55:23.522630" elapsed="0.000506"/>
</kw>
<return>
<value>${configured_val}</value>
<status status="PASS" start="2026-06-27T13:55:23.523183" elapsed="0.000169"/>
</return>
<msg time="2026-06-27T13:55:23.523458" level="INFO">${configured} = True</msg>
<var>${configured}</var>
<doc>Check if the master password has already been configured.</doc>
<status status="PASS" start="2026-06-27T13:55:23.468325" elapsed="0.055152"/>
</kw>
<if>
<branch type="IF" condition="not ${configured}">
<kw name="Setup Master Password" owner="common">
<doc>Configure the master password via the setup endpoint.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.523881" elapsed="0.000168"/>
</kw>
<kw name="Login And Get Token" owner="common">
<var>${token}</var>
<doc>Log in with the master password and return the JWT access token.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.524222" elapsed="0.000168"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<arg>auth</arg>
<arg>${BASE_URL}</arg>
<arg>headers={'Authorization': 'Bearer ${token}'}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.524474" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:23.523542" elapsed="0.001011"/>
</branch>
<branch type="ELSE IF" condition="'${TOKEN}' == '${EMPTY}'">
<kw name="Login And Get Token" owner="common">
<var>${token}</var>
<doc>Log in with the master password and return the JWT access token.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.525140" elapsed="0.000138"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<arg>auth</arg>
<arg>${BASE_URL}</arg>
<arg>headers={'Authorization': 'Bearer ${token}'}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.525364" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:23.524584" elapsed="0.000859"/>
</branch>
<branch type="ELSE">
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.525791" level="INFO">Creating Session using : alias=auth, url=http://127.0.0.1:8765, headers={'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJtYXN0ZXIiLCJleHAiOjE3ODI2NDc3MjIsImlhdCI6MTc4MjU2MTMyMn0.--vlbTAAA2hgaD0fZcM-E01gJMfeZI9wU6wqkY3O9Fs'}, cookies={}, auth=None, timeout=None, proxies=None, verify=False, debug=0 </msg>
<arg>auth</arg>
<arg>${BASE_URL}</arg>
<arg>headers={'Authorization': 'Bearer ${TOKEN}'}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-06-27T13:55:23.525566" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-06-27T13:55:23.525471" elapsed="0.000454"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.523526" elapsed="0.002423"/>
</if>
<doc>Create an authenticated HTTP session. Performs setup if needed, then logs in.
Skips setup/login if already authenticated (suite-level setup done).</doc>
<status status="PASS" start="2026-06-27T13:55:23.467503" elapsed="0.058477"/>
</kw>
<arg>Create Anonymous Session</arg>
<arg>AND</arg>
<arg>Setup Master Password</arg>
<arg>AND</arg>
<arg>Create Authenticated Session</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-06-27T13:55:23.447194" elapsed="0.078829"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-06-27T13:55:23.526482" level="INFO">${payload} = {'data_dir': 'data', 'scheduler': "{'enabled': True, 'schedule_time': '03:00', 'schedule_days': ['mon']}", 'logging': "{'level': 'INFO'}", 'backup': "{'enabled': False}", 'nfo': "{'auto_create': False...</msg>
<var>${payload}</var>
<arg>data_dir=data</arg>
<arg>scheduler={'enabled': True, 'schedule_time': '03:00', 'schedule_days': ['mon']}</arg>
<arg>logging={'level': 'INFO'}</arg>
<arg>backup={'enabled': False}</arg>
<arg>nfo={'auto_create': False}</arg>
<arg>other={}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-06-27T13:55:23.526111" elapsed="0.000898"/>
</kw>
<kw name="Validate Config" owner="api_keywords">
<kw name="POST API" owner="api_keywords">
<if>
<branch type="IF" condition="$payload is ${NONE}">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${session}</arg>
<arg>${endpoint}</arg>
<arg>expected_status=${expected_status}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.528039" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:23.527784" elapsed="0.000341"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.530807" level="INFO">POST Request : url=http://127.0.0.1:8765/api/config/validate
path_url=/api/config/validate
headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate, br', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJtYXN0ZXIiLCJleHAiOjE3ODI2NDc3MjIsImlhdCI6MTc4MjU2MTMyMn0.--vlbTAAA2hgaD0fZcM-E01gJMfeZI9wU6wqkY3O9Fs', 'Content-Length': '218', 'Content-Type': 'application/json'}
body=b'{"data_dir": "data", "scheduler": "{\'enabled\': True, \'schedule_time\': \'03:00\', \'schedule_days\': [\'mon\']}", "logging": "{\'level\': \'INFO\'}", "backup": "{\'enabled\': False}", "nfo": "{\'auto_create\': False}", "other": "{}"}'
</msg>
<msg time="2026-06-27T13:55:23.530858" level="INFO">POST Response : url=http://127.0.0.1:8765/api/config/validate
status=422, reason=Unprocessable Content
headers={'date': 'Sat, 27 Jun 2026 11:55:22 GMT', 'server': 'uvicorn', 'content-length': '1128', 'content-type': 'application/json'}
body={"detail":[{"type":"model_attributes_type","loc":["body","scheduler"],"msg":"Input should be a valid dictionary or object to extract fields from","input":"{'enabled': True, 'schedule_time': '03:00', 'schedule_days': ['mon']}","url":"https://errors.pydantic.dev/2.12/v/model_attributes_type"},{"type":"model_attributes_type","loc":["body","logging"],"msg":"Input should be a valid dictionary or object to extract fields from","input":"{'level': 'INFO'}","url":"https://errors.pydantic.dev/2.12/v/model_attributes_type"},{"type":"model_attributes_type","loc":["body","backup"],"msg":"Input should be a valid dictionary or object to extract fields from","input":"{'enabled': False}","url":"https://errors.pydantic.dev/2.12/v/model_attributes_type"},{"type":"model_attributes_type","loc":["body","nfo"],"msg":"Input should be a valid dictionary or object to extract fields from","input":"{'auto_create': False}","url":"https://errors.pydantic.dev/2.12/v/model_attributes_type"},{"type":"dict_type","loc":["body","other"],"msg":"Input should be a valid dictionary","input":"{}","url":"https://errors.pydantic.dev/2.12/v/dict_type"}]}
</msg>
<msg time="2026-06-27T13:55:23.530938" level="INFO">${resp} = &lt;Response [422]&gt;</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>${endpoint}</arg>
<arg>json=${payload}</arg>
<arg>expected_status=${expected_status}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-06-27T13:55:23.528253" elapsed="0.002703"/>
</kw>
<status status="PASS" start="2026-06-27T13:55:23.528160" elapsed="0.002844"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.527770" elapsed="0.003262"/>
</if>
<return>
<value>${resp}</value>
<status status="PASS" start="2026-06-27T13:55:23.531062" elapsed="0.000179"/>
</return>
<msg time="2026-06-27T13:55:23.531343" level="INFO">${resp} = &lt;Response [422]&gt;</msg>
<var>${resp}</var>
<arg>/api/config/validate</arg>
<arg>${payload}</arg>
<arg>${expected_status}</arg>
<doc>Perform an authenticated POST request with optional JSON payload.</doc>
<status status="PASS" start="2026-06-27T13:55:23.527494" elapsed="0.003867"/>
</kw>
<return>
<value>${resp}</value>
<status status="PASS" start="2026-06-27T13:55:23.531400" elapsed="0.000051"/>
</return>
<msg time="2026-06-27T13:55:23.531532" level="INFO">${resp} = &lt;Response [422]&gt;</msg>
<var>${resp}</var>
<arg>${payload}</arg>
<arg>422</arg>
<doc>POST /api/config/validate with the given payload.</doc>
<status status="PASS" start="2026-06-27T13:55:23.527183" elapsed="0.004366"/>
</kw>
<kw name="Response Should Have Status" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-06-27T13:55:23.532352" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>${expected_status}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-06-27T13:55:23.531885" elapsed="0.000511"/>
</kw>
<arg>${resp}</arg>
<arg>422</arg>
<doc>Assert that the response status code matches the expected value.</doc>
<status status="PASS" start="2026-06-27T13:55:23.531656" elapsed="0.000790"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary" type="TEARDOWN">
<msg time="2026-06-27T13:55:23.532679" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-06-27T13:55:23.532566" elapsed="0.000173"/>
</kw>
<doc>Validate a config missing the required 'name' field.</doc>
<status status="PASS" start="2026-06-27T13:55:23.444694" elapsed="0.088078"/>
</test>
<test id="s1-t5" name="Validate Invalid Schedule Time" line="64">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Create Anonymous Session" owner="common">
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.541191" level="INFO">Creating Session using : alias=anon, url=http://127.0.0.1:8765, headers={}, cookies={}, auth=None, timeout=None, proxies=None, verify=False, debug=0 </msg>
<arg>anon</arg>
<arg>${BASE_URL}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-06-27T13:55:23.541060" elapsed="0.000230"/>
</kw>
<doc>Create an unauthenticated HTTP session.</doc>
<status status="PASS" start="2026-06-27T13:55:23.540857" elapsed="0.000488"/>
</kw>
<kw name="Setup Master Password" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-06-27T13:55:23.542088" level="INFO">${payload} = {'master_password': 'TestPass123!', 'anime_directory': '/tmp/aniworld_test_anime', 'name': 'AniworldTest', 'data_dir': 'data', 'scheduler_enabled': 'False', 'logging_level': 'INFO', 'backup_enabled': ...</msg>
<var>${payload}</var>
<arg>master_password=${SETUP_PASSWORD}</arg>
<arg>anime_directory=/tmp/aniworld_test_anime</arg>
<arg>name=AniworldTest</arg>
<arg>data_dir=data</arg>
<arg>scheduler_enabled=False</arg>
<arg>logging_level=INFO</arg>
<arg>backup_enabled=False</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-06-27T13:55:23.541735" elapsed="0.000375"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.543977" level="INFO">POST Request : url=http://127.0.0.1:8765/api/auth/setup
path_url=/api/auth/setup
headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate, br', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Length': '208', 'Content-Type': 'application/json'}
body=b'{"master_password": "TestPass123!", "anime_directory": "/tmp/aniworld_test_anime", "name": "AniworldTest", "data_dir": "data", "scheduler_enabled": "False", "logging_level": "INFO", "backup_enabled": "False"}'
</msg>
<msg time="2026-06-27T13:55:23.544018" level="INFO">POST Response : url=http://127.0.0.1:8765/api/auth/setup
status=400, reason=Bad Request
headers={'date': 'Sat, 27 Jun 2026 11:55:22 GMT', 'server': 'uvicorn', 'content-length': '47', 'content-type': 'application/json'}
body={"detail":"Master password already configured"}
</msg>
<msg time="2026-06-27T13:55:23.544216" level="INFO">${resp} = &lt;Response [400]&gt;</msg>
<var>${resp}</var>
<arg>anon</arg>
<arg>/api/auth/setup</arg>
<arg>json=${payload}</arg>
<arg>expected_status=any</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-06-27T13:55:23.542199" elapsed="0.002038"/>
</kw>
<if>
<branch type="IF" condition="'${resp.status_code}' == '429'">
<kw name="Sleep" owner="BuiltIn">
<arg>45s</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.544733" elapsed="0.000054"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>anon</arg>
<arg>/api/auth/setup</arg>
<arg>json=${payload}</arg>
<arg>expected_status=any</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.544874" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:23.544316" elapsed="0.000639"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.544297" elapsed="0.000689"/>
</if>
<if>
<branch type="IF" condition="'${resp.status_code}' == '429'">
<kw name="Sleep" owner="BuiltIn">
<arg>45s</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.545380" elapsed="0.000043"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>anon</arg>
<arg>/api/auth/setup</arg>
<arg>json=${payload}</arg>
<arg>expected_status=any</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.545497" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:23.545028" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.545017" elapsed="0.000579"/>
</if>
<if>
<branch type="IF" condition="'${resp.status_code}' == '400'">
<kw name="Convert String To Json" owner="JSONLibrary">
<msg time="2026-06-27T13:55:23.546272" level="INFO">${json} = {'detail': 'Master password already configured'}</msg>
<var>${json}</var>
<arg>${resp.text}</arg>
<doc>Convert String to JSON object</doc>
<status status="PASS" start="2026-06-27T13:55:23.545960" elapsed="0.000331"/>
</kw>
<kw name="Get Value From Json" owner="JSONLibrary">
<msg time="2026-06-27T13:55:23.556341" level="INFO">${detail} = ['Master password already configured']</msg>
<var>${detail}</var>
<arg>${json}</arg>
<arg>$.detail</arg>
<doc>Get Value From JSON using JSONPath</doc>
<status status="PASS" start="2026-06-27T13:55:23.546368" elapsed="0.010000"/>
</kw>
<if>
<branch type="IF" condition="'${detail}[0]' == 'Master password already configured'">
<return>
<status status="PASS" start="2026-06-27T13:55:23.556667" elapsed="0.000061"/>
</return>
<status status="PASS" start="2026-06-27T13:55:23.556439" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.556425" elapsed="0.000362"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Setup failed with 400: ${detail}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.556863" elapsed="0.000113"/>
</kw>
<status status="PASS" start="2026-06-27T13:55:23.545633" elapsed="0.011373"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.545623" elapsed="0.011408"/>
</if>
<if>
<branch type="IF" condition="'${resp.status_code}' == '201'">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${resp.status_code}</arg>
<arg>201</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.557173" elapsed="0.000043"/>
</kw>
<return>
<status status="NOT RUN" start="2026-06-27T13:55:23.557255" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-06-27T13:55:23.557067" elapsed="0.000250"/>
</branch>
<status status="NOT RUN" start="2026-06-27T13:55:23.557057" elapsed="0.000283"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unexpected status ${resp.status_code} from /api/auth/setup</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.557398" elapsed="0.000041"/>
</kw>
<doc>Configure the master password via the setup endpoint.</doc>
<status status="PASS" start="2026-06-27T13:55:23.541535" elapsed="0.015958"/>
</kw>
<kw name="Create Authenticated Session" owner="common">
<kw name="Create Anonymous Session" owner="common">
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.558151" level="INFO">Creating Session using : alias=anon, url=http://127.0.0.1:8765, headers={}, cookies={}, auth=None, timeout=None, proxies=None, verify=False, debug=0 </msg>
<arg>anon</arg>
<arg>${BASE_URL}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-06-27T13:55:23.558037" elapsed="0.000204"/>
</kw>
<doc>Create an unauthenticated HTTP session.</doc>
<status status="PASS" start="2026-06-27T13:55:23.557880" elapsed="0.000407"/>
</kw>
<kw name="Is Auth Configured" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.560177" level="INFO">GET Request : url=http://127.0.0.1:8765/api/auth/status
path_url=/api/auth/status
headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate, br', 'Accept': '*/*', 'Connection': 'keep-alive'}
body=None
</msg>
<msg time="2026-06-27T13:55:23.560221" level="INFO">GET Response : url=http://127.0.0.1:8765/api/auth/status
status=200, reason=OK
headers={'date': 'Sat, 27 Jun 2026 11:55:22 GMT', 'server': 'uvicorn', 'content-length': '41', 'content-type': 'application/json'}
body={"configured":true,"authenticated":false}
</msg>
<msg time="2026-06-27T13:55:23.560287" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>anon</arg>
<arg>/api/auth/status</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-06-27T13:55:23.558562" elapsed="0.001743"/>
</kw>
<kw name="Convert String To Json" owner="JSONLibrary">
<msg time="2026-06-27T13:55:23.560882" level="INFO">${json} = {'configured': True, 'authenticated': False}</msg>
<var>${json}</var>
<arg>${resp.text}</arg>
<doc>Convert String to JSON object</doc>
<status status="PASS" start="2026-06-27T13:55:23.560402" elapsed="0.000499"/>
</kw>
<kw name="Get Value From Json" owner="JSONLibrary">
<msg time="2026-06-27T13:55:23.570682" level="INFO">${configured} = [True]</msg>
<var>${configured}</var>
<arg>${json}</arg>
<arg>$.configured</arg>
<doc>Get Value From JSON using JSONPath</doc>
<status status="PASS" start="2026-06-27T13:55:23.560986" elapsed="0.009731"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-06-27T13:55:23.571255" level="INFO">${configured_val} = True</msg>
<var>${configured_val}</var>
<arg>${configured}[0]</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-06-27T13:55:23.570826" elapsed="0.000452"/>
</kw>
<return>
<value>${configured_val}</value>
<status status="PASS" start="2026-06-27T13:55:23.571323" elapsed="0.000093"/>
</return>
<msg time="2026-06-27T13:55:23.571509" level="INFO">${configured} = True</msg>
<var>${configured}</var>
<doc>Check if the master password has already been configured.</doc>
<status status="PASS" start="2026-06-27T13:55:23.558386" elapsed="0.013139"/>
</kw>
<if>
<branch type="IF" condition="not ${configured}">
<kw name="Setup Master Password" owner="common">
<doc>Configure the master password via the setup endpoint.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.571884" elapsed="0.000149"/>
</kw>
<kw name="Login And Get Token" owner="common">
<var>${token}</var>
<doc>Log in with the master password and return the JWT access token.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.572204" elapsed="0.000054"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<arg>auth</arg>
<arg>${BASE_URL}</arg>
<arg>headers={'Authorization': 'Bearer ${token}'}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.572334" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:23.571582" elapsed="0.000971"/>
</branch>
<branch type="ELSE IF" condition="'${TOKEN}' == '${EMPTY}'">
<kw name="Login And Get Token" owner="common">
<var>${token}</var>
<doc>Log in with the master password and return the JWT access token.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.573048" elapsed="0.000044"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<arg>auth</arg>
<arg>${BASE_URL}</arg>
<arg>headers={'Authorization': 'Bearer ${token}'}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.573164" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:23.572594" elapsed="0.000638"/>
</branch>
<branch type="ELSE">
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.573537" level="INFO">Creating Session using : alias=auth, url=http://127.0.0.1:8765, headers={'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJtYXN0ZXIiLCJleHAiOjE3ODI2NDc3MjIsImlhdCI6MTc4MjU2MTMyMn0.--vlbTAAA2hgaD0fZcM-E01gJMfeZI9wU6wqkY3O9Fs'}, cookies={}, auth=None, timeout=None, proxies=None, verify=False, debug=0 </msg>
<arg>auth</arg>
<arg>${BASE_URL}</arg>
<arg>headers={'Authorization': 'Bearer ${TOKEN}'}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-06-27T13:55:23.573343" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-06-27T13:55:23.573261" elapsed="0.000408"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.571570" elapsed="0.002123"/>
</if>
<doc>Create an authenticated HTTP session. Performs setup if needed, then logs in.
Skips setup/login if already authenticated (suite-level setup done).</doc>
<status status="PASS" start="2026-06-27T13:55:23.557654" elapsed="0.016078"/>
</kw>
<arg>Create Anonymous Session</arg>
<arg>AND</arg>
<arg>Setup Master Password</arg>
<arg>AND</arg>
<arg>Create Authenticated Session</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-06-27T13:55:23.540327" elapsed="0.033456"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-06-27T13:55:23.574177" level="INFO">${payload} = {'name': 'Aniworld', 'data_dir': 'data', 'scheduler': "{'enabled': True, 'schedule_time': '25:00', 'schedule_days': ['mon']}", 'logging': "{'level': 'INFO'}", 'backup': "{'enabled': False}", 'nfo': "{...</msg>
<var>${payload}</var>
<arg>name=Aniworld</arg>
<arg>data_dir=data</arg>
<arg>scheduler={'enabled': True, 'schedule_time': '25:00', 'schedule_days': ['mon']}</arg>
<arg>logging={'level': 'INFO'}</arg>
<arg>backup={'enabled': False}</arg>
<arg>nfo={'auto_create': False}</arg>
<arg>other={}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-06-27T13:55:23.573881" elapsed="0.000318"/>
</kw>
<kw name="Validate Config" owner="api_keywords">
<kw name="POST API" owner="api_keywords">
<if>
<branch type="IF" condition="$payload is ${NONE}">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${session}</arg>
<arg>${endpoint}</arg>
<arg>expected_status=${expected_status}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.575116" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:23.574857" elapsed="0.000333"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.577628" level="INFO">POST Request : url=http://127.0.0.1:8765/api/config/validate
path_url=/api/config/validate
headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate, br', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJtYXN0ZXIiLCJleHAiOjE3ODI2NDc3MjIsImlhdCI6MTc4MjU2MTMyMn0.--vlbTAAA2hgaD0fZcM-E01gJMfeZI9wU6wqkY3O9Fs', 'Content-Length': '238', 'Content-Type': 'application/json'}
body=b'{"name": "Aniworld", "data_dir": "data", "scheduler": "{\'enabled\': True, \'schedule_time\': \'25:00\', \'schedule_days\': [\'mon\']}", "logging": "{\'level\': \'INFO\'}", "backup": "{\'enabled\': False}", "nfo": "{\'auto_create\': False}", "other": "{}"}'
</msg>
<msg time="2026-06-27T13:55:23.577696" level="INFO">POST Response : url=http://127.0.0.1:8765/api/config/validate
status=422, reason=Unprocessable Content
headers={'date': 'Sat, 27 Jun 2026 11:55:22 GMT', 'server': 'uvicorn', 'content-length': '1128', 'content-type': 'application/json'}
body={"detail":[{"type":"model_attributes_type","loc":["body","scheduler"],"msg":"Input should be a valid dictionary or object to extract fields from","input":"{'enabled': True, 'schedule_time': '25:00', 'schedule_days': ['mon']}","url":"https://errors.pydantic.dev/2.12/v/model_attributes_type"},{"type":"model_attributes_type","loc":["body","logging"],"msg":"Input should be a valid dictionary or object to extract fields from","input":"{'level': 'INFO'}","url":"https://errors.pydantic.dev/2.12/v/model_attributes_type"},{"type":"model_attributes_type","loc":["body","backup"],"msg":"Input should be a valid dictionary or object to extract fields from","input":"{'enabled': False}","url":"https://errors.pydantic.dev/2.12/v/model_attributes_type"},{"type":"model_attributes_type","loc":["body","nfo"],"msg":"Input should be a valid dictionary or object to extract fields from","input":"{'auto_create': False}","url":"https://errors.pydantic.dev/2.12/v/model_attributes_type"},{"type":"dict_type","loc":["body","other"],"msg":"Input should be a valid dictionary","input":"{}","url":"https://errors.pydantic.dev/2.12/v/dict_type"}]}
</msg>
<msg time="2026-06-27T13:55:23.577782" level="INFO">${resp} = &lt;Response [422]&gt;</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>${endpoint}</arg>
<arg>json=${payload}</arg>
<arg>expected_status=${expected_status}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-06-27T13:55:23.575296" elapsed="0.002506"/>
</kw>
<status status="PASS" start="2026-06-27T13:55:23.575214" elapsed="0.002643"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.574845" elapsed="0.003039"/>
</if>
<return>
<value>${resp}</value>
<status status="PASS" start="2026-06-27T13:55:23.577913" elapsed="0.000092"/>
</return>
<msg time="2026-06-27T13:55:23.578101" level="INFO">${resp} = &lt;Response [422]&gt;</msg>
<var>${resp}</var>
<arg>/api/config/validate</arg>
<arg>${payload}</arg>
<arg>${expected_status}</arg>
<doc>Perform an authenticated POST request with optional JSON payload.</doc>
<status status="PASS" start="2026-06-27T13:55:23.574592" elapsed="0.003528"/>
</kw>
<return>
<value>${resp}</value>
<status status="PASS" start="2026-06-27T13:55:23.578160" elapsed="0.000050"/>
</return>
<msg time="2026-06-27T13:55:23.578288" level="INFO">${resp} = &lt;Response [422]&gt;</msg>
<var>${resp}</var>
<arg>${payload}</arg>
<arg>422</arg>
<doc>POST /api/config/validate with the given payload.</doc>
<status status="PASS" start="2026-06-27T13:55:23.574312" elapsed="0.003993"/>
</kw>
<kw name="Response Should Have Status" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-06-27T13:55:23.579217" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>${expected_status}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-06-27T13:55:23.578679" elapsed="0.000579"/>
</kw>
<arg>${resp}</arg>
<arg>422</arg>
<doc>Assert that the response status code matches the expected value.</doc>
<status status="PASS" start="2026-06-27T13:55:23.578413" elapsed="0.000894"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary" type="TEARDOWN">
<msg time="2026-06-27T13:55:23.579693" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-06-27T13:55:23.579425" elapsed="0.000345"/>
</kw>
<doc>Validate a config with malformed schedule_time.</doc>
<status status="PASS" start="2026-06-27T13:55:23.537475" elapsed="0.042350"/>
</test>
<test id="s1-t6" name="Validate Invalid Log Level" line="77">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Create Anonymous Session" owner="common">
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.587704" level="INFO">Creating Session using : alias=anon, url=http://127.0.0.1:8765, headers={}, cookies={}, auth=None, timeout=None, proxies=None, verify=False, debug=0 </msg>
<arg>anon</arg>
<arg>${BASE_URL}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-06-27T13:55:23.587556" elapsed="0.000267"/>
</kw>
<doc>Create an unauthenticated HTTP session.</doc>
<status status="PASS" start="2026-06-27T13:55:23.587317" elapsed="0.000567"/>
</kw>
<kw name="Setup Master Password" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-06-27T13:55:23.588643" level="INFO">${payload} = {'master_password': 'TestPass123!', 'anime_directory': '/tmp/aniworld_test_anime', 'name': 'AniworldTest', 'data_dir': 'data', 'scheduler_enabled': 'False', 'logging_level': 'INFO', 'backup_enabled': ...</msg>
<var>${payload}</var>
<arg>master_password=${SETUP_PASSWORD}</arg>
<arg>anime_directory=/tmp/aniworld_test_anime</arg>
<arg>name=AniworldTest</arg>
<arg>data_dir=data</arg>
<arg>scheduler_enabled=False</arg>
<arg>logging_level=INFO</arg>
<arg>backup_enabled=False</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-06-27T13:55:23.588301" elapsed="0.000366"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.590594" level="INFO">POST Request : url=http://127.0.0.1:8765/api/auth/setup
path_url=/api/auth/setup
headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate, br', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Length': '208', 'Content-Type': 'application/json'}
body=b'{"master_password": "TestPass123!", "anime_directory": "/tmp/aniworld_test_anime", "name": "AniworldTest", "data_dir": "data", "scheduler_enabled": "False", "logging_level": "INFO", "backup_enabled": "False"}'
</msg>
<msg time="2026-06-27T13:55:23.590644" level="INFO">POST Response : url=http://127.0.0.1:8765/api/auth/setup
status=400, reason=Bad Request
headers={'date': 'Sat, 27 Jun 2026 11:55:22 GMT', 'server': 'uvicorn', 'content-length': '47', 'content-type': 'application/json'}
body={"detail":"Master password already configured"}
</msg>
<msg time="2026-06-27T13:55:23.590722" level="INFO">${resp} = &lt;Response [400]&gt;</msg>
<var>${resp}</var>
<arg>anon</arg>
<arg>/api/auth/setup</arg>
<arg>json=${payload}</arg>
<arg>expected_status=any</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-06-27T13:55:23.588770" elapsed="0.001971"/>
</kw>
<if>
<branch type="IF" condition="'${resp.status_code}' == '429'">
<kw name="Sleep" owner="BuiltIn">
<arg>45s</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.591239" elapsed="0.000047"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>anon</arg>
<arg>/api/auth/setup</arg>
<arg>json=${payload}</arg>
<arg>expected_status=any</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.591361" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:23.590827" elapsed="0.000605"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.590810" elapsed="0.000649"/>
</if>
<if>
<branch type="IF" condition="'${resp.status_code}' == '429'">
<kw name="Sleep" owner="BuiltIn">
<arg>45s</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.591801" elapsed="0.000042"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>anon</arg>
<arg>/api/auth/setup</arg>
<arg>json=${payload}</arg>
<arg>expected_status=any</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.591914" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:23.591499" elapsed="0.000481"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.591488" elapsed="0.000516"/>
</if>
<if>
<branch type="IF" condition="'${resp.status_code}' == '400'">
<kw name="Convert String To Json" owner="JSONLibrary">
<msg time="2026-06-27T13:55:23.592667" level="INFO">${json} = {'detail': 'Master password already configured'}</msg>
<var>${json}</var>
<arg>${resp.text}</arg>
<doc>Convert String to JSON object</doc>
<status status="PASS" start="2026-06-27T13:55:23.592356" elapsed="0.000330"/>
</kw>
<kw name="Get Value From Json" owner="JSONLibrary">
<msg time="2026-06-27T13:55:23.604555" level="INFO">${detail} = ['Master password already configured']</msg>
<var>${detail}</var>
<arg>${json}</arg>
<arg>$.detail</arg>
<doc>Get Value From JSON using JSONPath</doc>
<status status="PASS" start="2026-06-27T13:55:23.592766" elapsed="0.011823"/>
</kw>
<if>
<branch type="IF" condition="'${detail}[0]' == 'Master password already configured'">
<return>
<status status="PASS" start="2026-06-27T13:55:23.604906" elapsed="0.000060"/>
</return>
<status status="PASS" start="2026-06-27T13:55:23.604689" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.604672" elapsed="0.000360"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Setup failed with 400: ${detail}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.605123" elapsed="0.000049"/>
</kw>
<status status="PASS" start="2026-06-27T13:55:23.592038" elapsed="0.013167"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.592029" elapsed="0.013202"/>
</if>
<if>
<branch type="IF" condition="'${resp.status_code}' == '201'">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${resp.status_code}</arg>
<arg>201</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.605366" elapsed="0.000042"/>
</kw>
<return>
<status status="NOT RUN" start="2026-06-27T13:55:23.605446" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-06-27T13:55:23.605270" elapsed="0.000236"/>
</branch>
<status status="NOT RUN" start="2026-06-27T13:55:23.605260" elapsed="0.000268"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unexpected status ${resp.status_code} from /api/auth/setup</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.605584" elapsed="0.000037"/>
</kw>
<doc>Configure the master password via the setup endpoint.</doc>
<status status="PASS" start="2026-06-27T13:55:23.588100" elapsed="0.017575"/>
</kw>
<kw name="Create Authenticated Session" owner="common">
<kw name="Create Anonymous Session" owner="common">
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.606443" level="INFO">Creating Session using : alias=anon, url=http://127.0.0.1:8765, headers={}, cookies={}, auth=None, timeout=None, proxies=None, verify=False, debug=0 </msg>
<arg>anon</arg>
<arg>${BASE_URL}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-06-27T13:55:23.606316" elapsed="0.000233"/>
</kw>
<doc>Create an unauthenticated HTTP session.</doc>
<status status="PASS" start="2026-06-27T13:55:23.606157" elapsed="0.000467"/>
</kw>
<kw name="Is Auth Configured" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.608679" level="INFO">GET Request : url=http://127.0.0.1:8765/api/auth/status
path_url=/api/auth/status
headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate, br', 'Accept': '*/*', 'Connection': 'keep-alive'}
body=None
</msg>
<msg time="2026-06-27T13:55:23.608973" level="INFO">GET Response : url=http://127.0.0.1:8765/api/auth/status
status=200, reason=OK
headers={'date': 'Sat, 27 Jun 2026 11:55:22 GMT', 'server': 'uvicorn', 'content-length': '41', 'content-type': 'application/json'}
body={"configured":true,"authenticated":false}
</msg>
<msg time="2026-06-27T13:55:23.609070" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>anon</arg>
<arg>/api/auth/status</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-06-27T13:55:23.606968" elapsed="0.002122"/>
</kw>
<kw name="Convert String To Json" owner="JSONLibrary">
<msg time="2026-06-27T13:55:23.609606" level="INFO">${json} = {'configured': True, 'authenticated': False}</msg>
<var>${json}</var>
<arg>${resp.text}</arg>
<doc>Convert String to JSON object</doc>
<status status="PASS" start="2026-06-27T13:55:23.609210" elapsed="0.000418"/>
</kw>
<kw name="Get Value From Json" owner="JSONLibrary">
<msg time="2026-06-27T13:55:23.619138" level="INFO">${configured} = [True]</msg>
<var>${configured}</var>
<arg>${json}</arg>
<arg>$.configured</arg>
<doc>Get Value From JSON using JSONPath</doc>
<status status="PASS" start="2026-06-27T13:55:23.609734" elapsed="0.009430"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-06-27T13:55:23.619601" level="INFO">${configured_val} = True</msg>
<var>${configured_val}</var>
<arg>${configured}[0]</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-06-27T13:55:23.619260" elapsed="0.000367"/>
</kw>
<return>
<value>${configured_val}</value>
<status status="PASS" start="2026-06-27T13:55:23.619673" elapsed="0.000168"/>
</return>
<msg time="2026-06-27T13:55:23.619948" level="INFO">${configured} = True</msg>
<var>${configured}</var>
<doc>Check if the master password has already been configured.</doc>
<status status="PASS" start="2026-06-27T13:55:23.606744" elapsed="0.013221"/>
</kw>
<if>
<branch type="IF" condition="not ${configured}">
<kw name="Setup Master Password" owner="common">
<doc>Configure the master password via the setup endpoint.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.620391" elapsed="0.000049"/>
</kw>
<kw name="Login And Get Token" owner="common">
<var>${token}</var>
<doc>Log in with the master password and return the JWT access token.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.620582" elapsed="0.000041"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<arg>auth</arg>
<arg>${BASE_URL}</arg>
<arg>headers={'Authorization': 'Bearer ${token}'}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.620696" elapsed="0.000080"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:23.620020" elapsed="0.000794"/>
</branch>
<branch type="ELSE IF" condition="'${TOKEN}' == '${EMPTY}'">
<kw name="Login And Get Token" owner="common">
<var>${token}</var>
<doc>Log in with the master password and return the JWT access token.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.621341" elapsed="0.000043"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<arg>auth</arg>
<arg>${BASE_URL}</arg>
<arg>headers={'Authorization': 'Bearer ${token}'}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.621453" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:23.620842" elapsed="0.000675"/>
</branch>
<branch type="ELSE">
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.621834" level="INFO">Creating Session using : alias=auth, url=http://127.0.0.1:8765, headers={'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJtYXN0ZXIiLCJleHAiOjE3ODI2NDc3MjIsImlhdCI6MTc4MjU2MTMyMn0.--vlbTAAA2hgaD0fZcM-E01gJMfeZI9wU6wqkY3O9Fs'}, cookies={}, auth=None, timeout=None, proxies=None, verify=False, debug=0 </msg>
<arg>auth</arg>
<arg>${BASE_URL}</arg>
<arg>headers={'Authorization': 'Bearer ${TOKEN}'}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-06-27T13:55:23.621621" elapsed="0.000307"/>
</kw>
<status status="PASS" start="2026-06-27T13:55:23.621541" elapsed="0.000423"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.620008" elapsed="0.001980"/>
</if>
<doc>Create an authenticated HTTP session. Performs setup if needed, then logs in.
Skips setup/login if already authenticated (suite-level setup done).</doc>
<status status="PASS" start="2026-06-27T13:55:23.605865" elapsed="0.016154"/>
</kw>
<arg>Create Anonymous Session</arg>
<arg>AND</arg>
<arg>Setup Master Password</arg>
<arg>AND</arg>
<arg>Create Authenticated Session</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-06-27T13:55:23.586910" elapsed="0.035144"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-06-27T13:55:23.622507" level="INFO">${payload} = {'name': 'Aniworld', 'data_dir': 'data', 'scheduler': {'enabled': True, 'schedule_time': '03:00', 'schedule_days': ['mon']}, 'logging': {'level': 'INVALID', 'backup_count': 3}, 'backup': {'enabled': F...</msg>
<var>${payload}</var>
<arg>json.loads('''{"name": "Aniworld", "data_dir": "data", "scheduler": {"enabled": true, "schedule_time": "03:00", "schedule_days": ["mon"]}, "logging": {"level": "INVALID", "backup_count": 3}, "backup": {"enabled": false}, "nfo": {"auto_create": false}, "other": {}}''')</arg>
<arg>modules=json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-06-27T13:55:23.622137" elapsed="0.000390"/>
</kw>
<kw name="Validate Config" owner="api_keywords">
<kw name="POST API" owner="api_keywords">
<if>
<branch type="IF" condition="$payload is ${NONE}">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${session}</arg>
<arg>${endpoint}</arg>
<arg>expected_status=${expected_status}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.623458" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:23.623258" elapsed="0.000275"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.626421" level="INFO">POST Request : url=http://127.0.0.1:8765/api/config/validate
path_url=/api/config/validate
headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate, br', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJtYXN0ZXIiLCJleHAiOjE3ODI2NDc3MjIsImlhdCI6MTc4MjU2MTMyMn0.--vlbTAAA2hgaD0fZcM-E01gJMfeZI9wU6wqkY3O9Fs', 'Content-Length': '250', 'Content-Type': 'application/json'}
body=b'{"name": "Aniworld", "data_dir": "data", "scheduler": {"enabled": true, "schedule_time": "03:00", "schedule_days": ["mon"]}, "logging": {"level": "INVALID", "backup_count": 3}, "backup": {"enabled": false}, "nfo": {"auto_create": false}, "other": {}}'
</msg>
<msg time="2026-06-27T13:55:23.626474" level="INFO">POST Response : url=http://127.0.0.1:8765/api/config/validate
status=422, reason=Unprocessable Content
headers={'date': 'Sat, 27 Jun 2026 11:55:22 GMT', 'server': 'uvicorn', 'content-length': '212', 'content-type': 'application/json'}
body={"detail":[{"type":"value_error","loc":["body","logging","level"],"msg":"Value error, invalid logging level: INVALID","input":"INVALID","ctx":{"error":{}},"url":"https://errors.pydantic.dev/2.12/v/value_error"}]}
</msg>
<msg time="2026-06-27T13:55:23.626552" level="INFO">${resp} = &lt;Response [422]&gt;</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>${endpoint}</arg>
<arg>json=${payload}</arg>
<arg>expected_status=${expected_status}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-06-27T13:55:23.623638" elapsed="0.002932"/>
</kw>
<status status="PASS" start="2026-06-27T13:55:23.623556" elapsed="0.003626"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.623246" elapsed="0.003985"/>
</if>
<return>
<value>${resp}</value>
<status status="PASS" start="2026-06-27T13:55:23.627271" elapsed="0.000112"/>
</return>
<msg time="2026-06-27T13:55:23.627492" level="INFO">${resp} = &lt;Response [422]&gt;</msg>
<var>${resp}</var>
<arg>/api/config/validate</arg>
<arg>${payload}</arg>
<arg>${expected_status}</arg>
<doc>Perform an authenticated POST request with optional JSON payload.</doc>
<status status="PASS" start="2026-06-27T13:55:23.622943" elapsed="0.004568"/>
</kw>
<return>
<value>${resp}</value>
<status status="PASS" start="2026-06-27T13:55:23.627552" elapsed="0.000050"/>
</return>
<msg time="2026-06-27T13:55:23.627684" level="INFO">${resp} = &lt;Response [422]&gt;</msg>
<var>${resp}</var>
<arg>${payload}</arg>
<arg>422</arg>
<doc>POST /api/config/validate with the given payload.</doc>
<status status="PASS" start="2026-06-27T13:55:23.622631" elapsed="0.005070"/>
</kw>
<kw name="Response Should Have Status" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-06-27T13:55:23.628492" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>${expected_status}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-06-27T13:55:23.628062" elapsed="0.000469"/>
</kw>
<arg>${resp}</arg>
<arg>422</arg>
<doc>Assert that the response status code matches the expected value.</doc>
<status status="PASS" start="2026-06-27T13:55:23.627821" elapsed="0.000755"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary" type="TEARDOWN">
<msg time="2026-06-27T13:55:23.628790" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-06-27T13:55:23.628693" elapsed="0.000158"/>
</kw>
<doc>Validate a config with an invalid logging level.</doc>
<status status="PASS" start="2026-06-27T13:55:23.584323" elapsed="0.044564"/>
</test>
<test id="s1-t7" name="Config Backup Create" line="86">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Create Anonymous Session" owner="common">
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.637059" level="INFO">Creating Session using : alias=anon, url=http://127.0.0.1:8765, headers={}, cookies={}, auth=None, timeout=None, proxies=None, verify=False, debug=0 </msg>
<arg>anon</arg>
<arg>${BASE_URL}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-06-27T13:55:23.636918" elapsed="0.000244"/>
</kw>
<doc>Create an unauthenticated HTTP session.</doc>
<status status="PASS" start="2026-06-27T13:55:23.636681" elapsed="0.000546"/>
</kw>
<kw name="Setup Master Password" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-06-27T13:55:23.638001" level="INFO">${payload} = {'master_password': 'TestPass123!', 'anime_directory': '/tmp/aniworld_test_anime', 'name': 'AniworldTest', 'data_dir': 'data', 'scheduler_enabled': 'False', 'logging_level': 'INFO', 'backup_enabled': ...</msg>
<var>${payload}</var>
<arg>master_password=${SETUP_PASSWORD}</arg>
<arg>anime_directory=/tmp/aniworld_test_anime</arg>
<arg>name=AniworldTest</arg>
<arg>data_dir=data</arg>
<arg>scheduler_enabled=False</arg>
<arg>logging_level=INFO</arg>
<arg>backup_enabled=False</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-06-27T13:55:23.637677" elapsed="0.000345"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.639890" level="INFO">POST Request : url=http://127.0.0.1:8765/api/auth/setup
path_url=/api/auth/setup
headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate, br', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Length': '208', 'Content-Type': 'application/json'}
body=b'{"master_password": "TestPass123!", "anime_directory": "/tmp/aniworld_test_anime", "name": "AniworldTest", "data_dir": "data", "scheduler_enabled": "False", "logging_level": "INFO", "backup_enabled": "False"}'
</msg>
<msg time="2026-06-27T13:55:23.639944" level="INFO">POST Response : url=http://127.0.0.1:8765/api/auth/setup
status=400, reason=Bad Request
headers={'date': 'Sat, 27 Jun 2026 11:55:22 GMT', 'server': 'uvicorn', 'content-length': '47', 'content-type': 'application/json'}
body={"detail":"Master password already configured"}
</msg>
<msg time="2026-06-27T13:55:23.640010" level="INFO">${resp} = &lt;Response [400]&gt;</msg>
<var>${resp}</var>
<arg>anon</arg>
<arg>/api/auth/setup</arg>
<arg>json=${payload}</arg>
<arg>expected_status=any</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-06-27T13:55:23.638108" elapsed="0.001919"/>
</kw>
<if>
<branch type="IF" condition="'${resp.status_code}' == '429'">
<kw name="Sleep" owner="BuiltIn">
<arg>45s</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.640493" elapsed="0.000067"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>anon</arg>
<arg>/api/auth/setup</arg>
<arg>json=${payload}</arg>
<arg>expected_status=any</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.640643" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:23.640101" elapsed="0.000630"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.640085" elapsed="0.000684"/>
</if>
<if>
<branch type="IF" condition="'${resp.status_code}' == '429'">
<kw name="Sleep" owner="BuiltIn">
<arg>45s</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.641147" elapsed="0.000042"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>anon</arg>
<arg>/api/auth/setup</arg>
<arg>json=${payload}</arg>
<arg>expected_status=any</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.641260" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:23.640809" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.640798" elapsed="0.000552"/>
</if>
<if>
<branch type="IF" condition="'${resp.status_code}' == '400'">
<kw name="Convert String To Json" owner="JSONLibrary">
<msg time="2026-06-27T13:55:23.642009" level="INFO">${json} = {'detail': 'Master password already configured'}</msg>
<var>${json}</var>
<arg>${resp.text}</arg>
<doc>Convert String to JSON object</doc>
<status status="PASS" start="2026-06-27T13:55:23.641693" elapsed="0.000336"/>
</kw>
<kw name="Get Value From Json" owner="JSONLibrary">
<msg time="2026-06-27T13:55:23.651931" level="INFO">${detail} = ['Master password already configured']</msg>
<var>${detail}</var>
<arg>${json}</arg>
<arg>$.detail</arg>
<doc>Get Value From JSON using JSONPath</doc>
<status status="PASS" start="2026-06-27T13:55:23.642103" elapsed="0.009856"/>
</kw>
<if>
<branch type="IF" condition="'${detail}[0]' == 'Master password already configured'">
<return>
<status status="PASS" start="2026-06-27T13:55:23.652205" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-06-27T13:55:23.652046" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.652015" elapsed="0.000311"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Setup failed with 400: ${detail}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.652407" elapsed="0.000047"/>
</kw>
<status status="PASS" start="2026-06-27T13:55:23.641384" elapsed="0.011103"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.641375" elapsed="0.011391"/>
</if>
<if>
<branch type="IF" condition="'${resp.status_code}' == '201'">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${resp.status_code}</arg>
<arg>201</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.653084" elapsed="0.000042"/>
</kw>
<return>
<status status="NOT RUN" start="2026-06-27T13:55:23.653165" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-06-27T13:55:23.652828" elapsed="0.000397"/>
</branch>
<status status="NOT RUN" start="2026-06-27T13:55:23.652816" elapsed="0.000431"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unexpected status ${resp.status_code} from /api/auth/setup</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.653302" elapsed="0.000037"/>
</kw>
<doc>Configure the master password via the setup endpoint.</doc>
<status status="PASS" start="2026-06-27T13:55:23.637469" elapsed="0.015920"/>
</kw>
<kw name="Create Authenticated Session" owner="common">
<kw name="Create Anonymous Session" owner="common">
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.654131" level="INFO">Creating Session using : alias=anon, url=http://127.0.0.1:8765, headers={}, cookies={}, auth=None, timeout=None, proxies=None, verify=False, debug=0 </msg>
<arg>anon</arg>
<arg>${BASE_URL}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-06-27T13:55:23.653978" elapsed="0.000245"/>
</kw>
<doc>Create an unauthenticated HTTP session.</doc>
<status status="PASS" start="2026-06-27T13:55:23.653739" elapsed="0.000531"/>
</kw>
<kw name="Is Auth Configured" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.656149" level="INFO">GET Request : url=http://127.0.0.1:8765/api/auth/status
path_url=/api/auth/status
headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate, br', 'Accept': '*/*', 'Connection': 'keep-alive'}
body=None
</msg>
<msg time="2026-06-27T13:55:23.656204" level="INFO">GET Response : url=http://127.0.0.1:8765/api/auth/status
status=200, reason=OK
headers={'date': 'Sat, 27 Jun 2026 11:55:22 GMT', 'server': 'uvicorn', 'content-length': '41', 'content-type': 'application/json'}
body={"configured":true,"authenticated":false}
</msg>
<msg time="2026-06-27T13:55:23.656272" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>anon</arg>
<arg>/api/auth/status</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-06-27T13:55:23.654562" elapsed="0.001728"/>
</kw>
<kw name="Convert String To Json" owner="JSONLibrary">
<msg time="2026-06-27T13:55:23.656810" level="INFO">${json} = {'configured': True, 'authenticated': False}</msg>
<var>${json}</var>
<arg>${resp.text}</arg>
<doc>Convert String to JSON object</doc>
<status status="PASS" start="2026-06-27T13:55:23.656388" elapsed="0.000446"/>
</kw>
<kw name="Get Value From Json" owner="JSONLibrary">
<msg time="2026-06-27T13:55:23.666330" level="INFO">${configured} = [True]</msg>
<var>${configured}</var>
<arg>${json}</arg>
<arg>$.configured</arg>
<doc>Get Value From JSON using JSONPath</doc>
<status status="PASS" start="2026-06-27T13:55:23.656929" elapsed="0.009431"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-06-27T13:55:23.666844" level="INFO">${configured_val} = True</msg>
<var>${configured_val}</var>
<arg>${configured}[0]</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-06-27T13:55:23.666460" elapsed="0.000403"/>
</kw>
<return>
<value>${configured_val}</value>
<status status="PASS" start="2026-06-27T13:55:23.666905" elapsed="0.000109"/>
</return>
<msg time="2026-06-27T13:55:23.667106" level="INFO">${configured} = True</msg>
<var>${configured}</var>
<doc>Check if the master password has already been configured.</doc>
<status status="PASS" start="2026-06-27T13:55:23.654369" elapsed="0.012754"/>
</kw>
<if>
<branch type="IF" condition="not ${configured}">
<kw name="Setup Master Password" owner="common">
<doc>Configure the master password via the setup endpoint.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.667472" elapsed="0.000048"/>
</kw>
<kw name="Login And Get Token" owner="common">
<var>${token}</var>
<doc>Log in with the master password and return the JWT access token.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.667655" elapsed="0.000040"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<arg>auth</arg>
<arg>${BASE_URL}</arg>
<arg>headers={'Authorization': 'Bearer ${token}'}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.667771" elapsed="0.000101"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:23.667175" elapsed="0.000736"/>
</branch>
<branch type="ELSE IF" condition="'${TOKEN}' == '${EMPTY}'">
<kw name="Login And Get Token" owner="common">
<var>${token}</var>
<doc>Log in with the master password and return the JWT access token.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.668455" elapsed="0.000046"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<arg>auth</arg>
<arg>${BASE_URL}</arg>
<arg>headers={'Authorization': 'Bearer ${token}'}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.668576" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:23.667937" elapsed="0.000707"/>
</branch>
<branch type="ELSE">
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.668983" level="INFO">Creating Session using : alias=auth, url=http://127.0.0.1:8765, headers={'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJtYXN0ZXIiLCJleHAiOjE3ODI2NDc3MjIsImlhdCI6MTc4MjU2MTMyMn0.--vlbTAAA2hgaD0fZcM-E01gJMfeZI9wU6wqkY3O9Fs'}, cookies={}, auth=None, timeout=None, proxies=None, verify=False, debug=0 </msg>
<arg>auth</arg>
<arg>${BASE_URL}</arg>
<arg>headers={'Authorization': 'Bearer ${TOKEN}'}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-06-27T13:55:23.668757" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-06-27T13:55:23.668668" elapsed="0.000448"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.667164" elapsed="0.001976"/>
</if>
<doc>Create an authenticated HTTP session. Performs setup if needed, then logs in.
Skips setup/login if already authenticated (suite-level setup done).</doc>
<status status="PASS" start="2026-06-27T13:55:23.653545" elapsed="0.015626"/>
</kw>
<arg>Create Anonymous Session</arg>
<arg>AND</arg>
<arg>Setup Master Password</arg>
<arg>AND</arg>
<arg>Create Authenticated Session</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-06-27T13:55:23.636250" elapsed="0.032956"/>
</kw>
<kw name="POST API" owner="api_keywords">
<if>
<branch type="IF" condition="$payload is ${NONE}">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.673554" level="INFO">POST Request : url=http://127.0.0.1:8765/api/config/backups
path_url=/api/config/backups
headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate, br', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJtYXN0ZXIiLCJleHAiOjE3ODI2NDc3MjIsImlhdCI6MTc4MjU2MTMyMn0.--vlbTAAA2hgaD0fZcM-E01gJMfeZI9wU6wqkY3O9Fs', 'Content-Length': '0'}
body=None
</msg>
<msg time="2026-06-27T13:55:23.673613" level="INFO">POST Response : url=http://127.0.0.1:8765/api/config/backups
status=201, reason=Created
headers={'date': 'Sat, 27 Jun 2026 11:55:22 GMT', 'server': 'uvicorn', 'content-length': '85', 'content-type': 'application/json'}
body={"name":"config_backup_20260627_135523.json","message":"Backup created successfully"}
</msg>
<msg time="2026-06-27T13:55:23.674091" level="INFO">${resp} = &lt;Response [201]&gt;</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>${endpoint}</arg>
<arg>expected_status=${expected_status}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-06-27T13:55:23.669860" elapsed="0.004259"/>
</kw>
<status status="PASS" start="2026-06-27T13:55:23.669644" elapsed="0.004531"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${session}</arg>
<arg>${endpoint}</arg>
<arg>json=${payload}</arg>
<arg>expected_status=${expected_status}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.674365" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:23.674207" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.669632" elapsed="0.004844"/>
</if>
<return>
<value>${resp}</value>
<status status="PASS" start="2026-06-27T13:55:23.674507" elapsed="0.000055"/>
</return>
<msg time="2026-06-27T13:55:23.674673" level="INFO">${resp} = &lt;Response [201]&gt;</msg>
<var>${resp}</var>
<arg>/api/config/backups</arg>
<arg>expected_status=201</arg>
<doc>Perform an authenticated POST request with optional JSON payload.</doc>
<status status="PASS" start="2026-06-27T13:55:23.669333" elapsed="0.005361"/>
</kw>
<kw name="Response Should Have Status" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-06-27T13:55:23.675510" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>${expected_status}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-06-27T13:55:23.675072" elapsed="0.000481"/>
</kw>
<arg>${resp}</arg>
<arg>201</arg>
<doc>Assert that the response status code matches the expected value.</doc>
<status status="PASS" start="2026-06-27T13:55:23.674814" elapsed="0.000790"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary" type="TEARDOWN">
<msg time="2026-06-27T13:55:23.675828" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-06-27T13:55:23.675733" elapsed="0.000155"/>
</kw>
<doc>Create a configuration backup and verify it exists.</doc>
<status status="PASS" start="2026-06-27T13:55:23.633597" elapsed="0.042328"/>
</test>
<test id="s1-t8" name="Config Backup List" line="91">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Create Anonymous Session" owner="common">
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.683035" level="INFO">Creating Session using : alias=anon, url=http://127.0.0.1:8765, headers={}, cookies={}, auth=None, timeout=None, proxies=None, verify=False, debug=0 </msg>
<arg>anon</arg>
<arg>${BASE_URL}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-06-27T13:55:23.682860" elapsed="0.000284"/>
</kw>
<doc>Create an unauthenticated HTTP session.</doc>
<status status="PASS" start="2026-06-27T13:55:23.682612" elapsed="0.000594"/>
</kw>
<kw name="Setup Master Password" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-06-27T13:55:23.683965" level="INFO">${payload} = {'master_password': 'TestPass123!', 'anime_directory': '/tmp/aniworld_test_anime', 'name': 'AniworldTest', 'data_dir': 'data', 'scheduler_enabled': 'False', 'logging_level': 'INFO', 'backup_enabled': ...</msg>
<var>${payload}</var>
<arg>master_password=${SETUP_PASSWORD}</arg>
<arg>anime_directory=/tmp/aniworld_test_anime</arg>
<arg>name=AniworldTest</arg>
<arg>data_dir=data</arg>
<arg>scheduler_enabled=False</arg>
<arg>logging_level=INFO</arg>
<arg>backup_enabled=False</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-06-27T13:55:23.683635" elapsed="0.000352"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.685802" level="INFO">POST Request : url=http://127.0.0.1:8765/api/auth/setup
path_url=/api/auth/setup
headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate, br', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Length': '208', 'Content-Type': 'application/json'}
body=b'{"master_password": "TestPass123!", "anime_directory": "/tmp/aniworld_test_anime", "name": "AniworldTest", "data_dir": "data", "scheduler_enabled": "False", "logging_level": "INFO", "backup_enabled": "False"}'
</msg>
<msg time="2026-06-27T13:55:23.685845" level="INFO">POST Response : url=http://127.0.0.1:8765/api/auth/setup
status=400, reason=Bad Request
headers={'date': 'Sat, 27 Jun 2026 11:55:22 GMT', 'server': 'uvicorn', 'content-length': '47', 'content-type': 'application/json'}
body={"detail":"Master password already configured"}
</msg>
<msg time="2026-06-27T13:55:23.685910" level="INFO">${resp} = &lt;Response [400]&gt;</msg>
<var>${resp}</var>
<arg>anon</arg>
<arg>/api/auth/setup</arg>
<arg>json=${payload}</arg>
<arg>expected_status=any</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-06-27T13:55:23.684084" elapsed="0.001845"/>
</kw>
<if>
<branch type="IF" condition="'${resp.status_code}' == '429'">
<kw name="Sleep" owner="BuiltIn">
<arg>45s</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.686413" elapsed="0.000050"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>anon</arg>
<arg>/api/auth/setup</arg>
<arg>json=${payload}</arg>
<arg>expected_status=any</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.686545" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:23.686004" elapsed="0.000617"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.685988" elapsed="0.000662"/>
</if>
<if>
<branch type="IF" condition="'${resp.status_code}' == '429'">
<kw name="Sleep" owner="BuiltIn">
<arg>45s</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.687019" elapsed="0.000042"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>anon</arg>
<arg>/api/auth/setup</arg>
<arg>json=${payload}</arg>
<arg>expected_status=any</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.687133" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:23.686693" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.686681" elapsed="0.000548"/>
</if>
<if>
<branch type="IF" condition="'${resp.status_code}' == '400'">
<kw name="Convert String To Json" owner="JSONLibrary">
<msg time="2026-06-27T13:55:23.687933" level="INFO">${json} = {'detail': 'Master password already configured'}</msg>
<var>${json}</var>
<arg>${resp.text}</arg>
<doc>Convert String to JSON object</doc>
<status status="PASS" start="2026-06-27T13:55:23.687593" elapsed="0.000362"/>
</kw>
<kw name="Get Value From Json" owner="JSONLibrary">
<msg time="2026-06-27T13:55:23.698449" level="INFO">${detail} = ['Master password already configured']</msg>
<var>${detail}</var>
<arg>${json}</arg>
<arg>$.detail</arg>
<doc>Get Value From JSON using JSONPath</doc>
<status status="PASS" start="2026-06-27T13:55:23.688039" elapsed="0.010442"/>
</kw>
<if>
<branch type="IF" condition="'${detail}[0]' == 'Master password already configured'">
<return>
<status status="PASS" start="2026-06-27T13:55:23.698821" elapsed="0.000119"/>
</return>
<status status="PASS" start="2026-06-27T13:55:23.698559" elapsed="0.000417"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.698545" elapsed="0.000457"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Setup failed with 400: ${detail}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.699087" elapsed="0.000046"/>
</kw>
<status status="PASS" start="2026-06-27T13:55:23.687265" elapsed="0.012026"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.687255" elapsed="0.012076"/>
</if>
<if>
<branch type="IF" condition="'${resp.status_code}' == '201'">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${resp.status_code}</arg>
<arg>201</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.699504" elapsed="0.000044"/>
</kw>
<return>
<status status="NOT RUN" start="2026-06-27T13:55:23.699588" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-06-27T13:55:23.699380" elapsed="0.000271"/>
</branch>
<status status="NOT RUN" start="2026-06-27T13:55:23.699367" elapsed="0.000307"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unexpected status ${resp.status_code} from /api/auth/setup</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.699740" elapsed="0.000041"/>
</kw>
<doc>Configure the master password via the setup endpoint.</doc>
<status status="PASS" start="2026-06-27T13:55:23.683419" elapsed="0.016418"/>
</kw>
<kw name="Create Authenticated Session" owner="common">
<kw name="Create Anonymous Session" owner="common">
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.700507" level="INFO">Creating Session using : alias=anon, url=http://127.0.0.1:8765, headers={}, cookies={}, auth=None, timeout=None, proxies=None, verify=False, debug=0 </msg>
<arg>anon</arg>
<arg>${BASE_URL}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-06-27T13:55:23.700381" elapsed="0.000226"/>
</kw>
<doc>Create an unauthenticated HTTP session.</doc>
<status status="PASS" start="2026-06-27T13:55:23.700215" elapsed="0.000444"/>
</kw>
<kw name="Is Auth Configured" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.702599" level="INFO">GET Request : url=http://127.0.0.1:8765/api/auth/status
path_url=/api/auth/status
headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate, br', 'Accept': '*/*', 'Connection': 'keep-alive'}
body=None
</msg>
<msg time="2026-06-27T13:55:23.702647" level="INFO">GET Response : url=http://127.0.0.1:8765/api/auth/status
status=200, reason=OK
headers={'date': 'Sat, 27 Jun 2026 11:55:22 GMT', 'server': 'uvicorn', 'content-length': '41', 'content-type': 'application/json'}
body={"configured":true,"authenticated":false}
</msg>
<msg time="2026-06-27T13:55:23.702730" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>anon</arg>
<arg>/api/auth/status</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-06-27T13:55:23.700946" elapsed="0.001804"/>
</kw>
<kw name="Convert String To Json" owner="JSONLibrary">
<msg time="2026-06-27T13:55:23.703246" level="INFO">${json} = {'configured': True, 'authenticated': False}</msg>
<var>${json}</var>
<arg>${resp.text}</arg>
<doc>Convert String to JSON object</doc>
<status status="PASS" start="2026-06-27T13:55:23.702854" elapsed="0.000413"/>
</kw>
<kw name="Get Value From Json" owner="JSONLibrary">
<msg time="2026-06-27T13:55:23.713583" level="INFO">${configured} = [True]</msg>
<var>${configured}</var>
<arg>${json}</arg>
<arg>$.configured</arg>
<doc>Get Value From JSON using JSONPath</doc>
<status status="PASS" start="2026-06-27T13:55:23.703358" elapsed="0.010256"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-06-27T13:55:23.714227" level="INFO">${configured_val} = True</msg>
<var>${configured_val}</var>
<arg>${configured}[0]</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-06-27T13:55:23.713734" elapsed="0.000516"/>
</kw>
<return>
<value>${configured_val}</value>
<status status="PASS" start="2026-06-27T13:55:23.714297" elapsed="0.000164"/>
</return>
<msg time="2026-06-27T13:55:23.714558" level="INFO">${configured} = True</msg>
<var>${configured}</var>
<doc>Check if the master password has already been configured.</doc>
<status status="PASS" start="2026-06-27T13:55:23.700771" elapsed="0.013804"/>
</kw>
<if>
<branch type="IF" condition="not ${configured}">
<kw name="Setup Master Password" owner="common">
<doc>Configure the master password via the setup endpoint.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.715036" elapsed="0.000096"/>
</kw>
<kw name="Login And Get Token" owner="common">
<var>${token}</var>
<doc>Log in with the master password and return the JWT access token.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.715290" elapsed="0.000049"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<arg>auth</arg>
<arg>${BASE_URL}</arg>
<arg>headers={'Authorization': 'Bearer ${token}'}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.715423" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:23.714629" elapsed="0.000868"/>
</branch>
<branch type="ELSE IF" condition="'${TOKEN}' == '${EMPTY}'">
<kw name="Login And Get Token" owner="common">
<var>${token}</var>
<doc>Log in with the master password and return the JWT access token.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.715986" elapsed="0.000058"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<arg>auth</arg>
<arg>${BASE_URL}</arg>
<arg>headers={'Authorization': 'Bearer ${token}'}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.716120" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:23.715525" elapsed="0.000667"/>
</branch>
<branch type="ELSE">
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.716624" level="INFO">Creating Session using : alias=auth, url=http://127.0.0.1:8765, headers={'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJtYXN0ZXIiLCJleHAiOjE3ODI2NDc3MjIsImlhdCI6MTc4MjU2MTMyMn0.--vlbTAAA2hgaD0fZcM-E01gJMfeZI9wU6wqkY3O9Fs'}, cookies={}, auth=None, timeout=None, proxies=None, verify=False, debug=0 </msg>
<arg>auth</arg>
<arg>${BASE_URL}</arg>
<arg>headers={'Authorization': 'Bearer ${TOKEN}'}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-06-27T13:55:23.716379" elapsed="0.000357"/>
</kw>
<status status="PASS" start="2026-06-27T13:55:23.716218" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.714617" elapsed="0.002189"/>
</if>
<doc>Create an authenticated HTTP session. Performs setup if needed, then logs in.
Skips setup/login if already authenticated (suite-level setup done).</doc>
<status status="PASS" start="2026-06-27T13:55:23.700006" elapsed="0.016831"/>
</kw>
<arg>Create Anonymous Session</arg>
<arg>AND</arg>
<arg>Setup Master Password</arg>
<arg>AND</arg>
<arg>Create Authenticated Session</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-06-27T13:55:23.682193" elapsed="0.034681"/>
</kw>
<kw name="POST API" owner="api_keywords">
<if>
<branch type="IF" condition="$payload is ${NONE}">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.721385" level="INFO">POST Request : url=http://127.0.0.1:8765/api/config/backups
path_url=/api/config/backups
headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate, br', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJtYXN0ZXIiLCJleHAiOjE3ODI2NDc3MjIsImlhdCI6MTc4MjU2MTMyMn0.--vlbTAAA2hgaD0fZcM-E01gJMfeZI9wU6wqkY3O9Fs', 'Content-Length': '0'}
body=None
</msg>
<msg time="2026-06-27T13:55:23.721446" level="INFO">POST Response : url=http://127.0.0.1:8765/api/config/backups
status=201, reason=Created
headers={'date': 'Sat, 27 Jun 2026 11:55:22 GMT', 'server': 'uvicorn', 'content-length': '85', 'content-type': 'application/json'}
body={"name":"config_backup_20260627_135523.json","message":"Backup created successfully"}
</msg>
<msg time="2026-06-27T13:55:23.721674" level="INFO">${resp} = &lt;Response [201]&gt;</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>${endpoint}</arg>
<arg>expected_status=${expected_status}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-06-27T13:55:23.717612" elapsed="0.004084"/>
</kw>
<status status="PASS" start="2026-06-27T13:55:23.717347" elapsed="0.004410"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${session}</arg>
<arg>${endpoint}</arg>
<arg>json=${payload}</arg>
<arg>expected_status=${expected_status}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.721951" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:23.721792" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.717336" elapsed="0.004737"/>
</if>
<return>
<value>${resp}</value>
<status status="PASS" start="2026-06-27T13:55:23.722104" elapsed="0.000156"/>
</return>
<arg>/api/config/backups</arg>
<arg>expected_status=201</arg>
<doc>Perform an authenticated POST request with optional JSON payload.</doc>
<status status="PASS" start="2026-06-27T13:55:23.717007" elapsed="0.005377"/>
</kw>
<kw name="GET API" owner="api_keywords">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.725044" level="INFO">GET Request : url=http://127.0.0.1:8765/api/config/backups
path_url=/api/config/backups
headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate, br', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJtYXN0ZXIiLCJleHAiOjE3ODI2NDc3MjIsImlhdCI6MTc4MjU2MTMyMn0.--vlbTAAA2hgaD0fZcM-E01gJMfeZI9wU6wqkY3O9Fs'}
body=None
</msg>
<msg time="2026-06-27T13:55:23.725092" level="INFO">GET Response : url=http://127.0.0.1:8765/api/config/backups
status=200, reason=OK
headers={'date': 'Sat, 27 Jun 2026 11:55:22 GMT', 'server': 'uvicorn', 'content-length': '1054', 'content-type': 'application/json'}
body={"backups":[{"name":"config_backup_20260627_135523.json","size_bytes":1038,"created_at":"2026-06-27T13:55:23.370415"},{"name":"pre_restore.json","size_bytes":1006,"created_at":"2026-06-27T13:54:18.929110"},{"name":"config_backup_20260627_135413.json","size_bytes":1082,"created_at":"2026-06-27T13:54:13.524603"},{"name":"config_backup_20260627_135334.json","size_bytes":1082,"created_at":"2026-06-27T13:53:33.987485"},{"name":"config_backup_20260627_135300.json","size_bytes":1005,"created_at":"2026-06-27T13:52:52.824097"},{"name":"config_backup_20260627_135224.json","size_bytes":1005,"created_at":"2026-06-27T13:52:24.663837"},{"name":"config_backup_20260627_135252.json","size_bytes":1005,"created_at":"2026-06-27T13:52:24.663837"},{"name":"config_backup_20260627_135150.json","size_bytes":1005,"created_at":"2026-06-27T13:51:50.613557"},{"name":"config_backup_20260627_135110.json","size_bytes":848,"created_at":"2026-06-27T13:50:57.578964"},{"name":"config_backup_20260627_134732.json","size_bytes":1082,"created_at":"2026-06-27T13:37:13.232168"}]}
</msg>
<msg time="2026-06-27T13:55:23.725169" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>${endpoint}</arg>
<arg>expected_status=${expected_status}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-06-27T13:55:23.722801" elapsed="0.002386"/>
</kw>
<return>
<value>${resp}</value>
<status status="PASS" start="2026-06-27T13:55:23.725241" elapsed="0.000075"/>
</return>
<msg time="2026-06-27T13:55:23.725416" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>/api/config/backups</arg>
<doc>Perform an authenticated GET request and return the response.</doc>
<status status="PASS" start="2026-06-27T13:55:23.722514" elapsed="0.002920"/>
</kw>
<kw name="Response Should Have Status" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-06-27T13:55:23.726272" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>${expected_status}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-06-27T13:55:23.725805" elapsed="0.000511"/>
</kw>
<arg>${resp}</arg>
<arg>200</arg>
<doc>Assert that the response status code matches the expected value.</doc>
<status status="PASS" start="2026-06-27T13:55:23.725548" elapsed="0.000820"/>
</kw>
<kw name="Response Should Contain Key" owner="common">
<kw name="Convert String To Json" owner="JSONLibrary">
<msg time="2026-06-27T13:55:23.727089" level="INFO">${json} = {'backups': [{'name': 'config_backup_20260627_135523.json', 'size_bytes': 1038, 'created_at': '2026-06-27T13:55:23.370415'}, {'name': 'pre_restore.json', 'size_bytes': 1006, 'created_at': '2026-06-27T...</msg>
<var>${json}</var>
<arg>${response.text}</arg>
<doc>Convert String to JSON object</doc>
<status status="PASS" start="2026-06-27T13:55:23.726718" elapsed="0.000393"/>
</kw>
<kw name="Get Value From Json" owner="JSONLibrary">
<msg time="2026-06-27T13:55:23.737651" level="INFO">${values} = [[{'name': 'config_backup_20260627_135523.json', 'size_bytes': 1038, 'created_at': '2026-06-27T13:55:23.370415'}, {'name': 'pre_restore.json', 'size_bytes': 1006, 'created_at': '2026-06-27T13:54:18.92...</msg>
<var>${values}</var>
<arg>${json}</arg>
<arg>${json_path}</arg>
<doc>Get Value From JSON using JSONPath</doc>
<status status="PASS" start="2026-06-27T13:55:23.727193" elapsed="0.010486"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-06-27T13:55:23.738257" level="INFO">Length is 1.</msg>
<arg>${values}</arg>
<arg>Expected JSON path '${json_path}' not found in response</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-06-27T13:55:23.737776" elapsed="0.000516"/>
</kw>
<arg>${resp}</arg>
<arg>$.backups</arg>
<doc>Assert that the JSON response contains the given JSONPath key.</doc>
<status status="PASS" start="2026-06-27T13:55:23.726470" elapsed="0.011872"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary" type="TEARDOWN">
<msg time="2026-06-27T13:55:23.738659" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-06-27T13:55:23.738462" elapsed="0.000262"/>
</kw>
<doc>List configuration backups and verify the response structure.</doc>
<status status="PASS" start="2026-06-27T13:55:23.679943" elapsed="0.058818"/>
</test>
<test id="s1-t9" name="Config Backup Restore" line="98">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Create Anonymous Session" owner="common">
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.746533" level="INFO">Creating Session using : alias=anon, url=http://127.0.0.1:8765, headers={}, cookies={}, auth=None, timeout=None, proxies=None, verify=False, debug=0 </msg>
<arg>anon</arg>
<arg>${BASE_URL}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-06-27T13:55:23.746287" elapsed="0.000352"/>
</kw>
<doc>Create an unauthenticated HTTP session.</doc>
<status status="PASS" start="2026-06-27T13:55:23.745978" elapsed="0.000716"/>
</kw>
<kw name="Setup Master Password" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-06-27T13:55:23.747569" level="INFO">${payload} = {'master_password': 'TestPass123!', 'anime_directory': '/tmp/aniworld_test_anime', 'name': 'AniworldTest', 'data_dir': 'data', 'scheduler_enabled': 'False', 'logging_level': 'INFO', 'backup_enabled': ...</msg>
<var>${payload}</var>
<arg>master_password=${SETUP_PASSWORD}</arg>
<arg>anime_directory=/tmp/aniworld_test_anime</arg>
<arg>name=AniworldTest</arg>
<arg>data_dir=data</arg>
<arg>scheduler_enabled=False</arg>
<arg>logging_level=INFO</arg>
<arg>backup_enabled=False</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-06-27T13:55:23.747131" elapsed="0.000465"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.749653" level="INFO">POST Request : url=http://127.0.0.1:8765/api/auth/setup
path_url=/api/auth/setup
headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate, br', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Length': '208', 'Content-Type': 'application/json'}
body=b'{"master_password": "TestPass123!", "anime_directory": "/tmp/aniworld_test_anime", "name": "AniworldTest", "data_dir": "data", "scheduler_enabled": "False", "logging_level": "INFO", "backup_enabled": "False"}'
</msg>
<msg time="2026-06-27T13:55:23.749698" level="INFO">POST Response : url=http://127.0.0.1:8765/api/auth/setup
status=400, reason=Bad Request
headers={'date': 'Sat, 27 Jun 2026 11:55:22 GMT', 'server': 'uvicorn', 'content-length': '47', 'content-type': 'application/json'}
body={"detail":"Master password already configured"}
</msg>
<msg time="2026-06-27T13:55:23.749774" level="INFO">${resp} = &lt;Response [400]&gt;</msg>
<var>${resp}</var>
<arg>anon</arg>
<arg>/api/auth/setup</arg>
<arg>json=${payload}</arg>
<arg>expected_status=any</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-06-27T13:55:23.747831" elapsed="0.001963"/>
</kw>
<if>
<branch type="IF" condition="'${resp.status_code}' == '429'">
<kw name="Sleep" owner="BuiltIn">
<arg>45s</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.750353" elapsed="0.000068"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>anon</arg>
<arg>/api/auth/setup</arg>
<arg>json=${payload}</arg>
<arg>expected_status=any</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.750510" elapsed="0.000069"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:23.749885" elapsed="0.000726"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.749865" elapsed="0.000773"/>
</if>
<if>
<branch type="IF" condition="'${resp.status_code}' == '429'">
<kw name="Sleep" owner="BuiltIn">
<arg>45s</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.751054" elapsed="0.000045"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>anon</arg>
<arg>/api/auth/setup</arg>
<arg>json=${payload}</arg>
<arg>expected_status=any</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.751172" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:23.750677" elapsed="0.000567"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.750667" elapsed="0.000604"/>
</if>
<if>
<branch type="IF" condition="'${resp.status_code}' == '400'">
<kw name="Convert String To Json" owner="JSONLibrary">
<msg time="2026-06-27T13:55:23.752008" level="INFO">${json} = {'detail': 'Master password already configured'}</msg>
<var>${json}</var>
<arg>${resp.text}</arg>
<doc>Convert String to JSON object</doc>
<status status="PASS" start="2026-06-27T13:55:23.751662" elapsed="0.000367"/>
</kw>
<kw name="Get Value From Json" owner="JSONLibrary">
<msg time="2026-06-27T13:55:23.763962" level="INFO">${detail} = ['Master password already configured']</msg>
<var>${detail}</var>
<arg>${json}</arg>
<arg>$.detail</arg>
<doc>Get Value From JSON using JSONPath</doc>
<status status="PASS" start="2026-06-27T13:55:23.752108" elapsed="0.011889"/>
</kw>
<if>
<branch type="IF" condition="'${detail}[0]' == 'Master password already configured'">
<return>
<status status="PASS" start="2026-06-27T13:55:23.764295" elapsed="0.000122"/>
</return>
<status status="PASS" start="2026-06-27T13:55:23.764085" elapsed="0.000376"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.764068" elapsed="0.000419"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Setup failed with 400: ${detail}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.764575" elapsed="0.000047"/>
</kw>
<status status="PASS" start="2026-06-27T13:55:23.751309" elapsed="0.013344"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.751298" elapsed="0.013379"/>
</if>
<if>
<branch type="IF" condition="'${resp.status_code}' == '201'">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${resp.status_code}</arg>
<arg>201</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.764863" elapsed="0.000082"/>
</kw>
<return>
<status status="NOT RUN" start="2026-06-27T13:55:23.764980" elapsed="0.000086"/>
</return>
<status status="NOT RUN" start="2026-06-27T13:55:23.764720" elapsed="0.000369"/>
</branch>
<status status="NOT RUN" start="2026-06-27T13:55:23.764703" elapsed="0.000406"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unexpected status ${resp.status_code} from /api/auth/setup</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.765162" elapsed="0.000037"/>
</kw>
<doc>Configure the master password via the setup endpoint.</doc>
<status status="PASS" start="2026-06-27T13:55:23.746931" elapsed="0.018318"/>
</kw>
<kw name="Create Authenticated Session" owner="common">
<kw name="Create Anonymous Session" owner="common">
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.765896" level="INFO">Creating Session using : alias=anon, url=http://127.0.0.1:8765, headers={}, cookies={}, auth=None, timeout=None, proxies=None, verify=False, debug=0 </msg>
<arg>anon</arg>
<arg>${BASE_URL}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-06-27T13:55:23.765736" elapsed="0.000255"/>
</kw>
<doc>Create an unauthenticated HTTP session.</doc>
<status status="PASS" start="2026-06-27T13:55:23.765585" elapsed="0.000453"/>
</kw>
<kw name="Is Auth Configured" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.768497" level="INFO">GET Request : url=http://127.0.0.1:8765/api/auth/status
path_url=/api/auth/status
headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate, br', 'Accept': '*/*', 'Connection': 'keep-alive'}
body=None
</msg>
<msg time="2026-06-27T13:55:23.768548" level="INFO">GET Response : url=http://127.0.0.1:8765/api/auth/status
status=200, reason=OK
headers={'date': 'Sat, 27 Jun 2026 11:55:22 GMT', 'server': 'uvicorn', 'content-length': '41', 'content-type': 'application/json'}
body={"configured":true,"authenticated":false}
</msg>
<msg time="2026-06-27T13:55:23.768624" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>anon</arg>
<arg>/api/auth/status</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-06-27T13:55:23.766393" elapsed="0.002249"/>
</kw>
<kw name="Convert String To Json" owner="JSONLibrary">
<msg time="2026-06-27T13:55:23.769328" level="INFO">${json} = {'configured': True, 'authenticated': False}</msg>
<var>${json}</var>
<arg>${resp.text}</arg>
<doc>Convert String to JSON object</doc>
<status status="PASS" start="2026-06-27T13:55:23.768772" elapsed="0.000579"/>
</kw>
<kw name="Get Value From Json" owner="JSONLibrary">
<msg time="2026-06-27T13:55:23.779927" level="INFO">${configured} = [True]</msg>
<var>${configured}</var>
<arg>${json}</arg>
<arg>$.configured</arg>
<doc>Get Value From JSON using JSONPath</doc>
<status status="PASS" start="2026-06-27T13:55:23.769438" elapsed="0.010524"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-06-27T13:55:23.780406" level="INFO">${configured_val} = True</msg>
<var>${configured_val}</var>
<arg>${configured}[0]</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-06-27T13:55:23.780085" elapsed="0.000344"/>
</kw>
<return>
<value>${configured_val}</value>
<status status="PASS" start="2026-06-27T13:55:23.780649" elapsed="0.000127"/>
</return>
<msg time="2026-06-27T13:55:23.780900" level="INFO">${configured} = True</msg>
<var>${configured}</var>
<doc>Check if the master password has already been configured.</doc>
<status status="PASS" start="2026-06-27T13:55:23.766137" elapsed="0.014781"/>
</kw>
<if>
<branch type="IF" condition="not ${configured}">
<kw name="Setup Master Password" owner="common">
<doc>Configure the master password via the setup endpoint.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.781368" elapsed="0.000127"/>
</kw>
<kw name="Login And Get Token" owner="common">
<var>${token}</var>
<doc>Log in with the master password and return the JWT access token.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.781635" elapsed="0.000093"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<arg>auth</arg>
<arg>${BASE_URL}</arg>
<arg>headers={'Authorization': 'Bearer ${token}'}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.781823" elapsed="0.000138"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:23.780978" elapsed="0.001032"/>
</branch>
<branch type="ELSE IF" condition="'${TOKEN}' == '${EMPTY}'">
<kw name="Login And Get Token" owner="common">
<var>${token}</var>
<doc>Log in with the master password and return the JWT access token.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.782600" elapsed="0.000126"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<arg>auth</arg>
<arg>${BASE_URL}</arg>
<arg>headers={'Authorization': 'Bearer ${token}'}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.782824" elapsed="0.000085"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:23.782040" elapsed="0.000900"/>
</branch>
<branch type="ELSE">
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.783288" level="INFO">Creating Session using : alias=auth, url=http://127.0.0.1:8765, headers={'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJtYXN0ZXIiLCJleHAiOjE3ODI2NDc3MjIsImlhdCI6MTc4MjU2MTMyMn0.--vlbTAAA2hgaD0fZcM-E01gJMfeZI9wU6wqkY3O9Fs'}, cookies={}, auth=None, timeout=None, proxies=None, verify=False, debug=0 </msg>
<arg>auth</arg>
<arg>${BASE_URL}</arg>
<arg>headers={'Authorization': 'Bearer ${TOKEN}'}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-06-27T13:55:23.783091" elapsed="0.000296"/>
</kw>
<status status="PASS" start="2026-06-27T13:55:23.782965" elapsed="0.000455"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.780964" elapsed="0.002478"/>
</if>
<doc>Create an authenticated HTTP session. Performs setup if needed, then logs in.
Skips setup/login if already authenticated (suite-level setup done).</doc>
<status status="PASS" start="2026-06-27T13:55:23.765399" elapsed="0.018072"/>
</kw>
<arg>Create Anonymous Session</arg>
<arg>AND</arg>
<arg>Setup Master Password</arg>
<arg>AND</arg>
<arg>Create Authenticated Session</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-06-27T13:55:23.745531" elapsed="0.037976"/>
</kw>
<kw name="POST API" owner="api_keywords">
<if>
<branch type="IF" condition="$payload is ${NONE}">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.787481" level="INFO">POST Request : url=http://127.0.0.1:8765/api/config/backups
path_url=/api/config/backups
headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate, br', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJtYXN0ZXIiLCJleHAiOjE3ODI2NDc3MjIsImlhdCI6MTc4MjU2MTMyMn0.--vlbTAAA2hgaD0fZcM-E01gJMfeZI9wU6wqkY3O9Fs', 'Content-Length': '0'}
body=None
</msg>
<msg time="2026-06-27T13:55:23.787537" level="INFO">POST Response : url=http://127.0.0.1:8765/api/config/backups
status=201, reason=Created
headers={'date': 'Sat, 27 Jun 2026 11:55:22 GMT', 'server': 'uvicorn', 'content-length': '85', 'content-type': 'application/json'}
body={"name":"config_backup_20260627_135523.json","message":"Backup created successfully"}
</msg>
<msg time="2026-06-27T13:55:23.787617" level="INFO">${resp} = &lt;Response [201]&gt;</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>${endpoint}</arg>
<arg>expected_status=${expected_status}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-06-27T13:55:23.784194" elapsed="0.003443"/>
</kw>
<status status="PASS" start="2026-06-27T13:55:23.783910" elapsed="0.003776"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${session}</arg>
<arg>${endpoint}</arg>
<arg>json=${payload}</arg>
<arg>expected_status=${expected_status}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.787873" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:23.787726" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.783898" elapsed="0.004087"/>
</if>
<return>
<value>${resp}</value>
<status status="PASS" start="2026-06-27T13:55:23.788014" elapsed="0.000057"/>
</return>
<msg time="2026-06-27T13:55:23.788179" level="INFO">${resp} = &lt;Response [201]&gt;</msg>
<var>${resp}</var>
<arg>/api/config/backups</arg>
<arg>expected_status=201</arg>
<doc>Perform an authenticated POST request with optional JSON payload.</doc>
<status status="PASS" start="2026-06-27T13:55:23.783632" elapsed="0.004567"/>
</kw>
<kw name="Convert String To Json" owner="JSONLibrary">
<msg time="2026-06-27T13:55:23.788689" level="INFO">${json} = {'name': 'config_backup_20260627_135523.json', 'message': 'Backup created successfully'}</msg>
<var>${json}</var>
<arg>${resp.text}</arg>
<doc>Convert String to JSON object</doc>
<status status="PASS" start="2026-06-27T13:55:23.788287" elapsed="0.000430"/>
</kw>
<kw name="Get Value From Json" owner="JSONLibrary">
<msg time="2026-06-27T13:55:23.798754" level="INFO">${backup_name} = ['config_backup_20260627_135523.json']</msg>
<var>${backup_name}</var>
<arg>${json}</arg>
<arg>$.name</arg>
<doc>Get Value From JSON using JSONPath</doc>
<status status="PASS" start="2026-06-27T13:55:23.788807" elapsed="0.009976"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-06-27T13:55:23.799306" level="INFO">${name_before} = config_backup_20260627_135523.json</msg>
<var>${name_before}</var>
<arg>${backup_name}[0]</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-06-27T13:55:23.798886" elapsed="0.000442"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-06-27T13:55:23.799803" level="INFO">${scheduler} = {'enabled': False, 'schedule_time': '03:00', 'schedule_days': ['mon']}</msg>
<var>${scheduler}</var>
<arg>{'enabled': False, 'schedule_time': '03:00', 'schedule_days': ['mon']}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-06-27T13:55:23.799414" elapsed="0.000415"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-06-27T13:55:23.800284" level="INFO">${logging} = {'level': 'INFO', 'file': None, 'max_bytes': None, 'backup_count': 3}</msg>
<var>${logging}</var>
<arg>{'level': 'INFO', 'file': None, 'max_bytes': None, 'backup_count': 3}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-06-27T13:55:23.799922" elapsed="0.000385"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-06-27T13:55:23.800630" level="INFO">${backup} = {'enabled': False}</msg>
<var>${backup}</var>
<arg>{'enabled': False}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-06-27T13:55:23.800390" elapsed="0.000260"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-06-27T13:55:23.801332" level="INFO">${nfo} = {'auto_create': False}</msg>
<var>${nfo}</var>
<arg>{'auto_create': False}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-06-27T13:55:23.801067" elapsed="0.000289"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-06-27T13:55:23.801694" level="INFO">${other} = {}</msg>
<var>${other}</var>
<arg>{}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-06-27T13:55:23.801446" elapsed="0.000278"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-06-27T13:55:23.802267" level="INFO">${payload} = {'name': 'BeforeRestore', 'data_dir': 'data', 'scheduler': {'enabled': False, 'schedule_time': '03:00', 'schedule_days': ['mon']}, 'logging': {'level': 'INFO', 'file': None, 'max_bytes': None, 'backup...</msg>
<var>${payload}</var>
<arg>name=BeforeRestore</arg>
<arg>data_dir=data</arg>
<arg>scheduler=${scheduler}</arg>
<arg>logging=${logging}</arg>
<arg>backup=${backup}</arg>
<arg>nfo=${nfo}</arg>
<arg>other=${other}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-06-27T13:55:23.801815" elapsed="0.000475"/>
</kw>
<kw name="Update Config" owner="api_keywords">
<kw name="PUT API" owner="api_keywords">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.806864" level="INFO">PUT Request : url=http://127.0.0.1:8765/api/config
path_url=/api/config
headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate, br', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJtYXN0ZXIiLCJleHAiOjE3ODI2NDc3MjIsImlhdCI6MTc4MjU2MTMyMn0.--vlbTAAA2hgaD0fZcM-E01gJMfeZI9wU6wqkY3O9Fs', 'Content-Length': '286', 'Content-Type': 'application/json'}
body=b'{"name": "BeforeRestore", "data_dir": "data", "scheduler": {"enabled": false, "schedule_time": "03:00", "schedule_days": ["mon"]}, "logging": {"level": "INFO", "file": null, "max_bytes": null, "backup_count": 3}, "backup": {"enabled": false}, "nfo": {"auto_create": false}, "other": {}}'
</msg>
<msg time="2026-06-27T13:55:23.806922" level="INFO">PUT Response : url=http://127.0.0.1:8765/api/config
status=200, reason=OK
headers={'date': 'Sat, 27 Jun 2026 11:55:22 GMT', 'server': 'uvicorn', 'content-length': '796', 'content-type': 'application/json'}
body={"name":"BeforeRestore","data_dir":"data","scheduler":{"enabled":false,"interval_minutes":60,"schedule_time":"03:00","schedule_days":["mon"],"auto_download_after_rescan":false,"nfo_scan_after_rescan":true,"image_scan_after_rescan":true,"auto_download":null},"logging":{"level":"INFO","file":null,"max_bytes":null,"backup_count":3},"backup":{"enabled":false,"path":"data/backups","keep_days":30},"nfo":{"tmdb_api_key":null,"auto_create":false,"update_on_scan":false,"download_poster":true,"download_logo":true,"download_fanart":true,"image_size":"original"},"scan_key_overrides":{},"other":{"loading_complete":true,"master_password_hash":"$pbkdf2-sha256$29000$dm6NcU5JaU2p1dqbM2aMMQ$U4sJCHcdZe6kEYxBSqIoQ46pgtjyCt8N1flCTGj06tY","loading_started":true,"anime_directory":"/tmp/aniworld_test_anime"}}
</msg>
<msg time="2026-06-27T13:55:23.807010" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>${endpoint}</arg>
<arg>json=${payload}</arg>
<arg>expected_status=${expected_status}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-06-27T13:55:23.802895" elapsed="0.004135"/>
</kw>
<return>
<value>${resp}</value>
<status status="PASS" start="2026-06-27T13:55:23.807098" elapsed="0.000124"/>
</return>
<msg time="2026-06-27T13:55:23.807335" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>/api/config</arg>
<arg>${payload}</arg>
<doc>Perform an authenticated PUT request with JSON payload.</doc>
<status status="PASS" start="2026-06-27T13:55:23.802665" elapsed="0.004690"/>
</kw>
<return>
<value>${resp}</value>
<status status="PASS" start="2026-06-27T13:55:23.807402" elapsed="0.000061"/>
</return>
<arg>${payload}</arg>
<doc>PUT /api/config with the given payload.</doc>
<status status="PASS" start="2026-06-27T13:55:23.802417" elapsed="0.005130"/>
</kw>
<kw name="POST API" owner="api_keywords">
<if>
<branch type="IF" condition="$payload is ${NONE}">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.811302" level="INFO">POST Request : url=http://127.0.0.1:8765/api/config/backups/config_backup_20260627_135523.json/restore
path_url=/api/config/backups/config_backup_20260627_135523.json/restore
headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate, br', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJtYXN0ZXIiLCJleHAiOjE3ODI2NDc3MjIsImlhdCI6MTc4MjU2MTMyMn0.--vlbTAAA2hgaD0fZcM-E01gJMfeZI9wU6wqkY3O9Fs', 'Content-Length': '0'}
body=None
</msg>
<msg time="2026-06-27T13:55:23.811361" level="INFO">POST Response : url=http://127.0.0.1:8765/api/config/backups/config_backup_20260627_135523.json/restore
status=200, reason=OK
headers={'date': 'Sat, 27 Jun 2026 11:55:22 GMT', 'server': 'uvicorn', 'content-length': '820', 'content-type': 'application/json'}
body={"name":"UpdatedAniworld","data_dir":"data","scheduler":{"enabled":false,"interval_minutes":60,"schedule_time":"04:00","schedule_days":["mon","tue"],"auto_download_after_rescan":false,"nfo_scan_after_rescan":true,"image_scan_after_rescan":true,"auto_download":null},"logging":{"level":"DEBUG","file":"logs/test.log","max_bytes":1048576,"backup_count":5},"backup":{"enabled":false,"path":"data/backups","keep_days":30},"nfo":{"tmdb_api_key":"","auto_create":false,"update_on_scan":false,"download_poster":false,"download_logo":false,"download_fanart":false,"image_size":"original"},"scan_key_overrides":{},"other":{"loading_complete":true,"master_password_hash":"$pbkdf2-sha256$29000$dm6NcU5JaU2p1dqbM2aMMQ$U4sJCHcdZe6kEYxBSqIoQ46pgtjyCt8N1flCTGj06tY","loading_started":true,"anime_directory":"/tmp/aniworld_test_anime"}}
</msg>
<msg time="2026-06-27T13:55:23.811447" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>${endpoint}</arg>
<arg>expected_status=${expected_status}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-06-27T13:55:23.808216" elapsed="0.003252"/>
</kw>
<status status="PASS" start="2026-06-27T13:55:23.807974" elapsed="0.003547"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${session}</arg>
<arg>${endpoint}</arg>
<arg>json=${payload}</arg>
<arg>expected_status=${expected_status}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.811746" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:23.811556" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.807959" elapsed="0.003908"/>
</if>
<return>
<value>${resp}</value>
<status status="PASS" start="2026-06-27T13:55:23.811895" elapsed="0.000057"/>
</return>
<msg time="2026-06-27T13:55:23.812076" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>/api/config/backups/${name_before}/restore</arg>
<doc>Perform an authenticated POST request with optional JSON payload.</doc>
<status status="PASS" start="2026-06-27T13:55:23.807719" elapsed="0.004377"/>
</kw>
<kw name="Response Should Have Status" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-06-27T13:55:23.812920" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>${expected_status}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-06-27T13:55:23.812474" elapsed="0.000491"/>
</kw>
<arg>${resp}</arg>
<arg>200</arg>
<doc>Assert that the response status code matches the expected value.</doc>
<status status="PASS" start="2026-06-27T13:55:23.812211" elapsed="0.000947"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary" type="TEARDOWN">
<msg time="2026-06-27T13:55:23.813381" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-06-27T13:55:23.813290" elapsed="0.000152"/>
</kw>
<doc>Create a backup, change config, then restore and verify reversion.</doc>
<status status="PASS" start="2026-06-27T13:55:23.743050" elapsed="0.070428"/>
</test>
<test id="s1-t10" name="Config Backup Delete" line="123">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Create Anonymous Session" owner="common">
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.820360" level="INFO">Creating Session using : alias=anon, url=http://127.0.0.1:8765, headers={}, cookies={}, auth=None, timeout=None, proxies=None, verify=False, debug=0 </msg>
<arg>anon</arg>
<arg>${BASE_URL}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-06-27T13:55:23.820217" elapsed="0.000257"/>
</kw>
<doc>Create an unauthenticated HTTP session.</doc>
<status status="PASS" start="2026-06-27T13:55:23.819973" elapsed="0.000563"/>
</kw>
<kw name="Setup Master Password" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-06-27T13:55:23.821388" level="INFO">${payload} = {'master_password': 'TestPass123!', 'anime_directory': '/tmp/aniworld_test_anime', 'name': 'AniworldTest', 'data_dir': 'data', 'scheduler_enabled': 'False', 'logging_level': 'INFO', 'backup_enabled': ...</msg>
<var>${payload}</var>
<arg>master_password=${SETUP_PASSWORD}</arg>
<arg>anime_directory=/tmp/aniworld_test_anime</arg>
<arg>name=AniworldTest</arg>
<arg>data_dir=data</arg>
<arg>scheduler_enabled=False</arg>
<arg>logging_level=INFO</arg>
<arg>backup_enabled=False</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-06-27T13:55:23.821055" elapsed="0.000356"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.823298" level="INFO">POST Request : url=http://127.0.0.1:8765/api/auth/setup
path_url=/api/auth/setup
headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate, br', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Length': '208', 'Content-Type': 'application/json'}
body=b'{"master_password": "TestPass123!", "anime_directory": "/tmp/aniworld_test_anime", "name": "AniworldTest", "data_dir": "data", "scheduler_enabled": "False", "logging_level": "INFO", "backup_enabled": "False"}'
</msg>
<msg time="2026-06-27T13:55:23.823346" level="INFO">POST Response : url=http://127.0.0.1:8765/api/auth/setup
status=400, reason=Bad Request
headers={'date': 'Sat, 27 Jun 2026 11:55:22 GMT', 'server': 'uvicorn', 'content-length': '47', 'content-type': 'application/json'}
body={"detail":"Master password already configured"}
</msg>
<msg time="2026-06-27T13:55:23.823418" level="INFO">${resp} = &lt;Response [400]&gt;</msg>
<var>${resp}</var>
<arg>anon</arg>
<arg>/api/auth/setup</arg>
<arg>json=${payload}</arg>
<arg>expected_status=any</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-06-27T13:55:23.821506" elapsed="0.001931"/>
</kw>
<if>
<branch type="IF" condition="'${resp.status_code}' == '429'">
<kw name="Sleep" owner="BuiltIn">
<arg>45s</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.823933" elapsed="0.000052"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>anon</arg>
<arg>/api/auth/setup</arg>
<arg>json=${payload}</arg>
<arg>expected_status=any</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.824069" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:23.823523" elapsed="0.000623"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.823500" elapsed="0.000678"/>
</if>
<if>
<branch type="IF" condition="'${resp.status_code}' == '429'">
<kw name="Sleep" owner="BuiltIn">
<arg>45s</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.824579" elapsed="0.000047"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>anon</arg>
<arg>/api/auth/setup</arg>
<arg>json=${payload}</arg>
<arg>expected_status=any</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.824703" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:23.824220" elapsed="0.000566"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.824209" elapsed="0.000604"/>
</if>
<if>
<branch type="IF" condition="'${resp.status_code}' == '400'">
<kw name="Convert String To Json" owner="JSONLibrary">
<msg time="2026-06-27T13:55:23.825534" level="INFO">${json} = {'detail': 'Master password already configured'}</msg>
<var>${json}</var>
<arg>${resp.text}</arg>
<doc>Convert String to JSON object</doc>
<status status="PASS" start="2026-06-27T13:55:23.825190" elapsed="0.000365"/>
</kw>
<kw name="Get Value From Json" owner="JSONLibrary">
<msg time="2026-06-27T13:55:23.836546" level="INFO">${detail} = ['Master password already configured']</msg>
<var>${detail}</var>
<arg>${json}</arg>
<arg>$.detail</arg>
<doc>Get Value From JSON using JSONPath</doc>
<status status="PASS" start="2026-06-27T13:55:23.825634" elapsed="0.010943"/>
</kw>
<if>
<branch type="IF" condition="'${detail}[0]' == 'Master password already configured'">
<return>
<status status="PASS" start="2026-06-27T13:55:23.836812" elapsed="0.000061"/>
</return>
<status status="PASS" start="2026-06-27T13:55:23.836652" elapsed="0.000256"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.836637" elapsed="0.000300"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Setup failed with 400: ${detail}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.837017" elapsed="0.000051"/>
</kw>
<status status="PASS" start="2026-06-27T13:55:23.824851" elapsed="0.012251"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.824841" elapsed="0.012288"/>
</if>
<if>
<branch type="IF" condition="'${resp.status_code}' == '201'">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${resp.status_code}</arg>
<arg>201</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.837284" elapsed="0.000041"/>
</kw>
<return>
<status status="NOT RUN" start="2026-06-27T13:55:23.837363" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-06-27T13:55:23.837168" elapsed="0.000258"/>
</branch>
<status status="NOT RUN" start="2026-06-27T13:55:23.837158" elapsed="0.000291"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unexpected status ${resp.status_code} from /api/auth/setup</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.837504" elapsed="0.000040"/>
</kw>
<doc>Configure the master password via the setup endpoint.</doc>
<status status="PASS" start="2026-06-27T13:55:23.820812" elapsed="0.016786"/>
</kw>
<kw name="Create Authenticated Session" owner="common">
<kw name="Create Anonymous Session" owner="common">
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.838281" level="INFO">Creating Session using : alias=anon, url=http://127.0.0.1:8765, headers={}, cookies={}, auth=None, timeout=None, proxies=None, verify=False, debug=0 </msg>
<arg>anon</arg>
<arg>${BASE_URL}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-06-27T13:55:23.838135" elapsed="0.000244"/>
</kw>
<doc>Create an unauthenticated HTTP session.</doc>
<status status="PASS" start="2026-06-27T13:55:23.837974" elapsed="0.000570"/>
</kw>
<kw name="Is Auth Configured" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.840527" level="INFO">GET Request : url=http://127.0.0.1:8765/api/auth/status
path_url=/api/auth/status
headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate, br', 'Accept': '*/*', 'Connection': 'keep-alive'}
body=None
</msg>
<msg time="2026-06-27T13:55:23.840572" level="INFO">GET Response : url=http://127.0.0.1:8765/api/auth/status
status=200, reason=OK
headers={'date': 'Sat, 27 Jun 2026 11:55:22 GMT', 'server': 'uvicorn', 'content-length': '41', 'content-type': 'application/json'}
body={"configured":true,"authenticated":false}
</msg>
<msg time="2026-06-27T13:55:23.840640" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>anon</arg>
<arg>/api/auth/status</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-06-27T13:55:23.838850" elapsed="0.001808"/>
</kw>
<kw name="Convert String To Json" owner="JSONLibrary">
<msg time="2026-06-27T13:55:23.841199" level="INFO">${json} = {'configured': True, 'authenticated': False}</msg>
<var>${json}</var>
<arg>${resp.text}</arg>
<doc>Convert String to JSON object</doc>
<status status="PASS" start="2026-06-27T13:55:23.840762" elapsed="0.000460"/>
</kw>
<kw name="Get Value From Json" owner="JSONLibrary">
<msg time="2026-06-27T13:55:23.851571" level="INFO">${configured} = [True]</msg>
<var>${configured}</var>
<arg>${json}</arg>
<arg>$.configured</arg>
<doc>Get Value From JSON using JSONPath</doc>
<status status="PASS" start="2026-06-27T13:55:23.841314" elapsed="0.010290"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-06-27T13:55:23.852122" level="INFO">${configured_val} = True</msg>
<var>${configured_val}</var>
<arg>${configured}[0]</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-06-27T13:55:23.851728" elapsed="0.000424"/>
</kw>
<return>
<value>${configured_val}</value>
<status status="PASS" start="2026-06-27T13:55:23.852217" elapsed="0.000115"/>
</return>
<msg time="2026-06-27T13:55:23.852440" level="INFO">${configured} = True</msg>
<var>${configured}</var>
<doc>Check if the master password has already been configured.</doc>
<status status="PASS" start="2026-06-27T13:55:23.838661" elapsed="0.013798"/>
</kw>
<if>
<branch type="IF" condition="not ${configured}">
<kw name="Setup Master Password" owner="common">
<doc>Configure the master password via the setup endpoint.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.852859" elapsed="0.000056"/>
</kw>
<kw name="Login And Get Token" owner="common">
<var>${token}</var>
<doc>Log in with the master password and return the JWT access token.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.853069" elapsed="0.000045"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<arg>auth</arg>
<arg>${BASE_URL}</arg>
<arg>headers={'Authorization': 'Bearer ${token}'}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.853198" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:23.852523" elapsed="0.000750"/>
</branch>
<branch type="ELSE IF" condition="'${TOKEN}' == '${EMPTY}'">
<kw name="Login And Get Token" owner="common">
<var>${token}</var>
<doc>Log in with the master password and return the JWT access token.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.853786" elapsed="0.000075"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<arg>auth</arg>
<arg>${BASE_URL}</arg>
<arg>headers={'Authorization': 'Bearer ${token}'}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.853953" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:23.853304" elapsed="0.000730"/>
</branch>
<branch type="ELSE">
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.854361" level="INFO">Creating Session using : alias=auth, url=http://127.0.0.1:8765, headers={'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJtYXN0ZXIiLCJleHAiOjE3ODI2NDc3MjIsImlhdCI6MTc4MjU2MTMyMn0.--vlbTAAA2hgaD0fZcM-E01gJMfeZI9wU6wqkY3O9Fs'}, cookies={}, auth=None, timeout=None, proxies=None, verify=False, debug=0 </msg>
<arg>auth</arg>
<arg>${BASE_URL}</arg>
<arg>headers={'Authorization': 'Bearer ${TOKEN}'}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-06-27T13:55:23.854155" elapsed="0.000311"/>
</kw>
<status status="PASS" start="2026-06-27T13:55:23.854063" elapsed="0.000441"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.852508" elapsed="0.002021"/>
</if>
<doc>Create an authenticated HTTP session. Performs setup if needed, then logs in.
Skips setup/login if already authenticated (suite-level setup done).</doc>
<status status="PASS" start="2026-06-27T13:55:23.837769" elapsed="0.016795"/>
</kw>
<arg>Create Anonymous Session</arg>
<arg>AND</arg>
<arg>Setup Master Password</arg>
<arg>AND</arg>
<arg>Create Authenticated Session</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-06-27T13:55:23.819531" elapsed="0.035070"/>
</kw>
<kw name="POST API" owner="api_keywords">
<if>
<branch type="IF" condition="$payload is ${NONE}">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.858354" level="INFO">POST Request : url=http://127.0.0.1:8765/api/config/backups
path_url=/api/config/backups
headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate, br', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJtYXN0ZXIiLCJleHAiOjE3ODI2NDc3MjIsImlhdCI6MTc4MjU2MTMyMn0.--vlbTAAA2hgaD0fZcM-E01gJMfeZI9wU6wqkY3O9Fs', 'Content-Length': '0'}
body=None
</msg>
<msg time="2026-06-27T13:55:23.858410" level="INFO">POST Response : url=http://127.0.0.1:8765/api/config/backups
status=201, reason=Created
headers={'date': 'Sat, 27 Jun 2026 11:55:22 GMT', 'server': 'uvicorn', 'content-length': '85', 'content-type': 'application/json'}
body={"name":"config_backup_20260627_135523.json","message":"Backup created successfully"}
</msg>
<msg time="2026-06-27T13:55:23.858492" level="INFO">${resp} = &lt;Response [201]&gt;</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>${endpoint}</arg>
<arg>expected_status=${expected_status}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-06-27T13:55:23.855201" elapsed="0.003311"/>
</kw>
<status status="PASS" start="2026-06-27T13:55:23.855008" elapsed="0.003555"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${session}</arg>
<arg>${endpoint}</arg>
<arg>json=${payload}</arg>
<arg>expected_status=${expected_status}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-06-27T13:55:23.858799" elapsed="0.000058"/>
</kw>
<status status="NOT RUN" start="2026-06-27T13:55:23.858597" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-06-27T13:55:23.854995" elapsed="0.003926"/>
</if>
<return>
<value>${resp}</value>
<status status="PASS" start="2026-06-27T13:55:23.858951" elapsed="0.000058"/>
</return>
<msg time="2026-06-27T13:55:23.859121" level="INFO">${resp} = &lt;Response [201]&gt;</msg>
<var>${resp}</var>
<arg>/api/config/backups</arg>
<arg>expected_status=201</arg>
<doc>Perform an authenticated POST request with optional JSON payload.</doc>
<status status="PASS" start="2026-06-27T13:55:23.854754" elapsed="0.004387"/>
</kw>
<kw name="Convert String To Json" owner="JSONLibrary">
<msg time="2026-06-27T13:55:23.859630" level="INFO">${json} = {'name': 'config_backup_20260627_135523.json', 'message': 'Backup created successfully'}</msg>
<var>${json}</var>
<arg>${resp.text}</arg>
<doc>Convert String to JSON object</doc>
<status status="PASS" start="2026-06-27T13:55:23.859232" elapsed="0.000565"/>
</kw>
<kw name="Get Value From Json" owner="JSONLibrary">
<msg time="2026-06-27T13:55:23.870317" level="INFO">${backup_name} = ['config_backup_20260627_135523.json']</msg>
<var>${backup_name}</var>
<arg>${json}</arg>
<arg>$.name</arg>
<doc>Get Value From JSON using JSONPath</doc>
<status status="PASS" start="2026-06-27T13:55:23.859900" elapsed="0.010446"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-06-27T13:55:23.870854" level="INFO">${name} = config_backup_20260627_135523.json</msg>
<var>${name}</var>
<arg>${backup_name}[0]</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-06-27T13:55:23.870451" elapsed="0.000426"/>
</kw>
<kw name="DELETE API" owner="api_keywords">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-06-27T13:55:23.873588" level="INFO">DELETE Request : url=http://127.0.0.1:8765/api/config/backups/config_backup_20260627_135523.json
path_url=/api/config/backups/config_backup_20260627_135523.json
headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate, br', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJtYXN0ZXIiLCJleHAiOjE3ODI2NDc3MjIsImlhdCI6MTc4MjU2MTMyMn0.--vlbTAAA2hgaD0fZcM-E01gJMfeZI9wU6wqkY3O9Fs', 'Content-Length': '0'}
body=None
</msg>
<msg time="2026-06-27T13:55:23.873642" level="INFO">DELETE Response : url=http://127.0.0.1:8765/api/config/backups/config_backup_20260627_135523.json
status=200, reason=OK
headers={'date': 'Sat, 27 Jun 2026 11:55:22 GMT', 'server': 'uvicorn', 'content-length': '78', 'content-type': 'application/json'}
body={"message":"Backup 'config_backup_20260627_135523.json' deleted successfully"}
</msg>
<msg time="2026-06-27T13:55:23.873733" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>${endpoint}</arg>
<arg>expected_status=${expected_status}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-06-27T13:55:23.871304" elapsed="0.002450"/>
</kw>
<return>
<value>${resp}</value>
<status status="PASS" start="2026-06-27T13:55:23.873815" elapsed="0.000105"/>
</return>
<msg time="2026-06-27T13:55:23.874042" level="INFO">${del_resp} = &lt;Response [200]&gt;</msg>
<var>${del_resp}</var>
<arg>/api/config/backups/${name}</arg>
<doc>Perform an authenticated DELETE request.</doc>
<status status="PASS" start="2026-06-27T13:55:23.871009" elapsed="0.003054"/>
</kw>
<kw name="Response Should Have Status" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-06-27T13:55:23.874923" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>${expected_status}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-06-27T13:55:23.874456" elapsed="0.000513"/>
</kw>
<arg>${del_resp}</arg>
<arg>200</arg>
<doc>Assert that the response status code matches the expected value.</doc>
<status status="PASS" start="2026-06-27T13:55:23.874185" elapsed="0.000838"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary" type="TEARDOWN">
<msg time="2026-06-27T13:55:23.875281" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-06-27T13:55:23.875152" elapsed="0.000189"/>
</kw>
<doc>Create a backup and then delete it.</doc>
<status status="PASS" start="2026-06-27T13:55:23.817343" elapsed="0.058036"/>
</test>
<doc>Configuration API tests for Aniworld.
Covers get, update, validate, backup create/list/restore/delete, and export/import.</doc>
<status status="PASS" start="2026-06-27T13:55:22.607575" elapsed="1.271655"/>
</suite>
<statistics>
<total>
<stat pass="10" fail="0" skip="0">All Tests</stat>
</total>
<tag>
</tag>
<suite>
<stat name="Config" id="s1" pass="10" fail="0" skip="0">Config</stat>
</suite>
</statistics>
<errors>
</errors>
</robot>