)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"67794a866d6b3bb3452ebd6f427517b65512593b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"75d4abfd_b4da3fb4","updated":"2025-12-17 11:31:33.000000000","message":"the playright version need more work but i think that is lookign better to me over all","commit_id":"87502fe7c1e606920c8bb45496b92f8d0e54c537"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"3fc238476e8aa0f4fdd9846568b60bab65176817","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":17,"id":"6be948ac_f19dc393","updated":"2025-12-18 10:24:35.000000000","message":"Thank you @smooney@redhat.com for the detailed review, I have left few items as it is till we finalize the proper ui test automation framework.","commit_id":"f797f58e261c5579c6b4debb52df6660e7201384"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"281329cfc3b30949b9659113109f140f077413f2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"fc83b76b_b6e863ac","updated":"2026-01-20 05:48:42.000000000","message":"recheck","commit_id":"032590f48cca8e55872cc77a3e62a0fdb3b1658c"}],"doc/source/contributor/selenium-testing.rst":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"67794a866d6b3bb3452ebd6f427517b65512593b","unresolved":true,"context_lines":[{"line_number":153,"context_line":"**Test Output:**"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"``SELENIUM_TEST_REPORTS_DIR``"},{"line_number":156,"context_line":"   Directory for test reports (default: ``~/selenium``)"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"``SELENIUM_SCREENSHOT_DIR``"},{"line_number":159,"context_line":"   Directory for screenshots (default: ``~/selenium``)"}],"source_content_type":"text/x-rst","patch_set":16,"id":"6e040857_b13cf937","line":156,"updated":"2025-12-17 11:31:33.000000000","message":"same comment as the playwright verson\nits never ok to have our tooling use anyting form teh home directory\n\nit alwasy must be a subpath of the repo root.","commit_id":"87502fe7c1e606920c8bb45496b92f8d0e54c537"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"3fc238476e8aa0f4fdd9846568b60bab65176817","unresolved":false,"context_lines":[{"line_number":153,"context_line":"**Test Output:**"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"``SELENIUM_TEST_REPORTS_DIR``"},{"line_number":156,"context_line":"   Directory for test reports (default: ``~/selenium``)"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"``SELENIUM_SCREENSHOT_DIR``"},{"line_number":159,"context_line":"   Directory for screenshots (default: ``~/selenium``)"}],"source_content_type":"text/x-rst","patch_set":16,"id":"e90186de_b12e7bdf","line":156,"in_reply_to":"6e040857_b13cf937","updated":"2025-12-18 10:24:35.000000000","message":"Done","commit_id":"87502fe7c1e606920c8bb45496b92f8d0e54c537"}],"playbooks/selenium/run.yaml":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"67794a866d6b3bb3452ebd6f427517b65512593b","unresolved":true,"context_lines":[{"line_number":5,"context_line":"    FFMPEG_INSTALLED: True"},{"line_number":6,"context_line":"  roles:"},{"line_number":7,"context_line":"    - tox"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":""},{"line_number":10,"context_line":""},{"line_number":11,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":16,"id":"bbcdd2e9_19865719","line":8,"updated":"2025-12-17 11:31:33.000000000","message":"if we proceed with this we would need to clean this up","commit_id":"87502fe7c1e606920c8bb45496b92f8d0e54c537"}],"watcher_dashboard/test/integration/base.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"67794a866d6b3bb3452ebd6f427517b65512593b","unresolved":true,"context_lines":[{"line_number":19,"context_line":"    This module uses a hybrid locator strategy for Horizon:"},{"line_number":20,"context_line":"    - ID and CSS selectors for form interactions as they are stable"},{"line_number":21,"context_line":"    - CSS selectors for Horizon-specific elements like .alert-success,"},{"line_number":22,"context_line":"      .modal-content, and tr[data-display] which are stable conventions"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Video Recording:"},{"line_number":25,"context_line":"    Tests automatically record video of the browser session if ffmpeg is"}],"source_content_type":"text/x-python","patch_set":16,"id":"ac8f065e_144b2aed","line":22,"in_reply_to":"4e93b646_211809bb","updated":"2025-12-17 11:31:33.000000000","message":"tag is now used but its used incorerctly\n\n`from django.test import tag`\n\nshould be \n`from django import test import`\n\nand then you woudl use @test.tag\n\nhttps://github.com/openstack/hacking/blob/master/HACKING.rst?plain\u003d1#L58\n\nthis hackign rule is not enfoced by lits but since i see peopel breakign this and have to commet it foten im really considering if i shoudl write a lint rule for this so i dont have to keep point this out.\n\ntag is a decorator not a module \nhttps://github.com/django/django/blob/main/django/test/utils.py#L976-L986\nso you are not allowed to import it directly","commit_id":"87502fe7c1e606920c8bb45496b92f8d0e54c537"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"3fc238476e8aa0f4fdd9846568b60bab65176817","unresolved":false,"context_lines":[{"line_number":19,"context_line":"    This module uses a hybrid locator strategy for Horizon:"},{"line_number":20,"context_line":"    - ID and CSS selectors for form interactions as they are stable"},{"line_number":21,"context_line":"    - CSS selectors for Horizon-specific elements like .alert-success,"},{"line_number":22,"context_line":"      .modal-content, and tr[data-display] which are stable conventions"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Video Recording:"},{"line_number":25,"context_line":"    Tests automatically record video of the browser session if ffmpeg is"}],"source_content_type":"text/x-python","patch_set":16,"id":"6f53b66f_8bfd92c7","line":22,"in_reply_to":"ac8f065e_144b2aed","updated":"2025-12-18 10:24:35.000000000","message":"Done","commit_id":"87502fe7c1e606920c8bb45496b92f8d0e54c537"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"67794a866d6b3bb3452ebd6f427517b65512593b","unresolved":true,"context_lines":[{"line_number":38,"context_line":"from django.test import tag"},{"line_number":39,"context_line":"from selenium.common import exceptions"},{"line_number":40,"context_line":"from selenium import webdriver"},{"line_number":41,"context_line":"from selenium.webdriver.chrome.options import Options as ChromeOptions"},{"line_number":42,"context_line":"from selenium.webdriver.common.by import By"},{"line_number":43,"context_line":"from selenium.webdriver.support import expected_conditions as EC"},{"line_number":44,"context_line":"from selenium.webdriver.support.ui import Select"},{"line_number":45,"context_line":"from selenium.webdriver.support.ui import WebDriverWait"},{"line_number":46,"context_line":"import xvfbwrapper"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"from watcher_dashboard.test.integration import config"}],"source_content_type":"text/x-python","patch_set":16,"id":"c5724cc1_e7341018","line":45,"range":{"start_line":41,"start_character":0,"end_line":45,"end_character":55},"updated":"2025-12-17 11:31:33.000000000","message":"these all violate the same import rule.","commit_id":"87502fe7c1e606920c8bb45496b92f8d0e54c537"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"3fc238476e8aa0f4fdd9846568b60bab65176817","unresolved":false,"context_lines":[{"line_number":38,"context_line":"from django.test import tag"},{"line_number":39,"context_line":"from selenium.common import exceptions"},{"line_number":40,"context_line":"from selenium import webdriver"},{"line_number":41,"context_line":"from selenium.webdriver.chrome.options import Options as ChromeOptions"},{"line_number":42,"context_line":"from selenium.webdriver.common.by import By"},{"line_number":43,"context_line":"from selenium.webdriver.support import expected_conditions as EC"},{"line_number":44,"context_line":"from selenium.webdriver.support.ui import Select"},{"line_number":45,"context_line":"from selenium.webdriver.support.ui import WebDriverWait"},{"line_number":46,"context_line":"import xvfbwrapper"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"from watcher_dashboard.test.integration import config"}],"source_content_type":"text/x-python","patch_set":16,"id":"56c2104c_48488b27","line":45,"range":{"start_line":41,"start_character":0,"end_line":45,"end_character":55},"in_reply_to":"c5724cc1_e7341018","updated":"2025-12-18 10:24:35.000000000","message":"my bad, fixed it now by cross checking the code.","commit_id":"87502fe7c1e606920c8bb45496b92f8d0e54c537"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"67794a866d6b3bb3452ebd6f427517b65512593b","unresolved":true,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"@tag(\u0027integration\u0027)"},{"line_number":56,"context_line":"class SeleniumTestCase(unittest.TestCase):"},{"line_number":57,"context_line":"    \"\"\"Base test case for Watcher Dashboard integration tests."},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    Provides browser setup, login, screenshot, and common helpers"}],"source_content_type":"text/x-python","patch_set":16,"id":"dc804425_e736280b","line":56,"updated":"2025-12-17 11:31:33.000000000","message":"we may want to consider just using SeleniumTestCaseBase\n\nhttps://github.com/django/django/blob/main/django/test/selenium.py#L14\n\nif we were to use selenium or SeleniumTestCase.\nhttps://github.com/django/django/blob/main/django/test/selenium.py#L129","commit_id":"87502fe7c1e606920c8bb45496b92f8d0e54c537"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"67794a866d6b3bb3452ebd6f427517b65512593b","unresolved":true,"context_lines":[{"line_number":81,"context_line":"    _test_failed \u003d False"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    @classmethod"},{"line_number":84,"context_line":"    def setUpClass(cls):"},{"line_number":85,"context_line":"        \"\"\"Set up browser context for the test class.\"\"\""},{"line_number":86,"context_line":"        super().setUpClass()"},{"line_number":87,"context_line":"        cls._setup_xvfb()"}],"source_content_type":"text/x-python","patch_set":16,"id":"6171ab3c_9c146243","line":84,"range":{"start_line":84,"start_character":8,"end_line":84,"end_character":18},"updated":"2025-12-17 11:31:33.000000000","message":"just so your aware using setUpClass and teardownclass is\nbanned in some openstack project beucase of how error prone it is\n\n\nwe we end up going the seleinim route i will want us to refactor this to use fixture and minimies or elminate the usage of class method entirly \n\nwe may optimize the creation of the bowser and resue it per test class but i dont think we shoudl start with that","commit_id":"87502fe7c1e606920c8bb45496b92f8d0e54c537"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"3fc238476e8aa0f4fdd9846568b60bab65176817","unresolved":true,"context_lines":[{"line_number":81,"context_line":"    _test_failed \u003d False"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    @classmethod"},{"line_number":84,"context_line":"    def setUpClass(cls):"},{"line_number":85,"context_line":"        \"\"\"Set up browser context for the test class.\"\"\""},{"line_number":86,"context_line":"        super().setUpClass()"},{"line_number":87,"context_line":"        cls._setup_xvfb()"}],"source_content_type":"text/x-python","patch_set":16,"id":"896a9f6f_70368bd9","line":84,"range":{"start_line":84,"start_character":8,"end_line":84,"end_character":18},"in_reply_to":"6171ab3c_9c146243","updated":"2025-12-18 10:24:35.000000000","message":"I will wait for the final decision on the tool.","commit_id":"87502fe7c1e606920c8bb45496b92f8d0e54c537"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"67794a866d6b3bb3452ebd6f427517b65512593b","unresolved":true,"context_lines":[{"line_number":289,"context_line":"        try:"},{"line_number":290,"context_line":"            shutil.move(cls._video_recorder.file_path, video_dest)"},{"line_number":291,"context_line":"            LOG.info(\"Saved video to %s\", video_dest)"},{"line_number":292,"context_line":"        except Exception as e:"},{"line_number":293,"context_line":"            LOG.error(\"Failed to save video: %s\", e)"},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":16,"id":"360b3167_0469aa00","line":292,"in_reply_to":"34e24217_be00281a","updated":"2025-12-17 11:31:33.000000000","message":"\u003e **Suggestion**:\n\u003e Replace generic except Exception with more specific exception types to improve debugging\n\nhttps://docs.python.org/3/library/shutil.html#shutil.move\n\nwill raise either OSError or IOError\n\nhttps://docs.python.org/3/tutorial/errors.html#handling-exceptions\n\n\n```suggestion\n        except (OSError, IOError) as e:\n```","commit_id":"87502fe7c1e606920c8bb45496b92f8d0e54c537"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"3fc238476e8aa0f4fdd9846568b60bab65176817","unresolved":false,"context_lines":[{"line_number":289,"context_line":"        try:"},{"line_number":290,"context_line":"            shutil.move(cls._video_recorder.file_path, video_dest)"},{"line_number":291,"context_line":"            LOG.info(\"Saved video to %s\", video_dest)"},{"line_number":292,"context_line":"        except Exception as e:"},{"line_number":293,"context_line":"            LOG.error(\"Failed to save video: %s\", e)"},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":16,"id":"fcdf786a_06bfc312","line":292,"in_reply_to":"360b3167_0469aa00","updated":"2025-12-18 10:24:35.000000000","message":"Acknowledged","commit_id":"87502fe7c1e606920c8bb45496b92f8d0e54c537"}],"watcher_dashboard/test/integration/config.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"67794a866d6b3bb3452ebd6f427517b65512593b","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":16,"id":"56f2de44_47176a1c","line":25,"updated":"2025-12-17 11:31:33.000000000","message":"again this violate openstack coding style gudileins so you really should fix this before upload a patch for review.\n\nyou can only import modules not decortoars\n\ni wrote this up in the spec for imporivng code qualati in the watcher dashbaord repo prescisly beacuse i had to keep giving this same feedback in many reviews so please fix this in all future patches before you push them for review.\n\nhttps://specs.openstack.org/openstack/watcher-specs/specs/2026.1/approved/testing-and-codequality.html#problem-description","commit_id":"87502fe7c1e606920c8bb45496b92f8d0e54c537"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"3fc238476e8aa0f4fdd9846568b60bab65176817","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":16,"id":"ecea5a46_50cbc969","line":25,"in_reply_to":"56f2de44_47176a1c","updated":"2025-12-18 10:24:35.000000000","message":"Acknowledged","commit_id":"87502fe7c1e606920c8bb45496b92f8d0e54c537"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"67794a866d6b3bb3452ebd6f427517b65512593b","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(\u0027SELENIUM_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":"@cache"}],"source_content_type":"text/x-python","patch_set":16,"id":"3a0717a9_a3dd9032","line":68,"updated":"2025-12-17 11:31:33.000000000","message":"again we would use oslo.utils for this if we select the selenium veriosn but i guess we are leaining in the direciton of playright","commit_id":"87502fe7c1e606920c8bb45496b92f8d0e54c537"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"3fc238476e8aa0f4fdd9846568b60bab65176817","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(\u0027SELENIUM_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":"@cache"}],"source_content_type":"text/x-python","patch_set":16,"id":"fb9dc6eb_cddf2d92","line":68,"in_reply_to":"3a0717a9_a3dd9032","updated":"2025-12-18 10:24:35.000000000","message":"Done","commit_id":"87502fe7c1e606920c8bb45496b92f8d0e54c537"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"67794a866d6b3bb3452ebd6f427517b65512593b","unresolved":true,"context_lines":[{"line_number":75,"context_line":"    Returns:"},{"line_number":76,"context_line":"        The screenshot directory path (default: ~/selenium)"},{"line_number":77,"context_line":"    \"\"\""},{"line_number":78,"context_line":"    default_dir \u003d os.path.expanduser(\u0027~/selenium\u0027)"},{"line_number":79,"context_line":"    return os.environ.get(\u0027SELENIUM_SCREENSHOT_DIR\u0027, default_dir)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"faeff365_8b310ec5","line":78,"updated":"2025-12-17 11:31:33.000000000","message":"as noted previoulsy you cannot use the user home directory for things like this\nyou are not allowed to create files out side of the git repo.","commit_id":"87502fe7c1e606920c8bb45496b92f8d0e54c537"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"3fc238476e8aa0f4fdd9846568b60bab65176817","unresolved":false,"context_lines":[{"line_number":75,"context_line":"    Returns:"},{"line_number":76,"context_line":"        The screenshot directory path (default: ~/selenium)"},{"line_number":77,"context_line":"    \"\"\""},{"line_number":78,"context_line":"    default_dir \u003d os.path.expanduser(\u0027~/selenium\u0027)"},{"line_number":79,"context_line":"    return os.environ.get(\u0027SELENIUM_SCREENSHOT_DIR\u0027, default_dir)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"9154f654_ca406edb","line":78,"in_reply_to":"faeff365_8b310ec5","updated":"2025-12-18 10:24:35.000000000","message":"Done","commit_id":"87502fe7c1e606920c8bb45496b92f8d0e54c537"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"67794a866d6b3bb3452ebd6f427517b65512593b","unresolved":true,"context_lines":[{"line_number":149,"context_line":"    \"\"\"Get the directory for saving test reports (screenshots, videos, logs)."},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    Returns:"},{"line_number":152,"context_line":"        The test reports directory path (default: ~/selenium)"},{"line_number":153,"context_line":"    \"\"\""},{"line_number":154,"context_line":"    default_dir \u003d os.path.expanduser(\u0027~/selenium\u0027)"},{"line_number":155,"context_line":"    return os.environ.get(\u0027SELENIUM_TEST_REPORTS_DIR\u0027, default_dir)"}],"source_content_type":"text/x-python","patch_set":16,"id":"ea1586df_c21fbc18","line":152,"updated":"2025-12-17 11:31:33.000000000","message":"same as above","commit_id":"87502fe7c1e606920c8bb45496b92f8d0e54c537"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"3fc238476e8aa0f4fdd9846568b60bab65176817","unresolved":false,"context_lines":[{"line_number":149,"context_line":"    \"\"\"Get the directory for saving test reports (screenshots, videos, logs)."},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    Returns:"},{"line_number":152,"context_line":"        The test reports directory path (default: ~/selenium)"},{"line_number":153,"context_line":"    \"\"\""},{"line_number":154,"context_line":"    default_dir \u003d os.path.expanduser(\u0027~/selenium\u0027)"},{"line_number":155,"context_line":"    return os.environ.get(\u0027SELENIUM_TEST_REPORTS_DIR\u0027, default_dir)"}],"source_content_type":"text/x-python","patch_set":16,"id":"833f8776_dea5f9f6","line":152,"in_reply_to":"ea1586df_c21fbc18","updated":"2025-12-18 10:24:35.000000000","message":"Done","commit_id":"87502fe7c1e606920c8bb45496b92f8d0e54c537"}],"watcher_dashboard/test/integration/firefox_binary.py":[{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"3fc238476e8aa0f4fdd9846568b60bab65176817","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015, Rackspace, US, Inc."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\");"},{"line_number":4,"context_line":"# you may not use this file except in compliance with the License."}],"source_content_type":"text/x-python","patch_set":16,"id":"d58f8301_a14d4c3b","line":1,"in_reply_to":"4859a517_ea77698d","updated":"2025-12-18 10:24:35.000000000","message":"I dropped the code and directly importing video recorder and finary binary code from horizon.test with some additoonal customization.","commit_id":"87502fe7c1e606920c8bb45496b92f8d0e54c537"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"67794a866d6b3bb3452ebd6f427517b65512593b","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015, Rackspace, US, Inc."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\");"},{"line_number":4,"context_line":"# you may not use this file except in compliance with the License."}],"source_content_type":"text/x-python","patch_set":16,"id":"4859a517_ea77698d","line":1,"in_reply_to":"9c5fc992_820a1da6","updated":"2025-12-17 11:31:33.000000000","message":"\u003e Firefox license header missing Apache License format compliance\n\u003e \n\u003e **Severity**: HIGH | **Confidence**: 0.9\n\u003e \n\u003e **Risk**: License header non-compliance could cause legal issues\n\u003e \n\u003e **Priority**: Before merge\n\u003e **Why This Matters**: The firefox_binary.py file has a different license header format that doesn\u0027t match the standard Apache License header used throughout the rest of the codebase\n\u003e \n\u003e **Recommendation**:\n\u003e Update the license header in firefox_binary.py to match the standard Apache License header format used in all other files: \u0027Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License...\u0027\n\ni need to update the check but in generally i advise again addeing copyright statemetns \n\npresumably this is indicating that this file was copiedn in whoe or in part form somewhere else.\n\nwas it form horizon?\n\nif you are copying the code then you must preseve any exisitng copy right notices.","commit_id":"87502fe7c1e606920c8bb45496b92f8d0e54c537"}],"watcher_dashboard/test/integration/test_audit_workflow.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"67794a866d6b3bb3452ebd6f427517b65512593b","unresolved":true,"context_lines":[{"line_number":43,"context_line":"        self._create_audit_template(template_name)"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        # Verify template in list"},{"line_number":46,"context_line":"        self.assertIn(template_name, self.driver.page_source)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def test_launch_audit_and_verify_action_plan(self):"},{"line_number":49,"context_line":"        \"\"\"Test launching audit and verifying action plan creation.\"\"\""}],"source_content_type":"text/x-python","patch_set":16,"id":"a1c87ad6_8d014f55","line":46,"updated":"2025-12-17 11:31:33.000000000","message":"that a pretty terible assert\n\ni woudl expect you to assert soemting more specific like its in a  sub element on the page then just in the html in geneal.","commit_id":"87502fe7c1e606920c8bb45496b92f8d0e54c537"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"67794a866d6b3bb3452ebd6f427517b65512593b","unresolved":true,"context_lines":[{"line_number":45,"context_line":"        # Verify template in list"},{"line_number":46,"context_line":"        self.assertIn(template_name, self.driver.page_source)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def test_launch_audit_and_verify_action_plan(self):"},{"line_number":49,"context_line":"        \"\"\"Test launching audit and verifying action plan creation.\"\"\""},{"line_number":50,"context_line":"        # Create its OWN audit template - no dependency on other tests"},{"line_number":51,"context_line":"        # Using UUID for parallel-safe unique names"}],"source_content_type":"text/x-python","patch_set":16,"id":"437e56c7_fc5d4271","line":48,"range":{"start_line":48,"start_character":8,"end_line":48,"end_character":48},"updated":"2025-12-17 11:31:33.000000000","message":"the playwrite version looks significantly nicere to maintian lonterm\n\nhttps://review.opendev.org/c/openstack/watcher-dashboard/+/970353/23/watcher_dashboard/test/integration/test_playwright_audit_workflow.py#51\n\nthere si a little more indirection to precreate teh page objects\n\nhttps://review.opendev.org/c/openstack/watcher-dashboard/+/970353/23/watcher_dashboard/test/integration/playwright_base.py#291\nbut the end result is a much more compact and readable test.","commit_id":"87502fe7c1e606920c8bb45496b92f8d0e54c537"}]}
