Skip to content

Commit 616e532

Browse files
committed
テスト追加
1 parent 13da375 commit 616e532

4 files changed

Lines changed: 131 additions & 1 deletion

File tree

Controller/Admin/ConfigController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1001,7 +1001,7 @@ private function buildMasterUpsertOptions(string $tableName, array $override): a
10011001
* - PostgreSQL: mtb_authority を汎用 UPSERT, その後 dtb_member をカスタム UPSERT (全件 work_id=0 強制)
10021002
* - MySQL: 既存 truncate+insert(saveToC) 後に work_id=0 へ更新
10031003
*/
1004-
private function upsertAuthorityAndMember($em, $dir)
1004+
protected function upsertAuthorityAndMember($em, $dir)
10051005
{
10061006
$platform = $this->dataMigrationService->begin($em);
10071007
$authorityCsv = $dir . 'mtb_authority.csv';
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
id,name,department,login_id,password,authority_id,work_id,creator_id,create_date,update_date,discriminator_type
2+
99,テスト管理者,開発部,testadmin,$2y$10$dummyhash000000000000000000000000000000000000000000,0,1,1,2024-01-01 00:00:00,2024-01-01 00:00:00,member
3+
100,テスト店舗オーナー,営業部,testowner,$2y$10$dummyhash000000000000000000000000000000000000000000,1,1,1,2024-01-01 00:00:00,2024-01-01 00:00:00,member
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
id,name,sort_no
2+
0,システム管理者,0
3+
1,店舗オーナー,1

Tests/Web/Admin/ConfigControllerTest.php

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,4 +100,128 @@ public function testバックアップファイルをアップロードできる
100100
throw $e;
101101
}
102102
}
103+
104+
public function testUpsertAuthorityAndMember()
105+
{
106+
$container = self::getContainer();
107+
$project_dir = $container->getParameter('kernel.project_dir');
108+
$fixtureDir = $project_dir . '/app/Plugin/DataMigration43/Tests/Fixtures/member_test/';
109+
110+
// Controllerのインスタンスを取得
111+
$controller = $container->get('Plugin\DataMigration43\Controller\Admin\ConfigController');
112+
113+
// ReflectionClassを使ってprotectedメソッドにアクセス
114+
$reflection = new \ReflectionClass($controller);
115+
$method = $reflection->getMethod('upsertAuthorityAndMember');
116+
$method->setAccessible(true);
117+
118+
// EntityManagerの接続を取得
119+
$em = $this->entityManager->getConnection();
120+
121+
try {
122+
// テスト実行前に既存のメンバーを削除(idが99, 100の場合)
123+
$em->executeStatement('DELETE FROM dtb_member WHERE id IN (99, 100)');
124+
$em->executeStatement('DELETE FROM mtb_authority WHERE id IN (0, 1)');
125+
126+
// メソッドを実行
127+
$method->invoke($controller, $em, $fixtureDir);
128+
129+
// 権限マスタが正しくインポートされたか確認
130+
$authorities = $em->fetchAllAssociative('SELECT * FROM mtb_authority ORDER BY id');
131+
self::assertCount(2, $authorities, '権限マスタが2件インポートされること');
132+
self::assertEquals(0, $authorities[0]['id']);
133+
self::assertEquals('システム管理者', $authorities[0]['name']);
134+
self::assertEquals(1, $authorities[1]['id']);
135+
self::assertEquals('店舗オーナー', $authorities[1]['name']);
136+
137+
// メンバーが正しくインポートされたか確認
138+
$members = $em->fetchAllAssociative('SELECT * FROM dtb_member WHERE id IN (99, 100) ORDER BY id');
139+
self::assertCount(2, $members, 'メンバーが2件インポートされること');
140+
self::assertEquals(99, $members[0]['id']);
141+
self::assertEquals('テスト管理者', $members[0]['name']);
142+
self::assertEquals('testadmin', $members[0]['login_id']);
143+
self::assertEquals(0, $members[0]['authority_id']);
144+
self::assertEquals(1, $members[0]['work_id'], 'work_idが1(稼働中)であること');
145+
146+
self::assertEquals(100, $members[1]['id']);
147+
self::assertEquals('テスト店舗オーナー', $members[1]['name']);
148+
self::assertEquals('testowner', $members[1]['login_id']);
149+
self::assertEquals(1, $members[1]['authority_id']);
150+
self::assertEquals(1, $members[1]['work_id'], 'work_idが1(稼働中)であること');
151+
152+
} catch (\Exception $e) {
153+
// エラーが発生した場合は、トランザクションをリセットしてから例外を再スローする
154+
if ($this->entityManager->getConnection()->isTransactionActive()) {
155+
$this->entityManager->getConnection()->rollBack();
156+
$this->entityManager->getConnection()->beginTransaction();
157+
}
158+
throw $e;
159+
}
160+
}
161+
162+
public function testUpsertAuthorityAndMemberでログイン可能()
163+
{
164+
$container = self::getContainer();
165+
$project_dir = $container->getParameter('kernel.project_dir');
166+
$fixtureDir = $project_dir . '/app/Plugin/DataMigration43/Tests/Fixtures/member_test/';
167+
168+
// Controllerのインスタンスを取得
169+
$controller = $container->get('Plugin\DataMigration43\Controller\Admin\ConfigController');
170+
171+
// ReflectionClassを使ってprotectedメソッドにアクセス
172+
$reflection = new \ReflectionClass($controller);
173+
$method = $reflection->getMethod('upsertAuthorityAndMember');
174+
$method->setAccessible(true);
175+
176+
// EntityManagerの接続を取得
177+
$em = $this->entityManager->getConnection();
178+
179+
try {
180+
// テスト実行前に既存のメンバーを削除(idが99, 100の場合)
181+
$em->executeStatement('DELETE FROM dtb_member WHERE id IN (99, 100)');
182+
183+
// 正しいパスワードハッシュでメンバーデータを更新
184+
$encoder = $container->get('security.user_password_encoder.generic');
185+
$memberRepository = $this->entityManager->getRepository(\Eccube\Entity\Member::class);
186+
187+
// 既存の管理者を取得してパスワードハッシュを参考にする
188+
$existingMember = $memberRepository->find(1);
189+
if ($existingMember) {
190+
// 実際にログイン可能なパスワードハッシュを生成
191+
$testPassword = 'testpassword123';
192+
193+
// フィクスチャファイルを一時的に更新(本番では別の方法が望ましい)
194+
$hashedPassword = password_hash($testPassword, PASSWORD_BCRYPT);
195+
196+
$csvContent = "id,name,department,login_id,password,authority_id,work_id,creator_id,create_date,update_date,discriminator_type\n";
197+
$csvContent .= "99,テスト管理者,開発部,testadmin,$hashedPassword,0,1,1,2024-01-01 00:00:00,2024-01-01 00:00:00,member\n";
198+
199+
file_put_contents($fixtureDir . 'dtb_member.csv', $csvContent);
200+
}
201+
202+
// メソッドを実行
203+
$method->invoke($controller, $em, $fixtureDir);
204+
205+
// ログアウト
206+
$this->logoutTo();
207+
208+
// インポートしたメンバーでログインを試みる
209+
$this->client->request('POST', $this->generateUrl('admin_login'), [
210+
'login_id' => 'testadmin',
211+
'password' => 'testpassword123',
212+
]);
213+
214+
// ログイン成功を確認(管理画面にリダイレクトされること)
215+
self::assertTrue($this->client->getResponse()->isRedirect($this->generateUrl('admin_homepage')),
216+
'インポートしたメンバーでログインできること');
217+
218+
} catch (\Exception $e) {
219+
// エラーが発生した場合は、トランザクションをリセットしてから例外を再スローする
220+
if ($this->entityManager->getConnection()->isTransactionActive()) {
221+
$this->entityManager->getConnection()->rollBack();
222+
$this->entityManager->getConnection()->beginTransaction();
223+
}
224+
throw $e;
225+
}
226+
}
103227
}

0 commit comments

Comments
 (0)