Creating Session using : alias=anon, url=http://127.0.0.1:8765, headers={}, cookies={}, auth=None, timeout=None, proxies=None, verify=False, debug=0 anon ${BASE_URL} Create Session: create a HTTP session to a server Create an unauthenticated HTTP session. ${payload} = {'master_password': 'TestPass123!', 'anime_directory': '/tmp/aniworld_test_anime', 'name': 'AniworldTest', 'data_dir': 'data', 'scheduler_enabled': 'False', 'logging_level': 'INFO', 'backup_enabled': ... ${payload} master_password=${SETUP_PASSWORD} anime_directory=/tmp/aniworld_test_anime name=AniworldTest data_dir=data scheduler_enabled=False logging_level=INFO backup_enabled=False Creates and returns a dictionary based on the given ``items``. 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"}' 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"} ${resp} = <Response [201]> ${resp} anon /api/auth/setup json=${payload} expected_status=any Sends a POST request on a previously created HTTP Session. 45s Pauses the test executed for the given time. ${resp} anon /api/auth/setup json=${payload} expected_status=any Sends a POST request on a previously created HTTP Session. 45s Pauses the test executed for the given time. ${resp} anon /api/auth/setup json=${payload} expected_status=any Sends a POST request on a previously created HTTP Session. ${json} ${resp.text} Convert String to JSON object ${detail} ${json} $.detail Get Value From JSON using JSONPath Setup failed with 400: ${detail} Fails the test with the given message and optionally alters its tags. Argument types are: <class 'int'> <class 'str'> ${resp.status_code} 201 Fails if objects are unequal after converting them to integers. Unexpected status ${resp.status_code} from /api/auth/setup Fails the test with the given message and optionally alters its tags. Configure the master password via the setup endpoint. Creating Session using : alias=anon, url=http://127.0.0.1:8765, headers={}, cookies={}, auth=None, timeout=None, proxies=None, verify=False, debug=0 anon ${BASE_URL} Create Session: create a HTTP session to a server Create an unauthenticated HTTP session. 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 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} ${resp} = <Response [200]> ${resp} anon /api/auth/status expected_status=200 Sends a GET request on a previously created HTTP Session. ${json} = {'configured': True, 'authenticated': False} ${json} ${resp.text} Convert String to JSON object ${configured} = [True] ${configured} ${json} $.configured Get Value From JSON using JSONPath ${configured_val} = True ${configured_val} ${configured}[0] Returns the given values which can then be assigned to a variables. ${configured_val} ${configured} = True ${configured} Check if the master password has already been configured. Configure the master password via the setup endpoint. ${token} Log in with the master password and return the JWT access token. auth ${BASE_URL} headers={'Authorization': 'Bearer ${token}'} Create Session: create a HTTP session to a server ${payload} = {'password': 'TestPass123!'} ${payload} password=${SETUP_PASSWORD} Creates and returns a dictionary based on the given ``items``. 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!"}' 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"} ${resp} = <Response [200]> ${resp} anon /api/auth/login json=${payload} expected_status=any Sends a POST request on a previously created HTTP Session. 6s Pauses the test executed for the given time. ${resp} anon /api/auth/login json=${payload} expected_status=any Sends a POST request on a previously created HTTP Session. ${json} ${resp.text} Convert String to JSON object ${detail} ${json} $.detail Get Value From JSON using JSONPath ${detail_val} ${detail}[0] Returns the given values which can then be assigned to a variables. Login failed with ${resp.status_code}: ${detail_val} Fails the test with the given message and optionally alters its tags. ${json} = {'access_token': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJtYXN0ZXIiLCJleHAiOjE3ODI2NDc3MjIsImlhdCI6MTc4MjU2MTMyMn0.--vlbTAAA2hgaD0fZcM-E01gJMfeZI9wU6wqkY3O9Fs', 'token_type': 'bearer', 'expire... ${json} ${resp.text} Convert String to JSON object ${token} = ['eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJtYXN0ZXIiLCJleHAiOjE3ODI2NDc3MjIsImlhdCI6MTc4MjU2MTMyMn0.--vlbTAAA2hgaD0fZcM-E01gJMfeZI9wU6wqkY3O9Fs'] ${token} ${json} $.access_token Get Value From JSON using JSONPath ${token_str} = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJtYXN0ZXIiLCJleHAiOjE3ODI2NDc3MjIsImlhdCI6MTc4MjU2MTMyMn0.--vlbTAAA2hgaD0fZcM-E01gJMfeZI9wU6wqkY3O9Fs ${token_str} ${token}[0] Returns the given values which can then be assigned to a variables. ${TOKEN} = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJtYXN0ZXIiLCJleHAiOjE3ODI2NDc3MjIsImlhdCI6MTc4MjU2MTMyMn0.--vlbTAAA2hgaD0fZcM-E01gJMfeZI9wU6wqkY3O9Fs ${TOKEN} ${token_str} Makes a variable available everywhere within the scope of the current suite. ${token_str} ${token} = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJtYXN0ZXIiLCJleHAiOjE3ODI2NDc3MjIsImlhdCI6MTc4MjU2MTMyMn0.--vlbTAAA2hgaD0fZcM-E01gJMfeZI9wU6wqkY3O9Fs ${token} Log in with the master password and return the JWT access token. 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 auth ${BASE_URL} headers={'Authorization': 'Bearer ${token}'} Create Session: create a HTTP session to a server auth ${BASE_URL} headers={'Authorization': 'Bearer ${TOKEN}'} Create Session: create a HTTP session to a server Create an authenticated HTTP session. Performs setup if needed, then logs in. Skips setup/login if already authenticated (suite-level setup done). Create Anonymous Session AND Setup Master Password AND Create Authenticated Session Executes all the given keywords in a sequence. 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 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"}} ${resp} = <Response [200]> ${resp} ${session} ${endpoint} expected_status=${expected_status} Sends a GET request on a previously created HTTP Session. ${resp} ${resp} = <Response [200]> ${resp} /api/config Perform an authenticated GET request and return the response. Argument types are: <class 'int'> <class 'str'> ${response.status_code} ${expected_status} Fails if objects are unequal after converting them to integers. ${resp} 200 Assert that the response status code matches the expected value. ${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... ${json} ${response.text} Convert String to JSON object ${json} ${key} Fails if ``key`` is not found from ``dictionary``. name ${json} ${key} Fails if ``key`` is not found from ``dictionary``. data_dir ${json} ${key} Fails if ``key`` is not found from ``dictionary``. scheduler ${json} ${key} Fails if ``key`` is not found from ``dictionary``. logging ${json} ${key} Fails if ``key`` is not found from ``dictionary``. backup ${json} ${key} Fails if ``key`` is not found from ``dictionary``. nfo ${key} @{keys} ${resp} name data_dir scheduler logging backup nfo Assert that the JSON response contains all the specified top-level keys. Deleting All Sessions Removes all the session objects Starting Browser process /home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js using at 127.0.0.1:50011 Retrieve the current configuration and verify its structure. Creating Session using : alias=anon, url=http://127.0.0.1:8765, headers={}, cookies={}, auth=None, timeout=None, proxies=None, verify=False, debug=0 anon ${BASE_URL} Create Session: create a HTTP session to a server Create an unauthenticated HTTP session. ${payload} = {'master_password': 'TestPass123!', 'anime_directory': '/tmp/aniworld_test_anime', 'name': 'AniworldTest', 'data_dir': 'data', 'scheduler_enabled': 'False', 'logging_level': 'INFO', 'backup_enabled': ... ${payload} master_password=${SETUP_PASSWORD} anime_directory=/tmp/aniworld_test_anime name=AniworldTest data_dir=data scheduler_enabled=False logging_level=INFO backup_enabled=False Creates and returns a dictionary based on the given ``items``. 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"}' 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"} ${resp} = <Response [400]> ${resp} anon /api/auth/setup json=${payload} expected_status=any Sends a POST request on a previously created HTTP Session. 45s Pauses the test executed for the given time. ${resp} anon /api/auth/setup json=${payload} expected_status=any Sends a POST request on a previously created HTTP Session. 45s Pauses the test executed for the given time. ${resp} anon /api/auth/setup json=${payload} expected_status=any Sends a POST request on a previously created HTTP Session. ${json} = {'detail': 'Master password already configured'} ${json} ${resp.text} Convert String to JSON object ${detail} = ['Master password already configured'] ${detail} ${json} $.detail Get Value From JSON using JSONPath Setup failed with 400: ${detail} Fails the test with the given message and optionally alters its tags. ${resp.status_code} 201 Fails if objects are unequal after converting them to integers. Unexpected status ${resp.status_code} from /api/auth/setup Fails the test with the given message and optionally alters its tags. Configure the master password via the setup endpoint. Creating Session using : alias=anon, url=http://127.0.0.1:8765, headers={}, cookies={}, auth=None, timeout=None, proxies=None, verify=False, debug=0 anon ${BASE_URL} Create Session: create a HTTP session to a server Create an unauthenticated HTTP session. 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 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} ${resp} = <Response [200]> ${resp} anon /api/auth/status expected_status=200 Sends a GET request on a previously created HTTP Session. ${json} = {'configured': True, 'authenticated': False} ${json} ${resp.text} Convert String to JSON object ${configured} = [True] ${configured} ${json} $.configured Get Value From JSON using JSONPath ${configured_val} = True ${configured_val} ${configured}[0] Returns the given values which can then be assigned to a variables. ${configured_val} ${configured} = True ${configured} Check if the master password has already been configured. Configure the master password via the setup endpoint. ${token} Log in with the master password and return the JWT access token. auth ${BASE_URL} headers={'Authorization': 'Bearer ${token}'} Create Session: create a HTTP session to a server ${token} Log in with the master password and return the JWT access token. auth ${BASE_URL} headers={'Authorization': 'Bearer ${token}'} Create Session: create a HTTP session to a server 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 auth ${BASE_URL} headers={'Authorization': 'Bearer ${TOKEN}'} Create Session: create a HTTP session to a server Create an authenticated HTTP session. Performs setup if needed, then logs in. Skips setup/login if already authenticated (suite-level setup done). Create Anonymous Session AND Setup Master Password AND Create Authenticated Session Executes all the given keywords in a sequence. ${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... ${payload} 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'} Creates and returns a dictionary based on the given ``items``. 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\'}"}' 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"}} ${resp} = <Response [200]> ${resp} ${session} ${endpoint} json=${payload} expected_status=${expected_status} Sends a PUT request on a previously created HTTP Session. ${resp} ${resp} = <Response [200]> ${resp} /api/config ${payload} Perform an authenticated PUT request with JSON payload. ${resp} ${resp} = <Response [200]> ${resp} ${payload} PUT /api/config with the given payload. Argument types are: <class 'int'> <class 'str'> ${response.status_code} ${expected_status} Fails if objects are unequal after converting them to integers. ${resp} 200 Assert that the response status code matches the expected value. 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 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"}} ${resp} = <Response [200]> ${resp} ${session} ${endpoint} expected_status=${expected_status} Sends a GET request on a previously created HTTP Session. ${resp} ${resp} = <Response [200]> ${resp} /api/config Perform an authenticated GET request and return the response. ${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, ... ${json} ${resp.text} Convert String to JSON object ${json} ${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, ... ${config} GET /api/config and return the parsed JSON. ${config}[name] UpdatedAniworld Fails if objects are unequal after converting them to strings. Deleting All Sessions Removes all the session objects Update configuration fields and verify they are persisted. Creating Session using : alias=anon, url=http://127.0.0.1:8765, headers={}, cookies={}, auth=None, timeout=None, proxies=None, verify=False, debug=0 anon ${BASE_URL} Create Session: create a HTTP session to a server Create an unauthenticated HTTP session. ${payload} = {'master_password': 'TestPass123!', 'anime_directory': '/tmp/aniworld_test_anime', 'name': 'AniworldTest', 'data_dir': 'data', 'scheduler_enabled': 'False', 'logging_level': 'INFO', 'backup_enabled': ... ${payload} master_password=${SETUP_PASSWORD} anime_directory=/tmp/aniworld_test_anime name=AniworldTest data_dir=data scheduler_enabled=False logging_level=INFO backup_enabled=False Creates and returns a dictionary based on the given ``items``. 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"}' 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"} ${resp} = <Response [400]> ${resp} anon /api/auth/setup json=${payload} expected_status=any Sends a POST request on a previously created HTTP Session. 45s Pauses the test executed for the given time. ${resp} anon /api/auth/setup json=${payload} expected_status=any Sends a POST request on a previously created HTTP Session. 45s Pauses the test executed for the given time. ${resp} anon /api/auth/setup json=${payload} expected_status=any Sends a POST request on a previously created HTTP Session. ${json} = {'detail': 'Master password already configured'} ${json} ${resp.text} Convert String to JSON object ${detail} = ['Master password already configured'] ${detail} ${json} $.detail Get Value From JSON using JSONPath Setup failed with 400: ${detail} Fails the test with the given message and optionally alters its tags. ${resp.status_code} 201 Fails if objects are unequal after converting them to integers. Unexpected status ${resp.status_code} from /api/auth/setup Fails the test with the given message and optionally alters its tags. Configure the master password via the setup endpoint. Creating Session using : alias=anon, url=http://127.0.0.1:8765, headers={}, cookies={}, auth=None, timeout=None, proxies=None, verify=False, debug=0 anon ${BASE_URL} Create Session: create a HTTP session to a server Create an unauthenticated HTTP session. 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 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} ${resp} = <Response [200]> ${resp} anon /api/auth/status expected_status=200 Sends a GET request on a previously created HTTP Session. ${json} = {'configured': True, 'authenticated': False} ${json} ${resp.text} Convert String to JSON object ${configured} = [True] ${configured} ${json} $.configured Get Value From JSON using JSONPath ${configured_val} = True ${configured_val} ${configured}[0] Returns the given values which can then be assigned to a variables. ${configured_val} ${configured} = True ${configured} Check if the master password has already been configured. Configure the master password via the setup endpoint. ${token} Log in with the master password and return the JWT access token. auth ${BASE_URL} headers={'Authorization': 'Bearer ${token}'} Create Session: create a HTTP session to a server ${token} Log in with the master password and return the JWT access token. auth ${BASE_URL} headers={'Authorization': 'Bearer ${token}'} Create Session: create a HTTP session to a server 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 auth ${BASE_URL} headers={'Authorization': 'Bearer ${TOKEN}'} Create Session: create a HTTP session to a server Create an authenticated HTTP session. Performs setup if needed, then logs in. Skips setup/login if already authenticated (suite-level setup done). Create Anonymous Session AND Setup Master Password AND Create Authenticated Session Executes all the given keywords in a sequence. ${schedule_days} = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'] ${schedule_days} mon tue wed thu fri sat sun Returns a list containing given items. ${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... ${payload} 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": {}}''') modules=json Evaluates the given expression in Python and returns the result. ${resp} ${session} ${endpoint} expected_status=${expected_status} Sends a POST request on a previously created HTTP Session. 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": {}}' 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":[]} ${resp} = <Response [200]> ${resp} ${session} ${endpoint} json=${payload} expected_status=${expected_status} Sends a POST request on a previously created HTTP Session. ${resp} ${resp} = <Response [200]> ${resp} /api/config/validate ${payload} ${expected_status} Perform an authenticated POST request with optional JSON payload. ${resp} ${resp} = <Response [200]> ${resp} ${payload} 200 POST /api/config/validate with the given payload. Argument types are: <class 'int'> <class 'str'> ${response.status_code} ${expected_status} Fails if objects are unequal after converting them to integers. ${resp} 200 Assert that the response status code matches the expected value. ${json} = {'valid': True, 'errors': []} ${json} ${response.text} Convert String to JSON object ${values} = [True] ${values} ${json} ${json_path} Get Value From JSON using JSONPath ${value} = True ${value} ${values}[0] Returns the given values which can then be assigned to a variables. ${value} ${valid} = True ${valid} ${resp} $.valid Extract a value from a JSON response using JSONPath. Argument types are: <class 'bool'> <class 'str'> ${valid} True Fails if objects are unequal after converting them to strings. Deleting All Sessions Removes all the session objects Validate a well-formed configuration. Creating Session using : alias=anon, url=http://127.0.0.1:8765, headers={}, cookies={}, auth=None, timeout=None, proxies=None, verify=False, debug=0 anon ${BASE_URL} Create Session: create a HTTP session to a server Create an unauthenticated HTTP session. ${payload} = {'master_password': 'TestPass123!', 'anime_directory': '/tmp/aniworld_test_anime', 'name': 'AniworldTest', 'data_dir': 'data', 'scheduler_enabled': 'False', 'logging_level': 'INFO', 'backup_enabled': ... ${payload} master_password=${SETUP_PASSWORD} anime_directory=/tmp/aniworld_test_anime name=AniworldTest data_dir=data scheduler_enabled=False logging_level=INFO backup_enabled=False Creates and returns a dictionary based on the given ``items``. 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"}' 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"} ${resp} = <Response [400]> ${resp} anon /api/auth/setup json=${payload} expected_status=any Sends a POST request on a previously created HTTP Session. 45s Pauses the test executed for the given time. ${resp} anon /api/auth/setup json=${payload} expected_status=any Sends a POST request on a previously created HTTP Session. 45s Pauses the test executed for the given time. ${resp} anon /api/auth/setup json=${payload} expected_status=any Sends a POST request on a previously created HTTP Session. ${json} = {'detail': 'Master password already configured'} ${json} ${resp.text} Convert String to JSON object ${detail} = ['Master password already configured'] ${detail} ${json} $.detail Get Value From JSON using JSONPath Setup failed with 400: ${detail} Fails the test with the given message and optionally alters its tags. ${resp.status_code} 201 Fails if objects are unequal after converting them to integers. Unexpected status ${resp.status_code} from /api/auth/setup Fails the test with the given message and optionally alters its tags. Configure the master password via the setup endpoint. Creating Session using : alias=anon, url=http://127.0.0.1:8765, headers={}, cookies={}, auth=None, timeout=None, proxies=None, verify=False, debug=0 anon ${BASE_URL} Create Session: create a HTTP session to a server Create an unauthenticated HTTP session. 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 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} ${resp} = <Response [200]> ${resp} anon /api/auth/status expected_status=200 Sends a GET request on a previously created HTTP Session. ${json} = {'configured': True, 'authenticated': False} ${json} ${resp.text} Convert String to JSON object ${configured} = [True] ${configured} ${json} $.configured Get Value From JSON using JSONPath ${configured_val} = True ${configured_val} ${configured}[0] Returns the given values which can then be assigned to a variables. ${configured_val} ${configured} = True ${configured} Check if the master password has already been configured. Configure the master password via the setup endpoint. ${token} Log in with the master password and return the JWT access token. auth ${BASE_URL} headers={'Authorization': 'Bearer ${token}'} Create Session: create a HTTP session to a server ${token} Log in with the master password and return the JWT access token. auth ${BASE_URL} headers={'Authorization': 'Bearer ${token}'} Create Session: create a HTTP session to a server 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 auth ${BASE_URL} headers={'Authorization': 'Bearer ${TOKEN}'} Create Session: create a HTTP session to a server Create an authenticated HTTP session. Performs setup if needed, then logs in. Skips setup/login if already authenticated (suite-level setup done). Create Anonymous Session AND Setup Master Password AND Create Authenticated Session Executes all the given keywords in a sequence. ${payload} = {'data_dir': 'data', 'scheduler': "{'enabled': True, 'schedule_time': '03:00', 'schedule_days': ['mon']}", 'logging': "{'level': 'INFO'}", 'backup': "{'enabled': False}", 'nfo': "{'auto_create': False... ${payload} data_dir=data scheduler={'enabled': True, 'schedule_time': '03:00', 'schedule_days': ['mon']} logging={'level': 'INFO'} backup={'enabled': False} nfo={'auto_create': False} other={} Creates and returns a dictionary based on the given ``items``. ${resp} ${session} ${endpoint} expected_status=${expected_status} Sends a POST request on a previously created HTTP Session. 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": "{}"}' 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"}]} ${resp} = <Response [422]> ${resp} ${session} ${endpoint} json=${payload} expected_status=${expected_status} Sends a POST request on a previously created HTTP Session. ${resp} ${resp} = <Response [422]> ${resp} /api/config/validate ${payload} ${expected_status} Perform an authenticated POST request with optional JSON payload. ${resp} ${resp} = <Response [422]> ${resp} ${payload} 422 POST /api/config/validate with the given payload. Argument types are: <class 'int'> <class 'str'> ${response.status_code} ${expected_status} Fails if objects are unequal after converting them to integers. ${resp} 422 Assert that the response status code matches the expected value. Deleting All Sessions Removes all the session objects Validate a config missing the required 'name' field. Creating Session using : alias=anon, url=http://127.0.0.1:8765, headers={}, cookies={}, auth=None, timeout=None, proxies=None, verify=False, debug=0 anon ${BASE_URL} Create Session: create a HTTP session to a server Create an unauthenticated HTTP session. ${payload} = {'master_password': 'TestPass123!', 'anime_directory': '/tmp/aniworld_test_anime', 'name': 'AniworldTest', 'data_dir': 'data', 'scheduler_enabled': 'False', 'logging_level': 'INFO', 'backup_enabled': ... ${payload} master_password=${SETUP_PASSWORD} anime_directory=/tmp/aniworld_test_anime name=AniworldTest data_dir=data scheduler_enabled=False logging_level=INFO backup_enabled=False Creates and returns a dictionary based on the given ``items``. 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"}' 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"} ${resp} = <Response [400]> ${resp} anon /api/auth/setup json=${payload} expected_status=any Sends a POST request on a previously created HTTP Session. 45s Pauses the test executed for the given time. ${resp} anon /api/auth/setup json=${payload} expected_status=any Sends a POST request on a previously created HTTP Session. 45s Pauses the test executed for the given time. ${resp} anon /api/auth/setup json=${payload} expected_status=any Sends a POST request on a previously created HTTP Session. ${json} = {'detail': 'Master password already configured'} ${json} ${resp.text} Convert String to JSON object ${detail} = ['Master password already configured'] ${detail} ${json} $.detail Get Value From JSON using JSONPath Setup failed with 400: ${detail} Fails the test with the given message and optionally alters its tags. ${resp.status_code} 201 Fails if objects are unequal after converting them to integers. Unexpected status ${resp.status_code} from /api/auth/setup Fails the test with the given message and optionally alters its tags. Configure the master password via the setup endpoint. Creating Session using : alias=anon, url=http://127.0.0.1:8765, headers={}, cookies={}, auth=None, timeout=None, proxies=None, verify=False, debug=0 anon ${BASE_URL} Create Session: create a HTTP session to a server Create an unauthenticated HTTP session. 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 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} ${resp} = <Response [200]> ${resp} anon /api/auth/status expected_status=200 Sends a GET request on a previously created HTTP Session. ${json} = {'configured': True, 'authenticated': False} ${json} ${resp.text} Convert String to JSON object ${configured} = [True] ${configured} ${json} $.configured Get Value From JSON using JSONPath ${configured_val} = True ${configured_val} ${configured}[0] Returns the given values which can then be assigned to a variables. ${configured_val} ${configured} = True ${configured} Check if the master password has already been configured. Configure the master password via the setup endpoint. ${token} Log in with the master password and return the JWT access token. auth ${BASE_URL} headers={'Authorization': 'Bearer ${token}'} Create Session: create a HTTP session to a server ${token} Log in with the master password and return the JWT access token. auth ${BASE_URL} headers={'Authorization': 'Bearer ${token}'} Create Session: create a HTTP session to a server 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 auth ${BASE_URL} headers={'Authorization': 'Bearer ${TOKEN}'} Create Session: create a HTTP session to a server Create an authenticated HTTP session. Performs setup if needed, then logs in. Skips setup/login if already authenticated (suite-level setup done). Create Anonymous Session AND Setup Master Password AND Create Authenticated Session Executes all the given keywords in a sequence. ${payload} = {'name': 'Aniworld', 'data_dir': 'data', 'scheduler': "{'enabled': True, 'schedule_time': '25:00', 'schedule_days': ['mon']}", 'logging': "{'level': 'INFO'}", 'backup': "{'enabled': False}", 'nfo': "{... ${payload} 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={} Creates and returns a dictionary based on the given ``items``. ${resp} ${session} ${endpoint} expected_status=${expected_status} Sends a POST request on a previously created HTTP Session. 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": "{}"}' 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"}]} ${resp} = <Response [422]> ${resp} ${session} ${endpoint} json=${payload} expected_status=${expected_status} Sends a POST request on a previously created HTTP Session. ${resp} ${resp} = <Response [422]> ${resp} /api/config/validate ${payload} ${expected_status} Perform an authenticated POST request with optional JSON payload. ${resp} ${resp} = <Response [422]> ${resp} ${payload} 422 POST /api/config/validate with the given payload. Argument types are: <class 'int'> <class 'str'> ${response.status_code} ${expected_status} Fails if objects are unequal after converting them to integers. ${resp} 422 Assert that the response status code matches the expected value. Deleting All Sessions Removes all the session objects Validate a config with malformed schedule_time. Creating Session using : alias=anon, url=http://127.0.0.1:8765, headers={}, cookies={}, auth=None, timeout=None, proxies=None, verify=False, debug=0 anon ${BASE_URL} Create Session: create a HTTP session to a server Create an unauthenticated HTTP session. ${payload} = {'master_password': 'TestPass123!', 'anime_directory': '/tmp/aniworld_test_anime', 'name': 'AniworldTest', 'data_dir': 'data', 'scheduler_enabled': 'False', 'logging_level': 'INFO', 'backup_enabled': ... ${payload} master_password=${SETUP_PASSWORD} anime_directory=/tmp/aniworld_test_anime name=AniworldTest data_dir=data scheduler_enabled=False logging_level=INFO backup_enabled=False Creates and returns a dictionary based on the given ``items``. 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"}' 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"} ${resp} = <Response [400]> ${resp} anon /api/auth/setup json=${payload} expected_status=any Sends a POST request on a previously created HTTP Session. 45s Pauses the test executed for the given time. ${resp} anon /api/auth/setup json=${payload} expected_status=any Sends a POST request on a previously created HTTP Session. 45s Pauses the test executed for the given time. ${resp} anon /api/auth/setup json=${payload} expected_status=any Sends a POST request on a previously created HTTP Session. ${json} = {'detail': 'Master password already configured'} ${json} ${resp.text} Convert String to JSON object ${detail} = ['Master password already configured'] ${detail} ${json} $.detail Get Value From JSON using JSONPath Setup failed with 400: ${detail} Fails the test with the given message and optionally alters its tags. ${resp.status_code} 201 Fails if objects are unequal after converting them to integers. Unexpected status ${resp.status_code} from /api/auth/setup Fails the test with the given message and optionally alters its tags. Configure the master password via the setup endpoint. Creating Session using : alias=anon, url=http://127.0.0.1:8765, headers={}, cookies={}, auth=None, timeout=None, proxies=None, verify=False, debug=0 anon ${BASE_URL} Create Session: create a HTTP session to a server Create an unauthenticated HTTP session. 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 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} ${resp} = <Response [200]> ${resp} anon /api/auth/status expected_status=200 Sends a GET request on a previously created HTTP Session. ${json} = {'configured': True, 'authenticated': False} ${json} ${resp.text} Convert String to JSON object ${configured} = [True] ${configured} ${json} $.configured Get Value From JSON using JSONPath ${configured_val} = True ${configured_val} ${configured}[0] Returns the given values which can then be assigned to a variables. ${configured_val} ${configured} = True ${configured} Check if the master password has already been configured. Configure the master password via the setup endpoint. ${token} Log in with the master password and return the JWT access token. auth ${BASE_URL} headers={'Authorization': 'Bearer ${token}'} Create Session: create a HTTP session to a server ${token} Log in with the master password and return the JWT access token. auth ${BASE_URL} headers={'Authorization': 'Bearer ${token}'} Create Session: create a HTTP session to a server 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 auth ${BASE_URL} headers={'Authorization': 'Bearer ${TOKEN}'} Create Session: create a HTTP session to a server Create an authenticated HTTP session. Performs setup if needed, then logs in. Skips setup/login if already authenticated (suite-level setup done). Create Anonymous Session AND Setup Master Password AND Create Authenticated Session Executes all the given keywords in a sequence. ${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... ${payload} 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": {}}''') modules=json Evaluates the given expression in Python and returns the result. ${resp} ${session} ${endpoint} expected_status=${expected_status} Sends a POST request on a previously created HTTP Session. 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": {}}' 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"}]} ${resp} = <Response [422]> ${resp} ${session} ${endpoint} json=${payload} expected_status=${expected_status} Sends a POST request on a previously created HTTP Session. ${resp} ${resp} = <Response [422]> ${resp} /api/config/validate ${payload} ${expected_status} Perform an authenticated POST request with optional JSON payload. ${resp} ${resp} = <Response [422]> ${resp} ${payload} 422 POST /api/config/validate with the given payload. Argument types are: <class 'int'> <class 'str'> ${response.status_code} ${expected_status} Fails if objects are unequal after converting them to integers. ${resp} 422 Assert that the response status code matches the expected value. Deleting All Sessions Removes all the session objects Validate a config with an invalid logging level. Creating Session using : alias=anon, url=http://127.0.0.1:8765, headers={}, cookies={}, auth=None, timeout=None, proxies=None, verify=False, debug=0 anon ${BASE_URL} Create Session: create a HTTP session to a server Create an unauthenticated HTTP session. ${payload} = {'master_password': 'TestPass123!', 'anime_directory': '/tmp/aniworld_test_anime', 'name': 'AniworldTest', 'data_dir': 'data', 'scheduler_enabled': 'False', 'logging_level': 'INFO', 'backup_enabled': ... ${payload} master_password=${SETUP_PASSWORD} anime_directory=/tmp/aniworld_test_anime name=AniworldTest data_dir=data scheduler_enabled=False logging_level=INFO backup_enabled=False Creates and returns a dictionary based on the given ``items``. 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"}' 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"} ${resp} = <Response [400]> ${resp} anon /api/auth/setup json=${payload} expected_status=any Sends a POST request on a previously created HTTP Session. 45s Pauses the test executed for the given time. ${resp} anon /api/auth/setup json=${payload} expected_status=any Sends a POST request on a previously created HTTP Session. 45s Pauses the test executed for the given time. ${resp} anon /api/auth/setup json=${payload} expected_status=any Sends a POST request on a previously created HTTP Session. ${json} = {'detail': 'Master password already configured'} ${json} ${resp.text} Convert String to JSON object ${detail} = ['Master password already configured'] ${detail} ${json} $.detail Get Value From JSON using JSONPath Setup failed with 400: ${detail} Fails the test with the given message and optionally alters its tags. ${resp.status_code} 201 Fails if objects are unequal after converting them to integers. Unexpected status ${resp.status_code} from /api/auth/setup Fails the test with the given message and optionally alters its tags. Configure the master password via the setup endpoint. Creating Session using : alias=anon, url=http://127.0.0.1:8765, headers={}, cookies={}, auth=None, timeout=None, proxies=None, verify=False, debug=0 anon ${BASE_URL} Create Session: create a HTTP session to a server Create an unauthenticated HTTP session. 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 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} ${resp} = <Response [200]> ${resp} anon /api/auth/status expected_status=200 Sends a GET request on a previously created HTTP Session. ${json} = {'configured': True, 'authenticated': False} ${json} ${resp.text} Convert String to JSON object ${configured} = [True] ${configured} ${json} $.configured Get Value From JSON using JSONPath ${configured_val} = True ${configured_val} ${configured}[0] Returns the given values which can then be assigned to a variables. ${configured_val} ${configured} = True ${configured} Check if the master password has already been configured. Configure the master password via the setup endpoint. ${token} Log in with the master password and return the JWT access token. auth ${BASE_URL} headers={'Authorization': 'Bearer ${token}'} Create Session: create a HTTP session to a server ${token} Log in with the master password and return the JWT access token. auth ${BASE_URL} headers={'Authorization': 'Bearer ${token}'} Create Session: create a HTTP session to a server 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 auth ${BASE_URL} headers={'Authorization': 'Bearer ${TOKEN}'} Create Session: create a HTTP session to a server Create an authenticated HTTP session. Performs setup if needed, then logs in. Skips setup/login if already authenticated (suite-level setup done). Create Anonymous Session AND Setup Master Password AND Create Authenticated Session Executes all the given keywords in a sequence. 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 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"} ${resp} = <Response [201]> ${resp} ${session} ${endpoint} expected_status=${expected_status} Sends a POST request on a previously created HTTP Session. ${resp} ${session} ${endpoint} json=${payload} expected_status=${expected_status} Sends a POST request on a previously created HTTP Session. ${resp} ${resp} = <Response [201]> ${resp} /api/config/backups expected_status=201 Perform an authenticated POST request with optional JSON payload. Argument types are: <class 'int'> <class 'str'> ${response.status_code} ${expected_status} Fails if objects are unequal after converting them to integers. ${resp} 201 Assert that the response status code matches the expected value. Deleting All Sessions Removes all the session objects Create a configuration backup and verify it exists. Creating Session using : alias=anon, url=http://127.0.0.1:8765, headers={}, cookies={}, auth=None, timeout=None, proxies=None, verify=False, debug=0 anon ${BASE_URL} Create Session: create a HTTP session to a server Create an unauthenticated HTTP session. ${payload} = {'master_password': 'TestPass123!', 'anime_directory': '/tmp/aniworld_test_anime', 'name': 'AniworldTest', 'data_dir': 'data', 'scheduler_enabled': 'False', 'logging_level': 'INFO', 'backup_enabled': ... ${payload} master_password=${SETUP_PASSWORD} anime_directory=/tmp/aniworld_test_anime name=AniworldTest data_dir=data scheduler_enabled=False logging_level=INFO backup_enabled=False Creates and returns a dictionary based on the given ``items``. 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"}' 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"} ${resp} = <Response [400]> ${resp} anon /api/auth/setup json=${payload} expected_status=any Sends a POST request on a previously created HTTP Session. 45s Pauses the test executed for the given time. ${resp} anon /api/auth/setup json=${payload} expected_status=any Sends a POST request on a previously created HTTP Session. 45s Pauses the test executed for the given time. ${resp} anon /api/auth/setup json=${payload} expected_status=any Sends a POST request on a previously created HTTP Session. ${json} = {'detail': 'Master password already configured'} ${json} ${resp.text} Convert String to JSON object ${detail} = ['Master password already configured'] ${detail} ${json} $.detail Get Value From JSON using JSONPath Setup failed with 400: ${detail} Fails the test with the given message and optionally alters its tags. ${resp.status_code} 201 Fails if objects are unequal after converting them to integers. Unexpected status ${resp.status_code} from /api/auth/setup Fails the test with the given message and optionally alters its tags. Configure the master password via the setup endpoint. Creating Session using : alias=anon, url=http://127.0.0.1:8765, headers={}, cookies={}, auth=None, timeout=None, proxies=None, verify=False, debug=0 anon ${BASE_URL} Create Session: create a HTTP session to a server Create an unauthenticated HTTP session. 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 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} ${resp} = <Response [200]> ${resp} anon /api/auth/status expected_status=200 Sends a GET request on a previously created HTTP Session. ${json} = {'configured': True, 'authenticated': False} ${json} ${resp.text} Convert String to JSON object ${configured} = [True] ${configured} ${json} $.configured Get Value From JSON using JSONPath ${configured_val} = True ${configured_val} ${configured}[0] Returns the given values which can then be assigned to a variables. ${configured_val} ${configured} = True ${configured} Check if the master password has already been configured. Configure the master password via the setup endpoint. ${token} Log in with the master password and return the JWT access token. auth ${BASE_URL} headers={'Authorization': 'Bearer ${token}'} Create Session: create a HTTP session to a server ${token} Log in with the master password and return the JWT access token. auth ${BASE_URL} headers={'Authorization': 'Bearer ${token}'} Create Session: create a HTTP session to a server 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 auth ${BASE_URL} headers={'Authorization': 'Bearer ${TOKEN}'} Create Session: create a HTTP session to a server Create an authenticated HTTP session. Performs setup if needed, then logs in. Skips setup/login if already authenticated (suite-level setup done). Create Anonymous Session AND Setup Master Password AND Create Authenticated Session Executes all the given keywords in a sequence. 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 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"} ${resp} = <Response [201]> ${resp} ${session} ${endpoint} expected_status=${expected_status} Sends a POST request on a previously created HTTP Session. ${resp} ${session} ${endpoint} json=${payload} expected_status=${expected_status} Sends a POST request on a previously created HTTP Session. ${resp} /api/config/backups expected_status=201 Perform an authenticated POST request with optional JSON payload. 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 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"}]} ${resp} = <Response [200]> ${resp} ${session} ${endpoint} expected_status=${expected_status} Sends a GET request on a previously created HTTP Session. ${resp} ${resp} = <Response [200]> ${resp} /api/config/backups Perform an authenticated GET request and return the response. Argument types are: <class 'int'> <class 'str'> ${response.status_code} ${expected_status} Fails if objects are unequal after converting them to integers. ${resp} 200 Assert that the response status code matches the expected value. ${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... ${json} ${response.text} Convert String to JSON object ${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... ${values} ${json} ${json_path} Get Value From JSON using JSONPath Length is 1. ${values} Expected JSON path '${json_path}' not found in response Verifies that the given item is not empty. ${resp} $.backups Assert that the JSON response contains the given JSONPath key. Deleting All Sessions Removes all the session objects List configuration backups and verify the response structure. Creating Session using : alias=anon, url=http://127.0.0.1:8765, headers={}, cookies={}, auth=None, timeout=None, proxies=None, verify=False, debug=0 anon ${BASE_URL} Create Session: create a HTTP session to a server Create an unauthenticated HTTP session. ${payload} = {'master_password': 'TestPass123!', 'anime_directory': '/tmp/aniworld_test_anime', 'name': 'AniworldTest', 'data_dir': 'data', 'scheduler_enabled': 'False', 'logging_level': 'INFO', 'backup_enabled': ... ${payload} master_password=${SETUP_PASSWORD} anime_directory=/tmp/aniworld_test_anime name=AniworldTest data_dir=data scheduler_enabled=False logging_level=INFO backup_enabled=False Creates and returns a dictionary based on the given ``items``. 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"}' 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"} ${resp} = <Response [400]> ${resp} anon /api/auth/setup json=${payload} expected_status=any Sends a POST request on a previously created HTTP Session. 45s Pauses the test executed for the given time. ${resp} anon /api/auth/setup json=${payload} expected_status=any Sends a POST request on a previously created HTTP Session. 45s Pauses the test executed for the given time. ${resp} anon /api/auth/setup json=${payload} expected_status=any Sends a POST request on a previously created HTTP Session. ${json} = {'detail': 'Master password already configured'} ${json} ${resp.text} Convert String to JSON object ${detail} = ['Master password already configured'] ${detail} ${json} $.detail Get Value From JSON using JSONPath Setup failed with 400: ${detail} Fails the test with the given message and optionally alters its tags. ${resp.status_code} 201 Fails if objects are unequal after converting them to integers. Unexpected status ${resp.status_code} from /api/auth/setup Fails the test with the given message and optionally alters its tags. Configure the master password via the setup endpoint. Creating Session using : alias=anon, url=http://127.0.0.1:8765, headers={}, cookies={}, auth=None, timeout=None, proxies=None, verify=False, debug=0 anon ${BASE_URL} Create Session: create a HTTP session to a server Create an unauthenticated HTTP session. 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 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} ${resp} = <Response [200]> ${resp} anon /api/auth/status expected_status=200 Sends a GET request on a previously created HTTP Session. ${json} = {'configured': True, 'authenticated': False} ${json} ${resp.text} Convert String to JSON object ${configured} = [True] ${configured} ${json} $.configured Get Value From JSON using JSONPath ${configured_val} = True ${configured_val} ${configured}[0] Returns the given values which can then be assigned to a variables. ${configured_val} ${configured} = True ${configured} Check if the master password has already been configured. Configure the master password via the setup endpoint. ${token} Log in with the master password and return the JWT access token. auth ${BASE_URL} headers={'Authorization': 'Bearer ${token}'} Create Session: create a HTTP session to a server ${token} Log in with the master password and return the JWT access token. auth ${BASE_URL} headers={'Authorization': 'Bearer ${token}'} Create Session: create a HTTP session to a server 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 auth ${BASE_URL} headers={'Authorization': 'Bearer ${TOKEN}'} Create Session: create a HTTP session to a server Create an authenticated HTTP session. Performs setup if needed, then logs in. Skips setup/login if already authenticated (suite-level setup done). Create Anonymous Session AND Setup Master Password AND Create Authenticated Session Executes all the given keywords in a sequence. 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 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"} ${resp} = <Response [201]> ${resp} ${session} ${endpoint} expected_status=${expected_status} Sends a POST request on a previously created HTTP Session. ${resp} ${session} ${endpoint} json=${payload} expected_status=${expected_status} Sends a POST request on a previously created HTTP Session. ${resp} ${resp} = <Response [201]> ${resp} /api/config/backups expected_status=201 Perform an authenticated POST request with optional JSON payload. ${json} = {'name': 'config_backup_20260627_135523.json', 'message': 'Backup created successfully'} ${json} ${resp.text} Convert String to JSON object ${backup_name} = ['config_backup_20260627_135523.json'] ${backup_name} ${json} $.name Get Value From JSON using JSONPath ${name_before} = config_backup_20260627_135523.json ${name_before} ${backup_name}[0] Returns the given values which can then be assigned to a variables. ${scheduler} = {'enabled': False, 'schedule_time': '03:00', 'schedule_days': ['mon']} ${scheduler} {'enabled': False, 'schedule_time': '03:00', 'schedule_days': ['mon']} Evaluates the given expression in Python and returns the result. ${logging} = {'level': 'INFO', 'file': None, 'max_bytes': None, 'backup_count': 3} ${logging} {'level': 'INFO', 'file': None, 'max_bytes': None, 'backup_count': 3} Evaluates the given expression in Python and returns the result. ${backup} = {'enabled': False} ${backup} {'enabled': False} Evaluates the given expression in Python and returns the result. ${nfo} = {'auto_create': False} ${nfo} {'auto_create': False} Evaluates the given expression in Python and returns the result. ${other} = {} ${other} {} Evaluates the given expression in Python and returns the result. ${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... ${payload} name=BeforeRestore data_dir=data scheduler=${scheduler} logging=${logging} backup=${backup} nfo=${nfo} other=${other} Creates and returns a dictionary based on the given ``items``. 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": {}}' 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"}} ${resp} = <Response [200]> ${resp} ${session} ${endpoint} json=${payload} expected_status=${expected_status} Sends a PUT request on a previously created HTTP Session. ${resp} ${resp} = <Response [200]> ${resp} /api/config ${payload} Perform an authenticated PUT request with JSON payload. ${resp} ${payload} PUT /api/config with the given payload. 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 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"}} ${resp} = <Response [200]> ${resp} ${session} ${endpoint} expected_status=${expected_status} Sends a POST request on a previously created HTTP Session. ${resp} ${session} ${endpoint} json=${payload} expected_status=${expected_status} Sends a POST request on a previously created HTTP Session. ${resp} ${resp} = <Response [200]> ${resp} /api/config/backups/${name_before}/restore Perform an authenticated POST request with optional JSON payload. Argument types are: <class 'int'> <class 'str'> ${response.status_code} ${expected_status} Fails if objects are unequal after converting them to integers. ${resp} 200 Assert that the response status code matches the expected value. Deleting All Sessions Removes all the session objects Create a backup, change config, then restore and verify reversion. Creating Session using : alias=anon, url=http://127.0.0.1:8765, headers={}, cookies={}, auth=None, timeout=None, proxies=None, verify=False, debug=0 anon ${BASE_URL} Create Session: create a HTTP session to a server Create an unauthenticated HTTP session. ${payload} = {'master_password': 'TestPass123!', 'anime_directory': '/tmp/aniworld_test_anime', 'name': 'AniworldTest', 'data_dir': 'data', 'scheduler_enabled': 'False', 'logging_level': 'INFO', 'backup_enabled': ... ${payload} master_password=${SETUP_PASSWORD} anime_directory=/tmp/aniworld_test_anime name=AniworldTest data_dir=data scheduler_enabled=False logging_level=INFO backup_enabled=False Creates and returns a dictionary based on the given ``items``. 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"}' 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"} ${resp} = <Response [400]> ${resp} anon /api/auth/setup json=${payload} expected_status=any Sends a POST request on a previously created HTTP Session. 45s Pauses the test executed for the given time. ${resp} anon /api/auth/setup json=${payload} expected_status=any Sends a POST request on a previously created HTTP Session. 45s Pauses the test executed for the given time. ${resp} anon /api/auth/setup json=${payload} expected_status=any Sends a POST request on a previously created HTTP Session. ${json} = {'detail': 'Master password already configured'} ${json} ${resp.text} Convert String to JSON object ${detail} = ['Master password already configured'] ${detail} ${json} $.detail Get Value From JSON using JSONPath Setup failed with 400: ${detail} Fails the test with the given message and optionally alters its tags. ${resp.status_code} 201 Fails if objects are unequal after converting them to integers. Unexpected status ${resp.status_code} from /api/auth/setup Fails the test with the given message and optionally alters its tags. Configure the master password via the setup endpoint. Creating Session using : alias=anon, url=http://127.0.0.1:8765, headers={}, cookies={}, auth=None, timeout=None, proxies=None, verify=False, debug=0 anon ${BASE_URL} Create Session: create a HTTP session to a server Create an unauthenticated HTTP session. 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 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} ${resp} = <Response [200]> ${resp} anon /api/auth/status expected_status=200 Sends a GET request on a previously created HTTP Session. ${json} = {'configured': True, 'authenticated': False} ${json} ${resp.text} Convert String to JSON object ${configured} = [True] ${configured} ${json} $.configured Get Value From JSON using JSONPath ${configured_val} = True ${configured_val} ${configured}[0] Returns the given values which can then be assigned to a variables. ${configured_val} ${configured} = True ${configured} Check if the master password has already been configured. Configure the master password via the setup endpoint. ${token} Log in with the master password and return the JWT access token. auth ${BASE_URL} headers={'Authorization': 'Bearer ${token}'} Create Session: create a HTTP session to a server ${token} Log in with the master password and return the JWT access token. auth ${BASE_URL} headers={'Authorization': 'Bearer ${token}'} Create Session: create a HTTP session to a server 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 auth ${BASE_URL} headers={'Authorization': 'Bearer ${TOKEN}'} Create Session: create a HTTP session to a server Create an authenticated HTTP session. Performs setup if needed, then logs in. Skips setup/login if already authenticated (suite-level setup done). Create Anonymous Session AND Setup Master Password AND Create Authenticated Session Executes all the given keywords in a sequence. 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 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"} ${resp} = <Response [201]> ${resp} ${session} ${endpoint} expected_status=${expected_status} Sends a POST request on a previously created HTTP Session. ${resp} ${session} ${endpoint} json=${payload} expected_status=${expected_status} Sends a POST request on a previously created HTTP Session. ${resp} ${resp} = <Response [201]> ${resp} /api/config/backups expected_status=201 Perform an authenticated POST request with optional JSON payload. ${json} = {'name': 'config_backup_20260627_135523.json', 'message': 'Backup created successfully'} ${json} ${resp.text} Convert String to JSON object ${backup_name} = ['config_backup_20260627_135523.json'] ${backup_name} ${json} $.name Get Value From JSON using JSONPath ${name} = config_backup_20260627_135523.json ${name} ${backup_name}[0] Returns the given values which can then be assigned to a variables. 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 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"} ${resp} = <Response [200]> ${resp} ${session} ${endpoint} expected_status=${expected_status} Sends a DELETE request on a previously created HTTP Session. ${resp} ${del_resp} = <Response [200]> ${del_resp} /api/config/backups/${name} Perform an authenticated DELETE request. Argument types are: <class 'int'> <class 'str'> ${response.status_code} ${expected_status} Fails if objects are unequal after converting them to integers. ${del_resp} 200 Assert that the response status code matches the expected value. Deleting All Sessions Removes all the session objects Create a backup and then delete it. Configuration API tests for Aniworld. Covers get, update, validate, backup create/list/restore/delete, and export/import. All Tests Config