)]}'
{"watcherclient/tests/client_functional/v1/base.py":[{"robot_id":"zuul","robot_run_id":"1d16f1634a8b411c87d0811ea89b098a","url":"https://zuul.teim.app/t/main/buildset/1d16f1634a8b411c87d0811ea89b098a","author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"598ffb52d55d3d220e8159eb7460afab57db351d","patch_set":1,"id":"da29db7b_7b668e5f","line":67,"updated":"2026-04-06 14:12:12.000000000","message":"assertOutput was removed from base.py but is still called in test_audit.py (lines 185, 208) and test_audit_template.py (line 89), causing AttributeError at runtime.\n\n**Severity**: CRITICAL | **Confidence**: 1.0\n\n**Risk**: test_audit.py::AuditActiveTests::test_delete_oneshot_audit, test_audit.py::AuditActiveTests::test_continuous_audit, and test_audit_template.py::AuditTemplateActiveTests::test_delete_audit_template will all fail with AttributeError: \u0027TestCase\u0027 object has no attribute \u0027assertOutput\u0027.\n\n**Priority**: Before merge\n**Why This Matters**: assertOutput is still called in test_audit.py and test_audit_template.py but was removed from the base class. Removing a method without updating all call sites breaks those callers with AttributeError.\n\n**Recommendation**:\nEither update test_audit.py and test_audit_template.py to replace assertOutput with assertEqual in the same patch, or keep assertOutput until a follow-up patch addresses those files. The replacements in the unmodified files are instance methods so self.assertEqual would work correctly there.","commit_id":"da9ef6c1c63c27a343c4f6c918111b896162c215"}],"watcherclient/tests/client_functional/v1/test_action.py":[{"robot_id":"zuul","robot_run_id":"1d16f1634a8b411c87d0811ea89b098a","url":"https://zuul.teim.app/t/main/buildset/1d16f1634a8b411c87d0811ea89b098a","author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"598ffb52d55d3d220e8159eb7460afab57db351d","patch_set":1,"id":"5ff60e0e_b45d2f4c","line":57,"updated":"2026-04-06 14:12:12.000000000","message":"Consider whether asserting on empty output in tearDownClass is valuable. Cleanup methods should ideally be resilient and not fail on unexpected output.\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: Removing assertions from tearDownClass simplifies cleanup, avoids the classmethod scoping issue entirely, and follows the pattern already used in test_audit.py\u0027s tearDownClass (lines 55-61) which just calls delete without asserting.\n\n**Recommendation**:\nInstead of cls.assertEqual(cls, \u0027\u0027, raw_output), consider simply calling the delete commands without assertion in tearDownClass, matching the existing pattern in test_audit.py::AuditTests.tearDownClass. This avoids the awkward cls.assertEqual(cls, ...) syntax and makes teardown more resilient.","commit_id":"da9ef6c1c63c27a343c4f6c918111b896162c215"},{"robot_id":"zuul","robot_run_id":"72fb186014174bf3a66719944d8d5628","url":"https://zuul.opendev.org/t/openstack/buildset/72fb186014174bf3a66719944d8d5628","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"4b06f7dc3ad6338021e93a756b66f6cf4c29b6e2","patch_set":1,"id":"bbccc46d_19a4e700","line":57,"updated":"2026-04-06 14:42:04.000000000","message":"pep8: F821 undefined name \u0027self\u0027","commit_id":"da9ef6c1c63c27a343c4f6c918111b896162c215"},{"robot_id":"zuul","robot_run_id":"1d16f1634a8b411c87d0811ea89b098a","url":"https://zuul.teim.app/t/main/buildset/1d16f1634a8b411c87d0811ea89b098a","author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"598ffb52d55d3d220e8159eb7460afab57db351d","patch_set":1,"id":"da952489_8888f736","line":57,"updated":"2026-04-06 14:12:12.000000000","message":"self.assertEqual is used inside @classmethod tearDownClass methods where self is not defined. All 9 replacements will raise NameError: name \u0027self\u0027 is not defined at runtime.\n\n**Severity**: CRITICAL | **Confidence**: 1.0\n\n**Risk**: All functional tests in test_action.py (ActionTests, ActionUpdateTests) and test_action_plan.py (ActionPlanTests) will crash during tearDownClass with NameError, causing test infrastructure failures and potentially leaving test resources uncleaned.\n\n**Priority**: Before merge\n**Why This Matters**: tearDownClass is a @classmethod so self is not in scope. Using self.assertEqual inside it will raise NameError. This scoping error will prevent all affected tests from completing successfully.\n\n**Recommendation**:\nReplace all self.assertEqual(...) calls inside tearDownClass methods with the class-based form: cls.assertEqual(cls, ...). Alternatively, use the simpler pattern from test_audit.py\u0027s tearDownClass which does not assert on delete output. For example, change `self.assertEqual(\u0027\u0027, raw_output)` to `cls.assertEqual(cls, \u0027\u0027, raw_output)` or simply remove the assertion on cleanup output since tearDownClass failures are hard to diagnose.","commit_id":"da9ef6c1c63c27a343c4f6c918111b896162c215"},{"robot_id":"zuul","robot_run_id":"72fb186014174bf3a66719944d8d5628","url":"https://zuul.opendev.org/t/openstack/buildset/72fb186014174bf3a66719944d8d5628","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"4b06f7dc3ad6338021e93a756b66f6cf4c29b6e2","patch_set":1,"id":"87754a97_7bfc207a","line":60,"updated":"2026-04-06 14:42:04.000000000","message":"pep8: F821 undefined name \u0027self\u0027","commit_id":"da9ef6c1c63c27a343c4f6c918111b896162c215"},{"robot_id":"zuul","robot_run_id":"72fb186014174bf3a66719944d8d5628","url":"https://zuul.opendev.org/t/openstack/buildset/72fb186014174bf3a66719944d8d5628","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"4b06f7dc3ad6338021e93a756b66f6cf4c29b6e2","patch_set":1,"id":"417c2749_c586d697","line":64,"updated":"2026-04-06 14:42:04.000000000","message":"pep8: F821 undefined name \u0027self\u0027","commit_id":"da9ef6c1c63c27a343c4f6c918111b896162c215"},{"robot_id":"zuul","robot_run_id":"72fb186014174bf3a66719944d8d5628","url":"https://zuul.opendev.org/t/openstack/buildset/72fb186014174bf3a66719944d8d5628","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"4b06f7dc3ad6338021e93a756b66f6cf4c29b6e2","patch_set":1,"id":"b713e590_ed620d10","line":130,"updated":"2026-04-06 14:42:04.000000000","message":"pep8: F821 undefined name \u0027self\u0027","commit_id":"da9ef6c1c63c27a343c4f6c918111b896162c215"},{"robot_id":"zuul","robot_run_id":"72fb186014174bf3a66719944d8d5628","url":"https://zuul.opendev.org/t/openstack/buildset/72fb186014174bf3a66719944d8d5628","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"4b06f7dc3ad6338021e93a756b66f6cf4c29b6e2","patch_set":1,"id":"69af2b48_08ebe67c","line":134,"updated":"2026-04-06 14:42:04.000000000","message":"pep8: F821 undefined name \u0027self\u0027","commit_id":"da9ef6c1c63c27a343c4f6c918111b896162c215"},{"robot_id":"zuul","robot_run_id":"72fb186014174bf3a66719944d8d5628","url":"https://zuul.opendev.org/t/openstack/buildset/72fb186014174bf3a66719944d8d5628","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"4b06f7dc3ad6338021e93a756b66f6cf4c29b6e2","patch_set":1,"id":"43412f99_2533dccf","line":139,"updated":"2026-04-06 14:42:04.000000000","message":"pep8: F821 undefined name \u0027self\u0027","commit_id":"da9ef6c1c63c27a343c4f6c918111b896162c215"}],"watcherclient/tests/client_functional/v1/test_action_plan.py":[{"robot_id":"zuul","robot_run_id":"72fb186014174bf3a66719944d8d5628","url":"https://zuul.opendev.org/t/openstack/buildset/72fb186014174bf3a66719944d8d5628","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"4b06f7dc3ad6338021e93a756b66f6cf4c29b6e2","patch_set":1,"id":"837cbcf3_78050f57","line":59,"updated":"2026-04-06 14:42:04.000000000","message":"pep8: F821 undefined name \u0027self\u0027","commit_id":"da9ef6c1c63c27a343c4f6c918111b896162c215"},{"robot_id":"zuul","robot_run_id":"72fb186014174bf3a66719944d8d5628","url":"https://zuul.opendev.org/t/openstack/buildset/72fb186014174bf3a66719944d8d5628","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"4b06f7dc3ad6338021e93a756b66f6cf4c29b6e2","patch_set":1,"id":"8cc39b6d_d24adbcc","line":62,"updated":"2026-04-06 14:42:04.000000000","message":"pep8: F821 undefined name \u0027self\u0027","commit_id":"da9ef6c1c63c27a343c4f6c918111b896162c215"},{"robot_id":"zuul","robot_run_id":"72fb186014174bf3a66719944d8d5628","url":"https://zuul.opendev.org/t/openstack/buildset/72fb186014174bf3a66719944d8d5628","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"4b06f7dc3ad6338021e93a756b66f6cf4c29b6e2","patch_set":1,"id":"36aebef2_602b53c5","line":66,"updated":"2026-04-06 14:42:04.000000000","message":"pep8: F821 undefined name \u0027self\u0027","commit_id":"da9ef6c1c63c27a343c4f6c918111b896162c215"}]}
