)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":35153,"name":"Ashish Gupta","email":"ashigupt@redhat.com","username":"ashigupt","status":"Redhat"},"change_message_id":"f64123fcdd1322bb5daf4676030d1d43f83b84f7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"5f47b137_f928ee36","updated":"2025-06-18 22:09:56.000000000","message":"recheck, random failure","commit_id":"5b8977380e314016b698e86eeaaf108d663c28a8"},{"author":{"_account_id":35133,"name":"Jan Jasek","email":"jjasek@redhat.com","username":"janjasek"},"change_message_id":"4596896999a169ec5681b19f806b1e95651eae57","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"8e8eb833_06e65732","updated":"2025-06-24 16:32:33.000000000","message":"LGTM, thank you!","commit_id":"b6e47527cc1320aa83e7749cfc7e22485fd7cafd"}],"openstack_dashboard/test/selenium/integration/test_federation_login.py":[{"author":{"_account_id":35133,"name":"Jan Jasek","email":"jjasek@redhat.com","username":"janjasek"},"change_message_id":"8d9d01ec4a86f178224d7b03d1e29140d6745492","unresolved":true,"context_lines":[{"line_number":24,"context_line":"def test_federation_keystone_user_login(login, driver):"},{"line_number":25,"context_line":"    login(\u0027user\u0027)"},{"line_number":26,"context_line":"    user_dropdown_menu \u003d driver.find_element_by_css_selector("},{"line_number":27,"context_line":"        \u0027//span[@class\u003d\"rcueicon rcueicon-user\"]\u0027)"},{"line_number":28,"context_line":"    assert user_dropdown_menu.is_displayed()"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"0f2d39cc_f21163aa","line":27,"range":{"start_line":27,"start_character":9,"end_line":27,"end_character":48},"updated":"2025-06-23 09:14:34.000000000","message":"Hi Ashish, I know we do not have a job in upstream to run the tests yet but did you try to run/fly through the tests in the downstream and also upstream environment?\nWe did quite a lot of work to be able to run the same test code against different UI themes to simplify code maintenance.\nI am pretty sure that this xpath is not interchangeable for upstream/downstream UI themes. (If I am not right, please correct me)\n\nFor upstream we use: https://github.com/openstack/horizon/blob/90ec2c0560282a59f35d49a6b01a9b685ecb42f1/openstack_dashboard/test/integration_tests/horizon.conf#L126\nAnd for downstream this one: https://github.com/openstack-k8s-operators/tcib/blob/6d866ca2471a5533fc0ac2cad8aa9e0fdb9d8b2e/container-images/tcib/base/os/horizontest/run_horizontest.sh#L29C1-L29C71","commit_id":"5b8977380e314016b698e86eeaaf108d663c28a8"},{"author":{"_account_id":35153,"name":"Ashish Gupta","email":"ashigupt@redhat.com","username":"ashigupt","status":"Redhat"},"change_message_id":"eed96a46107e06a122b9f65c034318ca4031c325","unresolved":false,"context_lines":[{"line_number":24,"context_line":"def test_federation_keystone_user_login(login, driver):"},{"line_number":25,"context_line":"    login(\u0027user\u0027)"},{"line_number":26,"context_line":"    user_dropdown_menu \u003d driver.find_element_by_css_selector("},{"line_number":27,"context_line":"        \u0027//span[@class\u003d\"rcueicon rcueicon-user\"]\u0027)"},{"line_number":28,"context_line":"    assert user_dropdown_menu.is_displayed()"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3025174a_989d831f","line":27,"range":{"start_line":27,"start_character":9,"end_line":27,"end_character":48},"in_reply_to":"0f2d39cc_f21163aa","updated":"2025-06-24 00:49:47.000000000","message":"Yeah sorry, that was a leftover from testing. I changed it to use the selector from horizon.conf file directly.","commit_id":"5b8977380e314016b698e86eeaaf108d663c28a8"},{"author":{"_account_id":35133,"name":"Jan Jasek","email":"jjasek@redhat.com","username":"janjasek"},"change_message_id":"8d9d01ec4a86f178224d7b03d1e29140d6745492","unresolved":true,"context_lines":[{"line_number":31,"context_line":"def test_federation_keystone_admin_login(login, driver):"},{"line_number":32,"context_line":"    login(\u0027admin\u0027)"},{"line_number":33,"context_line":"    user_dropdown_menu \u003d driver.find_element_by_css_selector("},{"line_number":34,"context_line":"        \u0027span.rcueicon.rcueicon-user\u0027)"},{"line_number":35,"context_line":"    assert user_dropdown_menu.is_displayed()"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"05d1aa90_8fedaa25","line":34,"range":{"start_line":34,"start_character":9,"end_line":34,"end_character":36},"updated":"2025-06-23 09:14:34.000000000","message":"Is there a reason why here (on the line 34) is used different CSS selector than for previous test (on the line 27)? It looks for me like the same tests, just for different user (admin/demo).\nAdditionally I can see here the same issue with interchangeability as in previous comment.","commit_id":"5b8977380e314016b698e86eeaaf108d663c28a8"},{"author":{"_account_id":35153,"name":"Ashish Gupta","email":"ashigupt@redhat.com","username":"ashigupt","status":"Redhat"},"change_message_id":"eed96a46107e06a122b9f65c034318ca4031c325","unresolved":false,"context_lines":[{"line_number":31,"context_line":"def test_federation_keystone_admin_login(login, driver):"},{"line_number":32,"context_line":"    login(\u0027admin\u0027)"},{"line_number":33,"context_line":"    user_dropdown_menu \u003d driver.find_element_by_css_selector("},{"line_number":34,"context_line":"        \u0027span.rcueicon.rcueicon-user\u0027)"},{"line_number":35,"context_line":"    assert user_dropdown_menu.is_displayed()"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"94e9883b_73a5c118","line":34,"range":{"start_line":34,"start_character":9,"end_line":34,"end_character":36},"in_reply_to":"05d1aa90_8fedaa25","updated":"2025-06-24 00:49:47.000000000","message":"Done","commit_id":"5b8977380e314016b698e86eeaaf108d663c28a8"},{"author":{"_account_id":35133,"name":"Jan Jasek","email":"jjasek@redhat.com","username":"janjasek"},"change_message_id":"8d9d01ec4a86f178224d7b03d1e29140d6745492","unresolved":true,"context_lines":[{"line_number":44,"context_line":"        config.theme.project_name_xpath)"},{"line_number":45,"context_line":"    displayed_username \u003d driver.find_element_by_xpath("},{"line_number":46,"context_line":"        config.theme.user_name_xpath)"},{"line_number":47,"context_line":"    assert project_name.text \u003d\u003d config.OIDC.keycloak_test_user_home_project"},{"line_number":48,"context_line":"    assert displayed_username.text \u003d\u003d config.OIDC.keycloak_test_user1_username"}],"source_content_type":"text/x-python","patch_set":3,"id":"da016db8_40218218","line":47,"range":{"start_line":47,"start_character":11,"end_line":47,"end_character":28},"updated":"2025-06-23 09:14:34.000000000","message":"I know it is quite easy and elegant, and works well on the first sight but from previous experience we know this \".text\" is not a good practice and it can be very unstable. I get rid of this from all the integration tests (except the pagination/filtration) and login conf. And now we can see it fails sometimes on this step in the pagination/filtration tests where we left it (because of timing). So I am planning to try to change the process there.\nSo although it can work well now, we know it can be an issue in future so I strongly recommend to use here some more durable approach like using text you are looking for directly in the XPATH. Like here: https://github.com/openstack/horizon/blob/90ec2c0560282a59f35d49a6b01a9b685ecb42f1/openstack_dashboard/test/selenium/conftest.py#L74","commit_id":"5b8977380e314016b698e86eeaaf108d663c28a8"},{"author":{"_account_id":35153,"name":"Ashish Gupta","email":"ashigupt@redhat.com","username":"ashigupt","status":"Redhat"},"change_message_id":"7119eaa743029dfae6f0b2d90eb34bed87cf798a","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        config.theme.project_name_xpath)"},{"line_number":45,"context_line":"    displayed_username \u003d driver.find_element_by_xpath("},{"line_number":46,"context_line":"        config.theme.user_name_xpath)"},{"line_number":47,"context_line":"    assert project_name.text \u003d\u003d config.OIDC.keycloak_test_user_home_project"},{"line_number":48,"context_line":"    assert displayed_username.text \u003d\u003d config.OIDC.keycloak_test_user1_username"}],"source_content_type":"text/x-python","patch_set":3,"id":"0539d74b_11f6c067","line":47,"range":{"start_line":47,"start_character":11,"end_line":47,"end_character":28},"in_reply_to":"804ff08b_8dd86283","updated":"2025-06-24 00:50:07.000000000","message":"Done","commit_id":"5b8977380e314016b698e86eeaaf108d663c28a8"},{"author":{"_account_id":35153,"name":"Ashish Gupta","email":"ashigupt@redhat.com","username":"ashigupt","status":"Redhat"},"change_message_id":"eed96a46107e06a122b9f65c034318ca4031c325","unresolved":true,"context_lines":[{"line_number":44,"context_line":"        config.theme.project_name_xpath)"},{"line_number":45,"context_line":"    displayed_username \u003d driver.find_element_by_xpath("},{"line_number":46,"context_line":"        config.theme.user_name_xpath)"},{"line_number":47,"context_line":"    assert project_name.text \u003d\u003d config.OIDC.keycloak_test_user_home_project"},{"line_number":48,"context_line":"    assert displayed_username.text \u003d\u003d config.OIDC.keycloak_test_user1_username"}],"source_content_type":"text/x-python","patch_set":3,"id":"804ff08b_8dd86283","line":47,"range":{"start_line":47,"start_character":11,"end_line":47,"end_character":28},"in_reply_to":"da016db8_40218218","updated":"2025-06-24 00:49:47.000000000","message":"That was helpful, thanks","commit_id":"5b8977380e314016b698e86eeaaf108d663c28a8"},{"author":{"_account_id":35133,"name":"Jan Jasek","email":"jjasek@redhat.com","username":"janjasek"},"change_message_id":"8d9d01ec4a86f178224d7b03d1e29140d6745492","unresolved":true,"context_lines":[{"line_number":45,"context_line":"    displayed_username \u003d driver.find_element_by_xpath("},{"line_number":46,"context_line":"        config.theme.user_name_xpath)"},{"line_number":47,"context_line":"    assert project_name.text \u003d\u003d config.OIDC.keycloak_test_user_home_project"},{"line_number":48,"context_line":"    assert displayed_username.text \u003d\u003d config.OIDC.keycloak_test_user1_username"}],"source_content_type":"text/x-python","patch_set":3,"id":"a9cde241_d1da9b82","line":48,"range":{"start_line":48,"start_character":11,"end_line":48,"end_character":34},"updated":"2025-06-23 09:14:34.000000000","message":"ditto","commit_id":"5b8977380e314016b698e86eeaaf108d663c28a8"},{"author":{"_account_id":35153,"name":"Ashish Gupta","email":"ashigupt@redhat.com","username":"ashigupt","status":"Redhat"},"change_message_id":"eed96a46107e06a122b9f65c034318ca4031c325","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    displayed_username \u003d driver.find_element_by_xpath("},{"line_number":46,"context_line":"        config.theme.user_name_xpath)"},{"line_number":47,"context_line":"    assert project_name.text \u003d\u003d config.OIDC.keycloak_test_user_home_project"},{"line_number":48,"context_line":"    assert displayed_username.text \u003d\u003d config.OIDC.keycloak_test_user1_username"}],"source_content_type":"text/x-python","patch_set":3,"id":"07ddbc78_004022e3","line":48,"range":{"start_line":48,"start_character":11,"end_line":48,"end_character":34},"in_reply_to":"a9cde241_d1da9b82","updated":"2025-06-24 00:49:47.000000000","message":"Done","commit_id":"5b8977380e314016b698e86eeaaf108d663c28a8"},{"author":{"_account_id":35133,"name":"Jan Jasek","email":"jjasek@redhat.com","username":"janjasek"},"change_message_id":"3eaa35ea0b2f1e4b5c0f2b23a6d399b62c21da6d","unresolved":true,"context_lines":[{"line_number":24,"context_line":"def test_federation_keystone_user_login(login, driver, config):"},{"line_number":25,"context_line":"    login(\u0027user\u0027)"},{"line_number":26,"context_line":"    user_button \u003d driver.find_element_by_xpath(config.theme.user_name_xpath)"},{"line_number":27,"context_line":"    assert user_button.is_displayed()"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"def test_federation_keystone_admin_login(login, driver, config):"}],"source_content_type":"text/x-python","patch_set":4,"id":"4153e739_ba859517","line":27,"range":{"start_line":27,"start_character":4,"end_line":27,"end_character":37},"updated":"2025-06-24 10:27:21.000000000","message":"ditto","commit_id":"5e4bd10aadb3bca455a808d6296f7261aa2a8b71"},{"author":{"_account_id":35153,"name":"Ashish Gupta","email":"ashigupt@redhat.com","username":"ashigupt","status":"Redhat"},"change_message_id":"764a887c3bdf070e846fb480fca23a7de7384d60","unresolved":false,"context_lines":[{"line_number":24,"context_line":"def test_federation_keystone_user_login(login, driver, config):"},{"line_number":25,"context_line":"    login(\u0027user\u0027)"},{"line_number":26,"context_line":"    user_button \u003d driver.find_element_by_xpath(config.theme.user_name_xpath)"},{"line_number":27,"context_line":"    assert user_button.is_displayed()"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"def test_federation_keystone_admin_login(login, driver, config):"}],"source_content_type":"text/x-python","patch_set":4,"id":"749870af_235aad1e","line":27,"range":{"start_line":27,"start_character":4,"end_line":27,"end_character":37},"in_reply_to":"4153e739_ba859517","updated":"2025-06-24 11:57:33.000000000","message":"Done","commit_id":"5e4bd10aadb3bca455a808d6296f7261aa2a8b71"},{"author":{"_account_id":35133,"name":"Jan Jasek","email":"jjasek@redhat.com","username":"janjasek"},"change_message_id":"3eaa35ea0b2f1e4b5c0f2b23a6d399b62c21da6d","unresolved":true,"context_lines":[{"line_number":30,"context_line":"def test_federation_keystone_admin_login(login, driver, config):"},{"line_number":31,"context_line":"    login(\u0027admin\u0027)"},{"line_number":32,"context_line":"    user_button \u003d driver.find_element_by_xpath(config.theme.user_name_xpath)"},{"line_number":33,"context_line":"    assert user_button.is_displayed()"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"def test_federation_keycloak_test_user_login_admin(login_oidc, driver, config):"}],"source_content_type":"text/x-python","patch_set":4,"id":"97e334c3_632c7d0b","line":33,"range":{"start_line":33,"start_character":4,"end_line":33,"end_character":37},"updated":"2025-06-24 10:27:21.000000000","message":"ditto","commit_id":"5e4bd10aadb3bca455a808d6296f7261aa2a8b71"},{"author":{"_account_id":35153,"name":"Ashish Gupta","email":"ashigupt@redhat.com","username":"ashigupt","status":"Redhat"},"change_message_id":"764a887c3bdf070e846fb480fca23a7de7384d60","unresolved":false,"context_lines":[{"line_number":30,"context_line":"def test_federation_keystone_admin_login(login, driver, config):"},{"line_number":31,"context_line":"    login(\u0027admin\u0027)"},{"line_number":32,"context_line":"    user_button \u003d driver.find_element_by_xpath(config.theme.user_name_xpath)"},{"line_number":33,"context_line":"    assert user_button.is_displayed()"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"def test_federation_keycloak_test_user_login_admin(login_oidc, driver, config):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3e21e41a_94a8642f","line":33,"range":{"start_line":33,"start_character":4,"end_line":33,"end_character":37},"in_reply_to":"97e334c3_632c7d0b","updated":"2025-06-24 11:57:33.000000000","message":"Done","commit_id":"5e4bd10aadb3bca455a808d6296f7261aa2a8b71"},{"author":{"_account_id":35133,"name":"Jan Jasek","email":"jjasek@redhat.com","username":"janjasek"},"change_message_id":"3eaa35ea0b2f1e4b5c0f2b23a6d399b62c21da6d","unresolved":true,"context_lines":[{"line_number":41,"context_line":"        config.theme.project_name_xpath)"},{"line_number":42,"context_line":"    username_element \u003d driver.find_element_by_xpath("},{"line_number":43,"context_line":"        config.theme.user_name_xpath)"},{"line_number":44,"context_line":"    project_name \u003d project_element.find_element_by_xpath("},{"line_number":45,"context_line":"        f\u0027.//*[normalize-space()\u003d\"{project}\"]\u0027)"},{"line_number":46,"context_line":"    user_name \u003d username_element.find_element_by_xpath("},{"line_number":47,"context_line":"        f\u0027.//*[normalize-space()\u003d\"{username}\"]\u0027)"},{"line_number":48,"context_line":"    assert project_name.is_displayed()"},{"line_number":49,"context_line":"    assert user_name.is_displayed()"}],"source_content_type":"text/x-python","patch_set":4,"id":"7bc8213e_20b07bba","line":49,"range":{"start_line":44,"start_character":4,"end_line":49,"end_character":35},"updated":"2025-06-24 10:27:21.000000000","message":"Sorry I noticed one more thing.\nI am not sure if this will work how you expect. When you use \"find element by xpath\" for specific element (here for project_name or user_name, or for user_button) and the element does not exists (selenium can not find it) then I am pretty sure it will fail with \"NoSuchElementException\" and the test will FAIL/end before the \"assert\" can do what you expect it will do so the assert there is quite useless I guess.\nThe same for all the other tests above.\n\nI am not sure from the top of my head what is the best solution for this but two easy ideas that come to my mind are:\n1) Just use there try/catch, similar to this: https://github.com/openstack/horizon/blob/32ebfca938e6357f82cee51afa2d4c7e716b2e4a/openstack_dashboard/test/selenium/widgets.py#L74\n2) Or you can try to create some composition of assert with find_elementS, something like:\nassert (len(username_element.find_elements_by_xpath(f\u0027.//*[normalize-space()\u003d\"{username}\"]\u0027) \u003d\u003d 1)\n\nI did not try it practically.","commit_id":"5e4bd10aadb3bca455a808d6296f7261aa2a8b71"},{"author":{"_account_id":35153,"name":"Ashish Gupta","email":"ashigupt@redhat.com","username":"ashigupt","status":"Redhat"},"change_message_id":"764a887c3bdf070e846fb480fca23a7de7384d60","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        config.theme.project_name_xpath)"},{"line_number":42,"context_line":"    username_element \u003d driver.find_element_by_xpath("},{"line_number":43,"context_line":"        config.theme.user_name_xpath)"},{"line_number":44,"context_line":"    project_name \u003d project_element.find_element_by_xpath("},{"line_number":45,"context_line":"        f\u0027.//*[normalize-space()\u003d\"{project}\"]\u0027)"},{"line_number":46,"context_line":"    user_name \u003d username_element.find_element_by_xpath("},{"line_number":47,"context_line":"        f\u0027.//*[normalize-space()\u003d\"{username}\"]\u0027)"},{"line_number":48,"context_line":"    assert project_name.is_displayed()"},{"line_number":49,"context_line":"    assert user_name.is_displayed()"}],"source_content_type":"text/x-python","patch_set":4,"id":"4f92cc0c_f44aba82","line":49,"range":{"start_line":44,"start_character":4,"end_line":49,"end_character":35},"in_reply_to":"7bc8213e_20b07bba","updated":"2025-06-24 11:57:33.000000000","message":"Done","commit_id":"5e4bd10aadb3bca455a808d6296f7261aa2a8b71"}]}
