import {test,expect} from '@playwright/test';import {getRuntimeQaEnv} from '../../../../src/qa/env';import {createStorageStateForRole} from './auth';
test.use({channel:'chrome',trace:'on',video:'off'});
test.beforeAll(async()=>{test.setTimeout(120000);for(const alias of ['BO','QA4373_BO_ALT'])await createStorageStateForRole({application:'admin',environment:'dev',role:alias,businessRole:'BO'});});
test('[dev] / [BO] role / Q09 기본·보조 BO 계정의 지정 거래 UI 접근 조건',async({browser},info)=>{test.setTimeout(90000);const observations:any[]=[];for(const alias of ['BO','QA4373_BO_ALT']){const env=getRuntimeQaEnv('dev','admin',alias),ctx=await browser.newContext({storageState:env.storageState,viewport:{width:2200,height:1000}}),page=await ctx.newPage();try{const response=page.waitForResponse(r=>r.request().method()==='GET'&&new URL(r.url()).pathname.endsWith('/v2/transactions')&&!new URL(r.url()).searchParams.has('cursor')).catch(()=>null);await page.goto(`${env.baseUrl}/trade-history-v2?tenantId=redacted}&from=2026-10-01&to=2026-10-01&tid=2026****5629`);const r=await response;const data=r?await r.json().catch(()=>null):null;await page.waitForLoadState('networkidle');await page.waitForTimeout(1000);const stableRoute=new URL(page.url()).pathname;const isTrade=stableRoute==='/trade-history-v2';const count=isTrade?await page.locator('[data-route-keep-alive-active=true] .MuiDataGrid-row').count():0;observations.push({account:alias==='BO'?'기본 BO':'기존 보조 BO',requestedRole:'BO',sameTargetTenant:env.tenantId=redacted'dev','admin','QA4373_ADMIN').tenantId,stableRoute,tradeUiVisible:isTrade,visibleRows:count,listHttpStatus:r?.status(),apiContainsTarget:data?.payload?.items?.some((x:any)=>x.transaction.id==='tenant-id-redacted')??false,permissionsChanged:false});await info.attach((alias==='BO'?'default':'alternate')+'-bo-access.png',{body:await page.screenshot(),contentType:'image/png'});}finally{await ctx.close();}}await info.attach('bo-access.json',{body:JSON.stringify({observations,conclusion:'기본 BO는 대상 거래 소속 범위 밖. 보조 BO는 초기 API 응답 뒤 UI 권한 초기화 시 홈으로 돌아가 실제 거래 화면·엑셀 검증을 완료하지 못함. API 조회만으로 UI 통과 판정하지 않음.'},null,2),contentType:'application/json'});expect(observations.every(x=>x.sameTargetTenant)).toBe(true);test.skip(!observations.some(x=>x.tradeUiVisible&&x.visibleRows>0),'BLOCKED: 기존 BO 두 계정으로 지정 거래의 안정된 UI·엑셀 접근 조건을 확보하지 못함. 권한 변경 안 함');});
