Files
Aniworld/output.xml

577 lines
28 KiB
XML

<?xml version="1.0" encoding="UTF-8"?>
<robot generator="Robot 7.4.2 (Python 3.13.5 on linux)" generated="2026-07-02T21:15:17.624260" rpa="false" schemaversion="5">
<suite id="s1" name="Anime Settings" source="/home/lukas/Volume/repo/Aniworld/tests/robot/ui/anime_settings.robot">
<test id="s1-t1" name="Anime Settings Page Loads" line="24">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Create Anonymous Session" owner="common">
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-07-02T21:15:17.869883" 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-07-02T21:15:17.869702" elapsed="0.000384"/>
</kw>
<doc>Create an unauthenticated HTTP session.</doc>
<status status="PASS" start="2026-07-02T21:15:17.869324" elapsed="0.000858"/>
</kw>
<kw name="Setup Master Password" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-07-02T21:15:17.871190" 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-07-02T21:15:17.870736" elapsed="0.000484"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-07-02T21:15:17.874734" 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-07-02T21:15:17.874815" level="INFO">POST Response : url=http://127.0.0.1:8765/api/auth/setup
status=400, reason=Bad Request
headers={'date': 'Thu, 02 Jul 2026 19:15:17 GMT', 'server': 'uvicorn', 'content-length': '47', 'content-type': 'application/json'}
body={"detail":"Master password already configured"}
</msg>
<msg time="2026-07-02T21:15:17.874922" 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-07-02T21:15:17.871343" elapsed="0.003607"/>
</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-07-02T21:15:17.875597" elapsed="0.000057"/>
</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-07-02T21:15:17.875743" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-07-02T21:15:17.875066" elapsed="0.000759"/>
</branch>
<status status="PASS" start="2026-07-02T21:15:17.875037" elapsed="0.000823"/>
</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-07-02T21:15:17.876636" elapsed="0.000075"/>
</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-07-02T21:15:17.876799" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-07-02T21:15:17.875909" elapsed="0.000978"/>
</branch>
<status status="PASS" start="2026-07-02T21:15:17.875896" elapsed="0.001032"/>
</if>
<if>
<branch type="IF" condition="'${resp.status_code}' == '400'">
<kw name="Convert String To Json" owner="JSONLibrary">
<msg time="2026-07-02T21:15:17.877811" 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-07-02T21:15:17.877430" elapsed="0.000406"/>
</kw>
<kw name="Get Value From Json" owner="JSONLibrary">
<msg time="2026-07-02T21:15:17.890380" 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-07-02T21:15:17.877940" elapsed="0.012488"/>
</kw>
<if>
<branch type="IF" condition="'${detail}[0]' == 'Master password already configured'">
<return>
<status status="PASS" start="2026-07-02T21:15:17.890956" elapsed="0.000104"/>
</return>
<status status="PASS" start="2026-07-02T21:15:17.890604" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-07-02T21:15:17.890579" elapsed="0.000563"/>
</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-07-02T21:15:17.891262" elapsed="0.000074"/>
</kw>
<status status="PASS" start="2026-07-02T21:15:17.876987" elapsed="0.014384"/>
</branch>
<status status="PASS" start="2026-07-02T21:15:17.876966" elapsed="0.014434"/>
</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-07-02T21:15:17.891563" elapsed="0.000049"/>
</kw>
<return>
<status status="NOT RUN" start="2026-07-02T21:15:17.891652" elapsed="0.000044"/>
</return>
<status status="NOT RUN" start="2026-07-02T21:15:17.891446" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-07-02T21:15:17.891434" elapsed="0.000309"/>
</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-07-02T21:15:17.891803" elapsed="0.000047"/>
</kw>
<doc>Configure the master password via the setup endpoint.</doc>
<status status="PASS" start="2026-07-02T21:15:17.870462" elapsed="0.021466"/>
</kw>
<kw name="Open Browser To Page" owner="common">
<kw name="New Page" owner="Browser">
<msg time="2026-07-02T21:15:17.897413" level="INFO">Starting Browser process /home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js using at 127.0.0.1:34865</msg>
<msg time="2026-07-02T21:15:18.880478" level="INFO">Successfully initialized new page object and opened url: http://127.0.0.1:8765/login</msg>
<msg time="2026-07-02T21:15:18.880558" level="INFO">No browser and context was open. New browser and context was automatically opened when page is created.</msg>
<arg>${BASE_URL}${path}</arg>
<tag>BrowserControl</tag>
<tag>Setter</tag>
<doc>Open a new Page.</doc>
<status status="PASS" start="2026-07-02T21:15:17.892425" elapsed="0.988268"/>
</kw>
<arg>/login</arg>
<doc>Open a new page at the given path relative to BASE_URL.</doc>
<status status="PASS" start="2026-07-02T21:15:17.892075" elapsed="0.988717"/>
</kw>
<kw name="Perform Login" owner="ui_keywords">
<kw name="Fill Text" owner="Browser">
<msg time="2026-07-02T21:15:18.882711" level="INFO">Fills the text 'TestPass123!' in the given field.</msg>
<arg>id=password-input</arg>
<arg>${password}</arg>
<tag>PageContent</tag>
<tag>Setter</tag>
<doc>Clears and fills the given ``txt`` into the text field found by ``selector``.</doc>
<status status="PASS" start="2026-07-02T21:15:18.881750" elapsed="0.039843"/>
</kw>
<kw name="Click" owner="Browser">
<msg time="2026-07-02T21:15:18.922227" level="INFO">Clicks the element 'id=login-submit-btn'.</msg>
<arg>id=login-submit-btn</arg>
<tag>PageContent</tag>
<tag>Setter</tag>
<doc>Simulates mouse click on the element found by ``selector``.</doc>
<status status="PASS" start="2026-07-02T21:15:18.921782" elapsed="0.052200"/>
</kw>
<kw name="Wait For Elements State" owner="Browser">
<msg time="2026-07-02T21:15:20.274838" level="INFO">Waited for Element with selector id=search-input at state visible</msg>
<arg>id=search-input</arg>
<arg>visible</arg>
<arg>timeout=5s</arg>
<tag>PageContent</tag>
<tag>Wait</tag>
<doc>Waits for the element found by ``selector`` to satisfy state option.</doc>
<status status="PASS" start="2026-07-02T21:15:18.974188" elapsed="1.300795"/>
</kw>
<doc>Fill the login form and submit it.</doc>
<status status="PASS" start="2026-07-02T21:15:18.881328" elapsed="1.393753"/>
</kw>
<kw name="Wait For Elements State" owner="Browser">
<msg time="2026-07-02T21:15:20.285081" level="INFO">Waited for Element with selector id=search-input at state visible</msg>
<arg>id=search-input</arg>
<arg>visible</arg>
<arg>timeout=5s</arg>
<tag>PageContent</tag>
<tag>Wait</tag>
<doc>Waits for the element found by ``selector`` to satisfy state option.</doc>
<status status="PASS" start="2026-07-02T21:15:20.275231" elapsed="0.010015"/>
</kw>
<kw name="Login And Get Token" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-07-02T21:15:20.286401" 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-07-02T21:15:20.285956" elapsed="0.000472"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-07-02T21:15:20.296852" 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-07-02T21:15:20.296923" level="INFO">POST Response : url=http://127.0.0.1:8765/api/auth/login
status=200, reason=OK
headers={'date': 'Thu, 02 Jul 2026 19:15:19 GMT', 'server': 'uvicorn', 'content-length': '232', 'content-type': 'application/json'}
body={"access_token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJtYXN0ZXIiLCJleHAiOjE3ODMxMDYxMjAsImlhdCI6MTc4MzAxOTcyMH0.3lTBRZRfwrf3WmkoccB95LHtGASRwoG4SUqCpIwCehU","token_type":"bearer","expires_at":"2026-07-03T19:15:20.295776Z"}
</msg>
<msg time="2026-07-02T21:15:20.297070" 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-07-02T21:15:20.286543" elapsed="0.010548"/>
</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-07-02T21:15:20.297656" elapsed="0.000067"/>
</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-07-02T21:15:20.297807" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-07-02T21:15:20.297195" elapsed="0.000693"/>
</branch>
<status status="PASS" start="2026-07-02T21:15:20.297174" elapsed="0.000747"/>
</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-07-02T21:15:20.298315" elapsed="0.000047"/>
</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-07-02T21:15:20.298432" elapsed="0.000041"/>
</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-07-02T21:15:20.298542" elapsed="0.000039"/>
</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-07-02T21:15:20.298645" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-07-02T21:15:20.297979" elapsed="0.000732"/>
</branch>
<status status="PASS" start="2026-07-02T21:15:20.297967" elapsed="0.000768"/>
</if>
<kw name="Convert String To Json" owner="JSONLibrary">
<msg time="2026-07-02T21:15:20.299175" level="INFO">${json} = {'access_token': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJtYXN0ZXIiLCJleHAiOjE3ODMxMDYxMjAsImlhdCI6MTc4MzAxOTcyMH0.3lTBRZRfwrf3WmkoccB95LHtGASRwoG4SUqCpIwCehU', 'token_type': 'bearer', 'expire...</msg>
<var>${json}</var>
<arg>${resp.text}</arg>
<doc>Convert String to JSON object</doc>
<status status="PASS" start="2026-07-02T21:15:20.298793" elapsed="0.000403"/>
</kw>
<kw name="Get Value From Json" owner="JSONLibrary">
<msg time="2026-07-02T21:15:20.310663" level="INFO">${token} = ['eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJtYXN0ZXIiLCJleHAiOjE3ODMxMDYxMjAsImlhdCI6MTc4MzAxOTcyMH0.3lTBRZRfwrf3WmkoccB95LHtGASRwoG4SUqCpIwCehU']</msg>
<var>${token}</var>
<arg>${json}</arg>
<arg>$.access_token</arg>
<doc>Get Value From JSON using JSONPath</doc>
<status status="PASS" start="2026-07-02T21:15:20.299271" elapsed="0.011433"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-07-02T21:15:20.311266" level="INFO">${token_str} = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJtYXN0ZXIiLCJleHAiOjE3ODMxMDYxMjAsImlhdCI6MTc4MzAxOTcyMH0.3lTBRZRfwrf3WmkoccB95LHtGASRwoG4SUqCpIwCehU</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-07-02T21:15:20.310861" elapsed="0.000428"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-07-02T21:15:20.311670" level="INFO">${TOKEN} = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJtYXN0ZXIiLCJleHAiOjE3ODMxMDYxMjAsImlhdCI6MTc4MzAxOTcyMH0.3lTBRZRfwrf3WmkoccB95LHtGASRwoG4SUqCpIwCehU</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-07-02T21:15:20.311398" elapsed="0.000301"/>
</kw>
<return>
<value>${token_str}</value>
<status status="PASS" start="2026-07-02T21:15:20.311743" elapsed="0.000077"/>
</return>
<doc>Log in with the master password and return the JWT access token.</doc>
<status status="PASS" start="2026-07-02T21:15:20.285582" elapsed="0.026323"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-07-02T21:15:20.312289" level="INFO">Creating Session using : alias=auth, url=http://127.0.0.1:8765, headers={'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJtYXN0ZXIiLCJleHAiOjE3ODMxMDYxMjAsImlhdCI6MTc4MzAxOTcyMH0.3lTBRZRfwrf3WmkoccB95LHtGASRwoG4SUqCpIwCehU'}, 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-07-02T21:15:20.312027" elapsed="0.000548"/>
</kw>
<arg>Create Anonymous Session</arg>
<arg>AND</arg>
<arg>Setup Master Password</arg>
<arg>AND</arg>
<arg>Open Browser To Page</arg>
<arg>/login</arg>
<arg>AND</arg>
<arg>Perform Login</arg>
<arg>AND</arg>
<arg>Wait For Elements State</arg>
<arg>id=search-input</arg>
<arg>visible</arg>
<arg>timeout=5s</arg>
<arg>AND</arg>
<arg>Login And Get Token</arg>
<arg>AND</arg>
<arg>Create Session</arg>
<arg>auth</arg>
<arg>${BASE_URL}</arg>
<arg>headers={'Authorization': 'Bearer ${TOKEN}'}</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-07-02T21:15:17.868516" elapsed="2.444128"/>
</kw>
<kw name="Add Series" owner="api_keywords">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-07-02T21:15:20.313678" level="INFO">${payload} = {'link': 'https://aniworld.to/anime/stream/attack-on-titan', 'name': 'Attack on Titan'}</msg>
<var>${payload}</var>
<arg>link=${link}</arg>
<arg>name=${name}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-07-02T21:15:20.313183" elapsed="0.000518"/>
</kw>
<if>
<branch type="IF" condition="'${year}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${payload}</arg>
<arg>year=${year}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-07-02T21:15:20.314226" elapsed="0.000262"/>
</kw>
<status status="PASS" start="2026-07-02T21:15:20.313784" elapsed="0.000744"/>
</branch>
<status status="PASS" start="2026-07-02T21:15:20.313762" elapsed="0.000798"/>
</if>
<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-07-02T21:15:20.315258" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-07-02T21:15:20.314993" elapsed="0.000360"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-07-02T21:15:20.354762" level="INFO">POST Request : url=http://127.0.0.1:8765/api/anime/add
path_url=/api/anime/add
headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate, br', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJtYXN0ZXIiLCJleHAiOjE3ODMxMDYxMjAsImlhdCI6MTc4MzAxOTcyMH0.3lTBRZRfwrf3WmkoccB95LHtGASRwoG4SUqCpIwCehU', 'Content-Length': '103', 'Content-Type': 'application/json'}
body=b'{"link": "https://aniworld.to/anime/stream/attack-on-titan", "name": "Attack on Titan", "year": "2013"}'
</msg>
<msg time="2026-07-02T21:15:20.354833" level="INFO">POST Response : url=http://127.0.0.1:8765/api/anime/add
status=202, reason=Accepted
headers={'date': 'Thu, 02 Jul 2026 19:15:19 GMT', 'server': 'uvicorn', 'content-length': '243', 'content-type': 'application/json'}
body={"status":"exists","message":"Series already exists: Attack on Titan","key":"attack-on-titan","folder":"Attack on Titan (2013)","db_id":1,"loading_status":"completed","loading_progress":{"episodes":true,"nfo":true,"logo":false,"images":false}}
</msg>
<msg time="2026-07-02T21:15:20.354940" level="INFO">${resp} = &lt;Response [202]&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-07-02T21:15:20.315487" elapsed="0.039474"/>
</kw>
<status status="PASS" start="2026-07-02T21:15:20.315387" elapsed="0.039639"/>
</branch>
<status status="PASS" start="2026-07-02T21:15:20.314979" elapsed="0.040078"/>
</if>
<return>
<value>${resp}</value>
<status status="PASS" start="2026-07-02T21:15:20.355092" elapsed="0.000126"/>
</return>
<msg time="2026-07-02T21:15:20.355341" level="INFO">${resp} = &lt;Response [202]&gt;</msg>
<var>${resp}</var>
<arg>/api/anime/add</arg>
<arg>${payload}</arg>
<arg>202</arg>
<doc>Perform an authenticated POST request with optional JSON payload.</doc>
<status status="PASS" start="2026-07-02T21:15:20.314697" elapsed="0.040664"/>
</kw>
<return>
<value>${resp}</value>
<status status="PASS" start="2026-07-02T21:15:20.355405" elapsed="0.000054"/>
</return>
<msg time="2026-07-02T21:15:20.355545" level="INFO">${resp} = &lt;Response [202]&gt;</msg>
<var>${resp}</var>
<arg>https://aniworld.to/anime/stream/attack-on-titan</arg>
<arg>Attack on Titan</arg>
<arg>2013</arg>
<doc>POST /api/anime/add with series details.</doc>
<status status="PASS" start="2026-07-02T21:15:20.312847" elapsed="0.042717"/>
</kw>
<kw name="Response Should Have Status" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-07-02T21:15:20.356474" 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-07-02T21:15:20.355989" elapsed="0.000537"/>
</kw>
<arg>${resp}</arg>
<arg>202</arg>
<doc>Assert that the response status code matches the expected value.</doc>
<status status="PASS" start="2026-07-02T21:15:20.355700" elapsed="0.000881"/>
</kw>
<kw name="Get JSON Value" owner="api_keywords">
<kw name="Convert String To Json" owner="JSONLibrary">
<msg time="2026-07-02T21:15:20.357377" level="INFO">${json} = {'status': 'exists', 'message': 'Series already exists: Attack on Titan', 'key': 'attack-on-titan', 'folder': 'Attack on Titan (2013)', 'db_id': 1, 'loading_status': 'completed', 'loading_progress': {...</msg>
<var>${json}</var>
<arg>${response.text}</arg>
<doc>Convert String to JSON object</doc>
<status status="PASS" start="2026-07-02T21:15:20.356990" elapsed="0.000409"/>
</kw>
<kw name="Get Value From Json" owner="JSONLibrary">
<msg time="2026-07-02T21:15:20.368609" level="INFO">${values} = ['attack-on-titan']</msg>
<var>${values}</var>
<arg>${json}</arg>
<arg>${json_path}</arg>
<doc>Get Value From JSON using JSONPath</doc>
<status status="PASS" start="2026-07-02T21:15:20.357488" elapsed="0.011162"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-07-02T21:15:20.369238" level="INFO">${value} = attack-on-titan</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-07-02T21:15:20.368805" elapsed="0.000462"/>
</kw>
<return>
<value>${value}</value>
<status status="PASS" start="2026-07-02T21:15:20.369333" elapsed="0.000119"/>
</return>
<msg time="2026-07-02T21:15:20.369570" level="INFO">${key} = attack-on-titan</msg>
<var>${key}</var>
<arg>${resp}</arg>
<arg>$.key</arg>
<doc>Extract a value from a JSON response using JSONPath.</doc>
<status status="PASS" start="2026-07-02T21:15:20.356701" elapsed="0.012889"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-07-02T21:15:20.370113" level="INFO">Length is 15.</msg>
<arg>${key}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-07-02T21:15:20.369706" elapsed="0.000444"/>
</kw>
<kw name="Go To" owner="Browser">
<msg time="2026-07-02T21:15:20.565033" level="INFO">Successfully opened URL http://127.0.0.1:8765/anime/settings?key=attack-on-titan</msg>
<arg>${BASE_URL}/anime/settings?key=${key}</arg>
<tag>BrowserControl</tag>
<tag>Setter</tag>
<doc>Navigates to the given ``url``.</doc>
<status status="PASS" start="2026-07-02T21:15:20.370255" elapsed="0.195106"/>
</kw>
<kw name="Evaluate JavaScript" owner="Browser">
<msg time="2026-07-02T21:15:20.655706" level="INFO" html="true">&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="3"&gt;&lt;a href="browser/screenshot/fail-screenshot-1.png" target="_blank"&gt;&lt;img src="browser/screenshot/fail-screenshot-1.png" width="800px"/&gt;&lt;/a&gt;</msg>
<msg time="2026-07-02T21:15:20.655954" level="INFO">See also file:///home/lukas/Volume/repo/Aniworld/playwright-log.txt for additional details.</msg>
<msg time="2026-07-02T21:15:20.656218" level="FAIL">Error: locator.evaluate: Unexpected token "&amp;" while parsing css selector "window.AniWorld &amp;&amp; window.AniWorld.AnimeSettingsManager &amp;&amp; window.AniWorld.AnimeSettingsManager.init()". Did you mean to CSS.escape it?
Call log:
- waiting for window.AniWorld &amp;&amp; window.AniWorld.AnimeSettingsManager &amp;&amp; window.AniWorld.AnimeSettingsManager.init()
</msg>
<arg>window.AniWorld &amp;&amp; window.AniWorld.AnimeSettingsManager &amp;&amp; window.AniWorld.AnimeSettingsManager.init()</arg>
<tag>Getter</tag>
<tag>PageContent</tag>
<tag>Setter</tag>
<doc>Executes given javascript on the selected element(s) or on page.</doc>
<status status="FAIL" start="2026-07-02T21:15:20.565608" elapsed="0.092655">Error: locator.evaluate: Unexpected token "&amp;" while parsing css selector "window.AniWorld &amp;&amp; window.AniWorld.AnimeSettingsManager &amp;&amp; window.AniWorld.AnimeSettingsManager.init()". Did you mean to CSS.escape it?
Call log:
- waiting for window.AniWorld &amp;&amp; window.AniWorld.AnimeSettingsManager &amp;&amp; window.AniWorld.AnimeSettingsManager.init()
</status>
</kw>
<kw name="Wait For Elements State" owner="Browser">
<arg>id=settings-section</arg>
<arg>visible</arg>
<arg>timeout=10s</arg>
<tag>PageContent</tag>
<tag>Wait</tag>
<doc>Waits for the element found by ``selector`` to satisfy state option.</doc>
<status status="NOT RUN" start="2026-07-02T21:15:20.658436" elapsed="0.000096"/>
</kw>
<kw name="Page Title Should Contain" owner="ui_keywords">
<arg>Settings</arg>
<doc>Assert that the page title contains the given text.</doc>
<status status="NOT RUN" start="2026-07-02T21:15:20.658674" elapsed="0.000052"/>
</kw>
<kw name="Element Should Be Visible" owner="ui_keywords">
<arg>id=settings-section</arg>
<doc>Assert that the element matching the selector is visible.</doc>
<status status="NOT RUN" start="2026-07-02T21:15:20.658817" elapsed="0.000049"/>
</kw>
<kw name="Element Should Be Visible" owner="ui_keywords">
<arg>id=regenerate-nfo-btn</arg>
<doc>Assert that the element matching the selector is visible.</doc>
<status status="NOT RUN" start="2026-07-02T21:15:20.658961" elapsed="0.000056"/>
</kw>
<kw name="Element Should Be Visible" owner="ui_keywords">
<arg>id=save-db-btn</arg>
<doc>Assert that the element matching the selector is visible.</doc>
<status status="NOT RUN" start="2026-07-02T21:15:20.659098" elapsed="0.000048"/>
</kw>
<kw name="Close Browser" owner="common" type="TEARDOWN">
<kw name="Close Browser" owner="Browser">
<msg time="2026-07-02T21:15:20.690093" level="INFO">Closed all browsers</msg>
<arg>ALL</arg>
<tag>BrowserControl</tag>
<tag>Setter</tag>
<doc>Closes the current browser.</doc>
<status status="PASS" start="2026-07-02T21:15:20.659558" elapsed="0.030681"/>
</kw>
<doc>Close all browser contexts and the browser itself.</doc>
<status status="PASS" start="2026-07-02T21:15:20.659333" elapsed="0.031009"/>
</kw>
<doc>Navigate to anime settings page and verify form elements.</doc>
<status status="FAIL" start="2026-07-02T21:15:17.867367" elapsed="2.823025">Error: locator.evaluate: Unexpected token "&amp;" while parsing css selector "window.AniWorld &amp;&amp; window.AniWorld.AnimeSettingsManager &amp;&amp; window.AniWorld.AnimeSettingsManager.init()". Did you mean to CSS.escape it?
Call log:
- waiting for window.AniWorld &amp;&amp; window.AniWorld.AnimeSettingsManager &amp;&amp; window.AniWorld.AnimeSettingsManager.init()
</status>
</test>
<doc>Anime settings page UI tests for Aniworld.
Covers page load, regenerate NFO, and update series settings.</doc>
<status status="FAIL" start="2026-07-02T21:15:17.624987" elapsed="3.072867"/>
</suite>
<statistics>
<total>
<stat pass="0" fail="1" skip="0">All Tests</stat>
</total>
<tag>
</tag>
<suite>
<stat name="Anime Settings" id="s1" pass="0" fail="1" skip="0">Anime Settings</stat>
</suite>
</statistics>
<errors>
</errors>
</robot>