{"numFailedTestSuites":1,"numFailedTests":1,"numPassedTestSuites":0,"numPassedTests":9,"numPendingTestSuites":0,"numPendingTests":0,"numRuntimeErrorTestSuites":0,"numTodoTests":0,"numTotalTestSuites":1,"numTotalTests":10,"openHandles":[],"snapshot":{"added":0,"didUpdate":false,"failure":false,"filesAdded":0,"filesRemoved":0,"filesRemovedList":[],"filesUnmatched":0,"filesUpdated":0,"matched":0,"total":0,"unchecked":0,"uncheckedKeysByFile":[],"unmatched":0,"updated":0},"startTime":1792647886037,"success":false,"testResults":[{"assertionResults":[{"ancestorTitles":["조직 이동 경합 (격리 MySQL 두 연결)"],"duration":515,"failureDetails":[],"failureMessages":[],"fullName":"조직 이동 경합 (격리 MySQL 두 연결) 조직 이동 경합: 다른 연결이 대상 조직 행을 잠그고 있으면 이동 (lock=true) 은 기다리고, 잠금이 풀린 뒤 한 번만 바꾼다","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"조직 이동 경합: 다른 연결이 대상 조직 행을 잠그고 있으면 이동 (lock=true) 은 기다리고, 잠금이 풀린 뒤 한 번만 바꾼다"},{"ancestorTitles":["조직 이동 경합 (격리 MySQL 두 연결)"],"duration":13,"failureDetails":[],"failureMessages":[],"fullName":"조직 이동 경합 (격리 MySQL 두 연결) 낡은 스냅샷 이동: 잠금 뒤 최신 경로로 하위 전체를 다시 쓴다 (X·W 를 Z 아래로)","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"낡은 스냅샷 이동: 잠금 뒤 최신 경로로 하위 전체를 다시 쓴다 (X·W 를 Z 아래로)"},{"ancestorTitles":["조직 이동 경합 (격리 MySQL 두 연결)"],"duration":3,"failureDetails":[],"failureMessages":[],"fullName":"조직 이동 경합 (격리 MySQL 두 연결) 낡은 스냅샷 순환: 잠금 뒤 최신 경로로 순환을 다시 판정해 거부하고 아무것도 쓰지 않는다","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"낡은 스냅샷 순환: 잠금 뒤 최신 경로로 순환을 다시 판정해 거부하고 아무것도 쓰지 않는다"},{"ancestorTitles":["조직 이동 경합 (격리 MySQL 두 연결)"],"duration":514,"failureDetails":[],"failureMessages":[],"fullName":"조직 이동 경합 (격리 MySQL 두 연결) 하위 추가 경합: 부모 행이 잠겨 있으면 하위 추가는 기다리고, 풀린 뒤 최신 경로로 들어간다","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"하위 추가 경합: 부모 행이 잠겨 있으면 하위 추가는 기다리고, 풀린 뒤 최신 경로로 들어간다"},{"ancestorTitles":["조직 이동 경합 (격리 MySQL 두 연결)"],"duration":531,"failureDetails":[],"failureMessages":[],"fullName":"조직 이동 경합 (격리 MySQL 두 연결) 소속 쓰기 후 삭제: 소속 쓰기가 쥔 회원 잠금 뒤 삭제는 기다리고, 커밋 뒤 새 회원을 떼어 낸다","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"status":"passed","title":"소속 쓰기 후 삭제: 소속 쓰기가 쥔 회원 잠금 뒤 삭제는 기다리고, 커밋 뒤 새 회원을 떼어 낸다"},{"ancestorTitles":["조직 이동 경합 (격리 MySQL 두 연결)"],"duration":520,"failureDetails":[],"failureMessages":[],"fullName":"조직 이동 경합 (격리 MySQL 두 연결) 삭제 후 소속 쓰기 (원시 SQL 헬퍼): 삭제가 회원 잠금을 쥔 동안 기다리고, 삭제 뒤 대상 조직이 없어 0 행이다","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"status":"passed","title":"삭제 후 소속 쓰기 (원시 SQL 헬퍼): 삭제가 회원 잠금을 쥔 동안 기다리고, 삭제 뒤 대상 조직이 없어 0 행이다"},{"ancestorTitles":["조직 이동 경합 (격리 MySQL 두 연결)"],"duration":109,"failureDetails":[],"failureMessages":[],"fullName":"조직 이동 경합 (격리 MySQL 두 연결) 구 순서 반사실: 기업 잠금 뒤 회원을 갱신하는 옛 순서는 소속 쓰기 (회원 → 기업) 와 교착한다 (1213, MySQL 일반 성질)","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"구 순서 반사실: 기업 잠금 뒤 회원을 갱신하는 옛 순서는 소속 쓰기 (회원 → 기업) 와 교착한다 (1213, MySQL 일반 성질)"},{"ancestorTitles":["조직 이동 경합 (격리 MySQL 두 연결)"],"duration":529,"failureDetails":[],"failureMessages":[],"fullName":"조직 이동 경합 (격리 MySQL 두 연결) 삭제 경로 회원 선행 잠금: 삭제는 기업 잠금 전에 부분트리 회원 (1002) 을 잠근다","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"status":"passed","title":"삭제 경로 회원 선행 잠금: 삭제는 기업 잠금 전에 부분트리 회원 (1002) 을 잠근다"},{"ancestorTitles":["조직 이동 경합 (격리 MySQL 두 연결)"],"duration":518,"failureDetails":[],"failureMessages":[],"fullName":"조직 이동 경합 (격리 MySQL 두 연결) 조직 라우트 쓰기 잠금: 영업 판정은 기업 잠금 뒤의 담당 영업으로 한다 (기다린 뒤 거부)","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"조직 라우트 쓰기 잠금: 영업 판정은 기업 잠금 뒤의 담당 영업으로 한다 (기다린 뒤 거부)"},{"ancestorTitles":["조직 이동 경합 (격리 MySQL 두 연결)"],"duration":522,"failureDetails":[{"matcherResult":{"message":"expect(received).toBeNull()\n\nReceived: [Error: Deadlock found when trying to get lock; try restarting transaction]","pass":false}}],"failureMessages":["Error: expect(received).toBeNull()\n\nReceived: [Error: Deadlock found when trying to get lock; try restarting transaction]\n    at Object.<anonymous> (/home/madsc/work/insuniverse-temp/.worktrees/admin-rbac/insuniverse-server/apps/api/src/modules/agency/organization/organization.race.itspec.ts:544:19)\n    at processTicksAndRejections (node:internal/process/task_queues:103:5)"],"fullName":"조직 이동 경합 (격리 MySQL 두 연결) 삭제 · 소속 쓰기 교착 없음: 소속 쓰기가 기업을 쥔 채 옮기는 동안 삭제가 기업을 기다려도 교착하지 않는다","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"failed","title":"삭제 · 소속 쓰기 교착 없음: 소속 쓰기가 기업을 쥔 채 옮기는 동안 삭제가 기업을 기다려도 교착하지 않는다"}],"endTime":1792647890451,"message":"  ● 조직 이동 경합 (격리 MySQL 두 연결) › 삭제 · 소속 쓰기 교착 없음: 소속 쓰기가 기업을 쥔 채 옮기는 동안 삭제가 기업을 기다려도 교착하지 않는다\n\n    expect(received).toBeNull()\n\n    Received: [Error: Deadlock found when trying to get lock; try restarting transaction]\n\n      542 |       await del.catch(() => undefined);\n      543 |     }\n    > 544 |     expect(moved).toBeNull();\n          |                   ^\n      545 |     //* 커밋 뒤 삭제는 소속 변화를 보고 한 번 더 한다 (두 번째에 1002 · 1003 을 떼어 낸다).\n      546 |     await expect(del).resolves.toMatchObject({ deleted: true });\n      547 |     expect(await orgExists(DEL)).toBe(0);\n\n      at Object.<anonymous> (apps/api/src/modules/agency/organization/organization.race.itspec.ts:544:19)\n","name":"/home/madsc/work/insuniverse-temp/.worktrees/admin-rbac/insuniverse-server/apps/api/src/modules/agency/organization/organization.race.itspec.ts","startTime":1792647886163,"status":"failed","summary":""}],"wasInterrupted":false}
