import { describe, it, expect } from 'vitest'; import { createParentRouteScreenMap } from './createParentRouteScreenMap'; import type { RouteScreen } from '../types/RouteScreen'; describe('createParentRouteScreenMap', () => { describe('중첩된 레이아웃이 있는 경우', () => { it('각 페이지는 자신의 가장 가까운 상위 레이아웃과 매핑됩니다', () => { const paths: RouteScreen[] = [ { path: './bedrock-module/_layout', component: () => null }, { path: './bedrock-module/test', component: () => null }, { path: './about/_layout', component: () => null }, { path: './about/test', component: () => null }, { path: './about', component: () => null }, { path: './image', component: () => null }, ]; const layoutMap = createParentRouteScreenMap(paths, '_layout'); // bedrock-module 디렉토리의 페이지는 자신의 레이아웃과 매핑 expect(layoutMap.get('./bedrock-module/test')?.path).toBe('./bedrock-module/_layout'); // about 디렉토리의 페이지들은 자신의 레이아웃과 매핑 expect(layoutMap.get('./about')?.path).toBe('./about/_layout'); expect(layoutMap.get('./about/test')?.path).toBe('./about/_layout'); // 레이아웃이 없는 페이지는 undefined expect(layoutMap.get('./image')).toBeUndefined(); // 레이아웃 파일의 루트에 레이아웃이 없기 때문에 매핑되지 않음 expect(layoutMap.get('./bedrock-module/_layout')).toBeUndefined(); expect(layoutMap.get('./about/_layout')).toBeUndefined(); }); it('루트 레이아웃이 있으면 레이아웃이 없는 페이지는 루트 레이아웃과 매핑됩니다', () => { const paths: RouteScreen[] = [ { path: './_layout', component: () => null }, { path: './image', component: () => null }, { path: './bedrock-module/_layout', component: () => null }, { path: './bedrock-module/test', component: () => null }, { path: './about/_layout', component: () => null }, { path: './about', component: () => null }, { path: './about/test', component: () => null }, ]; const layoutMap = createParentRouteScreenMap(paths, '_layout'); // 각 디렉토리의 페이지는 자신의 레이아웃과 매핑 expect(layoutMap.get('./bedrock-module/test')?.path).toBe('./bedrock-module/_layout'); expect(layoutMap.get('./about')?.path).toBe('./about/_layout'); expect(layoutMap.get('./about/test')?.path).toBe('./about/_layout'); // 레이아웃이 없는 페이지는 루트 레이아웃과 매핑 expect(layoutMap.get('./image')?.path).toBe('./_layout'); expect(layoutMap.get('./_layout')).toBeUndefined(); expect(layoutMap.get('./bedrock-module/_layout')?.path).toBe('./_layout'); expect(layoutMap.get('./about/_layout')?.path).toBe('./_layout'); }); it('중첩된 디렉토리 구조에서 레이아웃 매핑이 올바르게 동작합니다', () => { const paths: RouteScreen[] = [ { path: './nested', component: () => null }, { path: './nested/_layout', component: () => null }, { path: './nested/test', component: () => null }, ]; const layoutMap = createParentRouteScreenMap(paths, '_layout'); // nested는 nested/_layout와 매핑 expect(layoutMap.get('./nested')?.path).toBe('./nested/_layout'); // nested/test는 nested/_layout와 매핑 expect(layoutMap.get('./nested/test')?.path).toBe('./nested/_layout'); expect(layoutMap.get('./nested/_layout')?.path).toBeUndefined(); }); it('2중 중첩된 디렉토리 구조에서 레이아웃 매핑이 올바르게 동작합니다', () => { const paths: RouteScreen[] = [ { path: './nested/_layout', component: () => null }, { path: './nested/test', component: () => null }, { path: './nested/deep/_layout', component: () => null }, { path: './nested/deep/test', component: () => null }, ]; const layoutMap = createParentRouteScreenMap(paths, '_layout'); // nested/test는 nested/_layout와 매핑 expect(layoutMap.get('./nested/test')?.path).toBe('./nested/_layout'); // nested/deep/test는 nested/deep/_layout와 매핑 expect(layoutMap.get('./nested/deep/test')?.path).toBe('./nested/deep/_layout'); // nested/deep/_layout는 nested/_layout와 매핑 expect(layoutMap.get('./nested/deep/_layout')?.path).toBe('./nested/_layout'); // nested/_layout는 매핑되지 않음 expect(layoutMap.get('./nested/_layout')?.path).toBeUndefined(); }); it('3중 중첩된 디렉토리 구조에서 레이아웃 매핑이 올바르게 동작합니다', () => { const paths: RouteScreen[] = [ { path: './nested/_layout', component: () => null }, { path: './nested/test', component: () => null }, { path: './nested/deep/_layout', component: () => null }, { path: './nested/deep/test', component: () => null }, { path: './nested/deep/deeper/_layout', component: () => null }, { path: './nested/deep/deeper/test', component: () => null }, ]; const layoutMap = createParentRouteScreenMap(paths, '_layout'); // nested/test는 nested/_layout와 매핑 expect(layoutMap.get('./nested/test')?.path).toBe('./nested/_layout'); // nested/deep/test는 nested/deep/_layout와 매핑 expect(layoutMap.get('./nested/deep/test')?.path).toBe('./nested/deep/_layout'); // nested/deep/deeper/test는 nested/deep/deeper/_layout와 매핑 expect(layoutMap.get('./nested/deep/deeper/test')?.path).toBe('./nested/deep/deeper/_layout'); // nested/deep/deeper/_layout는 nested/deep/_layout와 매핑 expect(layoutMap.get('./nested/deep/deeper/_layout')?.path).toBe('./nested/deep/_layout'); // nested/deep/_layout는 nested/_layout와 매핑 expect(layoutMap.get('./nested/deep/_layout')?.path).toBe('./nested/_layout'); // nested/_layout는 매핑되지 않음 expect(layoutMap.get('./nested/_layout')?.path).toBeUndefined(); }); }); describe('레이아웃이 전혀 없는 경우', () => { it('모든 페이지가 undefined로 매핑됩니다', () => { const paths: RouteScreen[] = [ { path: './page1', component: () => null }, { path: './page2', component: () => null }, { path: './nested/page3', component: () => null }, { path: './nested/deep/page4', component: () => null }, ]; const layoutMap = createParentRouteScreenMap(paths, '_layout'); // 모든 페이지가 undefined expect(layoutMap.get('./page1')).toBeUndefined(); expect(layoutMap.get('./page2')).toBeUndefined(); expect(layoutMap.get('./nested/page3')).toBeUndefined(); expect(layoutMap.get('./nested/deep/page4')).toBeUndefined(); }); }); it('중첩된 _layout은 부모의 _layout과 매핑됩니다', () => { const paths: RouteScreen[] = [ { path: './_layout', component: () => null }, { path: './nested/_layout', component: () => null }, { path: './nested/test', component: () => null }, { path: './nested/deep/_layout', component: () => null }, { path: './nested/deep/test', component: () => null }, ]; const layoutMap = createParentRouteScreenMap(paths, '_layout'); expect(layoutMap.get('./nested/deep/test')?.path).toBe('./nested/deep/_layout'); expect(layoutMap.get('./nested/deep/_layout')?.path).toBe('./nested/_layout'); expect(layoutMap.get('./nested/_layout')?.path).toBe('./_layout'); expect(layoutMap.get('./_layout')?.path).toBeUndefined(); }); });