)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"348b8af2ba2c3daa1b8a175449fd00b4b8e79dd9","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Aleksandra Bezborodova \u003cbezborodovaam@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2018-05-09 17:50:19 +0300"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Rewrite unit tests for emulator"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Unit tests was spiitted depends on logical functionality. Now we have"},{"line_number":10,"context_line":"different tests for flask application and libvirt driver."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"5f7c97a3_c13fffb1","line":7,"range":{"start_line":7,"start_character":23,"end_line":7,"end_character":31},"updated":"2018-05-11 12:40:34.000000000","message":"nit: there are two emulators in the package, not just one","commit_id":"2b361b5320a27721953d995dbe92589c6a84421b"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"348b8af2ba2c3daa1b8a175449fd00b4b8e79dd9","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Rewrite unit tests for emulator"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Unit tests was spiitted depends on logical functionality. Now we have"},{"line_number":10,"context_line":"different tests for flask application and libvirt driver."},{"line_number":11,"context_line":"Closes-Bug: #1751134"},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"5f7c97a3_61338bf7","line":9,"range":{"start_line":9,"start_character":24,"end_line":9,"end_character":31},"updated":"2018-05-11 12:40:34.000000000","message":"nit: depending or to align with or base on their","commit_id":"2b361b5320a27721953d995dbe92589c6a84421b"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"348b8af2ba2c3daa1b8a175449fd00b4b8e79dd9","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Rewrite unit tests for emulator"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Unit tests was spiitted depends on logical functionality. Now we have"},{"line_number":10,"context_line":"different tests for flask application and libvirt driver."},{"line_number":11,"context_line":"Closes-Bug: #1751134"},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"5f7c97a3_0125f7aa","line":9,"range":{"start_line":9,"start_character":15,"end_line":9,"end_character":23},"updated":"2018-05-11 12:40:34.000000000","message":"typo","commit_id":"2b361b5320a27721953d995dbe92589c6a84421b"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"348b8af2ba2c3daa1b8a175449fd00b4b8e79dd9","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Rewrite unit tests for emulator"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Unit tests was spiitted depends on logical functionality. Now we have"},{"line_number":10,"context_line":"different tests for flask application and libvirt driver."},{"line_number":11,"context_line":"Closes-Bug: #1751134"},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"5f7c97a3_a13d23c5","line":9,"range":{"start_line":9,"start_character":11,"end_line":9,"end_character":14},"updated":"2018-05-11 12:40:34.000000000","message":"typo: were or better have been","commit_id":"2b361b5320a27721953d995dbe92589c6a84421b"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"348b8af2ba2c3daa1b8a175449fd00b4b8e79dd9","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Unit tests was spiitted depends on logical functionality. Now we have"},{"line_number":10,"context_line":"different tests for flask application and libvirt driver."},{"line_number":11,"context_line":"Closes-Bug: #1751134"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: I02725332df886fdf6b13c98cb6d80ab3650575b9"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"5f7c97a3_41544fff","line":11,"range":{"start_line":11,"start_character":0,"end_line":11,"end_character":20},"updated":"2018-05-11 12:40:34.000000000","message":"Please change for storyboard ID + task ID","commit_id":"2b361b5320a27721953d995dbe92589c6a84421b"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"3b6e85a0183fc4144d7681688141c9626badcadc","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Rewrite unit tests for emulator"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Unit tests was spiitted depends on logical functionality. Now we have"},{"line_number":10,"context_line":"different tests for flask application and libvirt driver."},{"line_number":11,"context_line":"Closes-Bug: #1751134"},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"5f7c97a3_d054e656","line":9,"range":{"start_line":9,"start_character":15,"end_line":9,"end_character":23},"updated":"2018-06-07 14:00:52.000000000","message":"`Unit tests have been split onto multiple files to reflect their functionality`?","commit_id":"719b45abd76324d12a90c39965bb3955a941f109"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"3b6e85a0183fc4144d7681688141c9626badcadc","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Unit tests was spiitted depends on logical functionality. Now we have"},{"line_number":10,"context_line":"different tests for flask application and libvirt driver."},{"line_number":11,"context_line":"Closes-Bug: #1751134"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: I02725332df886fdf6b13c98cb6d80ab3650575b9"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"5f7c97a3_5078d6f6","line":11,"range":{"start_line":11,"start_character":0,"end_line":11,"end_character":20},"updated":"2018-06-07 14:00:52.000000000","message":"Please, reference instead of Closes-Bug:\n\nStory: \u003cID\u003e\nTask: \u003cID\u003e","commit_id":"719b45abd76324d12a90c39965bb3955a941f109"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"b321a7ce7a39220f361da05b911760f4153fcf68","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Rewrite unit tests for emulator"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Unit tests was spiitted depends on logical functionality. Now we have"},{"line_number":10,"context_line":"different tests for flask application and libvirt driver."},{"line_number":11,"context_line":"Closes-Bug: #1751134"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: I02725332df886fdf6b13c98cb6d80ab3650575b9"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"5f7c97a3_10e1159c","line":10,"updated":"2018-07-01 16:20:03.000000000","message":"Were there any other changes made? The title says \u0027Rewrite\u0027 which makes me think that restructuring was not the only thing. It might be beneficial to shortly describe other changes made as with file deleted it is hard to compare the changes.","commit_id":"2aa3cecafc33ed8206e6dfef82d3b23656eac4a4"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"7bd779b56976e52b533333851ba2137a9b80867e","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Split unit tests for driver and flask API"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Unit tests have been split onto multiple files to reflect their"},{"line_number":10,"context_line":"functionality. Flask release breaks \u0027render_template\u0027 mocks, so now"},{"line_number":11,"context_line":"in tests is used real parameters."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Story: 1751134"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"5f7c97a3_458264c9","line":10,"range":{"start_line":10,"start_character":15,"end_line":10,"end_character":59},"updated":"2018-07-02 09:16:07.000000000","message":"Well, may be our mocks were buggy? I\u0027d feel a bit uneasy boldly blaming Flask for that breakage, unless you are certain that\u0027s the Flask which went haywire.","commit_id":"f373eb8e4bb62c1ce92eda40cc1f19da54c9349b"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"7bd779b56976e52b533333851ba2137a9b80867e","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Unit tests have been split onto multiple files to reflect their"},{"line_number":10,"context_line":"functionality. Flask release breaks \u0027render_template\u0027 mocks, so now"},{"line_number":11,"context_line":"in tests is used real parameters."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Story: 1751134"},{"line_number":14,"context_line":"Task: 12046"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Story: 2002745"},{"line_number":17,"context_line":"Task:  22598"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Change-Id: I02725332df886fdf6b13c98cb6d80ab3650575b9"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"5f7c97a3_45d024c9","line":17,"range":{"start_line":12,"start_character":0,"end_line":17,"end_character":12},"updated":"2018-07-02 09:16:07.000000000","message":"Just asking (may be that\u0027s totally alright). Is it OK to have multiple `Story` and `Task` keys in the commit message? Suspiciously, Story 2002745 does not pick up this patch in comments.","commit_id":"f373eb8e4bb62c1ce92eda40cc1f19da54c9349b"}],"sushy_tools/tests/unit/emulator/test_libvirtdriver.py":[{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"348b8af2ba2c3daa1b8a175449fd00b4b8e79dd9","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#!/usr/bin/env python"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_2178338e","line":1,"range":{"start_line":1,"start_character":0,"end_line":1,"end_character":21},"updated":"2018-05-11 12:40:34.000000000","message":"we probably do not need this here","commit_id":"2b361b5320a27721953d995dbe92589c6a84421b"},{"author":{"_account_id":10155,"name":"Aleksandra Bezborodova","email":"bezborodovaam@gmail.com","username":"sasha_bezborodova"},"change_message_id":"fa8815c91047b44f3522b0a60dcd7319f04028ba","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#!/usr/bin/env python"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_00fd50b0","line":1,"range":{"start_line":1,"start_character":0,"end_line":1,"end_character":21},"in_reply_to":"5f7c97a3_2178338e","updated":"2018-05-22 17:22:04.000000000","message":"Done","commit_id":"2b361b5320a27721953d995dbe92589c6a84421b"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"348b8af2ba2c3daa1b8a175449fd00b4b8e79dd9","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class LibvirtDriverTastCase(base.BaseTestCase):"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    @mock.patch(\u0027libvirt.openReadOnly\u0027, autospec\u003dTrue)"},{"line_number":28,"context_line":"    def test_systems(self, libvirt_mock):"},{"line_number":29,"context_line":"        domain_mock \u003d mock.Mock()"},{"line_number":30,"context_line":"        conn_mock \u003d libvirt_mock.return_value"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_41f0cffe","line":27,"range":{"start_line":27,"start_character":4,"end_line":27,"end_character":54},"updated":"2018-05-11 12:40:34.000000000","message":"Would it make sense to move this up to the class definition level so the mock would apply just once for all the methods?","commit_id":"2b361b5320a27721953d995dbe92589c6a84421b"},{"author":{"_account_id":10155,"name":"Aleksandra Bezborodova","email":"bezborodovaam@gmail.com","username":"sasha_bezborodova"},"change_message_id":"fa8815c91047b44f3522b0a60dcd7319f04028ba","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class LibvirtDriverTastCase(base.BaseTestCase):"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    @mock.patch(\u0027libvirt.openReadOnly\u0027, autospec\u003dTrue)"},{"line_number":28,"context_line":"    def test_systems(self, libvirt_mock):"},{"line_number":29,"context_line":"        domain_mock \u003d mock.Mock()"},{"line_number":30,"context_line":"        conn_mock \u003d libvirt_mock.return_value"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_a02d7c47","line":27,"range":{"start_line":27,"start_character":4,"end_line":27,"end_character":54},"in_reply_to":"5f7c97a3_41f0cffe","updated":"2018-05-22 17:22:04.000000000","message":"Done","commit_id":"2b361b5320a27721953d995dbe92589c6a84421b"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"348b8af2ba2c3daa1b8a175449fd00b4b8e79dd9","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        conn_mock \u003d libvirt_mock.return_value"},{"line_number":31,"context_line":"        conn_mock.listDefinedDomains.return_value \u003d [domain_mock]"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"        tst_driver \u003d LibvirtDriver(uri\u003d\u0027127.0.0.1\u0027)"},{"line_number":34,"context_line":"        self.assertEqual([domain_mock], tst_driver.systems)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    @mock.patch(\u0027libvirt.openReadOnly\u0027, autospec\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_e17b1b78","line":33,"range":{"start_line":33,"start_character":35,"end_line":33,"end_character":50},"updated":"2018-05-11 12:40:34.000000000","message":"Do you need this non-default parameter?\nAlso, it\u0027s not exactly the URI but plain IPv4. A bit confusing to the reader, ;)","commit_id":"2b361b5320a27721953d995dbe92589c6a84421b"},{"author":{"_account_id":10155,"name":"Aleksandra Bezborodova","email":"bezborodovaam@gmail.com","username":"sasha_bezborodova"},"change_message_id":"fa8815c91047b44f3522b0a60dcd7319f04028ba","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        conn_mock \u003d libvirt_mock.return_value"},{"line_number":31,"context_line":"        conn_mock.listDefinedDomains.return_value \u003d [domain_mock]"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"        tst_driver \u003d LibvirtDriver(uri\u003d\u0027127.0.0.1\u0027)"},{"line_number":34,"context_line":"        self.assertEqual([domain_mock], tst_driver.systems)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    @mock.patch(\u0027libvirt.openReadOnly\u0027, autospec\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_c030b8a1","line":33,"range":{"start_line":33,"start_character":35,"end_line":33,"end_character":50},"in_reply_to":"5f7c97a3_e17b1b78","updated":"2018-05-22 17:22:04.000000000","message":"Done","commit_id":"2b361b5320a27721953d995dbe92589c6a84421b"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"348b8af2ba2c3daa1b8a175449fd00b4b8e79dd9","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        domain_mock.destroy.assert_called()"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    @mock.patch(\u0027libvirt.open\u0027, autospec\u003dTrue)"},{"line_number":95,"context_line":"    def test_set_power_state_grecefulshutdown(self, libvirt_mock):"},{"line_number":96,"context_line":"        domain_mock \u003d mock.Mock()"},{"line_number":97,"context_line":"        domain_mock.isActive.return_value \u003d True"},{"line_number":98,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_81e1072d","line":95,"range":{"start_line":95,"start_character":29,"end_line":95,"end_character":37},"updated":"2018-05-11 12:40:34.000000000","message":"typo: graceful","commit_id":"2b361b5320a27721953d995dbe92589c6a84421b"},{"author":{"_account_id":10155,"name":"Aleksandra Bezborodova","email":"bezborodovaam@gmail.com","username":"sasha_bezborodova"},"change_message_id":"fa8815c91047b44f3522b0a60dcd7319f04028ba","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        domain_mock.destroy.assert_called()"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    @mock.patch(\u0027libvirt.open\u0027, autospec\u003dTrue)"},{"line_number":95,"context_line":"    def test_set_power_state_grecefulshutdown(self, libvirt_mock):"},{"line_number":96,"context_line":"        domain_mock \u003d mock.Mock()"},{"line_number":97,"context_line":"        domain_mock.isActive.return_value \u003d True"},{"line_number":98,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_60276466","line":95,"range":{"start_line":95,"start_character":29,"end_line":95,"end_character":37},"in_reply_to":"5f7c97a3_81e1072d","updated":"2018-05-22 17:22:04.000000000","message":"Done","commit_id":"2b361b5320a27721953d995dbe92589c6a84421b"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"348b8af2ba2c3daa1b8a175449fd00b4b8e79dd9","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        domain_mock.shutdown.assert_called()"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    @mock.patch(\u0027libvirt.open\u0027, autospec\u003dTrue)"},{"line_number":109,"context_line":"    def test_set_power_state_grecefulrestart(self, libvirt_mock):"},{"line_number":110,"context_line":"        domain_mock \u003d mock.Mock()"},{"line_number":111,"context_line":"        domain_mock.isActive.return_value \u003d True"},{"line_number":112,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_41d9af7c","line":109,"range":{"start_line":109,"start_character":29,"end_line":109,"end_character":37},"updated":"2018-05-11 12:40:34.000000000","message":"ditto","commit_id":"2b361b5320a27721953d995dbe92589c6a84421b"},{"author":{"_account_id":10155,"name":"Aleksandra Bezborodova","email":"bezborodovaam@gmail.com","username":"sasha_bezborodova"},"change_message_id":"fa8815c91047b44f3522b0a60dcd7319f04028ba","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        domain_mock.shutdown.assert_called()"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    @mock.patch(\u0027libvirt.open\u0027, autospec\u003dTrue)"},{"line_number":109,"context_line":"    def test_set_power_state_grecefulrestart(self, libvirt_mock):"},{"line_number":110,"context_line":"        domain_mock \u003d mock.Mock()"},{"line_number":111,"context_line":"        domain_mock.isActive.return_value \u003d True"},{"line_number":112,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_20216c4e","line":109,"range":{"start_line":109,"start_character":29,"end_line":109,"end_character":37},"in_reply_to":"5f7c97a3_41d9af7c","updated":"2018-05-22 17:22:04.000000000","message":"Done","commit_id":"2b361b5320a27721953d995dbe92589c6a84421b"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"348b8af2ba2c3daa1b8a175449fd00b4b8e79dd9","unresolved":false,"context_lines":[{"line_number":167,"context_line":"        domain_mock \u003d mock.Mock()"},{"line_number":168,"context_line":"        domain_mock.isActive.return_value \u003d True"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"        domain_mock.XMLDesc.return_value \u003d data"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"        conn_mock \u003d libvirt_mock.return_value"},{"line_number":173,"context_line":"        conn_mock.lookupByName.return_value \u003d domain_mock"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_c1493f31","line":170,"range":{"start_line":170,"start_character":43,"end_line":170,"end_character":47},"updated":"2018-05-11 12:40:34.000000000","message":"may be:\n\n  with open(\u0027sushy_tools/tests/unit/emulator/domain.xml\u0027, \u0027r\u0027) as f:\n    domain_mock.XMLDesc.return_value \u003d f.read()\n\ngiven that `data` is never used elsewhere?","commit_id":"2b361b5320a27721953d995dbe92589c6a84421b"},{"author":{"_account_id":10155,"name":"Aleksandra Bezborodova","email":"bezborodovaam@gmail.com","username":"sasha_bezborodova"},"change_message_id":"fa8815c91047b44f3522b0a60dcd7319f04028ba","unresolved":false,"context_lines":[{"line_number":167,"context_line":"        domain_mock \u003d mock.Mock()"},{"line_number":168,"context_line":"        domain_mock.isActive.return_value \u003d True"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"        domain_mock.XMLDesc.return_value \u003d data"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"        conn_mock \u003d libvirt_mock.return_value"},{"line_number":173,"context_line":"        conn_mock.lookupByName.return_value \u003d domain_mock"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_401ca812","line":170,"range":{"start_line":170,"start_character":43,"end_line":170,"end_character":47},"in_reply_to":"5f7c97a3_c1493f31","updated":"2018-05-22 17:22:04.000000000","message":"Done","commit_id":"2b361b5320a27721953d995dbe92589c6a84421b"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"348b8af2ba2c3daa1b8a175449fd00b4b8e79dd9","unresolved":false,"context_lines":[{"line_number":183,"context_line":"            data \u003d f.read()"},{"line_number":184,"context_line":"        domain_mock \u003d mock.Mock()"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"        domain_mock.XMLDesc.return_value \u003d data"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"        conn_mock \u003d libvirt_mock.return_value"},{"line_number":189,"context_line":"        conn_mock.lookupByName.return_value \u003d domain_mock"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_e1579bc9","line":186,"range":{"start_line":186,"start_character":43,"end_line":186,"end_character":47},"updated":"2018-05-11 12:40:34.000000000","message":"ditto","commit_id":"2b361b5320a27721953d995dbe92589c6a84421b"},{"author":{"_account_id":10155,"name":"Aleksandra Bezborodova","email":"bezborodovaam@gmail.com","username":"sasha_bezborodova"},"change_message_id":"fa8815c91047b44f3522b0a60dcd7319f04028ba","unresolved":false,"context_lines":[{"line_number":183,"context_line":"            data \u003d f.read()"},{"line_number":184,"context_line":"        domain_mock \u003d mock.Mock()"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"        domain_mock.XMLDesc.return_value \u003d data"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"        conn_mock \u003d libvirt_mock.return_value"},{"line_number":189,"context_line":"        conn_mock.lookupByName.return_value \u003d domain_mock"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_e01a9415","line":186,"range":{"start_line":186,"start_character":43,"end_line":186,"end_character":47},"in_reply_to":"5f7c97a3_e1579bc9","updated":"2018-05-22 17:22:04.000000000","message":"Done","commit_id":"2b361b5320a27721953d995dbe92589c6a84421b"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"348b8af2ba2c3daa1b8a175449fd00b4b8e79dd9","unresolved":false,"context_lines":[{"line_number":225,"context_line":"        self.assertEqual(2, result)"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"    @mock.patch(\u0027libvirt.openReadOnly\u0027, autospec\u003dTrue)"},{"line_number":228,"context_line":"    def test_get_total_cpus_xml(self, libvirt_mock):"},{"line_number":229,"context_line":"        with open(\u0027sushy_tools/tests/unit/emulator/domain.xml\u0027, \u0027r\u0027) as f:"},{"line_number":230,"context_line":"            data \u003d f.read()"},{"line_number":231,"context_line":"        domain_mock \u003d mock.Mock()"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_012bb72f","line":228,"range":{"start_line":228,"start_character":8,"end_line":228,"end_character":31},"updated":"2018-05-11 12:40:34.000000000","message":"Would it also make sense to test the case of `vcpu` element missing in XML?","commit_id":"2b361b5320a27721953d995dbe92589c6a84421b"},{"author":{"_account_id":10155,"name":"Aleksandra Bezborodova","email":"bezborodovaam@gmail.com","username":"sasha_bezborodova"},"change_message_id":"fa8815c91047b44f3522b0a60dcd7319f04028ba","unresolved":false,"context_lines":[{"line_number":225,"context_line":"        self.assertEqual(2, result)"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"    @mock.patch(\u0027libvirt.openReadOnly\u0027, autospec\u003dTrue)"},{"line_number":228,"context_line":"    def test_get_total_cpus_xml(self, libvirt_mock):"},{"line_number":229,"context_line":"        with open(\u0027sushy_tools/tests/unit/emulator/domain.xml\u0027, \u0027r\u0027) as f:"},{"line_number":230,"context_line":"            data \u003d f.read()"},{"line_number":231,"context_line":"        domain_mock \u003d mock.Mock()"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_0016b0f2","line":228,"range":{"start_line":228,"start_character":8,"end_line":228,"end_character":31},"in_reply_to":"5f7c97a3_012bb72f","updated":"2018-05-22 17:22:04.000000000","message":"Done","commit_id":"2b361b5320a27721953d995dbe92589c6a84421b"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"348b8af2ba2c3daa1b8a175449fd00b4b8e79dd9","unresolved":false,"context_lines":[{"line_number":232,"context_line":"        domain_mock.isActive.return_value \u003d True"},{"line_number":233,"context_line":"        domain_mock.maxVcpus.return_value \u003d 0"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"        domain_mock.XMLDesc.return_value \u003d data"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"        conn_mock \u003d libvirt_mock.return_value"},{"line_number":238,"context_line":"        conn_mock.lookupByName.return_value \u003d domain_mock"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_a1fa03ba","line":235,"range":{"start_line":235,"start_character":43,"end_line":235,"end_character":47},"updated":"2018-05-11 12:40:34.000000000","message":"ditto","commit_id":"2b361b5320a27721953d995dbe92589c6a84421b"},{"author":{"_account_id":10155,"name":"Aleksandra Bezborodova","email":"bezborodovaam@gmail.com","username":"sasha_bezborodova"},"change_message_id":"fa8815c91047b44f3522b0a60dcd7319f04028ba","unresolved":false,"context_lines":[{"line_number":232,"context_line":"        domain_mock.isActive.return_value \u003d True"},{"line_number":233,"context_line":"        domain_mock.maxVcpus.return_value \u003d 0"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"        domain_mock.XMLDesc.return_value \u003d data"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"        conn_mock \u003d libvirt_mock.return_value"},{"line_number":238,"context_line":"        conn_mock.lookupByName.return_value \u003d domain_mock"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_a0d25c33","line":235,"range":{"start_line":235,"start_character":43,"end_line":235,"end_character":47},"in_reply_to":"5f7c97a3_a1fa03ba","updated":"2018-05-22 17:22:04.000000000","message":"Done","commit_id":"2b361b5320a27721953d995dbe92589c6a84421b"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"f964639fa7b407c50814fb9a2ea9acf314bfafbf","unresolved":false,"context_lines":[{"line_number":25,"context_line":"class LibvirtDriverTastCase(base.BaseTestCase):"},{"line_number":26,"context_line":"    def setUp(self):"},{"line_number":27,"context_line":"        patch_readonly \u003d mock.patch(\u0027libvirt.openReadOnly\u0027, autospec\u003dTrue)"},{"line_number":28,"context_line":"        patch_open \u003d mock.patch(\u0027libvirt.open\u0027, autospec\u003dTrue)"},{"line_number":29,"context_line":"        self.libvirt_mock_readonly \u003d patch_readonly.start()"},{"line_number":30,"context_line":"        self.libvirt_mock \u003d patch_open.start()"},{"line_number":31,"context_line":"        super(LibvirtDriverTastCase, self).setUp()"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_da1aa17b","line":28,"updated":"2018-05-25 09:20:59.000000000","message":"Can you use `@mock.patch` or `@mock.patch.object` decorator at the class level (e.g. at line #24) for the same purpose? It looks more concise to me.","commit_id":"719b45abd76324d12a90c39965bb3955a941f109"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"d61363f92131c275abb6bb12236f9ca7bad877a9","unresolved":false,"context_lines":[{"line_number":25,"context_line":"class LibvirtDriverTastCase(base.BaseTestCase):"},{"line_number":26,"context_line":"    def setUp(self):"},{"line_number":27,"context_line":"        patch_readonly \u003d mock.patch(\u0027libvirt.openReadOnly\u0027, autospec\u003dTrue)"},{"line_number":28,"context_line":"        patch_open \u003d mock.patch(\u0027libvirt.open\u0027, autospec\u003dTrue)"},{"line_number":29,"context_line":"        self.libvirt_mock_readonly \u003d patch_readonly.start()"},{"line_number":30,"context_line":"        self.libvirt_mock \u003d patch_open.start()"},{"line_number":31,"context_line":"        super(LibvirtDriverTastCase, self).setUp()"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_bdc84721","line":28,"updated":"2018-06-06 09:31:37.000000000","message":"I was sure I responded here Oo Anyway\n\nThere are two more common methods that avoid adding a new arguments. You can use @mock.patch with a replacement object like\n\n @mock.patch(\u0027...\u0027, some_new_object)\n\nor you can use fixtures in setUp:\n\n self.libvirt_mock \u003d self.useFixtures(fixtures.MockPatch(\u0027...\u0027, autospec\u003dTrue)).mock\n\nHowever, in your case you\u0027re using libvirt_mock in every test function, so Ilya\u0027s suggestion actually makes sense. Indeed, it will add new arguments to every call. While a bit bulky, it\u0027s also quite explicit, which is usually a good thing.","commit_id":"719b45abd76324d12a90c39965bb3955a941f109"},{"author":{"_account_id":10155,"name":"Aleksandra Bezborodova","email":"bezborodovaam@gmail.com","username":"sasha_bezborodova"},"change_message_id":"7af5f08bba8083280af5c751419756cbf444da18","unresolved":false,"context_lines":[{"line_number":25,"context_line":"class LibvirtDriverTastCase(base.BaseTestCase):"},{"line_number":26,"context_line":"    def setUp(self):"},{"line_number":27,"context_line":"        patch_readonly \u003d mock.patch(\u0027libvirt.openReadOnly\u0027, autospec\u003dTrue)"},{"line_number":28,"context_line":"        patch_open \u003d mock.patch(\u0027libvirt.open\u0027, autospec\u003dTrue)"},{"line_number":29,"context_line":"        self.libvirt_mock_readonly \u003d patch_readonly.start()"},{"line_number":30,"context_line":"        self.libvirt_mock \u003d patch_open.start()"},{"line_number":31,"context_line":"        super(LibvirtDriverTastCase, self).setUp()"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_14c86d73","line":28,"in_reply_to":"5f7c97a3_da1aa17b","updated":"2018-06-27 20:43:32.000000000","message":"Done","commit_id":"719b45abd76324d12a90c39965bb3955a941f109"},{"author":{"_account_id":10155,"name":"Aleksandra Bezborodova","email":"bezborodovaam@gmail.com","username":"sasha_bezborodova"},"change_message_id":"7dcde85a38cfd1dbafd114a71f29de58621cfd0f","unresolved":false,"context_lines":[{"line_number":25,"context_line":"class LibvirtDriverTastCase(base.BaseTestCase):"},{"line_number":26,"context_line":"    def setUp(self):"},{"line_number":27,"context_line":"        patch_readonly \u003d mock.patch(\u0027libvirt.openReadOnly\u0027, autospec\u003dTrue)"},{"line_number":28,"context_line":"        patch_open \u003d mock.patch(\u0027libvirt.open\u0027, autospec\u003dTrue)"},{"line_number":29,"context_line":"        self.libvirt_mock_readonly \u003d patch_readonly.start()"},{"line_number":30,"context_line":"        self.libvirt_mock \u003d patch_open.start()"},{"line_number":31,"context_line":"        super(LibvirtDriverTastCase, self).setUp()"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_4260e3cf","line":28,"in_reply_to":"5f7c97a3_da1aa17b","updated":"2018-05-28 15:00:02.000000000","message":"I think if I do that, it\u0027ll be more complex because every test will be look like:\n\n\ndef \u003ctest_name\u003e(self, libvirt_mock, libvirt_mock_readonly):\n    ...\n\naccording to the docs\nhttps://docs.python.org/3.5/library/unittest.mock-examples.html#applying-the-same-patch-to-every-test-method","commit_id":"719b45abd76324d12a90c39965bb3955a941f109"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"f964639fa7b407c50814fb9a2ea9acf314bfafbf","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        super(LibvirtDriverTastCase, self).tearDown()"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def test_systems(self):"},{"line_number":38,"context_line":"        domain_mock \u003d mock.Mock()"},{"line_number":39,"context_line":"        conn_mock \u003d self.libvirt_mock_readonly.return_value"},{"line_number":40,"context_line":"        conn_mock.listDefinedDomains.return_value \u003d [domain_mock]"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_ce23c2a6","line":38,"updated":"2018-05-25 09:20:59.000000000","message":"Would this work?\n\nconn_mock.lookupByName.UUIDString.return_value \u003d \u0027xxx-yyy-zzz\u0027\n\nYou definitely do not need to create `Mock` explicitly, it gets created magically, like everything in unitest. ;)","commit_id":"719b45abd76324d12a90c39965bb3955a941f109"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"e8bb041c4e513891808770ea5f7b71cdbd79110b","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        super(LibvirtDriverTastCase, self).tearDown()"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def test_systems(self):"},{"line_number":38,"context_line":"        domain_mock \u003d mock.Mock()"},{"line_number":39,"context_line":"        conn_mock \u003d self.libvirt_mock_readonly.return_value"},{"line_number":40,"context_line":"        conn_mock.listDefinedDomains.return_value \u003d [domain_mock]"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_156c9006","line":38,"in_reply_to":"5f7c97a3_a2953789","updated":"2018-06-07 13:36:58.000000000","message":"Not quite. I meant you never need thing like `x \u003d mock.Mock(); y.return_value \u003d x` for as long as `y` is a mock.\n\nYou can spawn these nested assignments over many lines for readability, but explicit Mock instantiation is almost never needed with unittest.","commit_id":"719b45abd76324d12a90c39965bb3955a941f109"},{"author":{"_account_id":10155,"name":"Aleksandra Bezborodova","email":"bezborodovaam@gmail.com","username":"sasha_bezborodova"},"change_message_id":"7dcde85a38cfd1dbafd114a71f29de58621cfd0f","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        super(LibvirtDriverTastCase, self).tearDown()"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def test_systems(self):"},{"line_number":38,"context_line":"        domain_mock \u003d mock.Mock()"},{"line_number":39,"context_line":"        conn_mock \u003d self.libvirt_mock_readonly.return_value"},{"line_number":40,"context_line":"        conn_mock.listDefinedDomains.return_value \u003d [domain_mock]"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_a2953789","line":38,"in_reply_to":"5f7c97a3_ce23c2a6","updated":"2018-05-28 15:00:02.000000000","message":"Did I understand correctly:\n\nconn_mock.lookupByName.return_value.UUIDString.return_value \u003d \u0027xxx-yyy-zzz\u0027\n\nI think it\u0027s less readable.","commit_id":"719b45abd76324d12a90c39965bb3955a941f109"},{"author":{"_account_id":10155,"name":"Aleksandra Bezborodova","email":"bezborodovaam@gmail.com","username":"sasha_bezborodova"},"change_message_id":"7af5f08bba8083280af5c751419756cbf444da18","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        super(LibvirtDriverTastCase, self).tearDown()"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def test_systems(self):"},{"line_number":38,"context_line":"        domain_mock \u003d mock.Mock()"},{"line_number":39,"context_line":"        conn_mock \u003d self.libvirt_mock_readonly.return_value"},{"line_number":40,"context_line":"        conn_mock.listDefinedDomains.return_value \u003d [domain_mock]"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_b4c41962","line":38,"in_reply_to":"5f7c97a3_ce23c2a6","updated":"2018-06-27 20:43:32.000000000","message":"Done","commit_id":"719b45abd76324d12a90c39965bb3955a941f109"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"d61363f92131c275abb6bb12236f9ca7bad877a9","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        conn_mock.listDefinedDomains.return_value \u003d [domain_mock]"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        tst_driver \u003d LibvirtDriver(uri\u003d\u0027127.0.0.1\u0027)"},{"line_number":43,"context_line":"        self.assertEqual([domain_mock], tst_driver.systems)"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def test_uuid(self):"},{"line_number":46,"context_line":"        domain_mock \u003d mock.Mock()"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_5dcfb328","line":43,"updated":"2018-06-06 09:31:37.000000000","message":"self.assertEqual(conn_mock.listDefinedDomains.return_value, tst_driver.systems)","commit_id":"719b45abd76324d12a90c39965bb3955a941f109"},{"author":{"_account_id":10155,"name":"Aleksandra Bezborodova","email":"bezborodovaam@gmail.com","username":"sasha_bezborodova"},"change_message_id":"7af5f08bba8083280af5c751419756cbf444da18","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        conn_mock.listDefinedDomains.return_value \u003d [domain_mock]"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        tst_driver \u003d LibvirtDriver(uri\u003d\u0027127.0.0.1\u0027)"},{"line_number":43,"context_line":"        self.assertEqual([domain_mock], tst_driver.systems)"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def test_uuid(self):"},{"line_number":46,"context_line":"        domain_mock \u003d mock.Mock()"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_d4c19550","line":43,"in_reply_to":"5f7c97a3_5dcfb328","updated":"2018-06-27 20:43:32.000000000","message":"Done","commit_id":"719b45abd76324d12a90c39965bb3955a941f109"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"d61363f92131c275abb6bb12236f9ca7bad877a9","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        domain_mock \u003d mock.Mock()"},{"line_number":47,"context_line":"        domain_mock.UUIDString.return_value \u003d \u0027xxx-yyy-zzz\u0027"},{"line_number":48,"context_line":"        conn_mock \u003d self.libvirt_mock_readonly.return_value"},{"line_number":49,"context_line":"        conn_mock.lookupByName.return_value \u003d domain_mock"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        tst_driver \u003d LibvirtDriver(uri\u003d\u0027127.0.0.1\u0027)"},{"line_number":52,"context_line":"        self.assertEqual(\u0027xxx-yyy-zzz\u0027, tst_driver.uuid(\u0027zzz-yyy-xxx\u0027))"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_7dd2afd3","line":49,"updated":"2018-06-06 09:31:37.000000000","message":"in spirit of the above:\n\n domain_mock \u003d conn_mock.lookupByName.return_value\n domain_mock.UUIDString.return_value \u003d ...\n\nessentially the same, but one line less (no creating of a new Mock)","commit_id":"719b45abd76324d12a90c39965bb3955a941f109"},{"author":{"_account_id":10155,"name":"Aleksandra Bezborodova","email":"bezborodovaam@gmail.com","username":"sasha_bezborodova"},"change_message_id":"7af5f08bba8083280af5c751419756cbf444da18","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        domain_mock \u003d mock.Mock()"},{"line_number":47,"context_line":"        domain_mock.UUIDString.return_value \u003d \u0027xxx-yyy-zzz\u0027"},{"line_number":48,"context_line":"        conn_mock \u003d self.libvirt_mock_readonly.return_value"},{"line_number":49,"context_line":"        conn_mock.lookupByName.return_value \u003d domain_mock"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        tst_driver \u003d LibvirtDriver(uri\u003d\u0027127.0.0.1\u0027)"},{"line_number":52,"context_line":"        self.assertEqual(\u0027xxx-yyy-zzz\u0027, tst_driver.uuid(\u0027zzz-yyy-xxx\u0027))"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_749c4170","line":49,"in_reply_to":"5f7c97a3_7dd2afd3","updated":"2018-06-27 20:43:32.000000000","message":"Done","commit_id":"719b45abd76324d12a90c39965bb3955a941f109"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"b321a7ce7a39220f361da05b911760f4153fcf68","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"@mock.patch(\u0027libvirt.openReadOnly\u0027)"},{"line_number":24,"context_line":"@mock.patch(\u0027libvirt.open\u0027)"},{"line_number":25,"context_line":"class LibvirtDriverTastCase(base.BaseTestCase):"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def test_systems(self, libvirt_mock, libvirt_mock_readonly):"},{"line_number":28,"context_line":"        conn_mock \u003d libvirt_mock_readonly.return_value"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_b0d061ca","line":25,"range":{"start_line":25,"start_character":19,"end_line":25,"end_character":23},"updated":"2018-07-01 16:20:03.000000000","message":"typo","commit_id":"2aa3cecafc33ed8206e6dfef82d3b23656eac4a4"},{"author":{"_account_id":10155,"name":"Aleksandra Bezborodova","email":"bezborodovaam@gmail.com","username":"sasha_bezborodova"},"change_message_id":"4a0f0734a444bab31e0683d204802fbf51bec489","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"@mock.patch(\u0027libvirt.openReadOnly\u0027)"},{"line_number":24,"context_line":"@mock.patch(\u0027libvirt.open\u0027)"},{"line_number":25,"context_line":"class LibvirtDriverTastCase(base.BaseTestCase):"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def test_systems(self, libvirt_mock, libvirt_mock_readonly):"},{"line_number":28,"context_line":"        conn_mock \u003d libvirt_mock_readonly.return_value"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_2bc1404f","line":25,"range":{"start_line":25,"start_character":19,"end_line":25,"end_character":23},"in_reply_to":"5f7c97a3_b0d061ca","updated":"2018-07-01 19:03:19.000000000","message":"Done","commit_id":"2aa3cecafc33ed8206e6dfef82d3b23656eac4a4"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"b321a7ce7a39220f361da05b911760f4153fcf68","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        conn_mock \u003d libvirt_mock_readonly.return_value"},{"line_number":29,"context_line":"        conn_mock.listDefinedDomains.return_value \u003d []"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"        tst_driver \u003d LibvirtDriver(uri\u003d\u0027127.0.0.1\u0027)"},{"line_number":32,"context_line":"        self.assertEqual(conn_mock.listDefinedDomains.return_value,"},{"line_number":33,"context_line":"                         tst_driver.systems)"},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_50730de9","line":31,"range":{"start_line":31,"start_character":8,"end_line":31,"end_character":51},"updated":"2018-07-01 16:20:03.000000000","message":"here and elsewhere: could this be moved to setUp to avoid setting this up in every single test?","commit_id":"2aa3cecafc33ed8206e6dfef82d3b23656eac4a4"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"b321a7ce7a39220f361da05b911760f4153fcf68","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        conn_mock \u003d libvirt_mock_readonly.return_value"},{"line_number":29,"context_line":"        conn_mock.listDefinedDomains.return_value \u003d []"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"        tst_driver \u003d LibvirtDriver(uri\u003d\u0027127.0.0.1\u0027)"},{"line_number":32,"context_line":"        self.assertEqual(conn_mock.listDefinedDomains.return_value,"},{"line_number":33,"context_line":"                         tst_driver.systems)"},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_d05f1d4b","line":31,"range":{"start_line":31,"start_character":8,"end_line":31,"end_character":51},"updated":"2018-07-01 16:20:03.000000000","message":"here and elswhere: why does this have uri parm while other tests cases below don\u0027t have?","commit_id":"2aa3cecafc33ed8206e6dfef82d3b23656eac4a4"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"b321a7ce7a39220f361da05b911760f4153fcf68","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        conn_mock \u003d libvirt_mock_readonly.return_value"},{"line_number":29,"context_line":"        conn_mock.listDefinedDomains.return_value \u003d []"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"        tst_driver \u003d LibvirtDriver(uri\u003d\u0027127.0.0.1\u0027)"},{"line_number":32,"context_line":"        self.assertEqual(conn_mock.listDefinedDomains.return_value,"},{"line_number":33,"context_line":"                         tst_driver.systems)"},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_d0915df9","line":31,"range":{"start_line":31,"start_character":8,"end_line":31,"end_character":18},"updated":"2018-07-01 16:20:03.000000000","message":"nit: here and elsewhere I don\u0027t think it is worth shortening this to \u0027tst\u0027, better have \u0027test\u0027","commit_id":"2aa3cecafc33ed8206e6dfef82d3b23656eac4a4"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"595f8ace5904bd02c46ff3a7d05ccda21033a84a","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        conn_mock \u003d libvirt_mock_readonly.return_value"},{"line_number":29,"context_line":"        conn_mock.listDefinedDomains.return_value \u003d []"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"        tst_driver \u003d LibvirtDriver(uri\u003d\u0027127.0.0.1\u0027)"},{"line_number":32,"context_line":"        self.assertEqual(conn_mock.listDefinedDomains.return_value,"},{"line_number":33,"context_line":"                         tst_driver.systems)"},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_20371601","line":31,"range":{"start_line":31,"start_character":8,"end_line":31,"end_character":51},"in_reply_to":"5f7c97a3_40d012c9","updated":"2018-07-02 09:38:37.000000000","message":"\u003e hm, setUp will be called before each test case and assign a new instance\n\ncorrect","commit_id":"2aa3cecafc33ed8206e6dfef82d3b23656eac4a4"},{"author":{"_account_id":10155,"name":"Aleksandra Bezborodova","email":"bezborodovaam@gmail.com","username":"sasha_bezborodova"},"change_message_id":"9acf2ae190d120dabdb9bc27b15284bca8d60070","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        conn_mock \u003d libvirt_mock_readonly.return_value"},{"line_number":29,"context_line":"        conn_mock.listDefinedDomains.return_value \u003d []"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"        tst_driver \u003d LibvirtDriver(uri\u003d\u0027127.0.0.1\u0027)"},{"line_number":32,"context_line":"        self.assertEqual(conn_mock.listDefinedDomains.return_value,"},{"line_number":33,"context_line":"                         tst_driver.systems)"},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_43e337d9","line":31,"range":{"start_line":31,"start_character":8,"end_line":31,"end_character":51},"in_reply_to":"5f7c97a3_40d012c9","updated":"2018-07-02 14:40:25.000000000","message":"ok, sounds reasonable. I\u0027ll try this suggestion.","commit_id":"2aa3cecafc33ed8206e6dfef82d3b23656eac4a4"},{"author":{"_account_id":10155,"name":"Aleksandra Bezborodova","email":"bezborodovaam@gmail.com","username":"sasha_bezborodova"},"change_message_id":"4a0f0734a444bab31e0683d204802fbf51bec489","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        conn_mock \u003d libvirt_mock_readonly.return_value"},{"line_number":29,"context_line":"        conn_mock.listDefinedDomains.return_value \u003d []"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"        tst_driver \u003d LibvirtDriver(uri\u003d\u0027127.0.0.1\u0027)"},{"line_number":32,"context_line":"        self.assertEqual(conn_mock.listDefinedDomains.return_value,"},{"line_number":33,"context_line":"                         tst_driver.systems)"},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_ebbb48e1","line":31,"range":{"start_line":31,"start_character":8,"end_line":31,"end_character":51},"in_reply_to":"5f7c97a3_50730de9","updated":"2018-07-01 19:03:19.000000000","message":"I don\u0027t think so, because every test has different associated params for this driver.","commit_id":"2aa3cecafc33ed8206e6dfef82d3b23656eac4a4"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"7bd779b56976e52b533333851ba2137a9b80867e","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        conn_mock \u003d libvirt_mock_readonly.return_value"},{"line_number":29,"context_line":"        conn_mock.listDefinedDomains.return_value \u003d []"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"        tst_driver \u003d LibvirtDriver(uri\u003d\u0027127.0.0.1\u0027)"},{"line_number":32,"context_line":"        self.assertEqual(conn_mock.listDefinedDomains.return_value,"},{"line_number":33,"context_line":"                         tst_driver.systems)"},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_80fe2a02","line":31,"range":{"start_line":31,"start_character":8,"end_line":31,"end_character":51},"in_reply_to":"5f7c97a3_655c40f0","updated":"2018-07-02 09:16:07.000000000","message":"Would it be OK to re-use the same `LibvirtDriver` instance across many tests? If the object is stateful, one test may influence the other. But may be that should not happen? Therefore if it happens that\u0027s a bug??\n\nAlso, some tests pass `uri` initializer to `LibvirtDriver` while some do not. Not sure why and is it important?\n\nJust trying to spark the flame! ;-)","commit_id":"2aa3cecafc33ed8206e6dfef82d3b23656eac4a4"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"697e8043a332a72a37a5a587a34ecd1e3bbd1071","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        conn_mock \u003d libvirt_mock_readonly.return_value"},{"line_number":29,"context_line":"        conn_mock.listDefinedDomains.return_value \u003d []"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"        tst_driver \u003d LibvirtDriver(uri\u003d\u0027127.0.0.1\u0027)"},{"line_number":32,"context_line":"        self.assertEqual(conn_mock.listDefinedDomains.return_value,"},{"line_number":33,"context_line":"                         tst_driver.systems)"},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_40d012c9","line":31,"range":{"start_line":31,"start_character":8,"end_line":31,"end_character":51},"in_reply_to":"5f7c97a3_80fe2a02","updated":"2018-07-02 09:34:30.000000000","message":"hm, setUp will be called before each test case and assign a new instance, but if tests happen to run in parallel (do they? can they?) I actually don\u0027t know if they will have their own instance for each test case or not. So maybe can\u0027t share the instance then. \n\n(the uri parm was removed in the latest patch)","commit_id":"2aa3cecafc33ed8206e6dfef82d3b23656eac4a4"},{"author":{"_account_id":10155,"name":"Aleksandra Bezborodova","email":"bezborodovaam@gmail.com","username":"sasha_bezborodova"},"change_message_id":"4a0f0734a444bab31e0683d204802fbf51bec489","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        conn_mock \u003d libvirt_mock_readonly.return_value"},{"line_number":29,"context_line":"        conn_mock.listDefinedDomains.return_value \u003d []"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"        tst_driver \u003d LibvirtDriver(uri\u003d\u0027127.0.0.1\u0027)"},{"line_number":32,"context_line":"        self.assertEqual(conn_mock.listDefinedDomains.return_value,"},{"line_number":33,"context_line":"                         tst_driver.systems)"},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_4b911c53","line":31,"range":{"start_line":31,"start_character":8,"end_line":31,"end_character":51},"in_reply_to":"5f7c97a3_d05f1d4b","updated":"2018-07-01 19:03:19.000000000","message":"probably kinda of typos.","commit_id":"2aa3cecafc33ed8206e6dfef82d3b23656eac4a4"},{"author":{"_account_id":10155,"name":"Aleksandra Bezborodova","email":"bezborodovaam@gmail.com","username":"sasha_bezborodova"},"change_message_id":"4a0f0734a444bab31e0683d204802fbf51bec489","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        conn_mock \u003d libvirt_mock_readonly.return_value"},{"line_number":29,"context_line":"        conn_mock.listDefinedDomains.return_value \u003d []"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"        tst_driver \u003d LibvirtDriver(uri\u003d\u0027127.0.0.1\u0027)"},{"line_number":32,"context_line":"        self.assertEqual(conn_mock.listDefinedDomains.return_value,"},{"line_number":33,"context_line":"                         tst_driver.systems)"},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_cb9d2c6d","line":31,"range":{"start_line":31,"start_character":8,"end_line":31,"end_character":18},"in_reply_to":"5f7c97a3_d0915df9","updated":"2018-07-01 19:03:19.000000000","message":"Done","commit_id":"2aa3cecafc33ed8206e6dfef82d3b23656eac4a4"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"a6ef0cd863682b28268f3533f86ef0fec24b001d","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        conn_mock \u003d libvirt_mock_readonly.return_value"},{"line_number":29,"context_line":"        conn_mock.listDefinedDomains.return_value \u003d []"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"        tst_driver \u003d LibvirtDriver(uri\u003d\u0027127.0.0.1\u0027)"},{"line_number":32,"context_line":"        self.assertEqual(conn_mock.listDefinedDomains.return_value,"},{"line_number":33,"context_line":"                         tst_driver.systems)"},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_655c40f0","line":31,"range":{"start_line":31,"start_character":8,"end_line":31,"end_character":51},"in_reply_to":"5f7c97a3_ebbb48e1","updated":"2018-07-02 08:38:26.000000000","message":"of course each test has some different setup, I only meant to move 1 line\n\n test_driver \u003d LibvirtDriver()\n\nto setUp and remove this from each test case while keeping test case specific parts where they are now.","commit_id":"2aa3cecafc33ed8206e6dfef82d3b23656eac4a4"}],"sushy_tools/tests/unit/emulator/test_main.py":[{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"348b8af2ba2c3daa1b8a175449fd00b4b8e79dd9","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#!/usr/bin/env python"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_21d5931c","line":1,"range":{"start_line":1,"start_character":0,"end_line":1,"end_character":21},"updated":"2018-05-11 12:40:34.000000000","message":"We probably do not need this here?","commit_id":"2b361b5320a27721953d995dbe92589c6a84421b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"944f10f87cab19b2b583f089dfc28ae0ad0f826a","unresolved":false,"context_lines":[{"line_number":22,"context_line":"class EmulatorTestCase(base.BaseTestCase):"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    def setUp(self):"},{"line_number":25,"context_line":"        self.app \u003d main.app.test_client()"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"        super(EmulatorTestCase, self).setUp()"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_81f52b59","line":25,"updated":"2018-05-16 15:02:09.000000000","message":"there is a subtle problem in our code: the \"main\" module has a global \"driver\" object. because of it, one test can influence another. we need to reset it to None in setUp.","commit_id":"2b361b5320a27721953d995dbe92589c6a84421b"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"d2d78101cbc8e461daa58a94bdc39c8df581b069","unresolved":false,"context_lines":[{"line_number":22,"context_line":"class EmulatorTestCase(base.BaseTestCase):"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    def setUp(self):"},{"line_number":25,"context_line":"        self.app \u003d main.app.test_client()"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"        super(EmulatorTestCase, self).setUp()"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_ea5b2a84","line":25,"in_reply_to":"5f7c97a3_80116007","updated":"2018-05-23 09:28:06.000000000","message":"Is it as simple as:\n\n    def setUp(self):\n        # force driver initialization by resetting\n        # potentially already existing driver object\n        main.driver \u003d None\n\n        self.app \u003d main.app.test_client()\n\n?","commit_id":"2b361b5320a27721953d995dbe92589c6a84421b"},{"author":{"_account_id":10155,"name":"Aleksandra Bezborodova","email":"bezborodovaam@gmail.com","username":"sasha_bezborodova"},"change_message_id":"fa8815c91047b44f3522b0a60dcd7319f04028ba","unresolved":false,"context_lines":[{"line_number":22,"context_line":"class EmulatorTestCase(base.BaseTestCase):"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    def setUp(self):"},{"line_number":25,"context_line":"        self.app \u003d main.app.test_client()"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"        super(EmulatorTestCase, self).setUp()"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_80116007","line":25,"in_reply_to":"5f7c97a3_81f52b59","updated":"2018-05-22 17:22:04.000000000","message":"I understand what do you want me to do, but I don\u0027t know how to do that. Can you send me a link to example or code sample.","commit_id":"2b361b5320a27721953d995dbe92589c6a84421b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"b154a6d83338924951ba0b2c13839f77bdf89188","unresolved":false,"context_lines":[{"line_number":35,"context_line":"                autospec\u003dTrue)"},{"line_number":36,"context_line":"    @mock.patch(\u0027flask.render_template\u0027, autospec\u003dTrue)"},{"line_number":37,"context_line":"    def test_collection_resource(self, render_mock, libvirt_mock):"},{"line_number":38,"context_line":"        mock_driver \u003d mock.Mock()"},{"line_number":39,"context_line":"        mock_driver.systems \u003d [\u0027host0\u0027, \u0027host1\u0027]"},{"line_number":40,"context_line":"        libvirt_mock.return_value \u003d mock_driver"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_216e97c8","line":38,"range":{"start_line":38,"start_character":8,"end_line":38,"end_character":33},"updated":"2018-05-16 14:40:30.000000000","message":"see below re creating a new Mock","commit_id":"2b361b5320a27721953d995dbe92589c6a84421b"},{"author":{"_account_id":10155,"name":"Aleksandra Bezborodova","email":"bezborodovaam@gmail.com","username":"sasha_bezborodova"},"change_message_id":"fa8815c91047b44f3522b0a60dcd7319f04028ba","unresolved":false,"context_lines":[{"line_number":35,"context_line":"                autospec\u003dTrue)"},{"line_number":36,"context_line":"    @mock.patch(\u0027flask.render_template\u0027, autospec\u003dTrue)"},{"line_number":37,"context_line":"    def test_collection_resource(self, render_mock, libvirt_mock):"},{"line_number":38,"context_line":"        mock_driver \u003d mock.Mock()"},{"line_number":39,"context_line":"        mock_driver.systems \u003d [\u0027host0\u0027, \u0027host1\u0027]"},{"line_number":40,"context_line":"        libvirt_mock.return_value \u003d mock_driver"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_30a771aa","line":38,"range":{"start_line":38,"start_character":8,"end_line":38,"end_character":33},"in_reply_to":"5f7c97a3_216e97c8","updated":"2018-05-22 17:22:04.000000000","message":"Done","commit_id":"2b361b5320a27721953d995dbe92589c6a84421b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"b154a6d83338924951ba0b2c13839f77bdf89188","unresolved":false,"context_lines":[{"line_number":48,"context_line":"                autospec\u003dTrue)"},{"line_number":49,"context_line":"    @mock.patch(\u0027flask.render_template\u0027, autospec\u003dTrue)"},{"line_number":50,"context_line":"    def test_system_resource_get(self, render_mock, libvirt_mock):"},{"line_number":51,"context_line":"        mock_driver \u003d mock.Mock()"},{"line_number":52,"context_line":"        mock_driver.identity.return_value \u003d \u0027xxxx-yyyy-zzzz\u0027"},{"line_number":53,"context_line":"        mock_driver.uuid.return_value \u003d \u0027zzzz-yyyy-xxxx\u0027"},{"line_number":54,"context_line":"        mock_driver.get_power_state.return_value \u003d \u0027On\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_a148675b","line":51,"range":{"start_line":51,"start_character":8,"end_line":51,"end_character":33},"updated":"2018-05-16 14:40:30.000000000","message":"doing it this way party defeats the autospec\u003dTrue above, because you\u0027re creating a Mock without any spec. Keeping in mind that any attribute of a Mock is also a Mock:\n\n mock_driver \u003d libvirt_mock.return_value\n mock_driver.identity.return_value\n\netc. This is probably not the cause of the failure though, but it may uncover the real reason.","commit_id":"2b361b5320a27721953d995dbe92589c6a84421b"},{"author":{"_account_id":10155,"name":"Aleksandra Bezborodova","email":"bezborodovaam@gmail.com","username":"sasha_bezborodova"},"change_message_id":"fa8815c91047b44f3522b0a60dcd7319f04028ba","unresolved":false,"context_lines":[{"line_number":48,"context_line":"                autospec\u003dTrue)"},{"line_number":49,"context_line":"    @mock.patch(\u0027flask.render_template\u0027, autospec\u003dTrue)"},{"line_number":50,"context_line":"    def test_system_resource_get(self, render_mock, libvirt_mock):"},{"line_number":51,"context_line":"        mock_driver \u003d mock.Mock()"},{"line_number":52,"context_line":"        mock_driver.identity.return_value \u003d \u0027xxxx-yyyy-zzzz\u0027"},{"line_number":53,"context_line":"        mock_driver.uuid.return_value \u003d \u0027zzzz-yyyy-xxxx\u0027"},{"line_number":54,"context_line":"        mock_driver.get_power_state.return_value \u003d \u0027On\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_10acb58a","line":51,"range":{"start_line":51,"start_character":8,"end_line":51,"end_character":33},"in_reply_to":"5f7c97a3_a148675b","updated":"2018-05-22 17:22:04.000000000","message":"Done","commit_id":"2b361b5320a27721953d995dbe92589c6a84421b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"944f10f87cab19b2b583f089dfc28ae0ad0f826a","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    @mock.patch(\u0027flask.render_template\u0027, autospec\u003dTrue)"},{"line_number":50,"context_line":"    def test_system_resource_get(self, render_mock, libvirt_mock):"},{"line_number":51,"context_line":"        mock_driver \u003d mock.Mock()"},{"line_number":52,"context_line":"        mock_driver.identity.return_value \u003d \u0027xxxx-yyyy-zzzz\u0027"},{"line_number":53,"context_line":"        mock_driver.uuid.return_value \u003d \u0027zzzz-yyyy-xxxx\u0027"},{"line_number":54,"context_line":"        mock_driver.get_power_state.return_value \u003d \u0027On\u0027"},{"line_number":55,"context_line":"        mock_driver.get_total_memory.return_value \u003d 1"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_21cf7729","line":52,"range":{"start_line":52,"start_character":20,"end_line":52,"end_character":60},"updated":"2018-05-16 15:02:09.000000000","message":"LibvirtDriver does not have identity()","commit_id":"2b361b5320a27721953d995dbe92589c6a84421b"},{"author":{"_account_id":10155,"name":"Aleksandra Bezborodova","email":"bezborodovaam@gmail.com","username":"sasha_bezborodova"},"change_message_id":"fa8815c91047b44f3522b0a60dcd7319f04028ba","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    @mock.patch(\u0027flask.render_template\u0027, autospec\u003dTrue)"},{"line_number":50,"context_line":"    def test_system_resource_get(self, render_mock, libvirt_mock):"},{"line_number":51,"context_line":"        mock_driver \u003d mock.Mock()"},{"line_number":52,"context_line":"        mock_driver.identity.return_value \u003d \u0027xxxx-yyyy-zzzz\u0027"},{"line_number":53,"context_line":"        mock_driver.uuid.return_value \u003d \u0027zzzz-yyyy-xxxx\u0027"},{"line_number":54,"context_line":"        mock_driver.get_power_state.return_value \u003d \u0027On\u0027"},{"line_number":55,"context_line":"        mock_driver.get_total_memory.return_value \u003d 1"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_709de955","line":52,"range":{"start_line":52,"start_character":20,"end_line":52,"end_character":60},"in_reply_to":"5f7c97a3_21cf7729","updated":"2018-05-22 17:22:04.000000000","message":"Done","commit_id":"2b361b5320a27721953d995dbe92589c6a84421b"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"348b8af2ba2c3daa1b8a175449fd00b4b8e79dd9","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        data0 \u003d json.dumps({\u0027Boot\u0027: {\u0027BootSourceOverrideTarget\u0027: \u0027Cd\u0027}})"},{"line_number":73,"context_line":"        response \u003d self.app.patch(\u0027/redfish/v1/Systems/xxxx-yyyy-zzzz\u0027,"},{"line_number":74,"context_line":"                                  data\u003ddata0, content_type\u003d\u0027application/json\u0027)"},{"line_number":75,"context_line":"        self.assertEqual(response.status, \u0027204 NO CONTENT\u0027)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    @mock.patch(\u0027sushy_tools.emulator.drivers.libvirtdriver.LibvirtDriver\u0027,"},{"line_number":78,"context_line":"                autospec\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_e159db8d","line":75,"range":{"start_line":75,"start_character":0,"end_line":75,"end_character":59},"updated":"2018-05-11 12:40:34.000000000","message":"I am a bit worrying that this way we do not test that the REST API call actually worked out. No content is a weak proof to me. ;-)\n\nMay be also check that the libvirt mock has been touched?","commit_id":"2b361b5320a27721953d995dbe92589c6a84421b"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"348b8af2ba2c3daa1b8a175449fd00b4b8e79dd9","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        response \u003d self.app.post("},{"line_number":82,"context_line":"            \u0027/redfish/v1/Systems/xxxx-yyyy-zzzz/Actions/ComputerSystem.Reset\u0027,"},{"line_number":83,"context_line":"            data\u003ddata, content_type\u003d\u0027application/json\u0027)"},{"line_number":84,"context_line":"        self.assertEqual(response.status, \u0027204 NO CONTENT\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_a1576358","line":84,"range":{"start_line":84,"start_character":0,"end_line":84,"end_character":59},"updated":"2018-05-11 12:40:34.000000000","message":"ditto","commit_id":"2b361b5320a27721953d995dbe92589c6a84421b"},{"author":{"_account_id":10155,"name":"Aleksandra Bezborodova","email":"bezborodovaam@gmail.com","username":"sasha_bezborodova"},"change_message_id":"fa8815c91047b44f3522b0a60dcd7319f04028ba","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        response \u003d self.app.post("},{"line_number":82,"context_line":"            \u0027/redfish/v1/Systems/xxxx-yyyy-zzzz/Actions/ComputerSystem.Reset\u0027,"},{"line_number":83,"context_line":"            data\u003ddata, content_type\u003d\u0027application/json\u0027)"},{"line_number":84,"context_line":"        self.assertEqual(response.status, \u0027204 NO CONTENT\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_d0b71dd8","line":84,"range":{"start_line":84,"start_character":0,"end_line":84,"end_character":59},"in_reply_to":"5f7c97a3_a1576358","updated":"2018-05-22 17:22:04.000000000","message":"Done","commit_id":"2b361b5320a27721953d995dbe92589c6a84421b"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"f964639fa7b407c50814fb9a2ea9acf314bfafbf","unresolved":false,"context_lines":[{"line_number":25,"context_line":"        self.app \u003d main.app.test_client()"},{"line_number":26,"context_line":"        super(EmulatorTestCase, self).setUp()"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def tearDown(self):"},{"line_number":29,"context_line":"        super(EmulatorTestCase, self).tearDown()"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    @mock.patch(\u0027flask.render_template\u0027, autospec\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_0e53fa18","line":28,"updated":"2018-05-25 09:20:59.000000000","message":"Do you need to override this method?","commit_id":"719b45abd76324d12a90c39965bb3955a941f109"},{"author":{"_account_id":10155,"name":"Aleksandra Bezborodova","email":"bezborodovaam@gmail.com","username":"sasha_bezborodova"},"change_message_id":"7af5f08bba8083280af5c751419756cbf444da18","unresolved":false,"context_lines":[{"line_number":25,"context_line":"        self.app \u003d main.app.test_client()"},{"line_number":26,"context_line":"        super(EmulatorTestCase, self).setUp()"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def tearDown(self):"},{"line_number":29,"context_line":"        super(EmulatorTestCase, self).tearDown()"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    @mock.patch(\u0027flask.render_template\u0027, autospec\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_7485210a","line":28,"in_reply_to":"5f7c97a3_0e53fa18","updated":"2018-06-27 20:43:32.000000000","message":"Done","commit_id":"719b45abd76324d12a90c39965bb3955a941f109"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"d61363f92131c275abb6bb12236f9ca7bad877a9","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    def test_collection_resource(self, render_mock):"},{"line_number":38,"context_line":"        with mock.patch(\u0027sushy_tools.emulator.drivers.libvirtdriver\u0027"},{"line_number":39,"context_line":"                        \u0027.LibvirtDriver.systems\u0027,"},{"line_number":40,"context_line":"                        new_callable\u003dmock.PropertyMock) as mock_systems:"},{"line_number":41,"context_line":"            mock_systems.return_value \u003d [\u0027host0\u0027, \u0027host1\u0027]"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"            self.app.get(\u0027/redfish/v1/Systems\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_1dd93bf3","line":40,"updated":"2018-06-06 09:31:37.000000000","message":"it\u0027s a bit confusing to have mocks both as decorators and as context managers, please move this one to a decorator. Also you can do it slightly simpler:\n\n @mock.patch.object(drivers.libvirtdriver.LibvirtDriver, \u0027systems\u0027, [\u0027host0\u0027, \u0027host1\u0027])\n\n(note that within the same package mock.patch.object is usally a bit shorter than mock.patch)","commit_id":"719b45abd76324d12a90c39965bb3955a941f109"},{"author":{"_account_id":10155,"name":"Aleksandra Bezborodova","email":"bezborodovaam@gmail.com","username":"sasha_bezborodova"},"change_message_id":"7af5f08bba8083280af5c751419756cbf444da18","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    def test_collection_resource(self, render_mock):"},{"line_number":38,"context_line":"        with mock.patch(\u0027sushy_tools.emulator.drivers.libvirtdriver\u0027"},{"line_number":39,"context_line":"                        \u0027.LibvirtDriver.systems\u0027,"},{"line_number":40,"context_line":"                        new_callable\u003dmock.PropertyMock) as mock_systems:"},{"line_number":41,"context_line":"            mock_systems.return_value \u003d [\u0027host0\u0027, \u0027host1\u0027]"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"            self.app.get(\u0027/redfish/v1/Systems\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_d496754a","line":40,"in_reply_to":"5f7c97a3_1dd93bf3","updated":"2018-06-27 20:43:32.000000000","message":"Done","commit_id":"719b45abd76324d12a90c39965bb3955a941f109"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"b321a7ce7a39220f361da05b911760f4153fcf68","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def test_root_resource(self):"},{"line_number":29,"context_line":"        response \u003d self.app.get(\u0027/redfish/v1/\u0027)"},{"line_number":30,"context_line":"        with open(\u0027sushy_tools/emulator/templates/root.json\u0027, \u0027r\u0027) as f:"},{"line_number":31,"context_line":"            data \u003d json.loads(f.read())"},{"line_number":32,"context_line":"        response_data \u003d json.loads(response.data.decode())"},{"line_number":33,"context_line":"        self.assertEqual(response.status_code, 200)"},{"line_number":34,"context_line":"        self.assertEqual(response_data, data)"},{"line_number":35,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_f04b3983","line":32,"range":{"start_line":30,"start_character":8,"end_line":32,"end_character":58},"updated":"2018-07-01 16:20:03.000000000","message":"should these changes be part of this patch or https://review.openstack.org/#/c/579133/ ?","commit_id":"2aa3cecafc33ed8206e6dfef82d3b23656eac4a4"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"7bd779b56976e52b533333851ba2137a9b80867e","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def test_root_resource(self):"},{"line_number":29,"context_line":"        response \u003d self.app.get(\u0027/redfish/v1/\u0027)"},{"line_number":30,"context_line":"        with open(\u0027sushy_tools/emulator/templates/root.json\u0027, \u0027r\u0027) as f:"},{"line_number":31,"context_line":"            data \u003d json.loads(f.read())"},{"line_number":32,"context_line":"        response_data \u003d json.loads(response.data.decode())"},{"line_number":33,"context_line":"        self.assertEqual(response.status_code, 200)"},{"line_number":34,"context_line":"        self.assertEqual(response_data, data)"},{"line_number":35,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_6033cec5","line":32,"range":{"start_line":30,"start_character":8,"end_line":32,"end_character":58},"in_reply_to":"5f7c97a3_45dca444","updated":"2018-07-02 09:16:07.000000000","message":"If you ask me, I\u0027m in favour of this sequence of work items:\n\n1. fix the broken tests by merging my patch\n2. either merge Aleksandra\u0027s tests in addition to the original tests (because they arguably test a little bit different things) or replacing the original ones as Dmitry proposed.\n\nDoing everything one-shot would confuse future code archaeologists and they will blame us in their papers. ;-)","commit_id":"2aa3cecafc33ed8206e6dfef82d3b23656eac4a4"},{"author":{"_account_id":10155,"name":"Aleksandra Bezborodova","email":"bezborodovaam@gmail.com","username":"sasha_bezborodova"},"change_message_id":"9acf2ae190d120dabdb9bc27b15284bca8d60070","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def test_root_resource(self):"},{"line_number":29,"context_line":"        response \u003d self.app.get(\u0027/redfish/v1/\u0027)"},{"line_number":30,"context_line":"        with open(\u0027sushy_tools/emulator/templates/root.json\u0027, \u0027r\u0027) as f:"},{"line_number":31,"context_line":"            data \u003d json.loads(f.read())"},{"line_number":32,"context_line":"        response_data \u003d json.loads(response.data.decode())"},{"line_number":33,"context_line":"        self.assertEqual(response.status_code, 200)"},{"line_number":34,"context_line":"        self.assertEqual(response_data, data)"},{"line_number":35,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_3e1e525f","line":32,"range":{"start_line":30,"start_character":8,"end_line":32,"end_character":58},"in_reply_to":"5f7c97a3_6033cec5","updated":"2018-07-02 14:40:25.000000000","message":"\u003e If you ask me, I\u0027m in favour of this sequence of work items:\n \u003e \n \u003e 1. fix the broken tests by merging my patch\n \u003e 2. either merge Aleksandra\u0027s tests in addition to the original\n \u003e tests (because they arguably test a little bit different things) or\n \u003e replacing the original ones as Dmitry proposed.\n \u003e \n \u003e Doing everything one-shot would confuse future code archaeologists\n \u003e and they will blame us in their papers. ;-)\n\nAFAIK, my old test is only one which we have, and affected by the problem with flask. So, this patch fix it one way or another. Probably we can remove tags related to mocks/Flask/whatever, because it\u0027s not the main idea of this patch.","commit_id":"2aa3cecafc33ed8206e6dfef82d3b23656eac4a4"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"697e8043a332a72a37a5a587a34ecd1e3bbd1071","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def test_root_resource(self):"},{"line_number":29,"context_line":"        response \u003d self.app.get(\u0027/redfish/v1/\u0027)"},{"line_number":30,"context_line":"        with open(\u0027sushy_tools/emulator/templates/root.json\u0027, \u0027r\u0027) as f:"},{"line_number":31,"context_line":"            data \u003d json.loads(f.read())"},{"line_number":32,"context_line":"        response_data \u003d json.loads(response.data.decode())"},{"line_number":33,"context_line":"        self.assertEqual(response.status_code, 200)"},{"line_number":34,"context_line":"        self.assertEqual(response_data, data)"},{"line_number":35,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_80bdca68","line":32,"range":{"start_line":30,"start_character":8,"end_line":32,"end_character":58},"in_reply_to":"5f7c97a3_6033cec5","updated":"2018-07-02 09:34:30.000000000","message":"If we are going the route to compare json response instead of asserting mock, then I have some comments for the proposed solution and I think it would be better to discuss this in dedicated patch instead of extending scope for this patch.","commit_id":"2aa3cecafc33ed8206e6dfef82d3b23656eac4a4"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"a6ef0cd863682b28268f3533f86ef0fec24b001d","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def test_root_resource(self):"},{"line_number":29,"context_line":"        response \u003d self.app.get(\u0027/redfish/v1/\u0027)"},{"line_number":30,"context_line":"        with open(\u0027sushy_tools/emulator/templates/root.json\u0027, \u0027r\u0027) as f:"},{"line_number":31,"context_line":"            data \u003d json.loads(f.read())"},{"line_number":32,"context_line":"        response_data \u003d json.loads(response.data.decode())"},{"line_number":33,"context_line":"        self.assertEqual(response.status_code, 200)"},{"line_number":34,"context_line":"        self.assertEqual(response_data, data)"},{"line_number":35,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_45dca444","line":32,"range":{"start_line":30,"start_character":8,"end_line":32,"end_character":58},"in_reply_to":"5f7c97a3_6bc73867","updated":"2018-07-02 08:38:26.000000000","message":"my understanding from Ilya\u0027s comment was that you rebase on top of #579133 and the solution to Flask issue is decided and implemented there.\n\n1 code review should not solve 2 stories.","commit_id":"2aa3cecafc33ed8206e6dfef82d3b23656eac4a4"},{"author":{"_account_id":10155,"name":"Aleksandra Bezborodova","email":"bezborodovaam@gmail.com","username":"sasha_bezborodova"},"change_message_id":"9acf2ae190d120dabdb9bc27b15284bca8d60070","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def test_root_resource(self):"},{"line_number":29,"context_line":"        response \u003d self.app.get(\u0027/redfish/v1/\u0027)"},{"line_number":30,"context_line":"        with open(\u0027sushy_tools/emulator/templates/root.json\u0027, \u0027r\u0027) as f:"},{"line_number":31,"context_line":"            data \u003d json.loads(f.read())"},{"line_number":32,"context_line":"        response_data \u003d json.loads(response.data.decode())"},{"line_number":33,"context_line":"        self.assertEqual(response.status_code, 200)"},{"line_number":34,"context_line":"        self.assertEqual(response_data, data)"},{"line_number":35,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_de415e38","line":32,"range":{"start_line":30,"start_character":8,"end_line":32,"end_character":58},"in_reply_to":"5f7c97a3_80bdca68","updated":"2018-07-02 14:40:25.000000000","message":"The Zuul is green on this patch now, so we can continue discussion on future patchsets of this patch.\nThis patch has a main idea to split API tests from Libvirt driver tests, and it\u0027s still about it \u003d)","commit_id":"2aa3cecafc33ed8206e6dfef82d3b23656eac4a4"},{"author":{"_account_id":10155,"name":"Aleksandra Bezborodova","email":"bezborodovaam@gmail.com","username":"sasha_bezborodova"},"change_message_id":"4a0f0734a444bab31e0683d204802fbf51bec489","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def test_root_resource(self):"},{"line_number":29,"context_line":"        response \u003d self.app.get(\u0027/redfish/v1/\u0027)"},{"line_number":30,"context_line":"        with open(\u0027sushy_tools/emulator/templates/root.json\u0027, \u0027r\u0027) as f:"},{"line_number":31,"context_line":"            data \u003d json.loads(f.read())"},{"line_number":32,"context_line":"        response_data \u003d json.loads(response.data.decode())"},{"line_number":33,"context_line":"        self.assertEqual(response.status_code, 200)"},{"line_number":34,"context_line":"        self.assertEqual(response_data, data)"},{"line_number":35,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_6bc73867","line":32,"range":{"start_line":30,"start_character":8,"end_line":32,"end_character":58},"in_reply_to":"5f7c97a3_f04b3983","updated":"2018-07-01 19:03:19.000000000","message":"I don\u0027t think so. I don\u0027t use mocks anymore, so the problem is solved. Almost, I delete the previous test implementation and Ilya\u0027s patch will be obsolete as soon as we merged this one.","commit_id":"2aa3cecafc33ed8206e6dfef82d3b23656eac4a4"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"7bd779b56976e52b533333851ba2137a9b80867e","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        with open("},{"line_number":42,"context_line":"            \u0027sushy_tools/emulator/templates/system_collection.json\u0027, \u0027r\u0027) as f:"},{"line_number":43,"context_line":"            data_string \u003d f.read()"},{"line_number":44,"context_line":"        data_list \u003d data_string.split(\u0027\\n\u0027)"},{"line_number":45,"context_line":"        for i in range(8):"},{"line_number":46,"context_line":"            data_list.pop(3)"},{"line_number":47,"context_line":"        data_string \u003d \u0027\u0027.join(data_list)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_e0903e52","line":44,"range":{"start_line":44,"start_character":8,"end_line":44,"end_character":43},"updated":"2018-07-02 09:16:07.000000000","message":"Why do you need to mess with serialized JSON by hand? May be you don\u0027t? ;-)\n\nIf you\u0027d leave a comment on this, I\u0027d not be so much confused.","commit_id":"2aa3cecafc33ed8206e6dfef82d3b23656eac4a4"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"3997d54aa2ca8a44118103d1d8934ba661c0a697","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        with open("},{"line_number":42,"context_line":"            \u0027sushy_tools/emulator/templates/system_collection.json\u0027, \u0027r\u0027) as f:"},{"line_number":43,"context_line":"            data_string \u003d f.read()"},{"line_number":44,"context_line":"        data_list \u003d data_string.split(\u0027\\n\u0027)"},{"line_number":45,"context_line":"        for i in range(8):"},{"line_number":46,"context_line":"            data_list.pop(3)"},{"line_number":47,"context_line":"        data_string \u003d \u0027\u0027.join(data_list)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_e327cc62","line":44,"range":{"start_line":44,"start_character":8,"end_line":44,"end_character":43},"in_reply_to":"5f7c97a3_03245f0d","updated":"2018-07-03 10:59:12.000000000","message":"May be we\u0027d better either:\n\n* add JSON sample documents into the test suite like we have in `sushy`\n* call `flask.render_template()` on those templates to turn them into proper JSON\n\nWDYT?","commit_id":"2aa3cecafc33ed8206e6dfef82d3b23656eac4a4"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"b5fc9a1e3112bf6ac80097f28f1a833e4e019c05","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        with open("},{"line_number":42,"context_line":"            \u0027sushy_tools/emulator/templates/system_collection.json\u0027, \u0027r\u0027) as f:"},{"line_number":43,"context_line":"            data_string \u003d f.read()"},{"line_number":44,"context_line":"        data_list \u003d data_string.split(\u0027\\n\u0027)"},{"line_number":45,"context_line":"        for i in range(8):"},{"line_number":46,"context_line":"            data_list.pop(3)"},{"line_number":47,"context_line":"        data_string \u003d \u0027\u0027.join(data_list)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_f803e074","line":44,"range":{"start_line":44,"start_character":8,"end_line":44,"end_character":43},"in_reply_to":"5f7c97a3_62a2bf41","updated":"2018-07-04 11:47:24.000000000","message":"\u003e If we compare the rendered output we bring into our test scope the templating engine as well. Is it beneficial or not?\n\nWell, we start testing our templates which are currently not covered at all.\n\n\u003e We may turn JSONs into Python dict trees and compare them, but that would probably include into comparison many extra details (like constants) which I am not sure are worth bringing into the scope of this test\n\nWe can only compare thing we care about.","commit_id":"2aa3cecafc33ed8206e6dfef82d3b23656eac4a4"},{"author":{"_account_id":10155,"name":"Aleksandra Bezborodova","email":"bezborodovaam@gmail.com","username":"sasha_bezborodova"},"change_message_id":"7e1f19ee617a6a99aae51137b668496e11b960ec","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        with open("},{"line_number":42,"context_line":"            \u0027sushy_tools/emulator/templates/system_collection.json\u0027, \u0027r\u0027) as f:"},{"line_number":43,"context_line":"            data_string \u003d f.read()"},{"line_number":44,"context_line":"        data_list \u003d data_string.split(\u0027\\n\u0027)"},{"line_number":45,"context_line":"        for i in range(8):"},{"line_number":46,"context_line":"            data_list.pop(3)"},{"line_number":47,"context_line":"        data_string \u003d \u0027\u0027.join(data_list)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_f95521fa","line":44,"range":{"start_line":44,"start_character":8,"end_line":44,"end_character":43},"in_reply_to":"5f7c97a3_735db346","updated":"2018-07-04 14:38:54.000000000","message":"I\u0027m not sure, but it looks like I lost the idea of the discussion in your comments, team. I think that I can update tests and we can go further with the review. Do you have any objections?","commit_id":"2aa3cecafc33ed8206e6dfef82d3b23656eac4a4"},{"author":{"_account_id":10155,"name":"Aleksandra Bezborodova","email":"bezborodovaam@gmail.com","username":"sasha_bezborodova"},"change_message_id":"9acf2ae190d120dabdb9bc27b15284bca8d60070","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        with open("},{"line_number":42,"context_line":"            \u0027sushy_tools/emulator/templates/system_collection.json\u0027, \u0027r\u0027) as f:"},{"line_number":43,"context_line":"            data_string \u003d f.read()"},{"line_number":44,"context_line":"        data_list \u003d data_string.split(\u0027\\n\u0027)"},{"line_number":45,"context_line":"        for i in range(8):"},{"line_number":46,"context_line":"            data_list.pop(3)"},{"line_number":47,"context_line":"        data_string \u003d \u0027\u0027.join(data_list)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_03245f0d","line":44,"range":{"start_line":44,"start_character":8,"end_line":44,"end_character":43},"in_reply_to":"5f7c97a3_e0903e52","updated":"2018-07-02 14:40:25.000000000","message":"system_collection.json is not really a json file, it\u0027s a jinja template. it has a loop inside which should collect systems, so json lib can\u0027t serialize it properly. that\u0027s why we need to do it manually. Yeah, it\u0027s a good idea to leave a comment about it, you\u0027re right.","commit_id":"2aa3cecafc33ed8206e6dfef82d3b23656eac4a4"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"a63d92d12aa1e98c6957b86ca096f80257c2a91e","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        with open("},{"line_number":42,"context_line":"            \u0027sushy_tools/emulator/templates/system_collection.json\u0027, \u0027r\u0027) as f:"},{"line_number":43,"context_line":"            data_string \u003d f.read()"},{"line_number":44,"context_line":"        data_list \u003d data_string.split(\u0027\\n\u0027)"},{"line_number":45,"context_line":"        for i in range(8):"},{"line_number":46,"context_line":"            data_list.pop(3)"},{"line_number":47,"context_line":"        data_string \u003d \u0027\u0027.join(data_list)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_62a2bf41","line":44,"range":{"start_line":44,"start_character":8,"end_line":44,"end_character":43},"in_reply_to":"5f7c97a3_e2101dae","updated":"2018-07-04 10:10:58.000000000","message":"\u003e I think that these jsons must be used for validation that our templates is correct and is rendered properly. \n\nLet\u0027s look at the scope of this test?\n\nInitially, with this test we ensured that the REST API call succeeds and results in some cornerstone libvirt call. Effectively, this way we tested mostly *our* layer isolating out Flask, templating engine etc.\n\nIf we compare the rendered output we bring into our test scope the templating engine as well. Is it beneficial or not?\n\nOther than that, I have two more thoughts to share:\n\n* We may not want to compare serialized representation  (e.g. JSON documents) literally because serialization gives some space to variations (e.g. ordering), that may fail the test needlessly.\n* We may turn JSONs into Python dict trees and compare them, but that would probably include into comparison many extra details (like constants) which I am not sure are worth bringing into the scope of this test","commit_id":"2aa3cecafc33ed8206e6dfef82d3b23656eac4a4"},{"author":{"_account_id":10155,"name":"Aleksandra Bezborodova","email":"bezborodovaam@gmail.com","username":"sasha_bezborodova"},"change_message_id":"a72ad733e9f8af2e7287dbbb37bf80115b01ced6","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        with open("},{"line_number":42,"context_line":"            \u0027sushy_tools/emulator/templates/system_collection.json\u0027, \u0027r\u0027) as f:"},{"line_number":43,"context_line":"            data_string \u003d f.read()"},{"line_number":44,"context_line":"        data_list \u003d data_string.split(\u0027\\n\u0027)"},{"line_number":45,"context_line":"        for i in range(8):"},{"line_number":46,"context_line":"            data_list.pop(3)"},{"line_number":47,"context_line":"        data_string \u003d \u0027\u0027.join(data_list)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_e2101dae","line":44,"range":{"start_line":44,"start_character":8,"end_line":44,"end_character":43},"in_reply_to":"5f7c97a3_e327cc62","updated":"2018-07-03 18:46:26.000000000","message":"It\u0027s a good idea to add preconfigured jsons, but I think that these jsons must be used for validation that our templates is correct and is rendered properly. So, my suggestion is:\n\n * add JSON samples which contains rendered JSONs.\n\n * call `flask.render_template()` on \"original\" templates and use test samples for validation only.\n\nIf we do it like this we\u0027ll stand out from \"programmaticaly\" constructed JSONs, and can check original JSONs.\n\nIs that a good idea?","commit_id":"2aa3cecafc33ed8206e6dfef82d3b23656eac4a4"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"64371b7f8cb9671bcfc8091ca4a2477ffb7ebdb7","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        with open("},{"line_number":42,"context_line":"            \u0027sushy_tools/emulator/templates/system_collection.json\u0027, \u0027r\u0027) as f:"},{"line_number":43,"context_line":"            data_string \u003d f.read()"},{"line_number":44,"context_line":"        data_list \u003d data_string.split(\u0027\\n\u0027)"},{"line_number":45,"context_line":"        for i in range(8):"},{"line_number":46,"context_line":"            data_list.pop(3)"},{"line_number":47,"context_line":"        data_string \u003d \u0027\u0027.join(data_list)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_735db346","line":44,"range":{"start_line":44,"start_character":8,"end_line":44,"end_character":43},"in_reply_to":"5f7c97a3_f803e074","updated":"2018-07-04 12:53:25.000000000","message":"it is beneficial to test response contents, there might be issues with templates, e.g., mistype template variable name. \n\nComparing plain strings has its drawbacks, e.g., whitespaces matter, when serialization order changes for unrelated reason, the tests are broken, so probably something in the middle, like comparing attributes that matter.","commit_id":"2aa3cecafc33ed8206e6dfef82d3b23656eac4a4"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"bb5a3287d2a3ea27df328825906b7a9569b136e7","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        with open("},{"line_number":42,"context_line":"            \u0027sushy_tools/emulator/templates/system_collection.json\u0027, \u0027r\u0027) as f:"},{"line_number":43,"context_line":"            data_string \u003d f.read()"},{"line_number":44,"context_line":"        data_list \u003d data_string.split(\u0027\\n\u0027)"},{"line_number":45,"context_line":"        for i in range(8):"},{"line_number":46,"context_line":"            data_list.pop(3)"},{"line_number":47,"context_line":"        data_string \u003d \u0027\u0027.join(data_list)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_e1c1cd82","line":44,"range":{"start_line":44,"start_character":8,"end_line":44,"end_character":43},"in_reply_to":"5f7c97a3_f95521fa","updated":"2018-07-18 11:00:57.000000000","message":"I think you should go-ahead now. The tests seem to be reworked and merged by now.\n\nAs a side note, I\u0027d not recommend you waiting for human response among the comments because humans tend to be overwhelmed and forgetful.\n\nInstead you\u0027d better bite the bullet and go on changing the code to make your point - that way programmers talk to each other.","commit_id":"2aa3cecafc33ed8206e6dfef82d3b23656eac4a4"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"7bd779b56976e52b533333851ba2137a9b80867e","unresolved":false,"context_lines":[{"line_number":42,"context_line":"            \u0027sushy_tools/emulator/templates/system_collection.json\u0027, \u0027r\u0027) as f:"},{"line_number":43,"context_line":"            data_string \u003d f.read()"},{"line_number":44,"context_line":"        data_list \u003d data_string.split(\u0027\\n\u0027)"},{"line_number":45,"context_line":"        for i in range(8):"},{"line_number":46,"context_line":"            data_list.pop(3)"},{"line_number":47,"context_line":"        data_string \u003d \u0027\u0027.join(data_list)"},{"line_number":48,"context_line":"        print(data_list)"},{"line_number":49,"context_line":"        data \u003d json.loads(data_string)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_a0c5665e","line":46,"range":{"start_line":45,"start_character":8,"end_line":46,"end_character":28},"updated":"2018-07-02 09:16:07.000000000","message":"This is interesting... Is there a more beautiful way to remove eight elements from a list? ;-)","commit_id":"2aa3cecafc33ed8206e6dfef82d3b23656eac4a4"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"3997d54aa2ca8a44118103d1d8934ba661c0a697","unresolved":false,"context_lines":[{"line_number":42,"context_line":"            \u0027sushy_tools/emulator/templates/system_collection.json\u0027, \u0027r\u0027) as f:"},{"line_number":43,"context_line":"            data_string \u003d f.read()"},{"line_number":44,"context_line":"        data_list \u003d data_string.split(\u0027\\n\u0027)"},{"line_number":45,"context_line":"        for i in range(8):"},{"line_number":46,"context_line":"            data_list.pop(3)"},{"line_number":47,"context_line":"        data_string \u003d \u0027\u0027.join(data_list)"},{"line_number":48,"context_line":"        print(data_list)"},{"line_number":49,"context_line":"        data \u003d json.loads(data_string)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_e3dcac46","line":46,"range":{"start_line":45,"start_character":8,"end_line":46,"end_character":28},"in_reply_to":"5f7c97a3_6382f3c9","updated":"2018-07-03 10:59:12.000000000","message":"If I understand what you are up to here, may be just array slicing would do the trick?\n\n    del data_list[3:11]","commit_id":"2aa3cecafc33ed8206e6dfef82d3b23656eac4a4"},{"author":{"_account_id":10155,"name":"Aleksandra Bezborodova","email":"bezborodovaam@gmail.com","username":"sasha_bezborodova"},"change_message_id":"9acf2ae190d120dabdb9bc27b15284bca8d60070","unresolved":false,"context_lines":[{"line_number":42,"context_line":"            \u0027sushy_tools/emulator/templates/system_collection.json\u0027, \u0027r\u0027) as f:"},{"line_number":43,"context_line":"            data_string \u003d f.read()"},{"line_number":44,"context_line":"        data_list \u003d data_string.split(\u0027\\n\u0027)"},{"line_number":45,"context_line":"        for i in range(8):"},{"line_number":46,"context_line":"            data_list.pop(3)"},{"line_number":47,"context_line":"        data_string \u003d \u0027\u0027.join(data_list)"},{"line_number":48,"context_line":"        print(data_list)"},{"line_number":49,"context_line":"        data \u003d json.loads(data_string)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_6382f3c9","line":46,"range":{"start_line":45,"start_character":8,"end_line":46,"end_character":28},"in_reply_to":"5f7c97a3_a0c5665e","updated":"2018-07-02 14:40:25.000000000","message":"I\u0027m open for suggestions. If you tell me what are you talking about I\u0027ll apply to the patch.","commit_id":"2aa3cecafc33ed8206e6dfef82d3b23656eac4a4"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"7bd779b56976e52b533333851ba2137a9b80867e","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        for i in range(8):"},{"line_number":46,"context_line":"            data_list.pop(3)"},{"line_number":47,"context_line":"        data_string \u003d \u0027\u0027.join(data_list)"},{"line_number":48,"context_line":"        print(data_list)"},{"line_number":49,"context_line":"        data \u003d json.loads(data_string)"},{"line_number":50,"context_line":"        data.update("},{"line_number":51,"context_line":"            {\u0027Members\u0027: ["}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_20d95655","line":48,"range":{"start_line":48,"start_character":8,"end_line":48,"end_character":13},"updated":"2018-07-02 09:16:07.000000000","message":"Probably some left-overs? I\u0027d strongly suggest you to code-review your patch yourself first!","commit_id":"2aa3cecafc33ed8206e6dfef82d3b23656eac4a4"},{"author":{"_account_id":10155,"name":"Aleksandra Bezborodova","email":"bezborodovaam@gmail.com","username":"sasha_bezborodova"},"change_message_id":"9acf2ae190d120dabdb9bc27b15284bca8d60070","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        for i in range(8):"},{"line_number":46,"context_line":"            data_list.pop(3)"},{"line_number":47,"context_line":"        data_string \u003d \u0027\u0027.join(data_list)"},{"line_number":48,"context_line":"        print(data_list)"},{"line_number":49,"context_line":"        data \u003d json.loads(data_string)"},{"line_number":50,"context_line":"        data.update("},{"line_number":51,"context_line":"            {\u0027Members\u0027: ["}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_5ea46e07","line":48,"range":{"start_line":48,"start_character":8,"end_line":48,"end_character":13},"in_reply_to":"5f7c97a3_20d95655","updated":"2018-07-02 14:40:25.000000000","message":"yeah, right \u003d) always forge to remove this things when tests become green.","commit_id":"2aa3cecafc33ed8206e6dfef82d3b23656eac4a4"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"b321a7ce7a39220f361da05b911760f4153fcf68","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    def test_collection_resource(self, mock_systems):"},{"line_number":39,"context_line":"        mock_systems.return_value \u003d [\u0027host0\u0027, \u0027host1\u0027]"},{"line_number":40,"context_line":"        response \u003d self.app.get(\u0027/redfish/v1/Systems\u0027)"},{"line_number":41,"context_line":"        with open("},{"line_number":42,"context_line":"            \u0027sushy_tools/emulator/templates/system_collection.json\u0027, \u0027r\u0027) as f:"},{"line_number":43,"context_line":"            data_string \u003d f.read()"},{"line_number":44,"context_line":"        data_list \u003d data_string.split(\u0027\\n\u0027)"},{"line_number":45,"context_line":"        for i in range(8):"},{"line_number":46,"context_line":"            data_list.pop(3)"},{"line_number":47,"context_line":"        data_string \u003d \u0027\u0027.join(data_list)"},{"line_number":48,"context_line":"        print(data_list)"},{"line_number":49,"context_line":"        data \u003d json.loads(data_string)"},{"line_number":50,"context_line":"        data.update("},{"line_number":51,"context_line":"            {\u0027Members\u0027: ["},{"line_number":52,"context_line":"                {\u0027@odata.id\u0027: \u0027/redfish/v1/Systems/host0\u0027},"},{"line_number":53,"context_line":"                {\u0027@odata.id\u0027: \u0027/redfish/v1/Systems/host1\u0027}"},{"line_number":54,"context_line":"            ]})"},{"line_number":55,"context_line":"        data.update({\u0027Members@odata.count\u0027: 2})"},{"line_number":56,"context_line":"        response_data \u003d json.loads(response.data.decode())"},{"line_number":57,"context_line":"        self.assertEqual(response.status_code, 200)"},{"line_number":58,"context_line":"        self.assertEqual(response_data, data)"},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_90420568","line":56,"range":{"start_line":41,"start_character":8,"end_line":56,"end_character":58},"updated":"2018-07-01 16:20:03.000000000","message":"ditto","commit_id":"2aa3cecafc33ed8206e6dfef82d3b23656eac4a4"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"b321a7ce7a39220f361da05b911760f4153fcf68","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        mock_instance.get_total_cpus.return_value \u003d 2"},{"line_number":69,"context_line":"        mock_instance.get_boot_device.return_value \u003d \u0027Cd\u0027"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        response \u003d self.app.get(\u0027/redfish/v1/Systems/xxxx-yyyy-zzzz\u0027)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"        expected_calls \u003d [mock.call.uuid(\u0027xxxx-yyyy-zzzz\u0027),"},{"line_number":74,"context_line":"                          mock.call.get_power_state(\u0027xxxx-yyyy-zzzz\u0027),"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_b045c171","line":71,"range":{"start_line":71,"start_character":8,"end_line":71,"end_character":69},"updated":"2018-07-01 16:20:03.000000000","message":"ditto","commit_id":"2aa3cecafc33ed8206e6dfef82d3b23656eac4a4"}]}
