From c6263789e0f366fa3a5521207bb990603a62fb7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=AE=E3=81=B6?= Date: Tue, 3 Mar 2026 10:02:26 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20member=5Ftest.tar.gz=E3=81=AE./=E3=83=97?= =?UTF-8?q?=E3=83=AC=E3=83=95=E3=82=A3=E3=83=83=E3=82=AF=E3=82=B9=E9=99=A4?= =?UTF-8?q?=E5=8E=BB=E3=83=BBPostgreSQL=20member=20UPSERT=E3=81=AE2.x?= =?UTF-8?q?=E3=82=AB=E3=83=A9=E3=83=A0=E3=83=9E=E3=83=83=E3=83=94=E3=83=B3?= =?UTF-8?q?=E3=82=B0=E8=BF=BD=E5=8A=A0=E3=83=BB=E3=83=86=E3=82=B9=E3=83=88?= =?UTF-8?q?=E6=94=B9=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - member_test.tar.gz: PharDataドライバーがRuntimeExceptionを投げる原因の `./`プレフィックスを除去(他フィクスチャと統一) - PostgreSQL UPSERT: 2.x系CSVカラム名マッピングを追加 (member_id→id, work→work_id, authority→authority_id, rank→sort_no) 既存の4.0系マッピングはDBカラム名が間違っていたためデッドコードだった - PostgreSQL UPSERT: convertDataTypesForPostgreSQL()呼び出し追加 - PostgreSQL UPSERT: creator_idデフォルト値(1)、del_flg==1時のemail処理追加 - PostgreSQL UPSERT: setIdSeq()呼び出し追加(シーケンスリセット) - テスト: メンバー件数の完全一致→以上比較に変更し、 移行固有データ(id=99, login_id=testadmin)の検証を追加 Co-Authored-By: Claude Opus 4.6 --- Controller/Admin/ConfigController.php | 29 +++++++++++++++++++---- Tests/Fixtures/member_test.tar.gz | Bin 800 -> 717 bytes Tests/Web/Admin/ConfigControllerTest.php | 9 ++++++- 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/Controller/Admin/ConfigController.php b/Controller/Admin/ConfigController.php index 33f2872..6f0e976 100644 --- a/Controller/Admin/ConfigController.php +++ b/Controller/Admin/ConfigController.php @@ -1085,13 +1085,30 @@ protected function upsertAuthorityAndMember($em, $dir) $insertValues[$col] = $data[$col] ?? 'member'; continue; } - // 4.0系のカラム名マッピング - if ($col === 'work' && !array_key_exists($col, $data) && array_key_exists('work_id', $data)) { - $insertValues[$col] = $data['work_id']; + // 2.x系カラムマッピング (member_id → id, work → work_id, authority → authority_id, rank → sort_no) + if ($col === 'id' && !array_key_exists('id', $data) && array_key_exists('member_id', $data)) { + $insertValues[$col] = $data['member_id']; continue; } - if ($col === 'authority' && !array_key_exists($col, $data) && array_key_exists('authority_id', $data)) { - $insertValues[$col] = $data['authority_id']; + if ($col === 'work_id' && !array_key_exists('work_id', $data) && array_key_exists('work', $data)) { + $insertValues[$col] = (isset($data['del_flg']) && $data['del_flg'] == 1) ? 0 : $data['work']; + continue; + } + if ($col === 'authority_id' && !array_key_exists('authority_id', $data) && array_key_exists('authority', $data)) { + $insertValues[$col] = $data['authority']; + continue; + } + if ($col === 'sort_no' && !array_key_exists('sort_no', $data) && array_key_exists('rank', $data)) { + $insertValues[$col] = $data['rank']; + continue; + } + // del_flg == 1 の場合 email をダミーに + if ($col === 'email' && isset($data['del_flg']) && $data['del_flg'] == 1) { + $insertValues[$col] = StringUtil::random(60) . '@dummy.dummy'; + continue; + } + if ($col === 'creator_id') { + $insertValues[$col] = !empty($data[$col]) ? $data[$col] : 1; continue; } if (array_key_exists($col, $data)) { @@ -1121,6 +1138,7 @@ protected function upsertAuthorityAndMember($em, $dir) if (array_key_exists('two_factor_auth_key', $insertValues) && $insertValues['two_factor_auth_key'] === null) { $insertValues['two_factor_auth_key'] = null; // NULL許可(この行は冗長だが明示的に残す) } + $insertValues = $this->dataMigrationService->convertDataTypesForPostgreSQL($em, 'dtb_member', $insertValues); $colsSql = implode(',', array_map(fn($c) => '"' . $c . '"', array_keys($insertValues))); $placeholders = implode(',', array_fill(0, count($insertValues), '?')); $updateSql = implode(', ', array_map(fn($c) => '"' . $c . '" = EXCLUDED."' . $c . '"', $updateCols)); @@ -1128,6 +1146,7 @@ protected function upsertAuthorityAndMember($em, $dir) $em->prepare($sql)->executeStatement(array_values($insertValues)); } fclose($handle); + $this->dataMigrationService->setIdSeq($em, 'dtb_member'); } // メンバーIDキャッシュ try { diff --git a/Tests/Fixtures/member_test.tar.gz b/Tests/Fixtures/member_test.tar.gz index b2bbbd397ba12ebcc1a6a474d21d7385ea3935c3..32748c6f52baaacacaecd287c437b1119c9d7fe9 100644 GIT binary patch literal 717 zcmV;;0y6y{iwFSNGNx$&1MQbhZ__Xs$FoTjBAnsu!;U6APST`7nnXdsCT)Vf2*D}x z60?RjFC^}^-q0$h2`-#AxPcH7LV_cRiSNLNh{m=rz!|rD=~l|h%Tff(FLB~Jw)Hgb z-_O5_?ebaMXZ|dU6(^aOG5`P!T}REkX%t#_!QLG})ip#4L?c8uG?gGAh6b91Ad6r+ zsU@7oB9w~fhdd0z*;?7Fgx~jDC^J?)VxGfa3S|}Uu`_h;lr$(w6VyRBrqOM*OS4Tn zEs842eNmd9U;f;brJ0$j-D-2hQ&G-zbQx&3pLIfCp;1(2N)(6lETDnIq=7-{>t|0j zhc0zli=1QQCS4q5)MfF7?Dm14`X_K$|0;k+B(!*(LHvjlu73@X&pn@w5Ys5CL^Fw| z6pEk~Gz%=bV50G{%cZF+qhq(ODvOkJ@#E+s*OAiXSjkGPXyTr8ZSs0i)-5zG294i2 zYS00V%YXYloK&*U{=M~Ys?eGL!7%dt-w$@y-u7G^P@iF!MKtC<3plQZb6(JV5YZ%A z2xAw=G^pStjJX|znAUhXj6Gh*;#oxutlD?0bJ&R)uXfkC<#(IBhJaOCQt5%I3Qln@^Uv9z4X`tB*IIt#3D8W6s1Xxnc+&R_ntAhTWR) z*UL01!%u^WIAFJ^!gQVoB2ENwv2}KB+j%`Q5!L+wH`dp-R@Ty`H)-Qj+IS?ccw_bb zmsfB1A`KS;7XL}4syN8+Mf$7juh_oW0rnR&lTDy!{%`w#LckFEH^C&i{`*4i|4%e+ z|DWAH&{O|y|G%Su6%1nL{=Xk|_r7b}D7vpefqwU*g1d?Brj& zkNq@SPE+CrLYOuTwSG=D&JgR3b0bewWFUf&o+22j5D~*jDJqOTGC?`y789Wq9oOf+ z=P#BEPSO9po~X98bj*DkUqx-5&kAE#E-0glGGpb{yYuP;wMkT_Toeh5^jM_m^V^f% zGP|%a*UUyOUW#<7qsmCT{BquRH7f{8R128DLOsjNQ)OgS`T59Olw#zN9J?pbS- z)Uqi{=F5yxkJ}FG_cMCxAHfd&rwM_Iy4LSNx-sPXCs1{{0|3q~| z`oDo7{ohcdCEE@#u6dxR{yY62jvS!$e}mu;{*M^Mgr@X==N>IK)wk)T|1|FOe<>XO z|C8%~{4_>B=h(orTncO&Sd6>W=5Mb`GlV0jHw-ZP5gb6pIc0U8JWS z|H%KlVg_gpXAF}-&-K6U{}FzC4-}e6v{bNxNN&i0x zI{ZI^NY~5^hEO+%eE)m?(PC45n_l`y2zRdkqD-#;gW%BkANBSLVRqNQ)XnZjt@^rc e$RU6U1iJWNVOFJrB@&6`Oz{hkLr!x5CIA5Ix}ehl diff --git a/Tests/Web/Admin/ConfigControllerTest.php b/Tests/Web/Admin/ConfigControllerTest.php index b8fe2f4..ffd7155 100644 --- a/Tests/Web/Admin/ConfigControllerTest.php +++ b/Tests/Web/Admin/ConfigControllerTest.php @@ -90,7 +90,14 @@ public function testバックアップファイルをアップロードできる if ($m > 0) { $members = $this->entityManager->getRepository(\Eccube\Entity\Member::class)->findAll(); - self::assertEquals($m, count($members), 'メンバーが正しくインポートされること'); + self::assertGreaterThanOrEqual($m, count($members), 'メンバーが正しくインポートされること'); + // 移行データ固有の値を検証 + $conn = $this->entityManager->getConnection(); + $testAdmin = $conn->fetchAssociative( + 'SELECT * FROM dtb_member WHERE id = ?', [99] + ); + self::assertNotFalse($testAdmin, 'メンバーid=99が存在すること'); + self::assertEquals('testadmin', $testAdmin['login_id']); } // ECCUBE_AUTH_MAGICの値を取得してアサート