11// ** import core packages
22import { beforeEach , describe , expect , it , vi } from 'vitest' ;
33
4- const createEngines = vi . fn ( ) ;
5- const createTableEngine = vi . fn ( ) ;
6- const parseRequest = vi . fn ( ) ;
7- const defaultCheckAccess = vi . fn ( ) ;
8- const getExportMeta = vi . fn ( ) ;
9-
10- class MockTableCraftError extends Error {
11- statusCode : number ;
12-
13- constructor ( message : string , statusCode = 500 ) {
14- super ( message ) ;
15- this . statusCode = statusCode ;
4+ const {
5+ createEngines,
6+ createTableEngine,
7+ parseRequest,
8+ defaultCheckAccess,
9+ getExportMeta,
10+ MockTableCraftError,
11+ mockState
12+ } = vi . hoisted ( ( ) => {
13+ class MockTableCraftError extends Error {
14+ statusCode : number ;
15+ constructor ( message : string , statusCode = 500 ) {
16+ super ( message ) ;
17+ this . statusCode = statusCode ;
18+ }
1619 }
17- }
20+
21+ return {
22+ createEngines : vi . fn ( ) ,
23+ createTableEngine : vi . fn ( ) ,
24+ parseRequest : vi . fn ( ) ,
25+ defaultCheckAccess : vi . fn ( ) ,
26+ getExportMeta : vi . fn ( ) ,
27+ MockTableCraftError,
28+ mockState : { base : '' }
29+ } ;
30+ } ) ;
1831
1932vi . mock ( '@tablecraft/engine' , ( ) => ( {
2033 createEngines,
@@ -25,6 +38,10 @@ vi.mock('@tablecraft/engine', () => ({
2538 TableCraftError : MockTableCraftError ,
2639} ) ) ;
2740
41+ vi . mock ( '$app/paths' , ( ) => ( {
42+ get base ( ) { return mockState . base ; }
43+ } ) ) ;
44+
2845import {
2946 createSvelteKitHandle ,
3047 createSvelteKitHandlers ,
@@ -44,6 +61,7 @@ function createEvent(urlStr: string, params: Record<string, string> = {}) {
4461describe ( '@tablecraft/adapter-sveltekit' , ( ) => {
4562 beforeEach ( ( ) => {
4663 vi . clearAllMocks ( ) ;
64+ mockState . base = '' ;
4765 parseRequest . mockReturnValue ( { page : 1 } ) ;
4866 defaultCheckAccess . mockReturnValue ( true ) ;
4967 getExportMeta . mockReturnValue ( {
@@ -215,6 +233,79 @@ describe('@tablecraft/adapter-sveltekit', () => {
215233 expect ( resolve ) . toHaveBeenCalledOnce ( ) ;
216234 } ) ;
217235
236+ it ( 'strips base path if present' , async ( ) => {
237+ mockState . base = '/myapp' ;
238+
239+ const usersEngine = {
240+ getConfig : vi . fn ( ( ) => ( { name : 'users' } ) ) ,
241+ query : vi . fn ( async ( ) => ( {
242+ data : [ { id : 8 } ] ,
243+ meta : { total : 1 , page : 1 , pageSize : 10 , totalPages : 1 } ,
244+ } ) ) ,
245+ exportData : vi . fn ( ) ,
246+ getMetadata : vi . fn ( ) ,
247+ } ;
248+
249+ createEngines . mockReturnValue ( { users : usersEngine } ) ;
250+
251+ const handle = createSvelteKitHandle ( {
252+ db : { } ,
253+ schema : { } ,
254+ configs : [ ] ,
255+ prefix : '/api' ,
256+ } ) ;
257+
258+ const resolve = vi . fn ( async ( ) => new Response ( 'resolved' , { status : 200 } ) ) ;
259+
260+ const apiResponse = await handle ( {
261+ event : createEvent ( 'https://example.test/myapp/api/users' ) ,
262+ resolve,
263+ } as any ) ;
264+
265+ expect ( apiResponse . status ) . toBe ( 200 ) ;
266+ await expect ( apiResponse . json ( ) ) . resolves . toEqual ( {
267+ data : [ { id : 8 } ] ,
268+ meta : { total : 1 , page : 1 , pageSize : 10 , totalPages : 1 } ,
269+ } ) ;
270+ expect ( resolve ) . not . toHaveBeenCalled ( ) ;
271+ } ) ;
272+
273+ it ( 'does not strip base path if it is a prefix of another folder' , async ( ) => {
274+ mockState . base = '/app' ;
275+
276+ const usersEngine = {
277+ getConfig : vi . fn ( ( ) => ( { name : 'users' } ) ) ,
278+ query : vi . fn ( async ( ) => ( {
279+ data : [ { id : 8 } ] ,
280+ meta : { total : 1 , page : 1 , pageSize : 10 , totalPages : 1 } ,
281+ } ) ) ,
282+ exportData : vi . fn ( ) ,
283+ getMetadata : vi . fn ( ) ,
284+ } ;
285+
286+ createEngines . mockReturnValue ( { users : usersEngine } ) ;
287+
288+ const handle = createSvelteKitHandle ( {
289+ db : { } ,
290+ schema : { } ,
291+ configs : [ ] ,
292+ prefix : '/api' ,
293+ } ) ;
294+
295+ const resolve = vi . fn ( async ( ) => new Response ( 'resolved' , { status : 200 } ) ) ;
296+
297+ // /apple is NOT under /app
298+ const apiResponse = await handle ( {
299+ event : createEvent ( 'https://example.test/apple/api/users' ) ,
300+ resolve,
301+ } as any ) ;
302+
303+ // Should passthrough
304+ expect ( apiResponse . status ) . toBe ( 200 ) ;
305+ await expect ( apiResponse . text ( ) ) . resolves . toBe ( 'resolved' ) ;
306+ expect ( resolve ) . toHaveBeenCalledOnce ( ) ;
307+ } ) ;
308+
218309 it ( 'serves metadata through the hook prefix and rejects non-GET methods' , async ( ) => {
219310 const usersEngine = {
220311 getConfig : vi . fn ( ( ) => ( { name : 'users' } ) ) ,
0 commit comments