@@ -3,16 +3,16 @@ import type { Sandbox } from "@vercel/sandbox";
33
44import { createSandboxFromSnapshot } from "../createSandboxFromSnapshot" ;
55
6- const mockSelectAccountSnapshots = vi . fn ( ) ;
6+ const mockGetValidSnapshotId = vi . fn ( ) ;
77const mockInsertAccountSandbox = vi . fn ( ) ;
88const mockCreateSandbox = vi . fn ( ) ;
99
1010vi . mock ( "@/lib/sandbox/createSandbox" , ( ) => ( {
1111 createSandbox : ( ...args : unknown [ ] ) => mockCreateSandbox ( ...args ) ,
1212} ) ) ;
1313
14- vi . mock ( "@/lib/supabase/account_snapshots/selectAccountSnapshots " , ( ) => ( {
15- selectAccountSnapshots : ( ...args : unknown [ ] ) => mockSelectAccountSnapshots ( ...args ) ,
14+ vi . mock ( "@/lib/sandbox/getValidSnapshotId " , ( ) => ( {
15+ getValidSnapshotId : ( ...args : unknown [ ] ) => mockGetValidSnapshotId ( ...args ) ,
1616} ) ) ;
1717
1818vi . mock ( "@/lib/supabase/account_sandboxes/insertAccountSandbox" , ( ) => ( {
@@ -44,9 +44,7 @@ describe("createSandboxFromSnapshot", () => {
4444 } ) ;
4545
4646 it ( "creates from snapshot when available" , async ( ) => {
47- mockSelectAccountSnapshots . mockResolvedValue ( [
48- { snapshot_id : "snap_abc" , account_id : "acc_1" } ,
49- ] ) ;
47+ mockGetValidSnapshotId . mockResolvedValue ( "snap_abc" ) ;
5048
5149 await createSandboxFromSnapshot ( "acc_1" ) ;
5250
@@ -56,15 +54,15 @@ describe("createSandboxFromSnapshot", () => {
5654 } ) ;
5755
5856 it ( "creates fresh sandbox when no snapshot exists" , async ( ) => {
59- mockSelectAccountSnapshots . mockResolvedValue ( [ ] ) ;
57+ mockGetValidSnapshotId . mockResolvedValue ( undefined ) ;
6058
6159 await createSandboxFromSnapshot ( "acc_1" ) ;
6260
6361 expect ( mockCreateSandbox ) . toHaveBeenCalledWith ( { } ) ;
6462 } ) ;
6563
6664 it ( "inserts account_sandbox record" , async ( ) => {
67- mockSelectAccountSnapshots . mockResolvedValue ( [ ] ) ;
65+ mockGetValidSnapshotId . mockResolvedValue ( undefined ) ;
6866
6967 await createSandboxFromSnapshot ( "acc_1" ) ;
7068
@@ -75,20 +73,54 @@ describe("createSandboxFromSnapshot", () => {
7573 } ) ;
7674
7775 it ( "returns { sandbox, fromSnapshot: true } when snapshot exists" , async ( ) => {
78- mockSelectAccountSnapshots . mockResolvedValue ( [
79- { snapshot_id : "snap_abc" , account_id : "acc_1" } ,
80- ] ) ;
76+ mockGetValidSnapshotId . mockResolvedValue ( "snap_abc" ) ;
8177
8278 const result = await createSandboxFromSnapshot ( "acc_1" ) ;
8379
8480 expect ( result ) . toEqual ( { sandbox : mockSandbox , fromSnapshot : true } ) ;
8581 } ) ;
8682
8783 it ( "returns { sandbox, fromSnapshot: false } when no snapshot" , async ( ) => {
88- mockSelectAccountSnapshots . mockResolvedValue ( [ ] ) ;
84+ mockGetValidSnapshotId . mockResolvedValue ( undefined ) ;
8985
9086 const result = await createSandboxFromSnapshot ( "acc_1" ) ;
9187
9288 expect ( result ) . toEqual ( { sandbox : mockSandbox , fromSnapshot : false } ) ;
9389 } ) ;
90+
91+ it ( "skips expired snapshot (getValidSnapshotId returns undefined)" , async ( ) => {
92+ mockGetValidSnapshotId . mockResolvedValue ( undefined ) ;
93+
94+ const result = await createSandboxFromSnapshot ( "acc_1" ) ;
95+
96+ expect ( mockCreateSandbox ) . toHaveBeenCalledWith ( { } ) ;
97+ expect ( result ) . toEqual ( { sandbox : mockSandbox , fromSnapshot : false } ) ;
98+ } ) ;
99+
100+ it ( "falls back to fresh sandbox when snapshot creation fails" , async ( ) => {
101+ mockGetValidSnapshotId . mockResolvedValue ( "snap_bad" ) ;
102+
103+ const freshSandbox = {
104+ sandboxId : "sbx_fresh" ,
105+ status : "running" ,
106+ runCommand : vi . fn ( ) ,
107+ } as unknown as Sandbox ;
108+
109+ mockCreateSandbox
110+ . mockRejectedValueOnce ( new Error ( "Status code 400 is not ok" ) )
111+ . mockResolvedValueOnce ( {
112+ sandbox : freshSandbox ,
113+ response : {
114+ sandboxId : "sbx_fresh" ,
115+ sandboxStatus : "running" ,
116+ timeout : 1800000 ,
117+ createdAt : "2024-01-01T00:00:00.000Z" ,
118+ } ,
119+ } ) ;
120+
121+ const result = await createSandboxFromSnapshot ( "acc_1" ) ;
122+
123+ expect ( mockCreateSandbox ) . toHaveBeenCalledTimes ( 2 ) ;
124+ expect ( result ) . toEqual ( { sandbox : freshSandbox , fromSnapshot : false } ) ;
125+ } ) ;
94126} ) ;
0 commit comments