This commit is contained in:
2026-07-03 22:08:11 +02:00
parent 58adf05325
commit 47bd393a57
7 changed files with 0 additions and 13968 deletions

2467
log.html

File diff suppressed because one or more lines are too long

View File

@@ -1,576 +0,0 @@
<?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>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@@ -1,54 +0,0 @@
{"level":"info","time":"2026-06-28T13:57:34.302Z","seq":1,"component":"browser-library","msg":"Listening on 127.0.0.1:36123"}
{"level":"error","time":"2026-06-28T13:57:34.371Z","seq":2,"component":"browser-library","event_kind":"grpc_error","status":"failed","error_type":"Error","msg":"Error: Browser has been closed.\n at PlaywrightState.getActiveBrowser (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:12594:13)\n at PlaywrightServer.getActiveBrowser (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:13516:52)\n at PlaywrightServer.setTimeout (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:13734:56)\n at Object.onReceiveHalfClose (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server.js:1478:25)\n at BaseServerInterceptingCall.maybePushNextMessage (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:594:31)\n at BaseServerInterceptingCall.handleEndEvent (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:634:14)\n at ServerHttp2Stream.<anonymous> (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:387:18)\n at ServerHttp2Stream.emit (node:events:531:35)\n at endReadableNT (node:internal/streams/readable:1698:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:89:21)"}
{"level":"info","time":"2026-06-28T13:57:34.375Z","seq":3,"suite_id":"s1","suite_name":"Config","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"started"}
{"level":"info","time":"2026-06-28T13:57:34.375Z","seq":4,"suite_id":"s1","suite_name":"Config","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"succeeded"}
{"level":"info","time":"2026-06-28T13:57:34.379Z","seq":5,"suite_id":"s1","suite_name":"Config","test_name":"Config.Update Config","test_id":"s1-t2","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"started"}
{"level":"info","time":"2026-06-28T13:57:34.379Z","seq":6,"suite_id":"s1","suite_name":"Config","test_name":"Config.Update Config","test_id":"s1-t2","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"succeeded"}
{"level":"error","time":"2026-06-28T13:57:34.991Z","seq":7,"suite_id":"s1","suite_name":"Config","test_name":"Config.Update Config","test_id":"s1-t2","component":"browser-library","event_kind":"grpc_error","status":"failed","error_type":"Error","msg":"Error: Browser has been closed.\n at PlaywrightState.getActiveBrowser (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:12594:13)\n at PlaywrightServer.getActiveBrowser (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:13516:52)\n at PlaywrightServer.setTimeout (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:13734:56)\n at Object.onReceiveHalfClose (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server.js:1478:25)\n at BaseServerInterceptingCall.maybePushNextMessage (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:594:31)\n at BaseServerInterceptingCall.handleEndEvent (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:634:14)\n at ServerHttp2Stream.<anonymous> (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:387:18)\n at ServerHttp2Stream.emit (node:events:531:35)\n at endReadableNT (node:internal/streams/readable:1698:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:89:21)"}
{"level":"info","time":"2026-06-28T13:57:34.994Z","seq":8,"suite_id":"s1","suite_name":"Config","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"started"}
{"level":"info","time":"2026-06-28T13:57:34.994Z","seq":9,"suite_id":"s1","suite_name":"Config","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"succeeded"}
{"level":"info","time":"2026-06-28T13:57:34.997Z","seq":10,"suite_id":"s1","suite_name":"Config","test_name":"Config.Validate Valid Config","test_id":"s1-t3","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"started"}
{"level":"info","time":"2026-06-28T13:57:34.997Z","seq":11,"suite_id":"s1","suite_name":"Config","test_name":"Config.Validate Valid Config","test_id":"s1-t3","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"succeeded"}
{"level":"error","time":"2026-06-28T13:57:35.610Z","seq":12,"suite_id":"s1","suite_name":"Config","test_name":"Config.Validate Valid Config","test_id":"s1-t3","component":"browser-library","event_kind":"grpc_error","status":"failed","error_type":"Error","msg":"Error: Browser has been closed.\n at PlaywrightState.getActiveBrowser (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:12594:13)\n at PlaywrightServer.getActiveBrowser (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:13516:52)\n at PlaywrightServer.setTimeout (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:13734:56)\n at Object.onReceiveHalfClose (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server.js:1478:25)\n at BaseServerInterceptingCall.maybePushNextMessage (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:594:31)\n at BaseServerInterceptingCall.handleEndEvent (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:634:14)\n at ServerHttp2Stream.<anonymous> (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:387:18)\n at ServerHttp2Stream.emit (node:events:531:35)\n at endReadableNT (node:internal/streams/readable:1698:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:89:21)"}
{"level":"info","time":"2026-06-28T13:57:35.613Z","seq":13,"suite_id":"s1","suite_name":"Config","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"started"}
{"level":"info","time":"2026-06-28T13:57:35.613Z","seq":14,"suite_id":"s1","suite_name":"Config","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"succeeded"}
{"level":"info","time":"2026-06-28T13:57:35.615Z","seq":15,"suite_id":"s1","suite_name":"Config","test_name":"Config.Validate Invalid Config Missing Name","test_id":"s1-t4","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"started"}
{"level":"info","time":"2026-06-28T13:57:35.615Z","seq":16,"suite_id":"s1","suite_name":"Config","test_name":"Config.Validate Invalid Config Missing Name","test_id":"s1-t4","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"succeeded"}
{"level":"error","time":"2026-06-28T13:57:36.228Z","seq":17,"suite_id":"s1","suite_name":"Config","test_name":"Config.Validate Invalid Config Missing Name","test_id":"s1-t4","component":"browser-library","event_kind":"grpc_error","status":"failed","error_type":"Error","msg":"Error: Browser has been closed.\n at PlaywrightState.getActiveBrowser (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:12594:13)\n at PlaywrightServer.getActiveBrowser (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:13516:52)\n at PlaywrightServer.setTimeout (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:13734:56)\n at Object.onReceiveHalfClose (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server.js:1478:25)\n at BaseServerInterceptingCall.maybePushNextMessage (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:594:31)\n at BaseServerInterceptingCall.handleEndEvent (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:634:14)\n at ServerHttp2Stream.<anonymous> (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:387:18)\n at ServerHttp2Stream.emit (node:events:531:35)\n at endReadableNT (node:internal/streams/readable:1698:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:89:21)"}
{"level":"info","time":"2026-06-28T13:57:36.230Z","seq":18,"suite_id":"s1","suite_name":"Config","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"started"}
{"level":"info","time":"2026-06-28T13:57:36.230Z","seq":19,"suite_id":"s1","suite_name":"Config","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"succeeded"}
{"level":"info","time":"2026-06-28T13:57:36.233Z","seq":20,"suite_id":"s1","suite_name":"Config","test_name":"Config.Validate Invalid Schedule Time","test_id":"s1-t5","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"started"}
{"level":"info","time":"2026-06-28T13:57:36.233Z","seq":21,"suite_id":"s1","suite_name":"Config","test_name":"Config.Validate Invalid Schedule Time","test_id":"s1-t5","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"succeeded"}
{"level":"error","time":"2026-06-28T13:57:36.845Z","seq":22,"suite_id":"s1","suite_name":"Config","test_name":"Config.Validate Invalid Schedule Time","test_id":"s1-t5","component":"browser-library","event_kind":"grpc_error","status":"failed","error_type":"Error","msg":"Error: Browser has been closed.\n at PlaywrightState.getActiveBrowser (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:12594:13)\n at PlaywrightServer.getActiveBrowser (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:13516:52)\n at PlaywrightServer.setTimeout (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:13734:56)\n at Object.onReceiveHalfClose (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server.js:1478:25)\n at BaseServerInterceptingCall.maybePushNextMessage (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:594:31)\n at BaseServerInterceptingCall.handleEndEvent (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:634:14)\n at ServerHttp2Stream.<anonymous> (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:387:18)\n at ServerHttp2Stream.emit (node:events:531:35)\n at endReadableNT (node:internal/streams/readable:1698:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:89:21)"}
{"level":"info","time":"2026-06-28T13:57:36.848Z","seq":23,"suite_id":"s1","suite_name":"Config","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"started"}
{"level":"info","time":"2026-06-28T13:57:36.848Z","seq":24,"suite_id":"s1","suite_name":"Config","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"succeeded"}
{"level":"info","time":"2026-06-28T13:57:36.850Z","seq":25,"suite_id":"s1","suite_name":"Config","test_name":"Config.Validate Invalid Log Level","test_id":"s1-t6","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"started"}
{"level":"info","time":"2026-06-28T13:57:36.851Z","seq":26,"suite_id":"s1","suite_name":"Config","test_name":"Config.Validate Invalid Log Level","test_id":"s1-t6","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"succeeded"}
{"level":"error","time":"2026-06-28T13:57:37.463Z","seq":27,"suite_id":"s1","suite_name":"Config","test_name":"Config.Validate Invalid Log Level","test_id":"s1-t6","component":"browser-library","event_kind":"grpc_error","status":"failed","error_type":"Error","msg":"Error: Browser has been closed.\n at PlaywrightState.getActiveBrowser (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:12594:13)\n at PlaywrightServer.getActiveBrowser (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:13516:52)\n at PlaywrightServer.setTimeout (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:13734:56)\n at Object.onReceiveHalfClose (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server.js:1478:25)\n at BaseServerInterceptingCall.maybePushNextMessage (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:594:31)\n at BaseServerInterceptingCall.handleEndEvent (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:634:14)\n at ServerHttp2Stream.<anonymous> (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:387:18)\n at ServerHttp2Stream.emit (node:events:531:35)\n at endReadableNT (node:internal/streams/readable:1698:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:89:21)"}
{"level":"info","time":"2026-06-28T13:57:37.465Z","seq":28,"suite_id":"s1","suite_name":"Config","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"started"}
{"level":"info","time":"2026-06-28T13:57:37.465Z","seq":29,"suite_id":"s1","suite_name":"Config","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"succeeded"}
{"level":"info","time":"2026-06-28T13:57:37.468Z","seq":30,"suite_id":"s1","suite_name":"Config","test_name":"Config.Config Backup Create","test_id":"s1-t7","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"started"}
{"level":"info","time":"2026-06-28T13:57:37.468Z","seq":31,"suite_id":"s1","suite_name":"Config","test_name":"Config.Config Backup Create","test_id":"s1-t7","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"succeeded"}
{"level":"error","time":"2026-06-28T13:57:38.080Z","seq":32,"suite_id":"s1","suite_name":"Config","test_name":"Config.Config Backup Create","test_id":"s1-t7","component":"browser-library","event_kind":"grpc_error","status":"failed","error_type":"Error","msg":"Error: Browser has been closed.\n at PlaywrightState.getActiveBrowser (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:12594:13)\n at PlaywrightServer.getActiveBrowser (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:13516:52)\n at PlaywrightServer.setTimeout (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:13734:56)\n at Object.onReceiveHalfClose (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server.js:1478:25)\n at BaseServerInterceptingCall.maybePushNextMessage (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:594:31)\n at BaseServerInterceptingCall.handleEndEvent (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:634:14)\n at ServerHttp2Stream.<anonymous> (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:387:18)\n at ServerHttp2Stream.emit (node:events:531:35)\n at endReadableNT (node:internal/streams/readable:1698:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:89:21)"}
{"level":"info","time":"2026-06-28T13:57:38.082Z","seq":33,"suite_id":"s1","suite_name":"Config","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"started"}
{"level":"info","time":"2026-06-28T13:57:38.083Z","seq":34,"suite_id":"s1","suite_name":"Config","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"succeeded"}
{"level":"info","time":"2026-06-28T13:57:38.085Z","seq":35,"suite_id":"s1","suite_name":"Config","test_name":"Config.Config Backup List","test_id":"s1-t8","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"started"}
{"level":"info","time":"2026-06-28T13:57:38.085Z","seq":36,"suite_id":"s1","suite_name":"Config","test_name":"Config.Config Backup List","test_id":"s1-t8","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"succeeded"}
{"level":"error","time":"2026-06-28T13:57:38.699Z","seq":37,"suite_id":"s1","suite_name":"Config","test_name":"Config.Config Backup List","test_id":"s1-t8","component":"browser-library","event_kind":"grpc_error","status":"failed","error_type":"Error","msg":"Error: Browser has been closed.\n at PlaywrightState.getActiveBrowser (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:12594:13)\n at PlaywrightServer.getActiveBrowser (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:13516:52)\n at PlaywrightServer.setTimeout (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:13734:56)\n at Object.onReceiveHalfClose (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server.js:1478:25)\n at BaseServerInterceptingCall.maybePushNextMessage (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:594:31)\n at BaseServerInterceptingCall.handleEndEvent (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:634:14)\n at ServerHttp2Stream.<anonymous> (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:387:18)\n at ServerHttp2Stream.emit (node:events:531:35)\n at endReadableNT (node:internal/streams/readable:1698:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:89:21)"}
{"level":"info","time":"2026-06-28T13:57:38.701Z","seq":38,"suite_id":"s1","suite_name":"Config","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"started"}
{"level":"info","time":"2026-06-28T13:57:38.702Z","seq":39,"suite_id":"s1","suite_name":"Config","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"succeeded"}
{"level":"info","time":"2026-06-28T13:57:38.704Z","seq":40,"suite_id":"s1","suite_name":"Config","test_name":"Config.Config Backup Restore","test_id":"s1-t9","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"started"}
{"level":"info","time":"2026-06-28T13:57:38.704Z","seq":41,"suite_id":"s1","suite_name":"Config","test_name":"Config.Config Backup Restore","test_id":"s1-t9","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"succeeded"}
{"level":"error","time":"2026-06-28T13:57:39.317Z","seq":42,"suite_id":"s1","suite_name":"Config","test_name":"Config.Config Backup Restore","test_id":"s1-t9","component":"browser-library","event_kind":"grpc_error","status":"failed","error_type":"Error","msg":"Error: Browser has been closed.\n at PlaywrightState.getActiveBrowser (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:12594:13)\n at PlaywrightServer.getActiveBrowser (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:13516:52)\n at PlaywrightServer.setTimeout (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:13734:56)\n at Object.onReceiveHalfClose (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server.js:1478:25)\n at BaseServerInterceptingCall.maybePushNextMessage (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:594:31)\n at BaseServerInterceptingCall.handleEndEvent (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:634:14)\n at ServerHttp2Stream.<anonymous> (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:387:18)\n at ServerHttp2Stream.emit (node:events:531:35)\n at endReadableNT (node:internal/streams/readable:1698:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:89:21)"}
{"level":"info","time":"2026-06-28T13:57:39.320Z","seq":43,"suite_id":"s1","suite_name":"Config","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"started"}
{"level":"info","time":"2026-06-28T13:57:39.320Z","seq":44,"suite_id":"s1","suite_name":"Config","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"succeeded"}
{"level":"info","time":"2026-06-28T13:57:39.323Z","seq":45,"suite_id":"s1","suite_name":"Config","test_name":"Config.Config Backup Delete","test_id":"s1-t10","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"started"}
{"level":"info","time":"2026-06-28T13:57:39.323Z","seq":46,"suite_id":"s1","suite_name":"Config","test_name":"Config.Config Backup Delete","test_id":"s1-t10","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"succeeded"}
{"level":"error","time":"2026-06-28T13:57:39.935Z","seq":47,"suite_id":"s1","suite_name":"Config","test_name":"Config.Config Backup Delete","test_id":"s1-t10","component":"browser-library","event_kind":"grpc_error","status":"failed","error_type":"Error","msg":"Error: Browser has been closed.\n at PlaywrightState.getActiveBrowser (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:12594:13)\n at PlaywrightServer.getActiveBrowser (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:13516:52)\n at PlaywrightServer.setTimeout (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:13734:56)\n at Object.onReceiveHalfClose (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server.js:1478:25)\n at BaseServerInterceptingCall.maybePushNextMessage (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:594:31)\n at BaseServerInterceptingCall.handleEndEvent (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:634:14)\n at ServerHttp2Stream.<anonymous> (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:387:18)\n at ServerHttp2Stream.emit (node:events:531:35)\n at endReadableNT (node:internal/streams/readable:1698:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:89:21)"}
{"level":"info","time":"2026-06-28T13:57:39.938Z","seq":48,"suite_id":"s1","suite_name":"Config","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"started"}
{"level":"info","time":"2026-06-28T13:57:39.938Z","seq":49,"suite_id":"s1","suite_name":"Config","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"succeeded"}
{"level":"error","time":"2026-06-28T13:57:39.939Z","seq":50,"suite_id":"s1","suite_name":"Config","component":"browser-library","event_kind":"grpc_error","status":"failed","error_type":"Error","msg":"Error: Browser has been closed.\n at PlaywrightState.getActiveBrowser (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:12594:13)\n at PlaywrightServer.getActiveBrowser (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:13516:52)\n at PlaywrightServer.setTimeout (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:13734:56)\n at Object.onReceiveHalfClose (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server.js:1478:25)\n at BaseServerInterceptingCall.maybePushNextMessage (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:594:31)\n at BaseServerInterceptingCall.handleEndEvent (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:634:14)\n at ServerHttp2Stream.<anonymous> (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:387:18)\n at ServerHttp2Stream.emit (node:events:531:35)\n at endReadableNT (node:internal/streams/readable:1698:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:89:21)"}
{"level":"info","time":"2026-06-28T13:57:39.942Z","seq":51,"component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"started"}
{"level":"info","time":"2026-06-28T13:57:39.942Z","seq":52,"component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"succeeded"}
{"level":"info","time":"2026-06-28T13:57:39.966Z","seq":53,"component":"browser-library","event_kind":"grpc","action":"closeAllBrowsers","status":"started"}
{"level":"info","time":"2026-06-28T13:57:39.967Z","seq":54,"component":"browser-library","event_kind":"grpc","action":"closeAllBrowsers","status":"succeeded"}

File diff suppressed because one or more lines are too long