ktsn-ud commited on
Commit
240906a
·
1 Parent(s): a890516

テストを若干修正

Browse files
tests/repositories/test_projects_repository.py CHANGED
@@ -3,11 +3,16 @@ import sys
3
  import types
4
  import unittest
5
 
 
 
6
  ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", ".."))
7
  if ROOT not in sys.path:
8
  sys.path.insert(0, ROOT)
9
 
 
 
10
  if "psycopg" not in sys.modules:
 
11
  psycopg_stub = types.ModuleType("psycopg")
12
 
13
  class Connection: # noqa: D401 - ダミークラス
@@ -49,6 +54,7 @@ if "psycopg" not in sys.modules:
49
  sys.modules["psycopg_pool"] = pool_stub
50
 
51
  if "dotenv" not in sys.modules:
 
52
  dotenv_stub = types.ModuleType("dotenv")
53
 
54
  def load_dotenv(*args, **kwargs): # pragma: no cover
@@ -58,9 +64,6 @@ if "dotenv" not in sys.modules:
58
  sys.modules["dotenv"] = dotenv_stub
59
 
60
 
61
- from app.repositories.projects_repository import ProjectsRepository
62
-
63
-
64
  class ProjectsRepositoryTestCase(unittest.TestCase):
65
  def test_transform_row_maps_database_columns_to_api_keys(self):
66
  repo = ProjectsRepository()
@@ -93,22 +96,18 @@ class ProjectsRepositoryTestCase(unittest.TestCase):
93
 
94
  api_row = repo._transform_row(db_row)
95
 
96
- self.assertEqual(api_row["projectId"], "100")
97
- self.assertEqual(api_row["circleName"], "Circle A")
98
- self.assertEqual(api_row["category"], "展示")
99
- self.assertTrue(api_row["firstDay"])
100
- self.assertIsNone(api_row["optionalImageName1"])
101
 
102
  def test_transform_row_handles_missing_columns(self):
103
  repo = ProjectsRepository()
104
  db_row = {"project_id": "200"}
105
 
106
- api_row = repo._transform_row(db_row)
107
-
108
- self.assertEqual(api_row["projectId"], "200")
109
- # 欠けているカラムは None になる
110
- self.assertIsNone(api_row["circleName"])
111
- self.assertIsNone(api_row["description"])
112
 
113
 
114
  if __name__ == "__main__":
 
3
  import types
4
  import unittest
5
 
6
+ from pydantic import ValidationError
7
+
8
  ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", ".."))
9
  if ROOT not in sys.path:
10
  sys.path.insert(0, ROOT)
11
 
12
+ from app.repositories.projects_repository import ProjectsRepository
13
+
14
  if "psycopg" not in sys.modules:
15
+ print("Stubbing psycopg and psycopg_pool modules for testing")
16
  psycopg_stub = types.ModuleType("psycopg")
17
 
18
  class Connection: # noqa: D401 - ダミークラス
 
54
  sys.modules["psycopg_pool"] = pool_stub
55
 
56
  if "dotenv" not in sys.modules:
57
+ print("Stubbing dotenv module for testing")
58
  dotenv_stub = types.ModuleType("dotenv")
59
 
60
  def load_dotenv(*args, **kwargs): # pragma: no cover
 
64
  sys.modules["dotenv"] = dotenv_stub
65
 
66
 
 
 
 
67
  class ProjectsRepositoryTestCase(unittest.TestCase):
68
  def test_transform_row_maps_database_columns_to_api_keys(self):
69
  repo = ProjectsRepository()
 
96
 
97
  api_row = repo._transform_row(db_row)
98
 
99
+ self.assertEqual(api_row.projectId, "100")
100
+ self.assertEqual(api_row.circleName, "Circle A")
101
+ self.assertEqual(api_row.category, "展示")
102
+ self.assertTrue(api_row.firstDay)
103
+ self.assertIsNone(api_row.optionalImageName1)
104
 
105
  def test_transform_row_handles_missing_columns(self):
106
  repo = ProjectsRepository()
107
  db_row = {"project_id": "200"}
108
 
109
+ # 必須フィールドが欠けているため、ValidationError が発生するはず
110
+ self.assertRaises(ValidationError, lambda: repo._transform_row(db_row))
 
 
 
 
111
 
112
 
113
  if __name__ == "__main__":
tests/services/test_projects_service.py CHANGED
@@ -7,9 +7,13 @@ ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", ".."))
7
  if ROOT not in sys.path:
8
  sys.path.insert(0, ROOT)
9
 
 
 
10
 
11
  if "psycopg" not in sys.modules: # psycopg が未インストールでも読み込みできるようにする
 
12
  psycopg_stub = types.ModuleType("psycopg")
 
13
  class Connection: # noqa: D401 - ダミークラス
14
  """psycopg.Connection のスタブ"""
15
 
@@ -49,6 +53,7 @@ if "psycopg" not in sys.modules: # psycopg が未インストールでも読み
49
  sys.modules["psycopg_pool"] = pool_stub
50
 
51
  if "dotenv" not in sys.modules:
 
52
  dotenv_stub = types.ModuleType("dotenv")
53
 
54
  def load_dotenv(*args, **kwargs): # pragma: no cover - テストで副作用なし
@@ -58,33 +63,42 @@ if "dotenv" not in sys.modules:
58
  sys.modules["dotenv"] = dotenv_stub
