3주차 과제 - 빈정원

필수 과제

unit test 통과한 화면

수정된 unit test code

diff --git a/openstackclient/tests/unit/compute/v2/test_server.py b/openstackclient/tests/unit/compute/v2/test_server.py
index 0898c67b..76361da0 100644
--- a/openstackclient/tests/unit/compute/v2/test_server.py
+++ b/openstackclient/tests/unit/compute/v2/test_server.py
@@ -32,6 +32,7 @@ from osc_lib import utils as common_utils
 from openstackclient.api import compute_v2
 from openstackclient.compute.v2 import server
 from openstackclient.tests.unit.compute.v2 import fakes as compute_fakes
+from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes
 from openstackclient.tests.unit.image.v2 import fakes as image_fakes
 from openstackclient.tests.unit.network.v2 import fakes as network_fakes
 from openstackclient.tests.unit import utils as test_utils
@@ -4576,6 +4577,8 @@ class _TestServerList(TestServer):
         'Networks',
         'Image',
         'Flavor',
+        'Project Name',
+        'User Name',
     )
     columns_long = (
         'ID',
@@ -4588,6 +4591,8 @@ class _TestServerList(TestServer):
         'Image ID',
         'Flavor Name',
         'Flavor ID',
+        'Project Name',
+        'User Name',
         'Availability Zone',
         'Pinned Availability Zone',
         'Host',
@@ -4601,6 +4606,8 @@ class _TestServerList(TestServer):
         'Networks',
         'Image',
         'Flavor',
+        'Project Name',
+        'User Name',
         'Project ID',
     )
 
@@ -4654,6 +4661,9 @@ class _TestServerList(TestServer):
         # Get the command object to test
         self.cmd = server.ListServer(self.app, None)
 
+        self.project = identity_fakes.FakeProject.create_one_project()
+        self.user = identity_fakes.FakeUser.create_one_user()
+
 
 class TestServerList(_TestServerList):
     def setUp(self):
@@ -4673,6 +4683,17 @@ class TestServerList(_TestServerList):
             for s in self.servers
         ]
 
+        Project = collections.namedtuple('Project', 'id name')
+        self.identity_client.projects.list.return_value = [
+            Project(id=s.project_id, name=self.project.name)
+            for s in self.servers
+        ]
+
+        User = collections.namedtuple('User', 'id name')
+        self.identity_client.users.list.return_value = [
+            User(id=s.user_id, name=self.user.name) for s in self.servers
+        ]
+
         self.data = tuple(
             (
                 s.id,
@@ -4682,6 +4703,8 @@ class TestServerList(_TestServerList):
                 # Image will be an empty string if boot-from-volume
                 self.image.name if s.image else server.IMAGE_STRING_FOR_BFV,
                 self.flavor.name,
+                self.project.name,
+                self.user.name,
             )
             for s in self.servers
         )
@@ -4737,6 +4760,8 @@ class TestServerList(_TestServerList):
                 s.image['id'] if s.image else server.IMAGE_STRING_FOR_BFV,
                 self.flavor.name,
                 s.flavor['id'],
+                self.project.name,
+                self.user.name,
                 getattr(s, 'availability_zone'),
                 getattr(s, 'pinned_availability_zone', ''),
                 server.HostColumn(getattr(s, 'hypervisor_hostname')),
@@ -4774,6 +4799,8 @@ class TestServerList(_TestServerList):
                 # Image will be an empty string if boot-from-volume
                 self.image.name if s.image else server.IMAGE_STRING_FOR_BFV,
                 self.flavor.name,
+                self.project.name,
+                self.user.name,
                 s.project_id,
             )
             for s in self.servers
@@ -4857,6 +4884,8 @@ class TestServerList(_TestServerList):
                 # Image will be an empty string if boot-from-volume
                 s.image['id'] if s.image else server.IMAGE_STRING_FOR_BFV,
                 s.flavor['id'],
+                self.project.name,
+                self.user.name,
             )
             for s in self.servers
         )
@@ -4888,6 +4917,8 @@ class TestServerList(_TestServerList):
                 # Image will be an empty string if boot-from-volume
                 s.image['id'] if s.image else server.IMAGE_STRING_FOR_BFV,
                 s.flavor['id'],
+                self.project.name,
+                self.user.name,
             )
             for s in self.servers
         )
@@ -5254,6 +5285,8 @@ class TestServerList(_TestServerList):
                 s.image['id'] if s.image else server.IMAGE_STRING_FOR_BFV,
                 self.flavor.name,
                 s.flavor['id'],
+                self.project.name,
+                self.user.name,
                 getattr(s, 'availability_zone'),
                 getattr(s, 'pinned_availability_zone', ''),
                 server.HostColumn(getattr(s, 'hypervisor_hostname')),
@@ -5310,6 +5343,8 @@ class TestServerList(_TestServerList):
                 s.image['id'] if s.image else server.IMAGE_STRING_FOR_BFV,
                 self.flavor.name,
                 s.flavor['id'],
+                self.project.name,
+                self.user.name,
                 getattr(s, 'availability_zone'),
                 getattr(s, 'pinned_availability_zone', ''),
                 server.HostColumn(getattr(s, 'hypervisor_hostname')),
@@ -5337,6 +5372,8 @@ class TestServerListV273(_TestServerList):
         'Networks',
         'Image',
         'Flavor',
+        'Project Name',
+        'User Name',
     )
     columns_long = (
         'ID',
@@ -5386,6 +5423,17 @@ class TestServerListV273(_TestServerList):
         # called
         self.compute_client.flavors = mock.NonCallableMock()

+        Project = collections.namedtuple('Project', 'id name')
+        self.identity_client.projects.list.return_value = [
+            Project(id=s.project_id, name=self.project.name)
+            for s in self.servers
+        ]
+
+        User = collections.namedtuple('User', 'id name')
+        self.identity_client.users.list.return_value = [
+            User(id=s.user_id, name=self.user.name) for s in self.servers
+        ]
+
         self.data = tuple(
             (
                 s.id,
@@ -5395,6 +5443,8 @@ class TestServerListV273(_TestServerList):
                 # Image will be an empty string if boot-from-volume
                 self.image.name if s.image else server.IMAGE_STRING_FOR_BFV,
                 self.flavor.name,
+                self.project.name,
+                self.user.name,
             )
             for s in self.servers
         )
@@ -5543,6 +5593,8 @@ class TestServerListV273(_TestServerList):
             server.AddressesColumn(None),
             '',
             '',
+            '',
+            '',
         )
         self.assertEqual(expected_row, partial_server)

설명

  1. _TestServerList


    Project Name, User Name 컬럼 추가

  2. identity_fakes 추가

  3. _TestServerList.setup()


    self.project, self.user 를 Fake Object로 추가

  4. TestServerList.setup()


    과제 2에서 추가한 identity_client.projects.list(), identity_client.users.list() 호출 시 Fake Object를 반환하도록 Stub 추가

    assertEqual에서 expected 값으로 쓰이는 self.data에 project_name, user_name 추가

  5. TestServerList.test_server_list_long_option()


    테스트 코드가 성공할 수 있도록 self.data(expected)에 self.project.name, self.user.name 추가

  6. tox 실행 후 실패하는 테스트 코드에 5번 과정 반복

  7. TestServerListV273 클래스에 대해서 4~6번 과정 진행