Skip to content

ci: add GitHub Actions CI pipeline for backend and frontend tests#20

Open
hayka-pacha wants to merge 1 commit into
CloakHQ:mainfrom
hayka-pacha:feat/ci-pipeline
Open

ci: add GitHub Actions CI pipeline for backend and frontend tests#20
hayka-pacha wants to merge 1 commit into
CloakHQ:mainfrom
hayka-pacha:feat/ci-pipeline

Conversation

@hayka-pacha
Copy link
Copy Markdown

What

Adds automated CI testing for every PR and push to main.

Changes

  • Backend job (Python 3.12): Installs deps (excluding binary), runs ============================= test session starts ==============================
    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 ==============================

  • Frontend job (Node 20): Runs , , (vitest)
  • Triggers on to and on to

Design decisions

  • The binary dependency is filtered out of during CI install (). The existing already mocks it via before any backend import.
  • Backend and frontend run as independent parallel jobs for faster feedback.
  • No Docker build in CI (would require the KasmVNC + CloakBrowser binary) -- just pure unit/integration tests.

Test results

All 192 existing tests pass locally with this configuration:

192 passed in 3.49s

Relates to #12, #14, #15 -- having CI will catch regressions on contributed features.

- 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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant