ci: add GitHub Actions CI pipeline for backend and frontend tests#20
Open
hayka-pacha wants to merge 1 commit into
Open
ci: add GitHub Actions CI pipeline for backend and frontend tests#20hayka-pacha wants to merge 1 commit into
hayka-pacha wants to merge 1 commit into
Conversation
- Backend job: Python 3.12, installs deps excluding cloakbrowser (custom binary), runs pytest with conftest.py mocking cloakbrowser via sys.modules - Frontend job: Node 20, npm ci, build, and vitest - Triggers on push to main and PRs to main
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Adds automated CI testing for every PR and push to main.
Changes
platform linux -- Python 3.11.15, pytest-9.0.3, pluggy-1.6.0 -- /home/ubuntu/venv-nodriver/bin/python3.11
cachedir: .pytest_cache
rootdir: /home/ubuntu/CloakBrowser-Manager
configfile: pyproject.toml
plugins: asyncio-1.3.0, anyio-4.13.0
asyncio: mode=Mode.AUTO, debug=False, asyncio_default_fixture_loop_scope=None, asyncio_default_test_loop_scope=function
collecting ... collected 192 items
backend/tests/test_api.py::test_list_profiles_empty PASSED [ 0%]
backend/tests/test_api.py::test_create_profile PASSED [ 1%]
backend/tests/test_api.py::test_create_profile_with_all_fields PASSED [ 1%]
backend/tests/test_api.py::test_create_profile_invalid_platform PASSED [ 2%]
backend/tests/test_api.py::test_get_profile PASSED [ 2%]
backend/tests/test_api.py::test_get_profile_not_found PASSED [ 3%]
backend/tests/test_api.py::test_update_profile PASSED [ 3%]
backend/tests/test_api.py::test_update_profile_not_found PASSED [ 4%]
backend/tests/test_api.py::test_delete_profile PASSED [ 4%]
backend/tests/test_api.py::test_delete_profile_not_found PASSED [ 5%]
backend/tests/test_api.py::test_delete_profile_stops_running PASSED [ 5%]
backend/tests/test_api.py::test_get_profile_status_stopped PASSED [ 6%]
backend/tests/test_api.py::test_get_profile_status_not_found PASSED [ 6%]
backend/tests/test_api.py::test_launch_not_found PASSED [ 7%]
backend/tests/test_api.py::test_launch_already_running PASSED [ 7%]
backend/tests/test_api.py::test_launch_invalid_proxy_400 PASSED [ 8%]
backend/tests/test_api.py::test_launch_failure_500 PASSED [ 8%]
backend/tests/test_api.py::test_stop_not_running PASSED [ 9%]
backend/tests/test_api.py::test_system_status PASSED [ 9%]
backend/tests/test_api.py::test_profile_launch_args_default_empty PASSED [ 10%]
backend/tests/test_api.py::test_profile_launch_args_create PASSED [ 10%]
backend/tests/test_api.py::test_profile_launch_args_update PASSED [ 11%]
backend/tests/test_api.py::test_profile_launch_args_get PASSED [ 11%]
backend/tests/test_api.py::test_profile_clipboard_sync_default_true PASSED [ 12%]
backend/tests/test_api.py::test_profile_clipboard_sync_update PASSED [ 13%]
backend/tests/test_api.py::test_set_clipboard_not_running PASSED [ 13%]
backend/tests/test_api.py::test_get_clipboard_not_running PASSED [ 14%]
backend/tests/test_api.py::test_set_clipboard_success PASSED [ 14%]
backend/tests/test_api.py::test_get_clipboard_from_page PASSED [ 15%]
backend/tests/test_api.py::test_profile_response_has_status_field PASSED [ 15%]
backend/tests/test_api.py::test_profile_response_has_cdp_url_field PASSED [ 16%]
backend/tests/test_api.py::test_status_stopped_has_cdp_url_null PASSED [ 16%]
backend/tests/test_api.py::test_running_profile_has_cdp_url PASSED [ 17%]
backend/tests/test_api.py::test_cdp_json_version_not_running PASSED [ 17%]
backend/tests/test_api.py::test_cdp_json_list_not_running PASSED [ 18%]
backend/tests/test_api.py::test_cdp_json_version_rewrites_ws_url PASSED [ 18%]
backend/tests/test_api.py::test_cdp_json_version_uses_wss_behind_https PASSED [ 19%]
backend/tests/test_api.py::test_cdp_json_list_rewrites_page_urls PASSED [ 19%]
backend/tests/test_api.py::test_cdp_json_version_chrome_unreachable PASSED [ 20%]
backend/tests/test_api.py::test_vnc_ws_rejects_cross_origin PASSED [ 20%]
backend/tests/test_api.py::test_cdp_ws_rejects_cross_origin PASSED [ 21%]
backend/tests/test_api.py::test_ws_allows_same_origin PASSED [ 21%]
backend/tests/test_api.py::test_ws_allows_no_origin PASSED [ 22%]
backend/tests/test_api.py::test_reset_profile_not_found PASSED [ 22%]
backend/tests/test_api.py::test_reset_profile_returns_updated_profile PASSED [ 23%]
backend/tests/test_api.py::test_reset_profile_preserves_tags PASSED [ 23%]
backend/tests/test_api.py::test_reset_profile_stops_running PASSED [ 24%]
backend/tests/test_api.py::test_reset_profile_wipes_state_files PASSED [ 25%]
backend/tests/test_api.py::test_reset_profile_keeps_bookmarks PASSED [ 25%]
backend/tests/test_auth.py::test_no_auth_profiles_accessible PASSED [ 26%]
backend/tests/test_auth.py::test_no_auth_status_shows_not_required PASSED [ 26%]
backend/tests/test_auth.py::test_no_auth_login_noop PASSED [ 27%]
backend/tests/test_auth.py::test_auth_no_token_401 PASSED [ 27%]
backend/tests/test_auth.py::test_auth_wrong_bearer_401 PASSED [ 28%]
backend/tests/test_auth.py::test_auth_correct_bearer_200 PASSED [ 28%]
backend/tests/test_auth.py::test_auth_correct_cookie_200 PASSED [ 29%]
backend/tests/test_auth.py::test_auth_status_unauthenticated PASSED [ 29%]
backend/tests/test_auth.py::test_auth_status_authenticated PASSED [ 30%]
backend/tests/test_auth.py::test_login_correct_sets_cookie PASSED [ 30%]
backend/tests/test_auth.py::test_login_wrong_token_401 PASSED [ 31%]
backend/tests/test_auth.py::test_logout_clears_cookie PASSED [ 31%]
backend/tests/test_auth.py::test_healthcheck_always_accessible PASSED [ 32%]
backend/tests/test_auth.py::test_auth_status_always_accessible PASSED [ 32%]
backend/tests/test_browser_manager.py::test_normalize_already_http PASSED [ 33%]
backend/tests/test_browser_manager.py::test_normalize_already_https PASSED [ 33%]
backend/tests/test_browser_manager.py::test_normalize_already_socks5 PASSED [ 34%]
backend/tests/test_browser_manager.py::test_normalize_host_port_user_pass PASSED [ 34%]
backend/tests/test_browser_manager.py::test_normalize_host_port_only PASSED [ 35%]
backend/tests/test_browser_manager.py::test_normalize_three_parts PASSED [ 35%]
backend/tests/test_browser_manager.py::test_normalize_five_parts PASSED [ 36%]
backend/tests/test_browser_manager.py::test_normalize_empty_parts PASSED [ 36%]
backend/tests/test_browser_manager.py::test_validate_valid_http PASSED [ 37%]
backend/tests/test_browser_manager.py::test_validate_valid_socks5 PASSED [ 38%]
backend/tests/test_browser_manager.py::test_validate_valid_with_auth PASSED [ 38%]
backend/tests/test_browser_manager.py::test_validate_bad_scheme PASSED [ 39%]
backend/tests/test_browser_manager.py::test_validate_no_hostname PASSED [ 39%]
backend/tests/test_browser_manager.py::test_validate_no_port PASSED [ 40%]
backend/tests/test_browser_manager.py::test_build_args_always_includes_base PASSED [ 40%]
backend/tests/test_browser_manager.py::test_build_args_seed PASSED [ 41%]
backend/tests/test_browser_manager.py::test_build_args_no_seed PASSED [ 41%]
backend/tests/test_browser_manager.py::test_build_args_platform PASSED [ 42%]
backend/tests/test_browser_manager.py::test_build_args_gpu PASSED [ 42%]
backend/tests/test_browser_manager.py::test_build_args_hardware_concurrency PASSED [ 43%]
backend/tests/test_browser_manager.py::test_build_args_screen PASSED [ 43%]
backend/tests/test_browser_manager.py::test_build_args_empty_profile PASSED [ 44%]
backend/tests/test_browser_manager.py::test_launch_args_appended_to_fingerprint_args PASSED [ 44%]
backend/tests/test_browser_manager.py::test_launch_args_empty_no_effect PASSED [ 45%]
backend/tests/test_browser_manager.py::test_launch_args_none_no_effect PASSED [ 45%]
backend/tests/test_browser_manager.py::test_allocate_cdp_port_returns_free_port PASSED [ 46%]
backend/tests/test_browser_manager.py::test_allocate_cdp_port_skips_occupied PASSED [ 46%]
backend/tests/test_browser_manager.py::test_allocate_cdp_port_advances_counter PASSED [ 47%]
backend/tests/test_browser_manager.py::test_allocate_cdp_port_wraps_around PASSED [ 47%]
backend/tests/test_browser_manager.py::test_allocate_cdp_port_all_occupied_raises PASSED [ 48%]
backend/tests/test_browser_manager.py::test_init_creates_bookmarks PASSED [ 48%]
backend/tests/test_browser_manager.py::test_init_creates_preferences PASSED [ 49%]
backend/tests/test_browser_manager.py::test_init_idempotent PASSED [ 50%]
backend/tests/test_database.py::test_init_db_creates_tables PASSED [ 50%]
backend/tests/test_database.py::test_init_db_idempotent PASSED [ 51%]
backend/tests/test_database.py::test_create_profile_minimal PASSED [ 51%]
backend/tests/test_database.py::test_create_profile_with_seed PASSED [ 52%]
backend/tests/test_database.py::test_create_profile_all_fields PASSED [ 52%]
backend/tests/test_database.py::test_create_profile_with_tags PASSED [ 53%]
backend/tests/test_database.py::test_create_profile_defaults PASSED [ 53%]
backend/tests/test_database.py::test_create_profile_with_launch_args PASSED [ 54%]
backend/tests/test_database.py::test_get_profile_launch_args_roundtrip PASSED [ 54%]
backend/tests/test_database.py::test_update_profile_launch_args PASSED [ 55%]
backend/tests/test_database.py::test_update_profile_launch_args_none_becomes_empty PASSED [ 55%]
backend/tests/test_database.py::test_list_profiles_includes_launch_args PASSED [ 56%]
backend/tests/test_database.py::test_get_profile_exists PASSED [ 56%]
backend/tests/test_database.py::test_get_profile_not_found PASSED [ 57%]
backend/tests/test_database.py::test_get_profile_includes_tags PASSED [ 57%]
backend/tests/test_database.py::test_list_profiles_empty PASSED [ 58%]
backend/tests/test_database.py::test_list_profiles_ordered PASSED [ 58%]
backend/tests/test_database.py::test_list_profiles_includes_tags PASSED [ 59%]
backend/tests/test_database.py::test_update_profile_partial PASSED [ 59%]
backend/tests/test_database.py::test_update_profile_tags_replace PASSED [ 60%]
backend/tests/test_database.py::test_update_profile_not_found PASSED [ 60%]
backend/tests/test_database.py::test_update_profile_no_fields PASSED [ 61%]
backend/tests/test_database.py::test_update_profile_updates_timestamp PASSED [ 61%]
backend/tests/test_database.py::test_delete_profile_exists PASSED [ 62%]
backend/tests/test_database.py::test_delete_profile_not_found PASSED [ 63%]
backend/tests/test_database.py::test_delete_profile_cascades_tags PASSED [ 63%]
backend/tests/test_database.py::test_reset_profile_changes_seed PASSED [ 64%]
backend/tests/test_database.py::test_reset_profile_preserves_name PASSED [ 64%]
backend/tests/test_database.py::test_reset_profile_preserves_proxy PASSED [ 65%]
backend/tests/test_database.py::test_reset_profile_preserves_tags PASSED [ 65%]
backend/tests/test_database.py::test_reset_profile_updates_timestamp PASSED [ 66%]
backend/tests/test_database.py::test_reset_profile_not_found PASSED [ 66%]
backend/tests/test_models.py::test_profile_create_minimal PASSED [ 67%]
backend/tests/test_models.py::test_profile_create_all_fields PASSED [ 67%]
backend/tests/test_models.py::test_profile_create_launch_args_default PASSED [ 68%]
backend/tests/test_models.py::test_profile_create_with_launch_args PASSED [ 68%]
backend/tests/test_models.py::test_profile_update_launch_args PASSED [ 69%]
backend/tests/test_models.py::test_profile_create_invalid_platform PASSED [ 69%]
backend/tests/test_models.py::test_profile_create_invalid_human_preset PASSED [ 70%]
backend/tests/test_models.py::test_profile_create_invalid_color_scheme PASSED [ 70%]
backend/tests/test_models.py::test_profile_update_all_optional PASSED [ 71%]
backend/tests/test_models.py::test_profile_update_exclude_unset PASSED [ 71%]
backend/tests/test_models.py::test_profile_update_invalid_platform PASSED [ 72%]
backend/tests/test_models.py::test_tag_create_minimal PASSED [ 72%]
backend/tests/test_models.py::test_tag_create_with_color PASSED [ 73%]
backend/tests/test_models.py::test_clipboard_request_valid PASSED [ 73%]
backend/tests/test_models.py::test_clipboard_request_max_length PASSED [ 74%]
backend/tests/test_models.py::test_clipboard_request_at_limit PASSED [ 75%]
backend/tests/test_models.py::test_launch_response_with_cdp_url PASSED [ 75%]
backend/tests/test_models.py::test_launch_response_cdp_url_default_none PASSED [ 76%]
backend/tests/test_models.py::test_profile_status_response_cdp_url PASSED [ 76%]
backend/tests/test_models.py::test_profile_status_response_cdp_url_stopped PASSED [ 77%]
backend/tests/test_models.py::test_profile_response_cdp_url PASSED [ 77%]
backend/tests/test_models.py::test_profile_response_cdp_url_default_none PASSED [ 78%]
backend/tests/test_rfb.py::test_parse_clipboard_text_plain PASSED [ 78%]
backend/tests/test_rfb.py::test_parse_clipboard_no_text_plain PASSED [ 79%]
backend/tests/test_rfb.py::test_parse_clipboard_too_short PASSED [ 79%]
backend/tests/test_rfb.py::test_parse_clipboard_empty_text PASSED [ 80%]
backend/tests/test_rfb.py::test_parse_clipboard_multiple_mimes PASSED [ 80%]
backend/tests/test_rfb.py::test_build_cut_text_basic PASSED [ 81%]
backend/tests/test_rfb.py::test_build_cut_text_empty PASSED [ 81%]
backend/tests/test_rfb.py::test_build_cut_text_latin1_fallback PASSED [ 82%]
backend/tests/test_rfb.py::test_rfb_len_set_pixel_format PASSED [ 82%]
backend/tests/test_rfb.py::test_rfb_len_fb_update_request PASSED [ 83%]
backend/tests/test_rfb.py::test_rfb_len_key_event PASSED [ 83%]
backend/tests/test_rfb.py::test_rfb_len_pointer_event PASSED [ 84%]
backend/tests/test_rfb.py::test_rfb_len_set_encodings PASSED [ 84%]
backend/tests/test_rfb.py::test_rfb_len_client_cut_text PASSED [ 85%]
backend/tests/test_rfb.py::test_rfb_len_extension_150 PASSED [ 85%]
backend/tests/test_rfb.py::test_rfb_len_unknown PASSED [ 86%]
backend/tests/test_rfb.py::test_rfb_len_with_offset PASSED [ 86%]
backend/tests/test_rfb.py::test_rewrite_keeps_allowed PASSED [ 87%]
backend/tests/test_rfb.py::test_rewrite_strips_disallowed PASSED [ 88%]
backend/tests/test_rfb.py::test_rewrite_with_offset PASSED [ 88%]
backend/tests/test_rfb.py::test_rewrite_pointer_basic PASSED [ 89%]
backend/tests/test_rfb.py::test_rewrite_pointer_mask_expansion PASSED [ 89%]
backend/tests/test_rfb.py::test_rewrite_pointer_with_offset PASSED [ 90%]
backend/tests/test_rfb.py::test_filter_keeps_standard_types PASSED [ 90%]
backend/tests/test_rfb.py::test_filter_strips_extension_150 PASSED [ 91%]
backend/tests/test_rfb.py::test_filter_drops_unknown PASSED [ 91%]
backend/tests/test_rfb.py::test_filter_drops_incomplete PASSED [ 92%]
backend/tests/test_rfb.py::test_filter_rewrites_pointer PASSED [ 92%]
backend/tests/test_rfb.py::test_filter_rewrites_set_encodings PASSED [ 93%]
backend/tests/test_rfb.py::test_filter_mixed_frame PASSED [ 93%]
backend/tests/test_rfb.py::test_filter_empty_input PASSED [ 94%]
backend/tests/test_vnc_manager.py::test_allocate_first PASSED [ 94%]
backend/tests/test_vnc_manager.py::test_allocate_sequential PASSED [ 95%]
backend/tests/test_vnc_manager.py::test_allocate_fills_gap PASSED [ 95%]
backend/tests/test_vnc_manager.py::test_allocate_tracks_instances PASSED [ 96%]
backend/tests/test_vnc_manager.py::test_allocate_instance_fields PASSED [ 96%]
backend/tests/test_vnc_manager.py::test_get_ws_port_allocated PASSED [ 97%]
backend/tests/test_vnc_manager.py::test_get_ws_port_not_allocated PASSED [ 97%]
backend/tests/test_vnc_manager.py::test_active_displays_empty PASSED [ 98%]
backend/tests/test_vnc_manager.py::test_active_displays_after_allocate PASSED [ 98%]
backend/tests/test_vnc_manager.py::test_get_status_stopped PASSED [ 99%]
backend/tests/test_vnc_manager.py::test_get_status_running PASSED [100%]
============================= 192 passed in 3.97s ==============================
Design decisions
Test results
All 192 existing tests pass locally with this configuration:
Relates to #12, #14, #15 -- having CI will catch regressions on contributed features.