{"numFailedTestSuites":0,"numFailedTests":0,"numPassedTestSuites":19,"numPassedTests":165,"numPendingTestSuites":1,"numPendingTests":10,"numRuntimeErrorTestSuites":0,"numTodoTests":0,"numTotalTestSuites":20,"numTotalTests":175,"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":1792461964003,"success":true,"testResults":[{"assertionResults":[{"ancestorTitles":["최고관리자 seed — 실 MySQL"],"duration":null,"failureDetails":[],"failureMessages":[],"fullName":"최고관리자 seed — 실 MySQL mysql: 두 번 실행해도 칸·유일 인덱스·값 제약이 한 벌이고 지정은 대상 한 행이다","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"pending","title":"mysql: 두 번 실행해도 칸·유일 인덱스·값 제약이 한 벌이고 지정은 대상 한 행이다"},{"ancestorTitles":["최고관리자 seed — 실 MySQL"],"duration":null,"failureDetails":[],"failureMessages":[],"fullName":"최고관리자 seed — 실 MySQL mysql: 두 기동이 동시에 돌아도 둘 다 멈추지 않고 지정은 대상 한 행이다","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"pending","title":"mysql: 두 기동이 동시에 돌아도 둘 다 멈추지 않고 지정은 대상 한 행이다"},{"ancestorTitles":["최고관리자 seed — 실 MySQL"],"duration":null,"failureDetails":[],"failureMessages":[],"fullName":"최고관리자 seed — 실 MySQL mysql: 유일 인덱스가 두 번째 1 을 막고 NULL 은 여럿 허용한다","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"pending","title":"mysql: 유일 인덱스가 두 번째 1 을 막고 NULL 은 여럿 허용한다"},{"ancestorTitles":["최고관리자 seed — 실 MySQL"],"duration":null,"failureDetails":[],"failureMessages":[],"fullName":"최고관리자 seed — 실 MySQL mysql: 복합 유일 인덱스뿐이면 \"최대 1개\" 전제가 없어 지정하지 않는다","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"pending","title":"mysql: 복합 유일 인덱스뿐이면 \"최대 1개\" 전제가 없어 지정하지 않는다"},{"ancestorTitles":["최고관리자 seed — 실 MySQL"],"duration":null,"failureDetails":[],"failureMessages":[],"fullName":"최고관리자 seed — 실 MySQL mysql: 값 제약이 0 과 2 를 막는다","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"pending","title":"mysql: 값 제약이 0 과 2 를 막는다"},{"ancestorTitles":["최고관리자 seed — 실 MySQL"],"duration":null,"failureDetails":[],"failureMessages":[],"fullName":"최고관리자 seed — 실 MySQL mysql: 지워진 뒤 같은 로그인 아이디로 다시 만든 계정은 지정되지 않는다","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"pending","title":"mysql: 지워진 뒤 같은 로그인 아이디로 다시 만든 계정은 지정되지 않는다"},{"ancestorTitles":["최고관리자 seed — 실 MySQL"],"duration":null,"failureDetails":[],"failureMessages":[],"fullName":"최고관리자 seed — 실 MySQL mysql: 칸 추가 뒤에도 기존 관리자 생성 경로로 두 명을 만들 수 있다","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"pending","title":"mysql: 칸 추가 뒤에도 기존 관리자 생성 경로로 두 명을 만들 수 있다"},{"ancestorTitles":["최고관리자 seed — 실 MySQL"],"duration":null,"failureDetails":[],"failureMessages":[],"fullName":"최고관리자 seed — 실 MySQL mysql: 표를 쥔 트랜잭션이 있으면 DDL 은 잠금 대기 상한 안에 실패하고 seed 는 던지지 않는다","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"pending","title":"mysql: 표를 쥔 트랜잭션이 있으면 DDL 은 잠금 대기 상한 안에 실패하고 seed 는 던지지 않는다"},{"ancestorTitles":["최고관리자 seed — 실 MySQL"],"duration":null,"failureDetails":[],"failureMessages":[],"fullName":"최고관리자 seed — 실 MySQL mysql: 판정은 칸이 없으면 거짓이고 지정 뒤 그 번호만 참이다","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"pending","title":"mysql: 판정은 칸이 없으면 거짓이고 지정 뒤 그 번호만 참이다"},{"ancestorTitles":["최고관리자 seed — 실 MySQL"],"duration":null,"failureDetails":[],"failureMessages":[],"fullName":"최고관리자 seed — 실 MySQL mysql: 칸이 없는 표에서도 관리자 로그인 조회가 선다","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"pending","title":"mysql: 칸이 없는 표에서도 관리자 로그인 조회가 선다"}],"coverage":{},"endTime":1792461967388,"message":"","name":"/home/madsc/work/insuniverse-temp/.worktrees/admin-rbac/insuniverse-server/apps/api/src/seeds/super-admin.seed.mysql.spec.ts","startTime":1792461967388,"status":"skipped","summary":""},{"assertionResults":[{"ancestorTitles":["최고관리자 기동 seed — 지정"],"duration":7,"failureDetails":[],"failureMessages":[],"fullName":"최고관리자 기동 seed — 지정 seed: 대상 번호와 로그인 아이디가 함께 맞으면 표시 칸을 1 로 지정하고 그 행을 출력한다","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"status":"passed","title":"seed: 대상 번호와 로그인 아이디가 함께 맞으면 표시 칸을 1 로 지정하고 그 행을 출력한다"},{"ancestorTitles":["최고관리자 기동 seed — 지정"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"최고관리자 기동 seed — 지정 seed: 번호는 같고 로그인 아이디가 다르면 지정하지 않고 멈춘다","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"status":"passed","title":"seed: 번호는 같고 로그인 아이디가 다르면 지정하지 않고 멈춘다"},{"ancestorTitles":["최고관리자 기동 seed — 지정"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"최고관리자 기동 seed — 지정 seed: 대상 번호의 행이 없으면 만들지 않고 멈춘다","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"seed: 대상 번호의 행이 없으면 만들지 않고 멈춘다"},{"ancestorTitles":["최고관리자 기동 seed — 지정"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"최고관리자 기동 seed — 지정 seed: 다른 계정이 이미 최고관리자면 옮기지 않고 멈춘다","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"seed: 다른 계정이 이미 최고관리자면 옮기지 않고 멈춘다"},{"ancestorTitles":["최고관리자 기동 seed — 지정"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"최고관리자 기동 seed — 지정 seed: 대상이 이미 최고관리자면 쓰지 않고 그 행을 출력한다","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"seed: 대상이 이미 최고관리자면 쓰지 않고 그 행을 출력한다"},{"ancestorTitles":["최고관리자 기동 seed — DDL"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"최고관리자 기동 seed — DDL ddl: 칸이 없으면 잠금 대기 상한을 건 연결에서 칸·유일 인덱스·값 제약을 한 문장으로 더하고 상한을 되돌린다","invocations":1,"location":null,"numPassingAsserts":9,"retryReasons":[],"status":"passed","title":"ddl: 칸이 없으면 잠금 대기 상한을 건 연결에서 칸·유일 인덱스·값 제약을 한 문장으로 더하고 상한을 되돌린다"},{"ancestorTitles":["최고관리자 기동 seed — DDL"],"duration":3,"failureDetails":[],"failureMessages":[],"fullName":"최고관리자 기동 seed — DDL ddl: 잠금 상한 복원이 실패하면 그 연결을 파기한다","invocations":1,"location":null,"numPassingAsserts":7,"retryReasons":[],"status":"passed","title":"ddl: 잠금 상한 복원이 실패하면 그 연결을 파기한다"},{"ancestorTitles":["최고관리자 기동 seed — DDL"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"최고관리자 기동 seed — DDL ddl: 풀 경로와 트랜잭션 경로가 같은 세 문장을 쓴다","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"ddl: 풀 경로와 트랜잭션 경로가 같은 세 문장을 쓴다"},{"ancestorTitles":["최고관리자 기동 seed — DDL"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"최고관리자 기동 seed — DDL ddl: 칸과 유일 인덱스가 있으면 DDL 을 건너뛴다","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"ddl: 칸과 유일 인덱스가 있으면 DDL 을 건너뛴다"},{"ancestorTitles":["최고관리자 기동 seed — DDL"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"최고관리자 기동 seed — DDL ddl: 칸은 있는데 유일 인덱스가 없으면 지정하지 않고 멈춘다","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"ddl: 칸은 있는데 유일 인덱스가 없으면 지정하지 않고 멈춘다"},{"ancestorTitles":["최고관리자 기동 seed — DDL"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"최고관리자 기동 seed — DDL ddl: 칸 추가가 중복 칸 오류면 다시 읽어 칸과 유일 인덱스가 있으면 이어 간다","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"ddl: 칸 추가가 중복 칸 오류면 다시 읽어 칸과 유일 인덱스가 있으면 이어 간다"},{"ancestorTitles":["최고관리자 기동 seed — 실행기와 출력"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"최고관리자 기동 seed — 실행기와 출력 runner: seed 가 던져도 runSeeds 는 던지지 않고 실패를 오류 로그로 남긴다","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"status":"passed","title":"runner: seed 가 던져도 runSeeds 는 던지지 않고 실패를 오류 로그로 남긴다"},{"ancestorTitles":["최고관리자 기동 seed — 실행기와 출력"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"최고관리자 기동 seed — 실행기와 출력 log: 출력은 번호·로그인 아이디·생성일만 싣고 이름·연락처·비밀번호 칸을 읽지 않는다","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"status":"passed","title":"log: 출력은 번호·로그인 아이디·생성일만 싣고 이름·연락처·비밀번호 칸을 읽지 않는다"}],"endTime":1792461965137,"message":"","name":"/home/madsc/work/insuniverse-temp/.worktrees/admin-rbac/insuniverse-server/apps/api/src/seeds/super-admin.seed.spec.ts","startTime":1792461964505,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["최고관리자 판정 엔드포인트"],"duration":5,"failureDetails":[],"failureMessages":[],"fullName":"최고관리자 판정 엔드포인트 permission: 최고관리자에게 isSuper 참을 낸다","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"permission: 최고관리자에게 isSuper 참을 낸다"},{"ancestorTitles":["최고관리자 판정 엔드포인트"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"최고관리자 판정 엔드포인트 permission: 최고관리자가 아닌 내부 관리자에게 isSuper 거짓을 200 으로 낸다","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"permission: 최고관리자가 아닌 내부 관리자에게 isSuper 거짓을 200 으로 낸다"},{"ancestorTitles":["최고관리자 판정 엔드포인트"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"최고관리자 판정 엔드포인트 permission: 판정을 내지 못하면 던져 비-200 이 된다","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"status":"passed","title":"permission: 판정을 내지 못하면 던져 비-200 이 된다"},{"ancestorTitles":["최고관리자 판정 엔드포인트"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"최고관리자 판정 엔드포인트 permission: 컨트롤러에 인증·역할 가드만 있고 최고관리자 가드가 없다","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"status":"passed","title":"permission: 컨트롤러에 인증·역할 가드만 있고 최고관리자 가드가 없다"}],"endTime":1792461965232,"message":"","name":"/home/madsc/work/insuniverse-temp/.worktrees/admin-rbac/insuniverse-server/apps/api/src/modules/admin/super-admin-permission.controller.spec.ts","startTime":1792461964437,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["관리자 감시 가드"],"duration":4,"failureDetails":[],"failureMessages":[],"fullName":"관리자 감시 가드 관리자 쿠키가 있으면 판정 입력을 붙이고 통과시킨다","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"관리자 쿠키가 있으면 판정 입력을 붙이고 통과시킨다"},{"ancestorTitles":["관리자 감시 가드"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"관리자 감시 가드 HEAD 요청도 GET 행과 같은 코드로 판정한다","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"HEAD 요청도 GET 행과 같은 코드로 판정한다"},{"ancestorTitles":["관리자 감시 가드"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"관리자 감시 가드 경로 맵에 없는 라우트는 code 가 null 인 입력으로 넘긴다","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"경로 맵에 없는 라우트는 code 가 null 인 입력으로 넘긴다"},{"ancestorTitles":["관리자 감시 가드"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"관리자 감시 가드 영업 등 관리자 계열 다른 종류는 판정하지 않고 종류 칸으로만 남긴다","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"영업 등 관리자 계열 다른 종류는 판정하지 않고 종류 칸으로만 남긴다"},{"ancestorTitles":["관리자 감시 가드"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"관리자 감시 가드 위조된 관리자 쿠키는 invalid 칸으로 남고 판정하지 않는다","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"위조된 관리자 쿠키는 invalid 칸으로 남고 판정하지 않는다"},{"ancestorTitles":["관리자 감시 가드"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"관리자 감시 가드 관리자 쿠키가 없으면 아무것도 붙이지 않는다","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"관리자 쿠키가 없으면 아무것도 붙이지 않는다"},{"ancestorTitles":["관리자 감시 가드"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"관리자 감시 가드 열람 토큰 헤더만 있으면 검증 없이 view-token 칸으로 남긴다 (R1)","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"열람 토큰 헤더만 있으면 검증 없이 view-token 칸으로 남긴다 (R1)"},{"ancestorTitles":["관리자 감시 가드"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"관리자 감시 가드 판정 준비가 던져도 통과시키고 guard-error 칸으로 남긴다","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"판정 준비가 던져도 통과시키고 guard-error 칸으로 남긴다"},{"ancestorTitles":["관리자 감시 가드"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"관리자 감시 가드 요청 객체가 비정상이어도 던지지 않고 true 다","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"요청 객체가 비정상이어도 던지지 않고 true 다"},{"ancestorTitles":["판정하지 않는 신원 칸 (R2 타입)"],"duration":7,"failureDetails":[],"failureMessages":[],"fullName":"판정하지 않는 신원 칸 (R2 타입) 계수 칸 이름은 닫힌 집합이다 (오타 칸은 컴파일되지 않는다)","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"계수 칸 이름은 닫힌 집합이다 (오타 칸은 컴파일되지 않는다)"}],"endTime":1792461965243,"message":"","name":"/home/madsc/work/insuniverse-temp/.worktrees/admin-rbac/insuniverse-server/apps/api/src/modules/auth/access-control/access-control.guard.spec.ts","startTime":1792461965133,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["최고관리자 판정"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"최고관리자 판정 judge: strict 는 admin 역할이고 admin-view 토큰이 아니며 그 번호가 지정 행이면 참이다","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"judge: strict 는 admin 역할이고 admin-view 토큰이 아니며 그 번호가 지정 행이면 참이다"},{"ancestorTitles":["최고관리자 판정"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"최고관리자 판정 judge: strict 는 지정 행이 다른 번호면 거짓이다","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"judge: strict 는 지정 행이 다른 번호면 거짓이다"},{"ancestorTitles":["최고관리자 판정"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"최고관리자 판정 judge: corp·sales 역할과 admin-view 토큰은 번호가 같아도 최고관리자가 아니다","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"status":"passed","title":"judge: corp·sales 역할과 admin-view 토큰은 번호가 같아도 최고관리자가 아니다"},{"ancestorTitles":["최고관리자 판정"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"최고관리자 판정 judge: 역할이나 신원이 없으면 두 경로 모두 DB 를 묻지 않고 거짓이다","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"status":"passed","title":"judge: 역할이나 신원이 없으면 두 경로 모두 DB 를 묻지 않고 거짓이다"},{"ancestorTitles":["최고관리자 판정"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"최고관리자 판정 judge: 조회가 실패하면 가드 경로는 거짓이고 판정 경로는 던진다","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"judge: 조회가 실패하면 가드 경로는 거짓이고 판정 경로는 던진다"},{"ancestorTitles":["최고관리자 판정"],"duration":14,"failureDetails":[],"failureMessages":[],"fullName":"최고관리자 판정 judge: 표시 칸이 없으면 가드 경로는 거짓이고 판정 경로는 던진다","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"judge: 표시 칸이 없으면 가드 경로는 거짓이고 판정 경로는 던진다"},{"ancestorTitles":["최고관리자 판정"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"최고관리자 판정 designation: 표시 칸이 1 인 행을 요청마다 다시 읽는다","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"designation: 표시 칸이 1 인 행을 요청마다 다시 읽는다"},{"ancestorTitles":["최고관리자 판정"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"최고관리자 판정 designation: 표시 칸이 없으면(1054) 칸 없음이고 다른 조회 실패는 던진다","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"status":"passed","title":"designation: 표시 칸이 없으면(1054) 칸 없음이고 다른 조회 실패는 던진다"}],"endTime":1792461965382,"message":"","name":"/home/madsc/work/insuniverse-temp/.worktrees/admin-rbac/insuniverse-server/apps/api/src/modules/admin/super-admin.service.spec.ts","startTime":1792461965246,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["메뉴 조회 접근제어"],"duration":9,"failureDetails":[],"failureMessages":[],"fullName":"메뉴 조회 접근제어 menu: 전체 메뉴 트리 조회가 인증 가드를 단다","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"menu: 전체 메뉴 트리 조회가 인증 가드를 단다"},{"ancestorTitles":["메뉴 조회 접근제어"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"메뉴 조회 접근제어 MenuController · getAllList · 배선 · AdminJwtAuthGuard 다음 RolesGuard · @Roles admin","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"MenuController · getAllList · 배선 · AdminJwtAuthGuard 다음 RolesGuard · @Roles admin"},{"ancestorTitles":["메뉴 조회 접근제어"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"메뉴 조회 접근제어 menu: 컨트롤러에 클래스 레벨 가드가 없다","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"menu: 컨트롤러에 클래스 레벨 가드가 없다"}],"endTime":1792461965386,"message":"","name":"/home/madsc/work/insuniverse-temp/.worktrees/admin-rbac/insuniverse-server/apps/api/src/modules/menu/menu-access.spec.ts","startTime":1792461964454,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["권한 쓰기 서비스 PermissionAdminService"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"권한 쓰기 서비스 PermissionAdminService 미지 코드는 거부된다","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"미지 코드는 거부된다"},{"ancestorTitles":["권한 쓰기 서비스 PermissionAdminService"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"권한 쓰기 서비스 PermissionAdminService 비최고관리자는 최고관리자 전용 코드를 쓰면 거부된다","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"비최고관리자는 최고관리자 전용 코드를 쓰면 거부된다"},{"ancestorTitles":["권한 쓰기 서비스 PermissionAdminService"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"권한 쓰기 서비스 PermissionAdminService 비최고관리자는 최고관리자 전용 코드를 가진 역할을 회수하지 못한다 (잠금 아래 이전 집합으로 판정)","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"비최고관리자는 최고관리자 전용 코드를 가진 역할을 회수하지 못한다 (잠금 아래 이전 집합으로 판정)"},{"ancestorTitles":["권한 쓰기 서비스 PermissionAdminService"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"권한 쓰기 서비스 PermissionAdminService 최고관리자 판정 조회가 실패하면 쓰지 않는다","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"최고관리자 판정 조회가 실패하면 쓰지 않는다"},{"ancestorTitles":["권한 쓰기 서비스 PermissionAdminService"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"권한 쓰기 서비스 PermissionAdminService DI 가 두 의존성을 실제 클래스로 찾는다 (Nest 가 읽는 design:paramtypes)","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"DI 가 두 의존성을 실제 클래스로 찾는다 (Nest 가 읽는 design:paramtypes)"},{"ancestorTitles":["권한 쓰기 서비스 PermissionAdminService"],"duration":5,"failureDetails":[],"failureMessages":[],"fullName":"권한 쓰기 서비스 PermissionAdminService 버전 sentinel 행이 없으면 던진다 (잠금 단계에서 중단하고 쓰지 않는다)","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"버전 sentinel 행이 없으면 던진다 (잠금 단계에서 중단하고 쓰지 않는다)"},{"ancestorTitles":["권한 쓰기 서비스 PermissionAdminService"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"권한 쓰기 서비스 PermissionAdminService 쓰기 트랜잭션은 sentinel 잠금 → 역할 잠금 → 이전 집합 읽기 순서다 (잠금 전 읽기는 낡는다)","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"쓰기 트랜잭션은 sentinel 잠금 → 역할 잠금 → 이전 집합 읽기 순서다 (잠금 전 읽기는 낡는다)"},{"ancestorTitles":["권한 쓰기 서비스 PermissionAdminService"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"권한 쓰기 서비스 PermissionAdminService 잠금 아래에서 역할이 없으면 쓰지 않는다 (바깥 확인과 쓰기 사이의 삭제)","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"잠금 아래에서 역할이 없으면 쓰지 않는다 (바깥 확인과 쓰기 사이의 삭제)"},{"ancestorTitles":["권한 쓰기 서비스 PermissionAdminService"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"권한 쓰기 서비스 PermissionAdminService 감사 행의 aud_changes 는 추가·삭제된 코드 목록을 싣는다","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"감사 행의 aud_changes 는 추가·삭제된 코드 목록을 싣는다"},{"ancestorTitles":["권한 쓰기 서비스 PermissionAdminService"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"권한 쓰기 서비스 PermissionAdminService aud_changes 가 1KB 를 넘으면 개수와 고위험 변경만 남기고 절단을 표시한다","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"aud_changes 가 1KB 를 넘으면 개수와 고위험 변경만 남기고 절단을 표시한다"},{"ancestorTitles":["권한 쓰기 서비스 PermissionAdminService"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"권한 쓰기 서비스 PermissionAdminService 시드 스크립트의 감사 줄 버전은 감사 모듈과 같다","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"시드 스크립트의 감사 줄 버전은 감사 모듈과 같다"}],"endTime":1792461965393,"message":"","name":"/home/madsc/work/insuniverse-temp/.worktrees/admin-rbac/insuniverse-server/apps/api/src/modules/auth/permission/permission-admin.service.spec.ts","startTime":1792461965237,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["권한 쓰기 컨트롤러 배선"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"권한 쓰기 컨트롤러 배선 가드 순서는 인증 · 역할 · 최고관리자 판정이다","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"가드 순서는 인증 · 역할 · 최고관리자 판정이다"},{"ancestorTitles":["권한 쓰기 컨트롤러 배선"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"권한 쓰기 컨트롤러 배선 역할 메타데이터는 admin 이다","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"역할 메타데이터는 admin 이다"},{"ancestorTitles":["권한 쓰기 컨트롤러 입력"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"권한 쓰기 컨트롤러 입력 codes 가 없으면 400 이고 서비스를 부르지 않는다 (전 권한 삭제로 해석하지 않는다)","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"codes 가 없으면 400 이고 서비스를 부르지 않는다 (전 권한 삭제로 해석하지 않는다)"},{"ancestorTitles":["권한 쓰기 컨트롤러 입력"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"권한 쓰기 컨트롤러 입력 codes 가 문자열 배열이 아니면 400 이다","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"codes 가 문자열 배열이 아니면 400 이다"},{"ancestorTitles":["권한 쓰기 컨트롤러 입력"],"duration":16,"failureDetails":[],"failureMessages":[],"fullName":"권한 쓰기 컨트롤러 입력 카탈로그 크기를 넘는 배열이나 64자를 넘는 코드는 400 이고 서비스를 부르지 않는다","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"카탈로그 크기를 넘는 배열이나 64자를 넘는 코드는 400 이고 서비스를 부르지 않는다"},{"ancestorTitles":["권한 쓰기 컨트롤러 입력"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"권한 쓰기 컨트롤러 입력 명시적 빈 배열은 허용되고, 문자열 배열은 서비스로 넘어간다","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"명시적 빈 배열은 허용되고, 문자열 배열은 서비스로 넘어간다"}],"endTime":1792461965407,"message":"","name":"/home/madsc/work/insuniverse-temp/.worktrees/admin-rbac/insuniverse-server/apps/api/src/modules/auth/permission/permission-admin.controller.spec.ts","startTime":1792461965143,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["권한 집합 조회 어댑터"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"권한 집합 조회 어댑터 권한 집합 조회는 표지 코드 두 개를 거른다","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"권한 집합 조회는 표지 코드 두 개를 거른다"}],"endTime":1792461965448,"message":"","name":"/home/madsc/work/insuniverse-temp/.worktrees/admin-rbac/insuniverse-server/apps/api/src/modules/auth/permission/permission-adapter.spec.ts","startTime":1792461965396,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["운영 알림 설정 접근제어"],"duration":5,"failureDetails":[],"failureMessages":[],"fullName":"운영 알림 설정 접근제어 alert: 알림 설정 컨트롤러에 인증·역할·최고관리자 가드가 순서대로 걸려 있다","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"status":"passed","title":"alert: 알림 설정 컨트롤러에 인증·역할·최고관리자 가드가 순서대로 걸려 있다"},{"ancestorTitles":["운영 알림 설정 접근제어"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"운영 알림 설정 접근제어 alert: 핸들러에 isPublic 우회가 없다","invocations":1,"location":null,"numPassingAsserts":15,"retryReasons":[],"status":"passed","title":"alert: 핸들러에 isPublic 우회가 없다"}],"endTime":1792461965489,"message":"","name":"/home/madsc/work/insuniverse-temp/.worktrees/admin-rbac/insuniverse-server/apps/api/src/modules/alert/alert-access.spec.ts","startTime":1792461964437,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["최고관리자 지정 상태 알림 규칙"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"최고관리자 지정 상태 알림 규칙 rule: 지정 행이 있으면 경고가 없다","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"rule: 지정 행이 있으면 경고가 없다"},{"ancestorTitles":["최고관리자 지정 상태 알림 규칙"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"최고관리자 지정 상태 알림 규칙 rule: 표시 칸이 없거나 지정 행이 없으면 사유를 담은 주의 경고 하나를 낸다","invocations":1,"location":null,"numPassingAsserts":10,"retryReasons":[],"status":"passed","title":"rule: 표시 칸이 없거나 지정 행이 없으면 사유를 담은 주의 경고 하나를 낸다"},{"ancestorTitles":["최고관리자 지정 상태 알림 규칙"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"최고관리자 지정 상태 알림 규칙 rule: 지정 조회가 실패하면 던져 미평가로 남긴다","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"rule: 지정 조회가 실패하면 던져 미평가로 남긴다"}],"endTime":1792461965494,"message":"","name":"/home/madsc/work/insuniverse-temp/.worktrees/admin-rbac/insuniverse-server/apps/api/src/modules/alert/rules/super-admin.rule.spec.ts","startTime":1792461965390,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["최고관리자 가드"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"최고관리자 가드 guard: 판정이 참이면 통과하고 거짓이면 403 이다","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"guard: 판정이 참이면 통과하고 거짓이면 403 이다"}],"endTime":1792461965505,"message":"","name":"/home/madsc/work/insuniverse-temp/.worktrees/admin-rbac/insuniverse-server/apps/api/src/modules/auth/admin/super-admin.guard.spec.ts","startTime":1792461965386,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["영업비 정산 접근제어 (hardening M6a DD3·DD4)"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"영업비 정산 접근제어 (hardening M6a DD3·DD4) sales: 영업비 컨트롤러에 인증·역할·최고관리자 가드가 순서대로 걸려 있다","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"status":"passed","title":"sales: 영업비 컨트롤러에 인증·역할·최고관리자 가드가 순서대로 걸려 있다"},{"ancestorTitles":["영업비 정산 접근제어 (hardening M6a DD3·DD4)"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"영업비 정산 접근제어 (hardening M6a DD3·DD4) sales: 판정 전용 permission 핸들러가 없다","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"status":"passed","title":"sales: 판정 전용 permission 핸들러가 없다"}],"endTime":1792461965543,"message":"","name":"/home/madsc/work/insuniverse-temp/.worktrees/admin-rbac/insuniverse-server/apps/api/src/modules/sales-commission/sales-commission-access.spec.ts","startTime":1792461964452,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["관리자 개입 기록 접근제어 (hardening M6a DD2)"],"duration":3,"failureDetails":[],"failureMessages":[],"fullName":"관리자 개입 기록 접근제어 (hardening M6a DD2) audit: 감사 컨트롤러에 인증·역할·최고관리자 가드가 순서대로 걸려 있다","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"status":"passed","title":"audit: 감사 컨트롤러에 인증·역할·최고관리자 가드가 순서대로 걸려 있다"},{"ancestorTitles":["관리자 개입 기록 접근제어 (hardening M6a DD2)"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"관리자 개입 기록 접근제어 (hardening M6a DD2) audit: 클래스 한 자리 가드다 — 핸들러에 판정 가드를 따로 달지 않는다","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"status":"passed","title":"audit: 클래스 한 자리 가드다 — 핸들러에 판정 가드를 따로 달지 않는다"}],"endTime":1792461965811,"message":"","name":"/home/madsc/work/insuniverse-temp/.worktrees/admin-rbac/insuniverse-server/apps/api/src/modules/audit-log/audit-log-access.spec.ts","startTime":1792461964458,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["푸시 관리 · 상세 접근제어"],"duration":4,"failureDetails":[],"failureMessages":[],"fullName":"푸시 관리 · 상세 접근제어 push: 관리 컨트롤러에 관리자 인증 · 역할 가드와 admin 역할이 걸려 있다","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"push: 관리 컨트롤러에 관리자 인증 · 역할 가드와 admin 역할이 걸려 있다"},{"ancestorTitles":["푸시 관리 · 상세 접근제어"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"푸시 관리 · 상세 접근제어 push: 관리 핸들러 열 개에 isPublic 우회가 없고 상세 핸들러는 관리 컨트롤러 밖에 있다","invocations":1,"location":null,"numPassingAsserts":14,"retryReasons":[],"status":"passed","title":"push: 관리 핸들러 열 개에 isPublic 우회가 없고 상세 핸들러는 관리 컨트롤러 밖에 있다"},{"ancestorTitles":["푸시 관리 · 상세 접근제어"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"푸시 관리 · 상세 접근제어 push: 모듈이 관리 컨트롤러를 상세 컨트롤러보다 먼저 등록하고 AdminViewTokenModule 을 가져온다","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"push: 모듈이 관리 컨트롤러를 상세 컨트롤러보다 먼저 등록하고 AdminViewTokenModule 을 가져온다"},{"ancestorTitles":["푸시 관리 · 상세 접근제어","HTTP"],"duration":54,"failureDetails":[],"failureMessages":[],"fullName":"푸시 관리 · 상세 접근제어 HTTP push: 관리 경로 열 개가 무토큰 401 이고 서비스에 닿지 않는다","invocations":1,"location":null,"numPassingAsserts":11,"retryReasons":[],"status":"passed","title":"push: 관리 경로 열 개가 무토큰 401 이고 서비스에 닿지 않는다"},{"ancestorTitles":["푸시 관리 · 상세 접근제어","HTTP"],"duration":13,"failureDetails":[],"failureMessages":[],"fullName":"푸시 관리 · 상세 접근제어 HTTP push: fcm-users 는 회원 토큰 · sales 거부 · admin 200 이고 상세 핸들러로 새지 않는다","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"status":"passed","title":"push: fcm-users 는 회원 토큰 · sales 거부 · admin 200 이고 상세 핸들러로 새지 않는다"},{"ancestorTitles":["푸시 관리 · 상세 접근제어","HTTP"],"duration":33,"failureDetails":[],"failureMessages":[],"fullName":"푸시 관리 · 상세 접근제어 HTTP push: 상세는 회원 access · 내부 관리자만 200 이고 refresh · 자리 바꾼 관리자 토큰 · 뷰 토큰 · sales · corp · 무토큰은 401","invocations":1,"location":null,"numPassingAsserts":13,"retryReasons":[],"status":"passed","title":"push: 상세는 회원 access · 내부 관리자만 200 이고 refresh · 자리 바꾼 관리자 토큰 · 뷰 토큰 · sales · corp · 무토큰은 401"}],"endTime":1792461965823,"message":"","name":"/home/madsc/work/insuniverse-temp/.worktrees/admin-rbac/insuniverse-server/apps/api/src/modules/push/push-access.spec.ts","startTime":1792461964471,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["관리자 감시 인터셉터"],"duration":26,"failureDetails":[],"failureMessages":[],"fullName":"관리자 감시 인터셉터 판정 예외는 unknown 으로 접힌다","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"판정 예외는 unknown 으로 접힌다"},{"ancestorTitles":["관리자 감시 인터셉터"],"duration":352,"failureDetails":[],"failureMessages":[],"fullName":"관리자 감시 인터셉터 풀 포화 때 업무 요청이 시간 상한 안에 끝난다","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"풀 포화 때 업무 요청이 시간 상한 안에 끝난다"},{"ancestorTitles":["관리자 감시 인터셉터"],"duration":21,"failureDetails":[],"failureMessages":[],"fullName":"관리자 감시 인터셉터 정지한 DB 작업이 있어도 동시 실행은 상한을 넘지 않는다","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"정지한 DB 작업이 있어도 동시 실행은 상한을 넘지 않는다"},{"ancestorTitles":["관리자 감시 인터셉터"],"duration":356,"failureDetails":[],"failureMessages":[],"fullName":"관리자 감시 인터셉터 시간 상한이 지나면 멈춘 판정의 슬롯을 돌려준다 (풀 연결은 여전히 쥐어 있다)","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"시간 상한이 지나면 멈춘 판정의 슬롯을 돌려준다 (풀 연결은 여전히 쥐어 있다)"},{"ancestorTitles":["관리자 감시 인터셉터"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"관리자 감시 인터셉터 감시 풀은 연결 2 · 대기 없음 · 큐 0 이다 (DB 쪽 동시 상한은 이 값이다)","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"감시 풀은 연결 2 · 대기 없음 · 큐 0 이다 (DB 쪽 동시 상한은 이 값이다)"},{"ancestorTitles":["관리자 감시 인터셉터"],"duration":22,"failureDetails":[],"failureMessages":[],"fullName":"관리자 감시 인터셉터 최고관리자 판정 조회는 감시 연결로 간다","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"최고관리자 판정 조회는 감시 연결로 간다"},{"ancestorTitles":["관리자 감시 인터셉터"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"관리자 감시 인터셉터 판정 결과 unmapped 는 허용으로 세지 않는다","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"판정 결과 unmapped 는 허용으로 세지 않는다"},{"ancestorTitles":["관리자 감시 인터셉터"],"duration":6,"failureDetails":[],"failureMessages":[],"fullName":"관리자 감시 인터셉터 요청 처리 중 감시 코드가 던져도 업무 요청은 끊기지 않는다","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"요청 처리 중 감시 코드가 던져도 업무 요청은 끊기지 않는다"},{"ancestorTitles":["관리자 감시 인터셉터"],"duration":30,"failureDetails":[],"failureMessages":[],"fullName":"관리자 감시 인터셉터 기록 단계가 던져도 처리되지 않은 거부가 생기지 않는다","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"기록 단계가 던져도 처리되지 않은 거부가 생기지 않는다"},{"ancestorTitles":["관리자 감시 인터셉터"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"관리자 감시 인터셉터 감시 연결마다 질의 시간 상한을 건다 (정지한 질의를 서버가 끊는다)","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"감시 연결마다 질의 시간 상한을 건다 (정지한 질의를 서버가 끊는다)"},{"ancestorTitles":["관리자 감시 인터셉터"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"관리자 감시 인터셉터 SET 이 실패한 감시 연결은 버리고 경고를 남긴다 (R2)","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"SET 이 실패한 감시 연결은 버리고 경고를 남긴다 (R2)"},{"ancestorTitles":["관리자 감시 인터셉터"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"관리자 감시 인터셉터 미배정 관리자 요청은 판정하지 않고 집계한다","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"미배정 관리자 요청은 판정하지 않고 집계한다"},{"ancestorTitles":["관리자 감시 인터셉터"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"관리자 감시 인터셉터 판정 입력이 없으면 아무것도 세지 않는다","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"판정 입력이 없으면 아무것도 세지 않는다"}],"endTime":1792461965973,"message":"","name":"/home/madsc/work/insuniverse-temp/.worktrees/admin-rbac/insuniverse-server/apps/api/src/modules/auth/access-control/access-control.spec.ts","startTime":1792461964472,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["삼성화재 계정 인테이크 접근제어"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"삼성화재 계정 인테이크 접근제어 access: 컨트롤러에 인증 가드와 최고관리자 가드가 둘 다 걸려 있다","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"access: 컨트롤러에 인증 가드와 최고관리자 가드가 둘 다 걸려 있다"},{"ancestorTitles":["삼성화재 계정 인테이크 접근제어"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"삼성화재 계정 인테이크 접근제어 access: 판정 전용 session 핸들러가 없다","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"access: 판정 전용 session 핸들러가 없다"},{"ancestorTitles":["삼성화재 계정 인테이크 접근제어"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"삼성화재 계정 인테이크 접근제어 access: 핸들러에 isPublic 우회가 없다","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"status":"passed","title":"access: 핸들러에 isPublic 우회가 없다"},{"ancestorTitles":["삼성화재 계정 인테이크 업로드 크기 상한"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"삼성화재 계정 인테이크 업로드 크기 상한 upload: 파일을 받는 핸들러는 전부 상한 걸린 인터셉터 하나를 쓴다","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"status":"passed","title":"upload: 파일을 받는 핸들러는 전부 상한 걸린 인터셉터 하나를 쓴다"},{"ancestorTitles":["삼성화재 계정 인테이크 업로드 크기 상한"],"duration":66,"failureDetails":[],"failureMessages":[],"fullName":"삼성화재 계정 인테이크 업로드 크기 상한 upload: 상한을 넘는 파일은 핸들러에 닿기 전에 413 으로 막힌다","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"upload: 상한을 넘는 파일은 핸들러에 닿기 전에 413 으로 막힌다"}],"endTime":1792461966125,"message":"","name":"/home/madsc/work/insuniverse-temp/.worktrees/admin-rbac/insuniverse-server/apps/api/src/modules/fc/agency/samsung-intake-access.spec.ts","startTime":1792461964432,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["원본 진료 다운로드 접근제어"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"원본 진료 다운로드 접근제어 medical: 컨트롤러에 회원 인증 · 분석 소유자 가드가 이 순서로 걸려 있고 isPublic 우회가 없다","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"medical: 컨트롤러에 회원 인증 · 분석 소유자 가드가 이 순서로 걸려 있고 isPublic 우회가 없다"},{"ancestorTitles":["원본 진료 다운로드 접근제어"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"원본 진료 다운로드 접근제어 medical: 모듈이 OrderDetailModule 을 가져온다","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"medical: 모듈이 OrderDetailModule 을 가져온다"},{"ancestorTitles":["원본 진료 다운로드 접근제어","HTTP"],"duration":18,"failureDetails":[],"failureMessages":[],"fullName":"원본 진료 다운로드 접근제어 HTTP medical: 무토큰 401 · 타인 회원 403 · 소유자 200 이고 거부된 요청은 엑셀을 만들지 않는다","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"status":"passed","title":"medical: 무토큰 401 · 타인 회원 403 · 소유자 200 이고 거부된 요청은 엑셀을 만들지 않는다"}],"endTime":1792461966138,"message":"","name":"/home/madsc/work/insuniverse-temp/.worktrees/admin-rbac/insuniverse-server/apps/api/src/modules/medical/medical-access.spec.ts","startTime":1792461964430,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["관리자 컨트롤러 역할 경계"],"duration":4,"failureDetails":[],"failureMessages":[],"fullName":"관리자 컨트롤러 역할 경계 FaxAdminController · admin → 통과","invocations":1,"location":null,"numPassingAsserts":13,"retryReasons":[],"status":"passed","title":"FaxAdminController · admin → 통과"},{"ancestorTitles":["관리자 컨트롤러 역할 경계"],"duration":3,"failureDetails":[],"failureMessages":[],"fullName":"관리자 컨트롤러 역할 경계 FaxAdminController · sales → 403","invocations":1,"location":null,"numPassingAsserts":13,"retryReasons":[],"status":"passed","title":"FaxAdminController · sales → 403"},{"ancestorTitles":["관리자 컨트롤러 역할 경계"],"duration":3,"failureDetails":[],"failureMessages":[],"fullName":"관리자 컨트롤러 역할 경계 FaxAdminController · corp → 403","invocations":1,"location":null,"numPassingAsserts":13,"retryReasons":[],"status":"passed","title":"FaxAdminController · corp → 403"},{"ancestorTitles":["관리자 컨트롤러 역할 경계"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"관리자 컨트롤러 역할 경계 FaxAdminController · none → 403","invocations":1,"location":null,"numPassingAsserts":13,"retryReasons":[],"status":"passed","title":"FaxAdminController · none → 403"},{"ancestorTitles":["관리자 컨트롤러 역할 경계"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"관리자 컨트롤러 역할 경계 TreatTestController · admin → 통과","invocations":1,"location":null,"numPassingAsserts":16,"retryReasons":[],"status":"passed","title":"TreatTestController · admin → 통과"},{"ancestorTitles":["관리자 컨트롤러 역할 경계"],"duration":4,"failureDetails":[],"failureMessages":[],"fullName":"관리자 컨트롤러 역할 경계 TreatTestController · sales → 403","invocations":1,"location":null,"numPassingAsserts":16,"retryReasons":[],"status":"passed","title":"TreatTestController · sales → 403"},{"ancestorTitles":["관리자 컨트롤러 역할 경계"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"관리자 컨트롤러 역할 경계 TreatTestController · corp → 403","invocations":1,"location":null,"numPassingAsserts":16,"retryReasons":[],"status":"passed","title":"TreatTestController · corp → 403"},{"ancestorTitles":["관리자 컨트롤러 역할 경계"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"관리자 컨트롤러 역할 경계 TreatTestController · none → 403","invocations":1,"location":null,"numPassingAsserts":16,"retryReasons":[],"status":"passed","title":"TreatTestController · none → 403"},{"ancestorTitles":["관리자 컨트롤러 역할 경계"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"관리자 컨트롤러 역할 경계 ClinicalResultController · admin → 통과","invocations":1,"location":null,"numPassingAsserts":13,"retryReasons":[],"status":"passed","title":"ClinicalResultController · admin → 통과"},{"ancestorTitles":["관리자 컨트롤러 역할 경계"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"관리자 컨트롤러 역할 경계 ClinicalResultController · sales → 403","invocations":1,"location":null,"numPassingAsserts":13,"retryReasons":[],"status":"passed","title":"ClinicalResultController · sales → 403"},{"ancestorTitles":["관리자 컨트롤러 역할 경계"],"duration":4,"failureDetails":[],"failureMessages":[],"fullName":"관리자 컨트롤러 역할 경계 ClinicalResultController · corp → 403","invocations":1,"location":null,"numPassingAsserts":13,"retryReasons":[],"status":"passed","title":"ClinicalResultController · corp → 403"},{"ancestorTitles":["관리자 컨트롤러 역할 경계"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"관리자 컨트롤러 역할 경계 ClinicalResultController · none → 403","invocations":1,"location":null,"numPassingAsserts":13,"retryReasons":[],"status":"passed","title":"ClinicalResultController · none → 403"},{"ancestorTitles":["관리자 컨트롤러 역할 경계"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"관리자 컨트롤러 역할 경계 AdminCoursesController · admin → 통과","invocations":1,"location":null,"numPassingAsserts":8,"retryReasons":[],"status":"passed","title":"AdminCoursesController · admin → 통과"},{"ancestorTitles":["관리자 컨트롤러 역할 경계"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"관리자 컨트롤러 역할 경계 AdminCoursesController · sales → 403","invocations":1,"location":null,"numPassingAsserts":8,"retryReasons":[],"status":"passed","title":"AdminCoursesController · sales → 403"},{"ancestorTitles":["관리자 컨트롤러 역할 경계"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"관리자 컨트롤러 역할 경계 AdminCoursesController · corp → 403","invocations":1,"location":null,"numPassingAsserts":8,"retryReasons":[],"status":"passed","title":"AdminCoursesController · corp → 403"},{"ancestorTitles":["관리자 컨트롤러 역할 경계"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"관리자 컨트롤러 역할 경계 AdminCoursesController · none → 403","invocations":1,"location":null,"numPassingAsserts":8,"retryReasons":[],"status":"passed","title":"AdminCoursesController · none → 403"},{"ancestorTitles":["관리자 컨트롤러 역할 경계"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"관리자 컨트롤러 역할 경계 AdminCoursesReviewsController · admin → 통과","invocations":1,"location":null,"numPassingAsserts":7,"retryReasons":[],"status":"passed","title":"AdminCoursesReviewsController · admin → 통과"},{"ancestorTitles":["관리자 컨트롤러 역할 경계"],"duration":3,"failureDetails":[],"failureMessages":[],"fullName":"관리자 컨트롤러 역할 경계 AdminCoursesReviewsController · sales → 403","invocations":1,"location":null,"numPassingAsserts":7,"retryReasons":[],"status":"passed","title":"AdminCoursesReviewsController · sales → 403"},{"ancestorTitles":["관리자 컨트롤러 역할 경계"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"관리자 컨트롤러 역할 경계 AdminCoursesReviewsController · corp → 403","invocations":1,"location":null,"numPassingAsserts":7,"retryReasons":[],"status":"passed","title":"AdminCoursesReviewsController · corp → 403"},{"ancestorTitles":["관리자 컨트롤러 역할 경계"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"관리자 컨트롤러 역할 경계 AdminCoursesReviewsController · none → 403","invocations":1,"location":null,"numPassingAsserts":7,"retryReasons":[],"status":"passed","title":"AdminCoursesReviewsController · none → 403"},{"ancestorTitles":["관리자 컨트롤러 역할 경계"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"관리자 컨트롤러 역할 경계 TreatMonitorController · admin → 통과","invocations":1,"location":null,"numPassingAsserts":9,"retryReasons":[],"status":"passed","title":"TreatMonitorController · admin → 통과"},{"ancestorTitles":["관리자 컨트롤러 역할 경계"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"관리자 컨트롤러 역할 경계 TreatMonitorController · sales → 403","invocations":1,"location":null,"numPassingAsserts":9,"retryReasons":[],"status":"passed","title":"TreatMonitorController · sales → 403"},{"ancestorTitles":["관리자 컨트롤러 역할 경계"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"관리자 컨트롤러 역할 경계 TreatMonitorController · corp → 403","invocations":1,"location":null,"numPassingAsserts":9,"retryReasons":[],"status":"passed","title":"TreatMonitorController · corp → 403"},{"ancestorTitles":["관리자 컨트롤러 역할 경계"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"관리자 컨트롤러 역할 경계 TreatMonitorController · none → 403","invocations":1,"location":null,"numPassingAsserts":9,"retryReasons":[],"status":"passed","title":"TreatMonitorController · none → 403"},{"ancestorTitles":["관리자 컨트롤러 역할 경계"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"관리자 컨트롤러 역할 경계 AdminViewTokenController · admin → 통과","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"status":"passed","title":"AdminViewTokenController · admin → 통과"},{"ancestorTitles":["관리자 컨트롤러 역할 경계"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"관리자 컨트롤러 역할 경계 AdminViewTokenController · corp → 통과","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"status":"passed","title":"AdminViewTokenController · corp → 통과"},{"ancestorTitles":["관리자 컨트롤러 역할 경계"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"관리자 컨트롤러 역할 경계 AdminViewTokenController · sales → 403","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"status":"passed","title":"AdminViewTokenController · sales → 403"},{"ancestorTitles":["관리자 컨트롤러 역할 경계"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"관리자 컨트롤러 역할 경계 AdminViewTokenController · none → 403","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"status":"passed","title":"AdminViewTokenController · none → 403"},{"ancestorTitles":["관리자 컨트롤러 역할 경계"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"관리자 컨트롤러 역할 경계 MenuController · getAllList · admin → 통과","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"status":"passed","title":"MenuController · getAllList · admin → 통과"},{"ancestorTitles":["관리자 컨트롤러 역할 경계"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"관리자 컨트롤러 역할 경계 MenuController · getAllList · sales → 403","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"status":"passed","title":"MenuController · getAllList · sales → 403"},{"ancestorTitles":["관리자 컨트롤러 역할 경계"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"관리자 컨트롤러 역할 경계 MenuController · getAllList · corp → 403","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"status":"passed","title":"MenuController · getAllList · corp → 403"},{"ancestorTitles":["관리자 컨트롤러 역할 경계"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"관리자 컨트롤러 역할 경계 MenuController · getAllList · none → 403","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"status":"passed","title":"MenuController · getAllList · none → 403"},{"ancestorTitles":["관리자 컨트롤러 역할 경계"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"관리자 컨트롤러 역할 경계 MenuController · getMyMenus · admin → 통과","invocations":1,"location":null,"numPassingAsserts":7,"retryReasons":[],"status":"passed","title":"MenuController · getMyMenus · admin → 통과"},{"ancestorTitles":["관리자 컨트롤러 역할 경계"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"관리자 컨트롤러 역할 경계 MenuController · getMyMenus · sales → 통과","invocations":1,"location":null,"numPassingAsserts":7,"retryReasons":[],"status":"passed","title":"MenuController · getMyMenus · sales → 통과"},{"ancestorTitles":["관리자 컨트롤러 역할 경계"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"관리자 컨트롤러 역할 경계 MenuController · getMyMenus · corp → 통과","invocations":1,"location":null,"numPassingAsserts":7,"retryReasons":[],"status":"passed","title":"MenuController · getMyMenus · corp → 통과"},{"ancestorTitles":["관리자 컨트롤러 역할 경계"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"관리자 컨트롤러 역할 경계 MenuController · getMyMenus · none → 통과","invocations":1,"location":null,"numPassingAsserts":7,"retryReasons":[],"status":"passed","title":"MenuController · getMyMenus · none → 통과"},{"ancestorTitles":["관리자 컨트롤러 역할 경계"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"관리자 컨트롤러 역할 경계 FaxAdminController · isPublic 우회가 없다","invocations":1,"location":null,"numPassingAsserts":12,"retryReasons":[],"status":"passed","title":"FaxAdminController · isPublic 우회가 없다"},{"ancestorTitles":["관리자 컨트롤러 역할 경계"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"관리자 컨트롤러 역할 경계 TreatTestController · isPublic 우회가 없다","invocations":1,"location":null,"numPassingAsserts":15,"retryReasons":[],"status":"passed","title":"TreatTestController · isPublic 우회가 없다"},{"ancestorTitles":["관리자 컨트롤러 역할 경계"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"관리자 컨트롤러 역할 경계 ClinicalResultController · isPublic 우회가 없다","invocations":1,"location":null,"numPassingAsserts":12,"retryReasons":[],"status":"passed","title":"ClinicalResultController · isPublic 우회가 없다"},{"ancestorTitles":["관리자 컨트롤러 역할 경계"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"관리자 컨트롤러 역할 경계 AdminCoursesController · isPublic 우회가 없다","invocations":1,"location":null,"numPassingAsserts":7,"retryReasons":[],"status":"passed","title":"AdminCoursesController · isPublic 우회가 없다"},{"ancestorTitles":["관리자 컨트롤러 역할 경계"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"관리자 컨트롤러 역할 경계 AdminCoursesReviewsController · isPublic 우회가 없다","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"status":"passed","title":"AdminCoursesReviewsController · isPublic 우회가 없다"},{"ancestorTitles":["관리자 컨트롤러 역할 경계"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"관리자 컨트롤러 역할 경계 TreatMonitorController · isPublic 우회가 없다","invocations":1,"location":null,"numPassingAsserts":8,"retryReasons":[],"status":"passed","title":"TreatMonitorController · isPublic 우회가 없다"},{"ancestorTitles":["관리자 컨트롤러 역할 경계"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"관리자 컨트롤러 역할 경계 AdminViewTokenController · isPublic 우회가 없다","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"status":"passed","title":"AdminViewTokenController · isPublic 우회가 없다"},{"ancestorTitles":["관리자 컨트롤러 역할 경계"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"관리자 컨트롤러 역할 경계 MenuController · isPublic 우회가 없다","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"status":"passed","title":"MenuController · isPublic 우회가 없다"}],"endTime":1792461966281,"message":"","name":"/home/madsc/work/insuniverse-temp/.worktrees/admin-rbac/insuniverse-server/apps/api/src/modules/auth/admin/admin-roles-access.spec.ts","startTime":1792461964414,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["접근 계약 부팅 단언 판정"],"duration":4,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 부팅 단언 판정 레지스트리와 런타임 집합이 같으면 위반이 없다","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"레지스트리와 런타임 집합이 같으면 위반이 없다"},{"ancestorTitles":["접근 계약 부팅 단언 판정"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 부팅 단언 판정 음성: 행 하나를 뺀 레지스트리면 선언 없음 위반이 1이다","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"음성: 행 하나를 뺀 레지스트리면 선언 없음 위반이 1이다"},{"ancestorTitles":["접근 계약 부팅 단언 판정"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 부팅 단언 판정 음성: 레지스트리에 없는 경로가 런타임에 있으면 미지 경로 위반이 1이다","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"음성: 레지스트리에 없는 경로가 런타임에 있으면 미지 경로 위반이 1이다"},{"ancestorTitles":["접근 계약 부팅 단언 판정"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 부팅 단언 판정 레지스트리에만 있는 행은 런타임 부재 위반이다","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"레지스트리에만 있는 행은 런타임 부재 위반이다"},{"ancestorTitles":["접근 계약 부팅 단언 판정"],"duration":6,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 부팅 단언 판정 음성: 예외 경로가 런타임 집합에 없어도 위반이 0이다 (예외가 누락 검사를 덮는다)","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"음성: 예외 경로가 런타임 집합에 없어도 위반이 0이다 (예외가 누락 검사를 덮는다)"},{"ancestorTitles":["접근 계약 예외표 · 접두 경계"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 예외표 · 접두 경계 예외 경로 7개와 접두 /swagger/ 아래 경로는 위반이 아니다","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"예외 경로 7개와 접두 /swagger/ 아래 경로는 위반이 아니다"},{"ancestorTitles":["접근 계약 예외표 · 접두 경계"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 예외표 · 접두 경계 음성: /swagger-admin 과 /swagger-admin/x 는 예외가 아니라 미지 경로 위반이다 (접두 경계)","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"음성: /swagger-admin 과 /swagger-admin/x 는 예외가 아니라 미지 경로 위반이다 (접두 경계)"},{"ancestorTitles":["접근 계약 예외표 · 접두 경계"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 예외표 · 접두 경계 음성: 예외 경로의 다른 메서드(DELETE /health · POST /live)는 예외가 아니라 미지 경로 위반이다 (메서드 경계)","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"음성: 예외 경로의 다른 메서드(DELETE /health · POST /live)는 예외가 아니라 미지 경로 위반이다 (메서드 경계)"},{"ancestorTitles":["접근 계약 모드 · 단언 불능"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 모드 · 단언 불능 warn 은 던지지 않고 Logger.warn 을 한 번 부른다","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"warn 은 던지지 않고 Logger.warn 을 한 번 부른다"},{"ancestorTitles":["접근 계약 모드 · 단언 불능"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 모드 · 단언 불능 음성(리뷰 R1): warn 에서 위반 0건이면 Logger.log 한 줄로 모드와 대조 행 수를 남기고 warn 은 부르지 않는다","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"status":"passed","title":"음성(리뷰 R1): warn 에서 위반 0건이면 Logger.log 한 줄로 모드와 대조 행 수를 남기고 warn 은 부르지 않는다"},{"ancestorTitles":["접근 계약 모드 · 단언 불능"],"duration":32,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 모드 · 단언 불능 fail 은 던진다","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"fail 은 던진다"},{"ancestorTitles":["접근 계약 모드 · 단언 불능"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 모드 · 단언 불능 음성: 라우터 스택 없음 입력과 수집 0건 입력은 단언 불능 위반 1건이다","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"음성: 라우터 스택 없음 입력과 수집 0건 입력은 단언 불능 위반 1건이다"},{"ancestorTitles":["접근 계약 모드 · 단언 불능"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 모드 · 단언 불능 음성: 단언 불능은 warn 에서 던지지 않고 fail 에서 던진다","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"음성: 단언 불능은 warn 에서 던지지 않고 fail 에서 던진다"},{"ancestorTitles":["접근 계약 모드 · 단언 불능"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 모드 · 단언 불능 음성: 라우터 스택이 없는 Express 앱은 단언 불능으로 세고 부팅을 멈추지 않는다 (warn)","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"음성: 라우터 스택이 없는 Express 앱은 단언 불능으로 세고 부팅을 멈추지 않는다 (warn)"},{"ancestorTitles":["접근 계약 모드 · 단언 불능"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 모드 · 단언 불능 음성: fail 모드에서 라우터 스택이 없는 앱은 단언 불능으로 던진다 (fail-open 금지)","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"음성: fail 모드에서 라우터 스택이 없는 앱은 단언 불능으로 던진다 (fail-open 금지)"},{"ancestorTitles":["접근 계약 실제 라우터 수집"],"duration":143,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 실제 라우터 수집 실제 라우터: 최소 Nest 모듈의 GET /zz-probe 를 수집하고 빈 레지스트리에서 미지 경로 1건이다","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"실제 라우터: 최소 Nest 모듈의 GET /zz-probe 를 수집하고 빈 레지스트리에서 미지 경로 1건이다"},{"ancestorTitles":["접근 계약 실제 라우터 수집"],"duration":3,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 실제 라우터 수집 음성: 목록 밖 와일드카드 핸들러(/zz-export/*)는 수집에서 빠지지 않고 미지 경로 위반이다","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"음성: 목록 밖 와일드카드 핸들러(/zz-export/*)는 수집에서 빠지지 않고 미지 경로 위반이다"},{"ancestorTitles":["접근 계약 실제 라우터 수집"],"duration":9,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 실제 라우터 수집 실제 Swagger 경로: setupSwagger 가 만든 문서 경로(-json · -yaml · 접두)는 예외표로 덮여 위반이 없다","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"실제 Swagger 경로: setupSwagger 가 만든 문서 경로(-json · -yaml · 접두)는 예외표로 덮여 위반이 없다"},{"ancestorTitles":["접근 계약 와일드카드 등록 (미들웨어 층 대 핸들러)"],"duration":3,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 와일드카드 등록 (미들웨어 층 대 핸들러) 미들웨어 2층 + @Get(*) 핸들러 = 핸들러 GET /* 1건만 위반이다","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"미들웨어 2층 + @Get(*) 핸들러 = 핸들러 GET /* 1건만 위반이다"},{"ancestorTitles":["접근 계약 와일드카드 등록 (미들웨어 층 대 핸들러)"],"duration":3,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 와일드카드 등록 (미들웨어 층 대 핸들러) 음성: 미들웨어 층 없이 @Get(*) 핸들러만 있으면 GET /* 가 위반이다 (기준 개수로 가리지 않는다)","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"음성: 미들웨어 층 없이 @Get(*) 핸들러만 있으면 GET /* 가 위반이다 (기준 개수로 가리지 않는다)"},{"ancestorTitles":["접근 계약 와일드카드 등록 (미들웨어 층 대 핸들러)"],"duration":3,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 와일드카드 등록 (미들웨어 층 대 핸들러) 음성: 미들웨어 층이 1개로 줄고 핸들러가 남으면 위반이 숨지 않는다 (슬롯 빌림 금지)","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"음성: 미들웨어 층이 1개로 줄고 핸들러가 남으면 위반이 숨지 않는다 (슬롯 빌림 금지)"},{"ancestorTitles":["접근 계약 와일드카드 등록 (M4 · 1509 반례)"],"duration":4,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 와일드카드 등록 (M4 · 1509 반례) 미선언 와일드카드 핸들러는 위반으로 잡힌다 (미들웨어 2층은 빼고 핸들러 층은 남긴다)","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"미선언 와일드카드 핸들러는 위반으로 잡힌다 (미들웨어 2층은 빼고 핸들러 층은 남긴다)"},{"ancestorTitles":["접근 계약 와일드카드 등록 (@All 핸들러의 모양은 미들웨어와 같다)"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 와일드카드 등록 (@All 핸들러의 모양은 미들웨어와 같다) 음성(리뷰 R1 codex): 미들웨어 1층 + 미선언 @All(*) 면 핸들러 층 ACL 이 위반으로 남는다 (층 수 2 로 가리지 않는다)","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"음성(리뷰 R1 codex): 미들웨어 1층 + 미선언 @All(*) 면 핸들러 층 ACL 이 위반으로 남는다 (층 수 2 로 가리지 않는다)"},{"ancestorTitles":["접근 계약 와일드카드 등록 (@All 핸들러의 모양은 미들웨어와 같다)"],"duration":5,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 와일드카드 등록 (@All 핸들러의 모양은 미들웨어와 같다) 미들웨어 2층 + 미선언 @All(*): 미들웨어 두 층은 빠지고 핸들러 층의 GET /* 가 1건 위반으로 남는다","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"미들웨어 2층 + 미선언 @All(*): 미들웨어 두 층은 빠지고 핸들러 층의 GET /* 가 1건 위반으로 남는다"},{"ancestorTitles":["접근 계약 main.ts 배선"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 main.ts 배선 main.ts 는 listen 앞에서 비주석 부팅 단언 호출을 정확히 한 번 한다","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"main.ts 는 listen 앞에서 비주석 부팅 단언 호출을 정확히 한 번 한다"},{"ancestorTitles":["접근 계약 main.ts 배선"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 main.ts 배선 음성: 호출을 주석 처리하면 호출 0건이다","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"음성: 호출을 주석 처리하면 호출 0건이다"},{"ancestorTitles":["접근 계약 main.ts 배선"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 main.ts 배선 음성: 호출을 listen 뒤로 옮기면 before 가 거짓이다","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"음성: 호출을 listen 뒤로 옮기면 before 가 거짓이다"},{"ancestorTitles":["접근 계약 실제 AppModule 대조"],"duration":1872,"failureDetails":[],"failureMessages":[],"fullName":"접근 계약 실제 AppModule 대조 실제 AppModule: setupSwagger 를 붙인 앱이 fail 단언을 통과하고 미선언 핸들러가 없다","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"실제 AppModule: setupSwagger 를 붙인 앱이 fail 단언을 통과하고 미선언 핸들러가 없다"}],"endTime":1792461967329,"message":"","name":"/home/madsc/work/insuniverse-temp/.worktrees/admin-rbac/insuniverse-server/apps/api/src/modules/auth/access-contract/access-contract.spec.ts","startTime":1792461964456,"status":"passed","summary":""}],"wasInterrupted":false}
