@@ -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