)]}'
{".zuul.yaml":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f1af12cd3b562c3b45a169f435d826d8908095df","unresolved":true,"context_lines":[{"line_number":1,"context_line":"- project:"},{"line_number":2,"context_line":"    templates:"},{"line_number":3,"context_line":"      - check-requirements"},{"line_number":4,"context_line":"      - horizon-non-primary-django-jobs"},{"line_number":5,"context_line":"      - openstack-python3-jobs-horizon"},{"line_number":6,"context_line":"      - openstack-cover-jobs"},{"line_number":7,"context_line":"      - publish-openstack-docs-pti"},{"line_number":8,"context_line":"      - release-notes-jobs-python3"},{"line_number":9,"context_line":"    check:"},{"line_number":10,"context_line":"      jobs:"},{"line_number":11,"context_line":"        - watcher-dashboard-integration-tests-playwright"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"- job:"},{"line_number":14,"context_line":"    name: watcher-dashboard-integration-tests-playwright"}],"source_content_type":"text/x-yaml","patch_set":43,"id":"e05bf481_82b03d9b","line":11,"range":{"start_line":1,"start_character":0,"end_line":11,"end_character":56},"updated":"2026-04-07 15:23:21.000000000","message":"the project stanza shoudl be after all the job defintions","commit_id":"1359ce3cf9a38b37c1e029f397e0995aa304ae1f"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"75151a0ec707c657fe598c8be305190628f5e69c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"- project:"},{"line_number":2,"context_line":"    templates:"},{"line_number":3,"context_line":"      - check-requirements"},{"line_number":4,"context_line":"      - horizon-non-primary-django-jobs"},{"line_number":5,"context_line":"      - openstack-python3-jobs-horizon"},{"line_number":6,"context_line":"      - openstack-cover-jobs"},{"line_number":7,"context_line":"      - publish-openstack-docs-pti"},{"line_number":8,"context_line":"      - release-notes-jobs-python3"},{"line_number":9,"context_line":"    check:"},{"line_number":10,"context_line":"      jobs:"},{"line_number":11,"context_line":"        - watcher-dashboard-integration-tests-playwright"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"- job:"},{"line_number":14,"context_line":"    name: watcher-dashboard-integration-tests-playwright"}],"source_content_type":"text/x-yaml","patch_set":43,"id":"45b40e08_7ed26802","line":11,"range":{"start_line":1,"start_character":0,"end_line":11,"end_character":56},"in_reply_to":"e05bf481_82b03d9b","updated":"2026-04-08 17:03:46.000000000","message":"Done","commit_id":"1359ce3cf9a38b37c1e029f397e0995aa304ae1f"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"2388e5185089162ee090974017bba2b2d0cf062d","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":17,"id":"47b4d6af_77369488","updated":"2025-12-16 10:31:17.000000000","message":"I might have missed few of the changes, may refine in followup.","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"d5341317c7902333961d3d4d6e2aad367367bce1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":44,"id":"8f663a90_63d93090","updated":"2026-04-08 14:56:14.000000000","message":"figuring out installing playwright in ci","commit_id":"20053f98c2702d1338b829a549f07358b43b717f"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"841384ff054648c2a479f5de52c49ea9945777ee","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":51,"id":"b7528ab4_8febf2eb","updated":"2026-04-09 16:55:41.000000000","message":"Need one more update to fix nit peak","commit_id":"177f617fd8f4a3919c3cf3b112ed802459613790"}],"doc/source/contributor/playwright-testing.rst":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"a2d10a4cd4f342dc12f9a8e563f16e83551f011a","unresolved":true,"context_lines":[{"line_number":15,"context_line":"- **Multi-browser**: Chromium, Firefox, and WebKit from a single API"},{"line_number":16,"context_line":"- **No external drivers**: Browser binaries are managed by Playwright"},{"line_number":17,"context_line":"- **Better debugging**: Trace viewer, screenshots, and video recording"},{"line_number":18,"context_line":"- **Reliable selectors**: Role-based, text-based, and CSS selectors"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Zuul CI"},{"line_number":21,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":17,"id":"00469c7d_c6dacbd6","line":18,"updated":"2025-12-12 19:15:48.000000000","message":"+1","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"2388e5185089162ee090974017bba2b2d0cf062d","unresolved":false,"context_lines":[{"line_number":15,"context_line":"- **Multi-browser**: Chromium, Firefox, and WebKit from a single API"},{"line_number":16,"context_line":"- **No external drivers**: Browser binaries are managed by Playwright"},{"line_number":17,"context_line":"- **Better debugging**: Trace viewer, screenshots, and video recording"},{"line_number":18,"context_line":"- **Reliable selectors**: Role-based, text-based, and CSS selectors"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Zuul CI"},{"line_number":21,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":17,"id":"3286bea9_e42606b9","line":18,"in_reply_to":"00469c7d_c6dacbd6","updated":"2025-12-16 10:31:17.000000000","message":"Acknowledged","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"a2d10a4cd4f342dc12f9a8e563f16e83551f011a","unresolved":true,"context_lines":[{"line_number":73,"context_line":".. code-block:: bash"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"   # Source OpenStack credentials first"},{"line_number":76,"context_line":"   source ~/repos/devstack/openrc admin admin"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"   # Default: Chromium, headless"},{"line_number":79,"context_line":"   tox -e integration-playwright"}],"source_content_type":"text/x-rst","patch_set":17,"id":"f0d9c070_e5597d59","line":76,"updated":"2025-12-12 19:15:48.000000000","message":"this is generally discuraged.\n\n\nwe whoudl just supprot asing the OS_CLOUD env var in tox and defualt it to devstack-admin","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3de7cf4b33120277789a45f15f5b53d6fbef601f","unresolved":false,"context_lines":[{"line_number":73,"context_line":".. code-block:: bash"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"   # Source OpenStack credentials first"},{"line_number":76,"context_line":"   source ~/repos/devstack/openrc admin admin"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"   # Default: Chromium, headless"},{"line_number":79,"context_line":"   tox -e integration-playwright"}],"source_content_type":"text/x-rst","patch_set":17,"id":"31680afd_9a152161","line":76,"in_reply_to":"6b1099eb_71f48252","updated":"2025-12-18 11:39:01.000000000","message":"ya i realsied that later we are not using the fils directy and isntead realying on the env vars. \n\nfor now i guess thats ok.\none thign to not is these test currently coan only run with password auth\nthey will not be able to be used if we have SSO or other auth methods but i think that is ok for the scope fo the testign we are trying to enabeld \n\nyou can ignore this comment","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"2388e5185089162ee090974017bba2b2d0cf062d","unresolved":true,"context_lines":[{"line_number":73,"context_line":".. code-block:: bash"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"   # Source OpenStack credentials first"},{"line_number":76,"context_line":"   source ~/repos/devstack/openrc admin admin"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"   # Default: Chromium, headless"},{"line_number":79,"context_line":"   tox -e integration-playwright"}],"source_content_type":"text/x-rst","patch_set":17,"id":"6b1099eb_71f48252","line":76,"in_reply_to":"f0d9c070_e5597d59","updated":"2025-12-16 10:31:17.000000000","message":"I changed it to OS_CLOUD: admin as we need admin as a username and password password for horizon login.","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"a2d10a4cd4f342dc12f9a8e563f16e83551f011a","unresolved":true,"context_lines":[{"line_number":135,"context_line":""},{"line_number":136,"context_line":"- ``off``: No video recording"},{"line_number":137,"context_line":"- ``on`` (default): Always record and keep videos"},{"line_number":138,"context_line":"- ``retain-on-failure``: Record videos but delete them if tests pass"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"Tracing"},{"line_number":141,"context_line":"-------"}],"source_content_type":"text/x-rst","patch_set":17,"id":"059946eb_5f825190","line":138,"updated":"2025-12-12 19:15:48.000000000","message":"retain-on-failure\nis proably what we want to use in ci\n\ni would be ok with making that the defualt or off but i dont think we should default ot on","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"2388e5185089162ee090974017bba2b2d0cf062d","unresolved":false,"context_lines":[{"line_number":135,"context_line":""},{"line_number":136,"context_line":"- ``off``: No video recording"},{"line_number":137,"context_line":"- ``on`` (default): Always record and keep videos"},{"line_number":138,"context_line":"- ``retain-on-failure``: Record videos but delete them if tests pass"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"Tracing"},{"line_number":141,"context_line":"-------"}],"source_content_type":"text/x-rst","patch_set":17,"id":"4a757260_dd532cf9","line":138,"in_reply_to":"059946eb_5f825190","updated":"2025-12-16 10:31:17.000000000","message":"Done","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"a2d10a4cd4f342dc12f9a8e563f16e83551f011a","unresolved":true,"context_lines":[{"line_number":156,"context_line":""},{"line_number":157,"context_line":"- ``off``: No trace recording"},{"line_number":158,"context_line":"- ``on`` (default): Always record and keep traces"},{"line_number":159,"context_line":"- ``retain-on-failure``: Record traces but delete them if tests pass"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"Viewing Traces"},{"line_number":162,"context_line":"^^^^^^^^^^^^^^"}],"source_content_type":"text/x-rst","patch_set":17,"id":"707558da_64a0a9bb","line":159,"updated":"2025-12-12 19:15:48.000000000","message":"again i woudl perfer to default to off or retain-on-failure\n\nrunning tox shoudl also remove the prior executions output","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"2388e5185089162ee090974017bba2b2d0cf062d","unresolved":false,"context_lines":[{"line_number":156,"context_line":""},{"line_number":157,"context_line":"- ``off``: No trace recording"},{"line_number":158,"context_line":"- ``on`` (default): Always record and keep traces"},{"line_number":159,"context_line":"- ``retain-on-failure``: Record traces but delete them if tests pass"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"Viewing Traces"},{"line_number":162,"context_line":"^^^^^^^^^^^^^^"}],"source_content_type":"text/x-rst","patch_set":17,"id":"f27c37ac_cf46a0f4","line":159,"in_reply_to":"707558da_64a0a9bb","updated":"2025-12-16 10:31:17.000000000","message":"Done","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"a2d10a4cd4f342dc12f9a8e563f16e83551f011a","unresolved":true,"context_lines":[{"line_number":238,"context_line":"    Login username (default: ``admin``)"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"``OS_PASSWORD``"},{"line_number":241,"context_line":"    Login password (default: ``secretadmin``)"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"All artifacts are stored under ``~/playwright/`` by default:"},{"line_number":244,"context_line":""}],"source_content_type":"text/x-rst","patch_set":17,"id":"c4d21117_7d397a4b","line":241,"updated":"2025-12-12 19:15:48.000000000","message":"i guess this is fine as well isntead of having to pars a cloud config.","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"2388e5185089162ee090974017bba2b2d0cf062d","unresolved":false,"context_lines":[{"line_number":238,"context_line":"    Login username (default: ``admin``)"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"``OS_PASSWORD``"},{"line_number":241,"context_line":"    Login password (default: ``secretadmin``)"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"All artifacts are stored under ``~/playwright/`` by default:"},{"line_number":244,"context_line":""}],"source_content_type":"text/x-rst","patch_set":17,"id":"9d8ad584_7f7b75e8","line":241,"in_reply_to":"c4d21117_7d397a4b","updated":"2025-12-16 10:31:17.000000000","message":"Acknowledged","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"a2d10a4cd4f342dc12f9a8e563f16e83551f011a","unresolved":true,"context_lines":[{"line_number":248,"context_line":"   ├── .auth/           # Saved authentication state"},{"line_number":249,"context_line":"   ├── screenshots/     # Step-by-step screenshots"},{"line_number":250,"context_line":"   ├── videos/          # Test execution videos"},{"line_number":251,"context_line":"   └── traces/          # Trace zip files"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"Authentication State Reuse"},{"line_number":254,"context_line":"--------------------------"}],"source_content_type":"text/x-rst","patch_set":17,"id":"bf1ae3dd_b2b0f4a6","line":251,"updated":"2025-12-12 19:15:48.000000000","message":"no\n\nyou are not allowexcd to read or write anything form the user home folder or antything out side of the git repo","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"2388e5185089162ee090974017bba2b2d0cf062d","unresolved":false,"context_lines":[{"line_number":248,"context_line":"   ├── .auth/           # Saved authentication state"},{"line_number":249,"context_line":"   ├── screenshots/     # Step-by-step screenshots"},{"line_number":250,"context_line":"   ├── videos/          # Test execution videos"},{"line_number":251,"context_line":"   └── traces/          # Trace zip files"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"Authentication State Reuse"},{"line_number":254,"context_line":"--------------------------"}],"source_content_type":"text/x-rst","patch_set":17,"id":"80cf995f_8c2b7aac","line":251,"in_reply_to":"bf1ae3dd_b2b0f4a6","updated":"2025-12-16 10:31:17.000000000","message":"Done","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"a2d10a4cd4f342dc12f9a8e563f16e83551f011a","unresolved":true,"context_lines":[{"line_number":264,"context_line":""},{"line_number":265,"context_line":"   # Clear saved auth state to force re-login"},{"line_number":266,"context_line":"   rm -rf ~/playwright/.auth/"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":".. note::"},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"   The auth state file may contain sensitive cookies. It is stored in"}],"source_content_type":"text/x-rst","patch_set":17,"id":"30189405_b515f151","line":267,"updated":"2025-12-12 19:15:48.000000000","message":"we shoudl clear this as part of each tox invocation","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"2388e5185089162ee090974017bba2b2d0cf062d","unresolved":false,"context_lines":[{"line_number":264,"context_line":""},{"line_number":265,"context_line":"   # Clear saved auth state to force re-login"},{"line_number":266,"context_line":"   rm -rf ~/playwright/.auth/"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":".. note::"},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"   The auth state file may contain sensitive cookies. It is stored in"}],"source_content_type":"text/x-rst","patch_set":17,"id":"cfebf547_6c3f4a17","line":267,"in_reply_to":"30189405_b515f151","updated":"2025-12-16 10:31:17.000000000","message":"Done","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f1af12cd3b562c3b45a169f435d826d8908095df","unresolved":true,"context_lines":[{"line_number":8,"context_line":"Why Playwright?"},{"line_number":9,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Playwright offers several advantages over Selenium:"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"- **Auto-waiting**: Automatically waits for elements to be ready"},{"line_number":14,"context_line":"- **Multi-browser**: Chromium, Firefox, and WebKit from a single API"}],"source_content_type":"text/x-rst","patch_set":43,"id":"f3591a68_328dce19","line":11,"range":{"start_line":11,"start_character":42,"end_line":11,"end_character":50},"updated":"2026-04-07 15:23:21.000000000","message":"we shoudl remove all refence to selenium","commit_id":"1359ce3cf9a38b37c1e029f397e0995aa304ae1f"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"75151a0ec707c657fe598c8be305190628f5e69c","unresolved":false,"context_lines":[{"line_number":8,"context_line":"Why Playwright?"},{"line_number":9,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Playwright offers several advantages over Selenium:"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"- **Auto-waiting**: Automatically waits for elements to be ready"},{"line_number":14,"context_line":"- **Multi-browser**: Chromium, Firefox, and WebKit from a single API"}],"source_content_type":"text/x-rst","patch_set":43,"id":"9bb43aed_cdb924e7","line":11,"range":{"start_line":11,"start_character":42,"end_line":11,"end_character":50},"in_reply_to":"f3591a68_328dce19","updated":"2026-04-08 17:03:46.000000000","message":"Done","commit_id":"1359ce3cf9a38b37c1e029f397e0995aa304ae1f"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f1af12cd3b562c3b45a169f435d826d8908095df","unresolved":true,"context_lines":[{"line_number":15,"context_line":"- **No external drivers**: Browser binaries are managed by Playwright"},{"line_number":16,"context_line":"- **Better debugging**: Trace viewer, screenshots, and video recording"},{"line_number":17,"context_line":"- **Reliable selectors**: Role-based, text-based, and CSS selectors"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Running Tests"},{"line_number":20,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":21,"context_line":""}],"source_content_type":"text/x-rst","patch_set":43,"id":"3cbd53c4_6c9f1c4c","line":18,"updated":"2026-04-07 15:23:21.000000000","message":"we proably want to replace this section with instacution on how to install the deps/browser required.","commit_id":"1359ce3cf9a38b37c1e029f397e0995aa304ae1f"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"75151a0ec707c657fe598c8be305190628f5e69c","unresolved":false,"context_lines":[{"line_number":15,"context_line":"- **No external drivers**: Browser binaries are managed by Playwright"},{"line_number":16,"context_line":"- **Better debugging**: Trace viewer, screenshots, and video recording"},{"line_number":17,"context_line":"- **Reliable selectors**: Role-based, text-based, and CSS selectors"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Running Tests"},{"line_number":20,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":21,"context_line":""}],"source_content_type":"text/x-rst","patch_set":43,"id":"4fd5fd70_caeb07b2","line":18,"in_reply_to":"3cbd53c4_6c9f1c4c","updated":"2026-04-08 17:03:46.000000000","message":"Done","commit_id":"1359ce3cf9a38b37c1e029f397e0995aa304ae1f"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"75151a0ec707c657fe598c8be305190628f5e69c","unresolved":true,"context_lines":[{"line_number":25,"context_line":".. note::"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"   System dependencies must be installed manually before running tox."},{"line_number":28,"context_line":"   The tox environment will install browser binaries automatically, but"},{"line_number":29,"context_line":"   system-level dependencies (graphics libraries, fonts, etc.) must be"},{"line_number":30,"context_line":"   installed outside of tox per OpenStack standards."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"   For CI environments, these dependencies should be installed in the base"}],"source_content_type":"text/x-rst","patch_set":44,"id":"79e06b3d_7676e9df","line":29,"range":{"start_line":28,"start_character":2,"end_line":29,"end_character":63},"updated":"2026-04-08 17:03:46.000000000","message":"se it shoudl not really do that either.\n\nit shoudl not be puting them in /opt or installing anything out side teh current git repo directory.","commit_id":"20053f98c2702d1338b829a549f07358b43b717f"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"b4c56f3024f1f64b02860ca995383d7242f344ec","unresolved":false,"context_lines":[{"line_number":25,"context_line":".. note::"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"   System dependencies must be installed manually before running tox."},{"line_number":28,"context_line":"   The tox environment will install browser binaries automatically, but"},{"line_number":29,"context_line":"   system-level dependencies (graphics libraries, fonts, etc.) must be"},{"line_number":30,"context_line":"   installed outside of tox per OpenStack standards."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"   For CI environments, these dependencies should be installed in the base"}],"source_content_type":"text/x-rst","patch_set":44,"id":"22349127_2f3edbf7","line":29,"range":{"start_line":28,"start_character":2,"end_line":29,"end_character":63},"in_reply_to":"79e06b3d_7676e9df","updated":"2026-04-10 05:30:17.000000000","message":"Done","commit_id":"20053f98c2702d1338b829a549f07358b43b717f"}],"test-requirements.txt":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f1af12cd3b562c3b45a169f435d826d8908095df","unresolved":true,"context_lines":[{"line_number":5,"context_line":"testscenarios\u003e\u003d0.4 # Apache-2.0/BSD"},{"line_number":6,"context_line":"testtools\u003e\u003d2.2.0 # MIT"},{"line_number":7,"context_line":"playwright\u003e\u003d1.57.0 # Apache-2.0"},{"line_number":8,"context_line":"oslotest\u003e\u003d3.8.0 # Apache-2.0"},{"line_number":9,"context_line":"oslo.utils\u003e\u003d4.0.0 # Apache-2.0"},{"line_number":10,"context_line":"oslo.log\u003e\u003d3.37.0 # Apache-2.0"},{"line_number":11,"context_line":"openstacksdk\u003e\u003d0.36.0 # Apache-2.0"}],"source_content_type":"text/plain","patch_set":43,"id":"fa37e5a3_0aafd78b","line":8,"in_reply_to":"e6ab6756_aa8d4872","updated":"2026-04-07 15:23:21.000000000","message":"watcher is not currently supported in the sdk so adding it is somewhat suspect","commit_id":"1359ce3cf9a38b37c1e029f397e0995aa304ae1f"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"b4c56f3024f1f64b02860ca995383d7242f344ec","unresolved":false,"context_lines":[{"line_number":5,"context_line":"testscenarios\u003e\u003d0.4 # Apache-2.0/BSD"},{"line_number":6,"context_line":"testtools\u003e\u003d2.2.0 # MIT"},{"line_number":7,"context_line":"playwright\u003e\u003d1.57.0 # Apache-2.0"},{"line_number":8,"context_line":"oslotest\u003e\u003d3.8.0 # Apache-2.0"},{"line_number":9,"context_line":"oslo.utils\u003e\u003d4.0.0 # Apache-2.0"},{"line_number":10,"context_line":"oslo.log\u003e\u003d3.37.0 # Apache-2.0"},{"line_number":11,"context_line":"openstacksdk\u003e\u003d0.36.0 # Apache-2.0"}],"source_content_type":"text/plain","patch_set":43,"id":"7cc17696_ca3edd14","line":8,"in_reply_to":"fa37e5a3_0aafd78b","updated":"2026-04-10 05:30:17.000000000","message":"Done","commit_id":"1359ce3cf9a38b37c1e029f397e0995aa304ae1f"}],"tox.ini":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"a2d10a4cd4f342dc12f9a8e563f16e83551f011a","unresolved":true,"context_lines":[{"line_number":43,"context_line":"# Set PLAYWRIGHT_BROWSER to choose browser: chromium (default), firefox, or webkit"},{"line_number":44,"context_line":"# Example: PLAYWRIGHT_BROWSER\u003dfirefox tox -e integration-playwright"},{"line_number":45,"context_line":"# Note: webkit provides Safari-like testing on Linux"},{"line_number":46,"context_line":"# Set PLAYWRIGHT_VIDEO to enable video recording: off (default), on, retain-on-failure"},{"line_number":47,"context_line":"passenv \u003d"},{"line_number":48,"context_line":"  DISPLAY"},{"line_number":49,"context_line":"  XAUTHORITY"}],"source_content_type":"text/x-properties","patch_set":17,"id":"7f0d4fcb_1108cb61","line":46,"updated":"2025-12-12 19:15:48.000000000","message":"i comment else where but i dont agree with the defults","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"2388e5185089162ee090974017bba2b2d0cf062d","unresolved":false,"context_lines":[{"line_number":43,"context_line":"# Set PLAYWRIGHT_BROWSER to choose browser: chromium (default), firefox, or webkit"},{"line_number":44,"context_line":"# Example: PLAYWRIGHT_BROWSER\u003dfirefox tox -e integration-playwright"},{"line_number":45,"context_line":"# Note: webkit provides Safari-like testing on Linux"},{"line_number":46,"context_line":"# Set PLAYWRIGHT_VIDEO to enable video recording: off (default), on, retain-on-failure"},{"line_number":47,"context_line":"passenv \u003d"},{"line_number":48,"context_line":"  DISPLAY"},{"line_number":49,"context_line":"  XAUTHORITY"}],"source_content_type":"text/x-properties","patch_set":17,"id":"040ce8ea_75552859","line":46,"in_reply_to":"7f0d4fcb_1108cb61","updated":"2025-12-16 10:31:17.000000000","message":"Acknowledged","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"a2d10a4cd4f342dc12f9a8e563f16e83551f011a","unresolved":true,"context_lines":[{"line_number":64,"context_line":"  playwright"},{"line_number":65,"context_line":"  stestr"},{"line_number":66,"context_line":"commands \u003d"},{"line_number":67,"context_line":"  playwright install chromium firefox webkit"},{"line_number":68,"context_line":"  stestr run --test-path watcher_dashboard/test/integration test_playwright {posargs}"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"[testenv:venv]"}],"source_content_type":"text/x-properties","patch_set":17,"id":"3d36958f_9c6cf966","line":67,"range":{"start_line":67,"start_character":21,"end_line":67,"end_character":44},"updated":"2025-12-12 19:15:48.000000000","message":"this shoudl be configurable via an environment variable  and it proably shoudl default webkit\nalso befoer each run we need to clean up the local artifacts form the last run.","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"2388e5185089162ee090974017bba2b2d0cf062d","unresolved":false,"context_lines":[{"line_number":64,"context_line":"  playwright"},{"line_number":65,"context_line":"  stestr"},{"line_number":66,"context_line":"commands \u003d"},{"line_number":67,"context_line":"  playwright install chromium firefox webkit"},{"line_number":68,"context_line":"  stestr run --test-path watcher_dashboard/test/integration test_playwright {posargs}"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"[testenv:venv]"}],"source_content_type":"text/x-properties","patch_set":17,"id":"abc8a1bd_01d76e6a","line":67,"range":{"start_line":67,"start_character":21,"end_line":67,"end_character":44},"in_reply_to":"3d36958f_9c6cf966","updated":"2025-12-16 10:31:17.000000000","message":"Done","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"c057aeaf14db817a73f776883928c4d6ec59cf45","unresolved":true,"context_lines":[{"line_number":80,"context_line":"  # Clean up artifacts from previous runs"},{"line_number":81,"context_line":"  rm -rf {toxinidir}/playwright"},{"line_number":82,"context_line":"  # Install system dependencies for browsers (requires passwordless sudo in CI)"},{"line_number":83,"context_line":"  sudo {envbindir}/playwright install-deps {env:PLAYWRIGHT_BROWSERS_TO_INSTALL}"},{"line_number":84,"context_line":"  # Install only the configured browsers"},{"line_number":85,"context_line":"  playwright install {env:PLAYWRIGHT_BROWSERS_TO_INSTALL}"},{"line_number":86,"context_line":"  stestr run --test-path watcher_dashboard/test/integration test_playwright {posargs}"}],"source_content_type":"text/x-properties","patch_set":20,"id":"1f4409d6_4324c248","line":83,"range":{"start_line":83,"start_character":1,"end_line":83,"end_character":6},"updated":"2025-12-16 12:48:43.000000000","message":"Added to install missing dependencies https://zuul.opendev.org/t/openstack/build/d3434decad1d4bc6b60af4faaf1d2457/log/job-output.txt#30816\n```\n   playwright._impl._errors.Error: BrowserType.launch:\n\n2025-12-16 11:05:49.151997 | controller | ╔══════════════════════════════════════════════════════╗\n\n2025-12-16 11:05:49.152008 | controller | ║ Host system is missing dependencies to run browsers. ║\n\n2025-12-16 11:05:49.152018 | controller | ║ Missing libraries:                                   ║\n\n2025-12-16 11:05:49.152029 | controller | ║     libgtk-4.so.1                                    ║\n\n2025-12-16 11:05:49.152040 | controller | ║     libgraphene-1.0.so.0                             ║\n\n2025-12-16 11:05:49.152050 | controller | ║     libwoff2dec.so.1.0.2                             ║\n\n2025-12-16 11:05:49.152061 | controller | ║     libgstgl-1.0.so.0                                ║\n\n2025-12-16 11:05:49.152295 | controller | ║     libgstcodecparsers-1.0.so.0                      ║\n\n2025-12-16 11:05:49.152317 | controller | ║     libflite.so.1                                    ║\n\n2025-12-16 11:05:49.152340 | controller | ║     libflite_usenglish.so.1                          ║\n\n2025-12-16 11:05:49.152352 | controller | ║     libflite_cmu_grapheme_lang.so.1                  ║\n\n2025-12-16 11:05:49.152363 | controller | ║     libflite_cmu_grapheme_lex.so.1                   ║\n\n2025-12-16 11:05:49.152373 | controller | ║     libflite_cmu_indic_lang.so.1                     ║\n\n2025-12-16 11:05:49.152384 | controller | ║     libflite_cmu_indic_lex.so.1                      ║\n\n2025-12-16 11:05:49.152395 | controller | ║     libflite_cmulex.so.1                             ║\n\n2025-12-16 11:05:49.152406 | controller | ║     libflite_cmu_time_awb.so.1                       ║\n\n2025-12-16 11:05:49.152416 | controller | ║     libflite_cmu_us_awb.so.1                         ║\n\n2025-12-16 11:05:49.152427 | controller | ║     libflite_cmu_us_kal16.so.1                       ║\n\n2025-12-16 11:05:49.152438 | controller | ║     libflite_cmu_us_kal.so.1                         ║\n\n2025-12-16 11:05:49.152456 | controller | ║     libflite_cmu_us_rms.so.1                         ║\n\n2025-12-16 11:05:49.152478 | controller | ║     libflite_cmu_us_slt.so.1                         ║\n\n2025-12-16 11:05:49.152499 | controller | ║     libwebpdemux.so.2                                ║\n\n2025-12-16 11:05:49.152520 | controller | ║     libharfbuzz-icu.so.0                             ║\n\n2025-12-16 11:05:49.152538 | controller | ║     libwebpmux.so.3                                  ║\n\n2025-12-16 11:05:49.152728 | controller | ║     libenchant-2.so.2                                ║\n\n2025-12-16 11:05:49.152776 | controller | ║     libsecret-1.so.0                                 ║\n\n2025-12-16 11:05:49.152796 | controller | ║     libhyphen.so.0                                   ║\n\n2025-12-16 11:05:49.152816 | controller | ║     libmanette-0.2.so.0                              ║\n\n2025-12-16 11:05:49.152837 | controller | ║     libGLESv2.so.2                                   ║\n\n2025-12-16 11:05:49.152876 | controller | ║     libx264.so                                       ║\n\n2025-12-16 11:05:49.152899 | controller | ╚══════════════════════════════════════════════════════╝\n```","commit_id":"4d2b49078d8c6fff779f304d1036730b5e4230d8"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f1af12cd3b562c3b45a169f435d826d8908095df","unresolved":true,"context_lines":[{"line_number":68,"context_line":"  PLAYWRIGHT_BROWSERS_PATH \u003d {env:HOME}/.cache/ms-playwright"},{"line_number":69,"context_line":"deps \u003d"},{"line_number":70,"context_line":"  {[testenv]deps}"},{"line_number":71,"context_line":"  playwright"},{"line_number":72,"context_line":"  stestr"},{"line_number":73,"context_line":"allowlist_externals \u003d"},{"line_number":74,"context_line":"  rm"}],"source_content_type":"text/x-properties","patch_set":41,"id":"a7d28702_4fd8941e","line":71,"in_reply_to":"f12913a1_390fee76","updated":"2026-04-07 15:23:21.000000000","message":"the real fix is to remove this entirly since it will be listed in test requiremetn going forward","commit_id":"40d1708a8e046cf263c1dcba69b447ef861817eb"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f1af12cd3b562c3b45a169f435d826d8908095df","unresolved":true,"context_lines":[{"line_number":62,"context_line":"  DEBUG \u003d pw:api"},{"line_number":63,"context_line":"  # Default browser to webkit"},{"line_number":64,"context_line":"  PLAYWRIGHT_BROWSER \u003d {env:PLAYWRIGHT_BROWSER:webkit}"},{"line_number":65,"context_line":"  # Store artifacts within the project directory"},{"line_number":66,"context_line":"  PLAYWRIGHT_OUTPUT_DIR \u003d {toxinidir}/playwright"},{"line_number":67,"context_line":"  # Set browser cache path within the project directory"},{"line_number":68,"context_line":"  PLAYWRIGHT_BROWSERS_PATH \u003d {toxinidir}/.playwright"}],"source_content_type":"text/x-properties","patch_set":43,"id":"8bdd2378_a5c85db4","line":65,"in_reply_to":"64f03165_b7e2edf3","updated":"2026-04-07 15:23:21.000000000","message":"we should not be installing system packages if this is correct we need to fix that","commit_id":"1359ce3cf9a38b37c1e029f397e0995aa304ae1f"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"b4c56f3024f1f64b02860ca995383d7242f344ec","unresolved":false,"context_lines":[{"line_number":62,"context_line":"  DEBUG \u003d pw:api"},{"line_number":63,"context_line":"  # Default browser to webkit"},{"line_number":64,"context_line":"  PLAYWRIGHT_BROWSER \u003d {env:PLAYWRIGHT_BROWSER:webkit}"},{"line_number":65,"context_line":"  # Store artifacts within the project directory"},{"line_number":66,"context_line":"  PLAYWRIGHT_OUTPUT_DIR \u003d {toxinidir}/playwright"},{"line_number":67,"context_line":"  # Set browser cache path within the project directory"},{"line_number":68,"context_line":"  PLAYWRIGHT_BROWSERS_PATH \u003d {toxinidir}/.playwright"}],"source_content_type":"text/x-properties","patch_set":43,"id":"3c1b4065_9e529d1e","line":65,"in_reply_to":"8bdd2378_a5c85db4","updated":"2026-04-10 05:30:17.000000000","message":"Done","commit_id":"1359ce3cf9a38b37c1e029f397e0995aa304ae1f"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f1af12cd3b562c3b45a169f435d826d8908095df","unresolved":true,"context_lines":[{"line_number":77,"context_line":"  # Clean up artifacts from previous runs"},{"line_number":78,"context_line":"  rm -rf {toxinidir}/playwright {toxinidir}/.playwright"},{"line_number":79,"context_line":"  # Install system dependencies for browsers (requires passwordless sudo in CI)"},{"line_number":80,"context_line":"  sudo {envbindir}/playwright install-deps {env:PLAYWRIGHT_BROWSER}"},{"line_number":81,"context_line":"  # Install only the configured browsers"},{"line_number":82,"context_line":"  playwright install {env:PLAYWRIGHT_BROWSER}"},{"line_number":83,"context_line":"  stestr run --test-path watcher_dashboard/test/integration test_playwright {posargs}"}],"source_content_type":"text/x-properties","patch_set":43,"id":"1840d345_641e634d","line":80,"updated":"2026-04-07 15:23:21.000000000","message":"ya this is not approate ti incldu in the tox.ini\n\nthis is somehting that shoudl be done by a person before runnign tox but not as part of it\n\n\nwe can list teps in bindeps with a playwright tag if we want but beyond that we shoudl jsut docuemnt this.","commit_id":"1359ce3cf9a38b37c1e029f397e0995aa304ae1f"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f1af12cd3b562c3b45a169f435d826d8908095df","unresolved":true,"context_lines":[{"line_number":79,"context_line":"  # Install system dependencies for browsers (requires passwordless sudo in CI)"},{"line_number":80,"context_line":"  sudo {envbindir}/playwright install-deps {env:PLAYWRIGHT_BROWSER}"},{"line_number":81,"context_line":"  # Install only the configured browsers"},{"line_number":82,"context_line":"  playwright install {env:PLAYWRIGHT_BROWSER}"},{"line_number":83,"context_line":"  stestr run --test-path watcher_dashboard/test/integration test_playwright {posargs}"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"[testenv:venv]"}],"source_content_type":"text/x-properties","patch_set":43,"id":"b4a8acf6_2130a8ab","line":82,"updated":"2026-04-07 15:23:21.000000000","message":"this is also not ok to incldue","commit_id":"1359ce3cf9a38b37c1e029f397e0995aa304ae1f"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"b4c56f3024f1f64b02860ca995383d7242f344ec","unresolved":true,"context_lines":[{"line_number":79,"context_line":"  # Install system dependencies for browsers (requires passwordless sudo in CI)"},{"line_number":80,"context_line":"  sudo {envbindir}/playwright install-deps {env:PLAYWRIGHT_BROWSER}"},{"line_number":81,"context_line":"  # Install only the configured browsers"},{"line_number":82,"context_line":"  playwright install {env:PLAYWRIGHT_BROWSER}"},{"line_number":83,"context_line":"  stestr run --test-path watcher_dashboard/test/integration test_playwright {posargs}"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"[testenv:venv]"}],"source_content_type":"text/x-properties","patch_set":43,"id":"2286ccb4_47e03b39","line":82,"in_reply_to":"b4a8acf6_2130a8ab","updated":"2026-04-10 05:30:17.000000000","message":"It downloads binary in a directory and does not installs anything, If we install outside env, it does not work.","commit_id":"1359ce3cf9a38b37c1e029f397e0995aa304ae1f"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"b4c56f3024f1f64b02860ca995383d7242f344ec","unresolved":true,"context_lines":[{"line_number":76,"context_line":"  rm -rf {toxinidir}/playwright {toxinidir}/.playwright"},{"line_number":77,"context_line":"  # Install browser binaries (system deps must be installed manually first)"},{"line_number":78,"context_line":"  playwright install {env:PLAYWRIGHT_BROWSER}"},{"line_number":79,"context_line":"  stestr run --test-path watcher_dashboard/test/integration test_playwright {posargs}"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"[testenv:venv]"},{"line_number":82,"context_line":"commands \u003d {posargs}"}],"source_content_type":"text/x-properties","patch_set":44,"id":"ef8844f0_015e9143","line":79,"in_reply_to":"07a09ffe_d3699745","updated":"2026-04-10 05:30:17.000000000","message":"Replaced it with .stestr.conf file","commit_id":"20053f98c2702d1338b829a549f07358b43b717f"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"75151a0ec707c657fe598c8be305190628f5e69c","unresolved":true,"context_lines":[{"line_number":76,"context_line":"  rm -rf {toxinidir}/playwright {toxinidir}/.playwright"},{"line_number":77,"context_line":"  # Install browser binaries (system deps must be installed manually first)"},{"line_number":78,"context_line":"  playwright install {env:PLAYWRIGHT_BROWSER}"},{"line_number":79,"context_line":"  stestr run --test-path watcher_dashboard/test/integration test_playwright {posargs}"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"[testenv:venv]"},{"line_number":82,"context_line":"commands \u003d {posargs}"}],"source_content_type":"text/x-properties","patch_set":44,"id":"07a09ffe_d3699745","line":79,"in_reply_to":"e05e930e_bd31e372","updated":"2026-04-08 17:03:46.000000000","message":"im not sure we actully need a regex beyond the test path.\n\nnormal test disocverty shoudl find all of the tests wehich are the function tha start with test_ by defualt","commit_id":"20053f98c2702d1338b829a549f07358b43b717f"}],"watcher_dashboard/test/integration/__init__.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f1af12cd3b562c3b45a169f435d826d8908095df","unresolved":true,"context_lines":[{"line_number":10,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"\"\"\"Playwright integration tests for Watcher Dashboard."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"\"\"\""}],"source_content_type":"text/x-python","patch_set":41,"id":"ece95fa5_dc32c724","line":13,"in_reply_to":"20a0ca99_23ab0419","updated":"2026-04-07 15:23:21.000000000","message":"by conventio nwe actully prefer __init__.py files to be entirly empty","commit_id":"40d1708a8e046cf263c1dcba69b447ef861817eb"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"b4c56f3024f1f64b02860ca995383d7242f344ec","unresolved":false,"context_lines":[{"line_number":10,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"\"\"\"Playwright integration tests for Watcher Dashboard."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"\"\"\""}],"source_content_type":"text/x-python","patch_set":41,"id":"d6ae1390_f9909d90","line":13,"in_reply_to":"ece95fa5_dc32c724","updated":"2026-04-10 05:30:17.000000000","message":"Done","commit_id":"40d1708a8e046cf263c1dcba69b447ef861817eb"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f1af12cd3b562c3b45a169f435d826d8908095df","unresolved":true,"context_lines":[{"line_number":1,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":2,"context_line":"#    not use this file except in compliance with the License. You may obtain"},{"line_number":3,"context_line":"#    a copy of the License at"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":43,"id":"6bbecf93_ee90118a","line":1,"updated":"2026-04-07 15:23:21.000000000","message":"again this should be empty by convetion\nno licence here or module doc string","commit_id":"1359ce3cf9a38b37c1e029f397e0995aa304ae1f"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"b4c56f3024f1f64b02860ca995383d7242f344ec","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":2,"context_line":"#    not use this file except in compliance with the License. You may obtain"},{"line_number":3,"context_line":"#    a copy of the License at"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":43,"id":"fcffe944_605497fa","line":1,"in_reply_to":"6bbecf93_ee90118a","updated":"2026-04-10 05:30:17.000000000","message":"Done","commit_id":"1359ce3cf9a38b37c1e029f397e0995aa304ae1f"}],"watcher_dashboard/test/integration/page_objects.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3de7cf4b33120277789a45f15f5b53d6fbef601f","unresolved":true,"context_lines":[{"line_number":25,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class BasePage:"},{"line_number":29,"context_line":"    \"\"\"Base class for all Page Objects.\"\"\""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    # Subclasses should override this for go_to_index()"}],"source_content_type":"text/x-python","patch_set":23,"id":"fd7f6834_18fe5563","line":28,"updated":"2025-12-18 11:39:01.000000000","message":"looking at https://playwright.dev/python/docs/pages\n\npages are intened to be defiend on a brozer context so im not sure this class heriacy make sense.","commit_id":"04e1d0d19e0d2af8ed596c9a85b90fb6dfccd3ee"}],"watcher_dashboard/test/integration/playwright_base.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"1bf4a76d277214c0d48acbaaca4bcc9c658d9302","unresolved":true,"context_lines":[{"line_number":1,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":2,"context_line":"#    not use this file except in compliance with the License. You may obtain"},{"line_number":3,"context_line":"#    a copy of the License at"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":17,"id":"e0d4a91b_aef10819","line":1,"updated":"2025-12-12 19:26:06.000000000","message":"jsut as an aside i asked gemini to refactor this to follow openstack coding convention and testing approches \n\ngeminies  feedback on the inital version was \n\n\"\"\"\nThe current code suffers from \"implementation leakage\"—it mixes test orchestration, browser lifecycle management, and resource cleanup logic into a single monolithic class.\n\nIn the OpenStack ecosystem, the standard approach relies on oslo_test, testtools, and fixtures. This architecture promotes:\n\n    Composition over Inheritance: Moving complex setup (like launching a browser) into reusable fixtures.\n\n    LIFO Cleanup: Using self.addCleanup eliminates the need for manual dependency tracking lists and complex tearDown logic.\n\n    Standard Logging: Integrating with oslo_log.\n\nHere is the refactored implementation.\nKey Changes\n\n    PlaywrightFixture: Encapsulates the entire browser lifecycle (Playwright start, Browser launch, Context creation, Page creation, Tracing/Video).\n\n    oslo_test.base.BaseTestCase: We inherit from the standard OpenStack base class.\n\n    self.addCleanup: We replaced the complex CLEANUP_ORDER list. Now, when you create a resource in a helper, you immediately register its deletion. testtools runs these in Last-In-First-Out order automatically, ensuring children are deleted before parents.\n\n\"\"\"\n\nthis was it version \nhttps://paste.opendev.org/show/bAHoMVpl1SW2Y1jTRCJv/\nwhich is defeintly a lot clsoe to what i was expecthign this to look like","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"b4c56f3024f1f64b02860ca995383d7242f344ec","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":2,"context_line":"#    not use this file except in compliance with the License. You may obtain"},{"line_number":3,"context_line":"#    a copy of the License at"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":17,"id":"4fa47b08_fc98178f","line":1,"in_reply_to":"dc9175a6_bc522922","updated":"2026-04-10 05:30:17.000000000","message":"Done","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"2388e5185089162ee090974017bba2b2d0cf062d","unresolved":true,"context_lines":[{"line_number":1,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":2,"context_line":"#    not use this file except in compliance with the License. You may obtain"},{"line_number":3,"context_line":"#    a copy of the License at"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":17,"id":"dc9175a6_bc522922","line":1,"in_reply_to":"e0d4a91b_aef10819","updated":"2025-12-16 10:31:17.000000000","message":"wonderful, it helped a lot and I went a head refined it more to follow POM Model for testing different pages https://playwright.dev/docs/pom","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"a2d10a4cd4f342dc12f9a8e563f16e83551f011a","unresolved":true,"context_lines":[{"line_number":24,"context_line":"      .modal.in, and tr[data-display] which are stable conventions"},{"line_number":25,"context_line":"\"\"\""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"import logging"},{"line_number":28,"context_line":"import os"},{"line_number":29,"context_line":"import re"},{"line_number":30,"context_line":"import unittest"}],"source_content_type":"text/x-python","patch_set":17,"id":"c1966a17_caa92755","line":27,"in_reply_to":"49e05775_557c5e8b","updated":"2025-12-12 19:15:48.000000000","message":"the input aort is valid but proably more valied is that we shoudl be using oslo.log for logging even in these tests.","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"b4c56f3024f1f64b02860ca995383d7242f344ec","unresolved":false,"context_lines":[{"line_number":24,"context_line":"      .modal.in, and tr[data-display] which are stable conventions"},{"line_number":25,"context_line":"\"\"\""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"import logging"},{"line_number":28,"context_line":"import os"},{"line_number":29,"context_line":"import re"},{"line_number":30,"context_line":"import unittest"}],"source_content_type":"text/x-python","patch_set":17,"id":"63f6b09a_e2c18d4b","line":27,"in_reply_to":"c1966a17_caa92755","updated":"2026-04-10 05:30:17.000000000","message":"Done","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"e620eb8d7dd512049ea9c28bebf6c15bf2f64572","unresolved":false,"context_lines":[{"line_number":191,"context_line":"        if cls.auth_reuse_enabled:"},{"line_number":192,"context_line":"            os.makedirs(os.path.dirname(cls.auth_state_path), exist_ok\u003dTrue)"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"        cls._playwright \u003d sync_playwright().start()"},{"line_number":195,"context_line":"        # Get browser type from config (chromium, firefox, or webkit)"},{"line_number":196,"context_line":"        browser_type \u003d config.get_browser()"},{"line_number":197,"context_line":"        browser_launcher \u003d getattr(cls._playwright, browser_type)"}],"source_content_type":"text/x-python","patch_set":17,"id":"2bcb593f_7fdf5581","line":194,"in_reply_to":"394534dc_2f7580e5","updated":"2025-12-16 12:02:33.000000000","message":"yes, this is to avoid startup delay of opening browser for each test.\nBased on playwright best practices https://playwright.dev/docs/best-practices#use-browser-contexts\n```\nEach test gets a fresh browser context... Browser contexts are isolated from each other, which means tests don\u0027t share cookies, cache, or other browser state\n```\namd\ntest isolation docs https://playwright.dev/docs/browser-contexts\n```\nBrowser contexts are equivalent to a brand new browser profile. This allows tests to run in parallel without interfering with each other.\n```\nBrowserContextFixture will create fresh session per test ensuring test isolation.\n\nI have now removed the duplication also.","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"a2d10a4cd4f342dc12f9a8e563f16e83551f011a","unresolved":true,"context_lines":[{"line_number":191,"context_line":"        if cls.auth_reuse_enabled:"},{"line_number":192,"context_line":"            os.makedirs(os.path.dirname(cls.auth_state_path), exist_ok\u003dTrue)"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"        cls._playwright \u003d sync_playwright().start()"},{"line_number":195,"context_line":"        # Get browser type from config (chromium, firefox, or webkit)"},{"line_number":196,"context_line":"        browser_type \u003d config.get_browser()"},{"line_number":197,"context_line":"        browser_launcher \u003d getattr(cls._playwright, browser_type)"}],"source_content_type":"text/x-python","patch_set":17,"id":"bb337e5a_793b1a08","line":194,"in_reply_to":"3bd8c02c_59d7b828","updated":"2025-12-12 19:15:48.000000000","message":"hum interesting\n\n\nso you have chosen to do the bowser setup once per class not per test.\n\ni assume this is to avoid the startup dely of opening the borwser for each test?\n\nis this a recommend or documetned pattheren for playwright testing?\n\nyou are also duplicating a lot of the conten of browser_context\n\n\nwe shoudl fix this","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"2388e5185089162ee090974017bba2b2d0cf062d","unresolved":false,"context_lines":[{"line_number":191,"context_line":"        if cls.auth_reuse_enabled:"},{"line_number":192,"context_line":"            os.makedirs(os.path.dirname(cls.auth_state_path), exist_ok\u003dTrue)"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"        cls._playwright \u003d sync_playwright().start()"},{"line_number":195,"context_line":"        # Get browser type from config (chromium, firefox, or webkit)"},{"line_number":196,"context_line":"        browser_type \u003d config.get_browser()"},{"line_number":197,"context_line":"        browser_launcher \u003d getattr(cls._playwright, browser_type)"}],"source_content_type":"text/x-python","patch_set":17,"id":"394534dc_2f7580e5","line":194,"in_reply_to":"bb337e5a_793b1a08","updated":"2025-12-16 10:31:17.000000000","message":"Done","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"a2d10a4cd4f342dc12f9a8e563f16e83551f011a","unresolved":true,"context_lines":[{"line_number":237,"context_line":"        # Register cleanup to ensure browser closes even if tests fail"},{"line_number":238,"context_line":"        cls.addClassCleanup(cls._cleanup_browser)"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"    @classmethod"},{"line_number":241,"context_line":"    def _cleanup_browser(cls):"},{"line_number":242,"context_line":"        \"\"\"Close browser and Playwright resources.\"\"\""},{"line_number":243,"context_line":"        # Get video path before closing context (video is finalized on close)"}],"source_content_type":"text/x-python","patch_set":17,"id":"160b312a_d1d903e4","line":240,"range":{"start_line":240,"start_character":0,"end_line":240,"end_character":2},"updated":"2025-12-12 19:15:48.000000000","message":"im not really a fan of these class meothod\n\nwe shoudl think about what should be at the class level and what should be at the test level.\nmos tof the time we want to prefer isntance metods and doing things at the test leve via seupt and using fixtures","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"2388e5185089162ee090974017bba2b2d0cf062d","unresolved":false,"context_lines":[{"line_number":237,"context_line":"        # Register cleanup to ensure browser closes even if tests fail"},{"line_number":238,"context_line":"        cls.addClassCleanup(cls._cleanup_browser)"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"    @classmethod"},{"line_number":241,"context_line":"    def _cleanup_browser(cls):"},{"line_number":242,"context_line":"        \"\"\"Close browser and Playwright resources.\"\"\""},{"line_number":243,"context_line":"        # Get video path before closing context (video is finalized on close)"}],"source_content_type":"text/x-python","patch_set":17,"id":"91643cd1_b3cbc3a1","line":240,"range":{"start_line":240,"start_character":0,"end_line":240,"end_character":2},"in_reply_to":"160b312a_d1d903e4","updated":"2025-12-16 10:31:17.000000000","message":"Done","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"a2d10a4cd4f342dc12f9a8e563f16e83551f011a","unresolved":true,"context_lines":[{"line_number":302,"context_line":"        cls._cleanup_all_resources()"},{"line_number":303,"context_line":"        super().tearDownClass()"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"    @classmethod"},{"line_number":306,"context_line":"    def _cleanup_all_resources(cls):"},{"line_number":307,"context_line":"        \"\"\"Delete all tracked resources in correct dependency order.\"\"\""},{"line_number":308,"context_line":"        for resource_type in cls.CLEANUP_ORDER:"},{"line_number":309,"context_line":"            resources \u003d cls._created_resources.get(resource_type, [])"},{"line_number":310,"context_line":"            panel_url \u003d cls.RESOURCE_PANELS.get(resource_type)"},{"line_number":311,"context_line":"            for resource_name in resources:"},{"line_number":312,"context_line":"                cls._delete_resource(panel_url, resource_name)"},{"line_number":313,"context_line":""},{"line_number":314,"context_line":"    @classmethod"},{"line_number":315,"context_line":"    def _delete_resource(cls, panel_url, resource_name):"}],"source_content_type":"text/x-python","patch_set":17,"id":"3d8a12e9_dba52857","line":312,"range":{"start_line":305,"start_character":2,"end_line":312,"end_character":62},"updated":"2025-12-12 19:15:48.000000000","message":"we should not be doing it this way we should be suing self.addCleanup when creating the resouce ot regeister them for cleanup\n\nor self.addClassCleanup if we are doign it at the test class level","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"2388e5185089162ee090974017bba2b2d0cf062d","unresolved":false,"context_lines":[{"line_number":302,"context_line":"        cls._cleanup_all_resources()"},{"line_number":303,"context_line":"        super().tearDownClass()"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"    @classmethod"},{"line_number":306,"context_line":"    def _cleanup_all_resources(cls):"},{"line_number":307,"context_line":"        \"\"\"Delete all tracked resources in correct dependency order.\"\"\""},{"line_number":308,"context_line":"        for resource_type in cls.CLEANUP_ORDER:"},{"line_number":309,"context_line":"            resources \u003d cls._created_resources.get(resource_type, [])"},{"line_number":310,"context_line":"            panel_url \u003d cls.RESOURCE_PANELS.get(resource_type)"},{"line_number":311,"context_line":"            for resource_name in resources:"},{"line_number":312,"context_line":"                cls._delete_resource(panel_url, resource_name)"},{"line_number":313,"context_line":""},{"line_number":314,"context_line":"    @classmethod"},{"line_number":315,"context_line":"    def _delete_resource(cls, panel_url, resource_name):"}],"source_content_type":"text/x-python","patch_set":17,"id":"e1af2410_3a6388d6","line":312,"range":{"start_line":305,"start_character":2,"end_line":312,"end_character":62},"in_reply_to":"3d8a12e9_dba52857","updated":"2025-12-16 10:31:17.000000000","message":"Acknowledged","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3de7cf4b33120277789a45f15f5b53d6fbef601f","unresolved":true,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"# \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":39,"context_line":"# Session-Scoped Fixtures (reused across all tests for performance)"},{"line_number":40,"context_line":"# \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class PlaywrightSessionFixture(fixtures.Fixture):"}],"source_content_type":"text/x-python","patch_set":19,"id":"84f60dc3_ddb63833","line":39,"range":{"start_line":39,"start_character":2,"end_line":39,"end_character":67},"updated":"2025-12-18 11:39:01.000000000","message":"this feels like a premature optimisation to me.","commit_id":"8fdc992e47df40c7212b8230620a73e38aed5188"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"b4c56f3024f1f64b02860ca995383d7242f344ec","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"# \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":39,"context_line":"# Session-Scoped Fixtures (reused across all tests for performance)"},{"line_number":40,"context_line":"# \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class PlaywrightSessionFixture(fixtures.Fixture):"}],"source_content_type":"text/x-python","patch_set":19,"id":"8584a139_a6b24560","line":39,"range":{"start_line":39,"start_character":2,"end_line":39,"end_character":67},"in_reply_to":"019cfafe_22b83981","updated":"2026-04-10 05:30:17.000000000","message":"Done","commit_id":"8fdc992e47df40c7212b8230620a73e38aed5188"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"0fa465ec54efb042cf38c45bbde7801a9c2aa793","unresolved":true,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"# \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":39,"context_line":"# Session-Scoped Fixtures (reused across all tests for performance)"},{"line_number":40,"context_line":"# \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class PlaywrightSessionFixture(fixtures.Fixture):"}],"source_content_type":"text/x-python","patch_set":19,"id":"019cfafe_22b83981","line":39,"range":{"start_line":39,"start_character":2,"end_line":39,"end_character":67},"in_reply_to":"84f60dc3_ddb63833","updated":"2025-12-18 11:54:37.000000000","message":"I think I should fallback to https://paste.opendev.org/show/bAHoMVpl1SW2Y1jTRCJv/ refactoring much simpler.","commit_id":"8fdc992e47df40c7212b8230620a73e38aed5188"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3de7cf4b33120277789a45f15f5b53d6fbef601f","unresolved":true,"context_lines":[{"line_number":225,"context_line":"    _browser_fixture \u003d None"},{"line_number":226,"context_line":"    _watcher_client_fixture \u003d None"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"    @classmethod"},{"line_number":229,"context_line":"    def setUpClass(cls):"},{"line_number":230,"context_line":"        \"\"\"Set up session-scoped fixtures once per test class.\"\"\""},{"line_number":231,"context_line":"        super().setUpClass()"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"        # Create session-scoped fixtures"},{"line_number":234,"context_line":"        cls._playwright_fixture \u003d PlaywrightSessionFixture()"},{"line_number":235,"context_line":"        cls._playwright_fixture.setUp()"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"        cls._browser_fixture \u003d BrowserFixture(cls._playwright_fixture)"},{"line_number":238,"context_line":"        cls._browser_fixture.setUp()"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"        # Initialize Watcher API client for cleanup operations"},{"line_number":241,"context_line":"        cls._watcher_client_fixture \u003d WatcherClientFixture()"},{"line_number":242,"context_line":"        cls._watcher_client_fixture.setUp()"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"        LOG.info(\"Session fixtures initialized for %s\", cls.__name__)"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"    @classmethod"},{"line_number":247,"context_line":"    def tearDownClass(cls):"},{"line_number":248,"context_line":"        \"\"\"Tear down session-scoped fixtures.\"\"\""},{"line_number":249,"context_line":"        if cls._watcher_client_fixture:"},{"line_number":250,"context_line":"            cls._watcher_client_fixture.cleanUp()"},{"line_number":251,"context_line":"        if cls._browser_fixture:"},{"line_number":252,"context_line":"            cls._browser_fixture.cleanUp()"},{"line_number":253,"context_line":"        if cls._playwright_fixture:"},{"line_number":254,"context_line":"            cls._playwright_fixture.cleanUp()"},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"        LOG.info(\"Session fixtures cleaned up for %s\", cls.__name__)"},{"line_number":257,"context_line":"        super().tearDownClass()"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"    @property"},{"line_number":260,"context_line":"    def watcher_client(self):"},{"line_number":261,"context_line":"        \"\"\"Get the Watcher API client for cleanup operations."}],"source_content_type":"text/x-python","patch_set":23,"id":"fff3c976_e1f30ac8","line":258,"range":{"start_line":228,"start_character":3,"end_line":258,"end_character":1},"updated":"2025-12-18 11:39:01.000000000","message":"just cross posting for visabliyt\n\nbut as i noted on the seleium version setupClass and tearDownClass are banned in some project because the signfically increate the congitive load when reasoning about the bevhioar of the tests.\n\nthis feels like a premare opmtiamion to me and i woudl prefer if we did not so any class level session or borwse rfconifg initally and start with seting this up for each test.","commit_id":"04e1d0d19e0d2af8ed596c9a85b90fb6dfccd3ee"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"b4c56f3024f1f64b02860ca995383d7242f344ec","unresolved":false,"context_lines":[{"line_number":225,"context_line":"    _browser_fixture \u003d None"},{"line_number":226,"context_line":"    _watcher_client_fixture \u003d None"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"    @classmethod"},{"line_number":229,"context_line":"    def setUpClass(cls):"},{"line_number":230,"context_line":"        \"\"\"Set up session-scoped fixtures once per test class.\"\"\""},{"line_number":231,"context_line":"        super().setUpClass()"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"        # Create session-scoped fixtures"},{"line_number":234,"context_line":"        cls._playwright_fixture \u003d PlaywrightSessionFixture()"},{"line_number":235,"context_line":"        cls._playwright_fixture.setUp()"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"        cls._browser_fixture \u003d BrowserFixture(cls._playwright_fixture)"},{"line_number":238,"context_line":"        cls._browser_fixture.setUp()"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"        # Initialize Watcher API client for cleanup operations"},{"line_number":241,"context_line":"        cls._watcher_client_fixture \u003d WatcherClientFixture()"},{"line_number":242,"context_line":"        cls._watcher_client_fixture.setUp()"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"        LOG.info(\"Session fixtures initialized for %s\", cls.__name__)"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"    @classmethod"},{"line_number":247,"context_line":"    def tearDownClass(cls):"},{"line_number":248,"context_line":"        \"\"\"Tear down session-scoped fixtures.\"\"\""},{"line_number":249,"context_line":"        if cls._watcher_client_fixture:"},{"line_number":250,"context_line":"            cls._watcher_client_fixture.cleanUp()"},{"line_number":251,"context_line":"        if cls._browser_fixture:"},{"line_number":252,"context_line":"            cls._browser_fixture.cleanUp()"},{"line_number":253,"context_line":"        if cls._playwright_fixture:"},{"line_number":254,"context_line":"            cls._playwright_fixture.cleanUp()"},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"        LOG.info(\"Session fixtures cleaned up for %s\", cls.__name__)"},{"line_number":257,"context_line":"        super().tearDownClass()"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"    @property"},{"line_number":260,"context_line":"    def watcher_client(self):"},{"line_number":261,"context_line":"        \"\"\"Get the Watcher API client for cleanup operations."}],"source_content_type":"text/x-python","patch_set":23,"id":"1a81bdc2_eb728b07","line":258,"range":{"start_line":228,"start_character":3,"end_line":258,"end_character":1},"in_reply_to":"fff3c976_e1f30ac8","updated":"2026-04-10 05:30:17.000000000","message":"Done","commit_id":"04e1d0d19e0d2af8ed596c9a85b90fb6dfccd3ee"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3de7cf4b33120277789a45f15f5b53d6fbef601f","unresolved":true,"context_lines":[{"line_number":299,"context_line":"        # Perform login at start of every test"},{"line_number":300,"context_line":"        self.login()"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"    def tearDown(self):"},{"line_number":303,"context_line":"        \"\"\"Capture screenshot on test failure before cleanup.\"\"\""},{"line_number":304,"context_line":"        # Check if test failed and capture screenshot"},{"line_number":305,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":23,"id":"a8834d72_3a23235c","line":302,"range":{"start_line":302,"start_character":4,"end_line":302,"end_character":23},"updated":"2025-12-18 11:39:01.000000000","message":"i guess this is a valid use of tearDown.\n\nwe try not to define custom tearDown handeler but this is oen of the clearn ways to achive this.","commit_id":"04e1d0d19e0d2af8ed596c9a85b90fb6dfccd3ee"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"b4c56f3024f1f64b02860ca995383d7242f344ec","unresolved":false,"context_lines":[{"line_number":299,"context_line":"        # Perform login at start of every test"},{"line_number":300,"context_line":"        self.login()"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"    def tearDown(self):"},{"line_number":303,"context_line":"        \"\"\"Capture screenshot on test failure before cleanup.\"\"\""},{"line_number":304,"context_line":"        # Check if test failed and capture screenshot"},{"line_number":305,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":23,"id":"7bcca738_e57da9e6","line":302,"range":{"start_line":302,"start_character":4,"end_line":302,"end_character":23},"in_reply_to":"a8834d72_3a23235c","updated":"2026-04-10 05:30:17.000000000","message":"Done","commit_id":"04e1d0d19e0d2af8ed596c9a85b90fb6dfccd3ee"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"32d145cece2b882585bac9253939c4596d0bb6b0","unresolved":true,"context_lines":[{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        launch_args \u003d []"},{"line_number":58,"context_line":"        if browser_type \u003d\u003d \u0027chromium\u0027:"},{"line_number":59,"context_line":"            launch_args \u003d [\u0027--no-sandbox\u0027, \u0027--disable-dev-shm-usage\u0027]"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        self.browser \u003d launcher.launch("},{"line_number":62,"context_line":"            headless\u003dconfig.is_headless(),"}],"source_content_type":"text/x-python","patch_set":30,"id":"0fcb7cb3_ba4f6f6e","line":59,"updated":"2026-01-21 15:41:50.000000000","message":"I think we should document why we set these args for future reference. I did a quick search and I got the impression that they might give better performance, but I\u0027m not sure if that is the case","commit_id":"eccdb99da25decc93323d106f2b71f7797f0d919"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"5207b50dd84516a590cb89e5e7bda016c5770669","unresolved":false,"context_lines":[{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        launch_args \u003d []"},{"line_number":58,"context_line":"        if browser_type \u003d\u003d \u0027chromium\u0027:"},{"line_number":59,"context_line":"            launch_args \u003d [\u0027--no-sandbox\u0027, \u0027--disable-dev-shm-usage\u0027]"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        self.browser \u003d launcher.launch("},{"line_number":62,"context_line":"            headless\u003dconfig.is_headless(),"}],"source_content_type":"text/x-python","patch_set":30,"id":"4500db88_8ae2113f","line":59,"in_reply_to":"0fcb7cb3_ba4f6f6e","updated":"2026-01-22 04:09:50.000000000","message":"Done","commit_id":"eccdb99da25decc93323d106f2b71f7797f0d919"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"32d145cece2b882585bac9253939c4596d0bb6b0","unresolved":true,"context_lines":[{"line_number":166,"context_line":"    def setUpClass(cls):"},{"line_number":167,"context_line":"        \"\"\"Set up session-scoped Watcher API client.\"\"\""},{"line_number":168,"context_line":"        super().setUpClass()"},{"line_number":169,"context_line":"        cls._watcher_client_fixture \u003d WatcherClientFixture()"},{"line_number":170,"context_line":"        cls._watcher_client_fixture.setUp()"},{"line_number":171,"context_line":"        LOG.info(\"Watcher API client initialized for %s\", cls.__name__)"},{"line_number":172,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"a7c1eb83_209d64e9","line":169,"updated":"2026-01-21 15:41:50.000000000","message":"why not using `useFixture` for this like it\u0027s done with the `PlaywrightFixture`?","commit_id":"eccdb99da25decc93323d106f2b71f7797f0d919"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"5207b50dd84516a590cb89e5e7bda016c5770669","unresolved":true,"context_lines":[{"line_number":166,"context_line":"    def setUpClass(cls):"},{"line_number":167,"context_line":"        \"\"\"Set up session-scoped Watcher API client.\"\"\""},{"line_number":168,"context_line":"        super().setUpClass()"},{"line_number":169,"context_line":"        cls._watcher_client_fixture \u003d WatcherClientFixture()"},{"line_number":170,"context_line":"        cls._watcher_client_fixture.setUp()"},{"line_number":171,"context_line":"        LOG.info(\"Watcher API client initialized for %s\", cls.__name__)"},{"line_number":172,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"eb639ddd_e071ab7f","line":169,"in_reply_to":"a7c1eb83_209d64e9","updated":"2026-01-22 04:09:50.000000000","message":"useFixture only works on instance method not on class method.We create the client here so one session is reused by all tests in this class and we avoid logging in every test.","commit_id":"eccdb99da25decc93323d106f2b71f7797f0d919"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"b4c56f3024f1f64b02860ca995383d7242f344ec","unresolved":false,"context_lines":[{"line_number":166,"context_line":"    def setUpClass(cls):"},{"line_number":167,"context_line":"        \"\"\"Set up session-scoped Watcher API client.\"\"\""},{"line_number":168,"context_line":"        super().setUpClass()"},{"line_number":169,"context_line":"        cls._watcher_client_fixture \u003d WatcherClientFixture()"},{"line_number":170,"context_line":"        cls._watcher_client_fixture.setUp()"},{"line_number":171,"context_line":"        LOG.info(\"Watcher API client initialized for %s\", cls.__name__)"},{"line_number":172,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"80fad22f_b9d44736","line":169,"in_reply_to":"eb639ddd_e071ab7f","updated":"2026-04-10 05:30:17.000000000","message":"Done","commit_id":"eccdb99da25decc93323d106f2b71f7797f0d919"}],"watcher_dashboard/test/integration/playwright_config.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"a2d10a4cd4f342dc12f9a8e563f16e83551f011a","unresolved":true,"context_lines":[{"line_number":22,"context_line":"integration tests run standalone without Django settings configured."},{"line_number":23,"context_line":"\"\"\""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"from functools import cache"},{"line_number":26,"context_line":"import os"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"213ef6a3_fd62e60c","line":25,"updated":"2025-12-12 19:15:48.000000000","message":"import functools\n\n@functools.cache\n\nwe do not import funciton directly","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"2388e5185089162ee090974017bba2b2d0cf062d","unresolved":false,"context_lines":[{"line_number":22,"context_line":"integration tests run standalone without Django settings configured."},{"line_number":23,"context_line":"\"\"\""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"from functools import cache"},{"line_number":26,"context_line":"import os"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"e0409810_edafa3d8","line":25,"in_reply_to":"213ef6a3_fd62e60c","updated":"2025-12-16 10:31:17.000000000","message":"Done","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"a2d10a4cd4f342dc12f9a8e563f16e83551f011a","unresolved":true,"context_lines":[{"line_number":54,"context_line":"    Returns:"},{"line_number":55,"context_line":"        The password (default: secretadmin, matching Horizon\u0027s test config)"},{"line_number":56,"context_line":"    \"\"\""},{"line_number":57,"context_line":"    return os.environ.get(\u0027OS_PASSWORD\u0027, \u0027secretadmin\u0027)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"@cache"}],"source_content_type":"text/x-python","patch_set":17,"id":"637df7b8_db2a3ac9","line":57,"in_reply_to":"30285d8f_11f875ea","updated":"2025-12-12 19:15:48.000000000","message":"no relvent but we shoudl be setting th edefault in thte tox config not here.","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"b4c56f3024f1f64b02860ca995383d7242f344ec","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    Returns:"},{"line_number":55,"context_line":"        The password (default: secretadmin, matching Horizon\u0027s test config)"},{"line_number":56,"context_line":"    \"\"\""},{"line_number":57,"context_line":"    return os.environ.get(\u0027OS_PASSWORD\u0027, \u0027secretadmin\u0027)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"@cache"}],"source_content_type":"text/x-python","patch_set":17,"id":"e5bdc7e8_c482f89f","line":57,"in_reply_to":"637df7b8_db2a3ac9","updated":"2026-04-10 05:30:17.000000000","message":"Done","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"a2d10a4cd4f342dc12f9a8e563f16e83551f011a","unresolved":true,"context_lines":[{"line_number":65,"context_line":"        True if headless mode is enabled (default: True)"},{"line_number":66,"context_line":"    \"\"\""},{"line_number":67,"context_line":"    value \u003d os.environ.get(\u0027PLAYWRIGHT_HEADLESS\u0027, \u0027True\u0027).lower()"},{"line_number":68,"context_line":"    return value in (\u0027true\u0027, \u00271\u0027, \u0027yes\u0027)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"def _get_playwright_base_dir():"}],"source_content_type":"text/x-python","patch_set":17,"id":"2bce14f0_ab0f1636","line":68,"updated":"2025-12-12 19:15:48.000000000","message":"use oslo.utils bool_from_string for this","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"2388e5185089162ee090974017bba2b2d0cf062d","unresolved":true,"context_lines":[{"line_number":65,"context_line":"        True if headless mode is enabled (default: True)"},{"line_number":66,"context_line":"    \"\"\""},{"line_number":67,"context_line":"    value \u003d os.environ.get(\u0027PLAYWRIGHT_HEADLESS\u0027, \u0027True\u0027).lower()"},{"line_number":68,"context_line":"    return value in (\u0027true\u0027, \u00271\u0027, \u0027yes\u0027)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"def _get_playwright_base_dir():"}],"source_content_type":"text/x-python","patch_set":17,"id":"4f2f7ee2_4135c591","line":68,"in_reply_to":"2bce14f0_ab0f1636","updated":"2025-12-16 10:31:17.000000000","message":"But we need to import oslo.utils in test-requirements.txt.","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"e2be3bfed169cf58333820bda364da7ed10c05e9","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        True if headless mode is enabled (default: True)"},{"line_number":66,"context_line":"    \"\"\""},{"line_number":67,"context_line":"    value \u003d os.environ.get(\u0027PLAYWRIGHT_HEADLESS\u0027, \u0027True\u0027).lower()"},{"line_number":68,"context_line":"    return value in (\u0027true\u0027, \u00271\u0027, \u0027yes\u0027)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"def _get_playwright_base_dir():"}],"source_content_type":"text/x-python","patch_set":17,"id":"04fefd56_a7a0cec1","line":68,"in_reply_to":"4f2f7ee2_4135c591","updated":"2025-12-18 10:01:13.000000000","message":"Done","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"a2d10a4cd4f342dc12f9a8e563f16e83551f011a","unresolved":true,"context_lines":[{"line_number":76,"context_line":"    \"\"\""},{"line_number":77,"context_line":"    base_dir \u003d os.environ.get(\u0027PLAYWRIGHT_OUTPUT_DIR\u0027,"},{"line_number":78,"context_line":"                              os.path.expanduser(\u0027~/playwright\u0027))"},{"line_number":79,"context_line":"    return base_dir"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"@cache"}],"source_content_type":"text/x-python","patch_set":17,"id":"99e63b1c_d563a120","line":79,"updated":"2025-12-12 19:15:48.000000000","message":"-1 \nyou are not allowed to use any directory out side fo the git repo\n\nyou need to create a .playwritght dir at the root of the repo and add that to .gitignore.","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"2388e5185089162ee090974017bba2b2d0cf062d","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    \"\"\""},{"line_number":77,"context_line":"    base_dir \u003d os.environ.get(\u0027PLAYWRIGHT_OUTPUT_DIR\u0027,"},{"line_number":78,"context_line":"                              os.path.expanduser(\u0027~/playwright\u0027))"},{"line_number":79,"context_line":"    return base_dir"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"@cache"}],"source_content_type":"text/x-python","patch_set":17,"id":"5fa4206d_809c8fb7","line":79,"in_reply_to":"99e63b1c_d563a120","updated":"2025-12-16 10:31:17.000000000","message":"Acknowledged","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"a2d10a4cd4f342dc12f9a8e563f16e83551f011a","unresolved":true,"context_lines":[{"line_number":118,"context_line":"    Supported browsers: chromium, firefox, webkit"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    Returns:"},{"line_number":121,"context_line":"        The browser type (default: chromium)"},{"line_number":122,"context_line":"    \"\"\""},{"line_number":123,"context_line":"    browser \u003d os.environ.get(\u0027PLAYWRIGHT_BROWSER\u0027, \u0027chromium\u0027).lower()"},{"line_number":124,"context_line":"    valid_browsers \u003d (\u0027chromium\u0027, \u0027firefox\u0027, \u0027webkit\u0027)"}],"source_content_type":"text/x-python","patch_set":17,"id":"a2b78ca6_6738150b","line":121,"updated":"2025-12-12 19:15:48.000000000","message":"the default should likely be webkit or firefox but it should be set via the tox file","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"2388e5185089162ee090974017bba2b2d0cf062d","unresolved":false,"context_lines":[{"line_number":118,"context_line":"    Supported browsers: chromium, firefox, webkit"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    Returns:"},{"line_number":121,"context_line":"        The browser type (default: chromium)"},{"line_number":122,"context_line":"    \"\"\""},{"line_number":123,"context_line":"    browser \u003d os.environ.get(\u0027PLAYWRIGHT_BROWSER\u0027, \u0027chromium\u0027).lower()"},{"line_number":124,"context_line":"    valid_browsers \u003d (\u0027chromium\u0027, \u0027firefox\u0027, \u0027webkit\u0027)"}],"source_content_type":"text/x-python","patch_set":17,"id":"9ab1f0a2_8fdcd737","line":121,"in_reply_to":"a2b78ca6_6738150b","updated":"2025-12-16 10:31:17.000000000","message":"Done","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f1af12cd3b562c3b45a169f435d826d8908095df","unresolved":true,"context_lines":[{"line_number":15,"context_line":"import functools"},{"line_number":16,"context_line":"import os"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import openstack"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from oslo_utils import strutils"},{"line_number":21,"context_line":""}],"source_content_type":"text/x-python","patch_set":43,"id":"9b14f03c_f2d5aa9e","line":18,"updated":"2026-04-07 15:23:21.000000000","message":"so it looks like you only using the sdk to parse the auth.\n\nthis is a very heavy weight approch to that.\n\ni woudl prefer if we removed this dep entirly and isntead jsut used json or configparser moduel to read this form a local file.\n\nfor example we can do this only via enviorng varibles that are set/defaulted in tox.ini","commit_id":"1359ce3cf9a38b37c1e029f397e0995aa304ae1f"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"b4c56f3024f1f64b02860ca995383d7242f344ec","unresolved":false,"context_lines":[{"line_number":15,"context_line":"import functools"},{"line_number":16,"context_line":"import os"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import openstack"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from oslo_utils import strutils"},{"line_number":21,"context_line":""}],"source_content_type":"text/x-python","patch_set":43,"id":"301727db_bd106a5c","line":18,"in_reply_to":"9b14f03c_f2d5aa9e","updated":"2026-04-10 05:30:17.000000000","message":"Done","commit_id":"1359ce3cf9a38b37c1e029f397e0995aa304ae1f"}],"watcher_dashboard/test/integration/test_playwright_audit_workflow.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"a2d10a4cd4f342dc12f9a8e563f16e83551f011a","unresolved":true,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"import uuid"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from playwright.sync_api import expect"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"from watcher_dashboard.test.integration import playwright_base"},{"line_number":26,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"aad7cbb4_a38f6052","line":23,"range":{"start_line":23,"start_character":32,"end_line":23,"end_character":38},"updated":"2025-12-12 19:15:48.000000000","message":"you shoudl only import module not funcitons\n\n```suggestion\nfrom playwright import sync_api\n```","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"b4c56f3024f1f64b02860ca995383d7242f344ec","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"import uuid"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from playwright.sync_api import expect"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"from watcher_dashboard.test.integration import playwright_base"},{"line_number":26,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"1b44b004_5fd3910d","line":23,"range":{"start_line":23,"start_character":32,"end_line":23,"end_character":38},"in_reply_to":"aad7cbb4_a38f6052","updated":"2026-04-10 05:30:17.000000000","message":"Done","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"a2d10a4cd4f342dc12f9a8e563f16e83551f011a","unresolved":true,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":"from watcher_dashboard.test.integration import playwright_base"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"PlaywrightTestCase \u003d playwright_base.PlaywrightTestCase"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class TestPlaywrightAuditWorkflow(PlaywrightTestCase):"}],"source_content_type":"text/x-python","patch_set":17,"id":"21a75b21_09ec205d","line":27,"updated":"2025-12-12 19:15:48.000000000","message":"delete","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"2388e5185089162ee090974017bba2b2d0cf062d","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":"from watcher_dashboard.test.integration import playwright_base"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"PlaywrightTestCase \u003d playwright_base.PlaywrightTestCase"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class TestPlaywrightAuditWorkflow(PlaywrightTestCase):"}],"source_content_type":"text/x-python","patch_set":17,"id":"d43bfb2a_b1347e61","line":27,"in_reply_to":"21a75b21_09ec205d","updated":"2025-12-16 10:31:17.000000000","message":"Done","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"a2d10a4cd4f342dc12f9a8e563f16e83551f011a","unresolved":true,"context_lines":[{"line_number":27,"context_line":"PlaywrightTestCase \u003d playwright_base.PlaywrightTestCase"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class TestPlaywrightAuditWorkflow(PlaywrightTestCase):"},{"line_number":31,"context_line":"    \"\"\"Integration tests for audit workflow using Playwright."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    Each test is self-contained and creates its own prerequisites."}],"source_content_type":"text/x-python","patch_set":17,"id":"8f185b25_4bc7740d","line":30,"range":{"start_line":30,"start_character":0,"end_line":30,"end_character":54},"updated":"2025-12-12 19:15:48.000000000","message":"```suggestion\nclass TestPlaywrightAuditWorkflow(playwright_base.PlaywrightTestCase):\n```\nor\n```\nclass TestPlaywrightAuditWorkflow(\n    playwright_base.PlaywrightTestCase\n):\n```\nif you need to wrap it","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"2388e5185089162ee090974017bba2b2d0cf062d","unresolved":false,"context_lines":[{"line_number":27,"context_line":"PlaywrightTestCase \u003d playwright_base.PlaywrightTestCase"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class TestPlaywrightAuditWorkflow(PlaywrightTestCase):"},{"line_number":31,"context_line":"    \"\"\"Integration tests for audit workflow using Playwright."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    Each test is self-contained and creates its own prerequisites."}],"source_content_type":"text/x-python","patch_set":17,"id":"1f53388c_fb07c1db","line":30,"range":{"start_line":30,"start_character":0,"end_line":30,"end_character":54},"in_reply_to":"8f185b25_4bc7740d","updated":"2025-12-16 10:31:17.000000000","message":"Done","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"a2d10a4cd4f342dc12f9a8e563f16e83551f011a","unresolved":true,"context_lines":[{"line_number":33,"context_line":"    Each test is self-contained and creates its own prerequisites."},{"line_number":34,"context_line":"    This ensures tests can run in any order or in parallel."},{"line_number":35,"context_line":"    \"\"\""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def test_create_audit_template(self):"},{"line_number":38,"context_line":"        \"\"\"Test creating an audit template via UI.\"\"\""},{"line_number":39,"context_line":"        # Each test creates its own unique template (UUID for parallel safety)"}],"source_content_type":"text/x-python","patch_set":17,"id":"87e4ef9a_4b7e4027","line":36,"updated":"2025-12-12 19:15:48.000000000","message":"if you want to avoid doing \n\nsync_api.expect you can do\n\n```\nexpect \u003d sync_api.expect\n``\nand do \nself.expect() below\n\nbut i woudl prefer we di that PlaywrightTestCase","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"b4c56f3024f1f64b02860ca995383d7242f344ec","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    Each test is self-contained and creates its own prerequisites."},{"line_number":34,"context_line":"    This ensures tests can run in any order or in parallel."},{"line_number":35,"context_line":"    \"\"\""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def test_create_audit_template(self):"},{"line_number":38,"context_line":"        \"\"\"Test creating an audit template via UI.\"\"\""},{"line_number":39,"context_line":"        # Each test creates its own unique template (UUID for parallel safety)"}],"source_content_type":"text/x-python","patch_set":17,"id":"692d936d_2eb6f8df","line":36,"in_reply_to":"87e4ef9a_4b7e4027","updated":"2026-04-10 05:30:17.000000000","message":"Done","commit_id":"53d28e30b991d9f7ce808d8bc4371378d469fa59"}]}