59
 
60
 
61
- from app.services.projects_service import ProjectsService
62
-
63
-
64
  class FakeProjectsRepository:
65
- def __init__(self, projects=None):
66
- if projects is None:
67
- projects = [
68
- {
69
- "projectId": "100",
70
- "circleName": "Circle A",
71
- "name": "Project A",
72
- }
73
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
74
  self._projects = projects
75
  self.list_calls = 0
76
  self.get_calls = 0
77
 
78
  def list_projects(self):
79
  self.list_calls += 1
80
- return [dict(item) for item in self._projects]
81
-
82
- def get_project(self, project_id):
83
- self.get_calls += 1
84
- for item in self._projects:
85
- if item["projectId"] == project_id:
86
- return dict(item)
87
- return None
88
 
89
 
90
  class ProjectsServiceTestCase(unittest.TestCase):
@@ -106,28 +120,27 @@ class ProjectsServiceTestCase(unittest.TestCase):
106
  service = ProjectsService(repo, cache_ttl_seconds=60)
107
 
108
  cached = service.list_projects()
109
- cached[0]["name"] = "mutated"
110
  fresh = service.list_projects()
111
 
112
- self.assertNotEqual(cached[0]["name"], fresh[0]["name"])
113
 
114
  def test_get_project_returns_none_when_not_found(self):
115
- repo = FakeProjectsRepository(projects=[])
116
  service = ProjectsService(repo)
117
 
118
- self.assertIsNone(service.get_project("missing"))
119
- self.assertEqual(repo.get_calls, 1)
120
 
121
  def test_get_project_returns_copy(self):
122
  repo = FakeProjectsRepository()
123
  service = ProjectsService(repo)
124
 
125
- project = service.get_project("100")
126
  self.assertIsNotNone(project)
127
- project["name"] = "mutated"
128
 
129
- again = service.get_project("100")
130
- self.assertEqual(again["name"], "Project A")
131
 
132
 
133
  if __name__ == "__main__":
 
7
  if ROOT not in sys.path:
8
  sys.path.insert(0, ROOT)
9
 
10
+ from app.services.projects_service import ProjectsService
11
+ from schemas.projects import Project
12
 
13
  if "psycopg" not in sys.modules: # psycopg が未インストールでも読み込みできるようにする
14
+ print("psycopg not found, using stub")
15
  psycopg_stub = types.ModuleType("psycopg")
16
+
17
  class Connection: # noqa: D401 - ダミークラス
18
  """psycopg.Connection のスタブ"""
19
 
 
53
  sys.modules["psycopg_pool"] = pool_stub
54
 
55
  if "dotenv" not in sys.modules:
56
+ print("dotenv not found, using stub")
57
  dotenv_stub = types.ModuleType("dotenv")
58
 
59
  def load_dotenv(*args, **kwargs): # pragma: no cover - テストで副作用なし
 
63
  sys.modules["dotenv"] = dotenv_stub
64
 
65
 
 
 
 
66
  class FakeProjectsRepository:
67
+ def __init__(self):
68
+ p = {
69
+ "projectId": "100",
70
+ "circleName": "Circle A",
71
+ "circleNameKana": "サークルエー",
72
+ "name": "Project A",
73
+ "category": "展示",
74
+ "firstDay": True,
75
+ "secondDay": False,
76
+ "thirdDay": True,
77
+ "location": "Room 1",
78
+ "description": "Description",
79
+ "prComment": "PR",
80
+ "prCommentLong": "Long PR",
81
+ "note": None,
82
+ "imageName": "img.png",
83
+ "optionalImageName1": None,
84
+ "optionalImageName2": None,
85
+ "optionalImageName3": None,
86
+ "optionalImageName4": None,
87
+ "optionalImageName5": None,
88
+ "urlX": "https://x.com",
89
+ "urlInstagram": None,
90
+ "urlOfficialWebsite": None,
91
+ "urlYoutube": None,
92
+ "urlOthers": None,
93
+ }
94
+ projects = [Project(**p)]
95
  self._projects = projects
96
  self.list_calls = 0
97
  self.get_calls = 0
98
 
99
  def list_projects(self):
100
  self.list_calls += 1
101
+ return [item.model_copy() for item in self._projects]
 
 
 
 
 
 
 
102
 
103
 
104
  class ProjectsServiceTestCase(unittest.TestCase):
 
120
  service = ProjectsService(repo, cache_ttl_seconds=60)
121
 
122
  cached = service.list_projects()
123
+ cached[0].name = "modified"
124
  fresh = service.list_projects()
125
 
126
+ self.assertNotEqual(cached[0].name, fresh[0].name)
127
 
128
  def test_get_project_returns_none_when_not_found(self):
129
+ repo = FakeProjectsRepository()
130
  service = ProjectsService(repo)
131
 
132
+ self.assertIsNone(service.get_project(project_id="missing"))
 
133
 
134
  def test_get_project_returns_copy(self):
135
  repo = FakeProjectsRepository()
136
  service = ProjectsService(repo)
137
 
138
+ project = service.get_project(project_id="100")
139
  self.assertIsNotNone(project)
140
+ project.name = "modified"
141
 
142
+ again = service.get_project(project_id="100")
143
+ self.assertEqual(again.name, "Project A")
144
 
145
 
146
  if __name__ == "__main__":