@@ -6,7 +6,7 @@ import * as CrossSpawnSpawner from "../../src/effect/cross-spawn-spawner"
66import { Permission } from "../../src/permission"
77import { PermissionID } from "../../src/permission/schema"
88import { Instance } from "../../src/project/instance"
9- import { provideInstance , provideTmpdirInstance , tmpdirScoped } from "../fixture/fixture"
9+ import { provideInstance , provideTmpdirInstance , tmpdir , tmpdirScoped } from "../fixture/fixture"
1010import { testEffect } from "../lib/effect"
1111import { MessageID , SessionID } from "../../src/session/schema"
1212
@@ -33,12 +33,12 @@ const rejectAll = (message?: string) =>
3333const waitForPending = ( count : number ) =>
3434 Effect . gen ( function * ( ) {
3535 const permission = yield * Permission . Service
36- for ( let i = 0 ; i < 20 ; i ++ ) {
36+ for ( let i = 0 ; i < 100 ; i ++ ) {
3737 const list = yield * permission . list ( )
3838 if ( list . length === count ) return list
39- yield * Effect . promise ( ( ) => Bun . sleep ( 0 ) )
39+ yield * Effect . sleep ( "10 millis" )
4040 }
41- return yield * permission . list ( )
41+ return yield * Effect . fail ( new Error ( `timed out waiting for ${ count } pending permission request(s)` ) )
4242 } )
4343
4444const fail = < A , E , R > ( self : Effect . Effect < A , E , R > ) =>
@@ -853,6 +853,18 @@ it.live("reply - publishes replied event", () =>
853853 withDir ( { git : true } , ( ) =>
854854 Effect . gen ( function * ( ) {
855855 const bus = yield * Bus . Service
856+ let resolve ! : ( value : { sessionID : SessionID ; requestID : PermissionID ; reply : Permission . Reply } ) => void
857+ const seen = Effect . promise < {
858+ sessionID : SessionID
859+ requestID : PermissionID
860+ reply : Permission . Reply
861+ } > (
862+ ( ) =>
863+ new Promise ( ( res ) => {
864+ resolve = res
865+ } ) ,
866+ )
867+
856868 const fiber = yield * ask ( {
857869 id : PermissionID . make ( "per_test7" ) ,
858870 sessionID : SessionID . make ( "session_test" ) ,
@@ -865,25 +877,14 @@ it.live("reply - publishes replied event", () =>
865877
866878 yield * waitForPending ( 1 )
867879
868- let seen :
869- | {
870- sessionID : SessionID
871- requestID : PermissionID
872- reply : Permission . Reply
873- }
874- | undefined
875880 const unsub = yield * bus . subscribeCallback ( Permission . Event . Replied , ( event ) => {
876- seen = event . properties
881+ resolve ( event . properties )
877882 } )
878883
879884 try {
880885 yield * reply ( { requestID : PermissionID . make ( "per_test7" ) , reply : "once" } )
881886 yield * Fiber . join ( fiber )
882- for ( let i = 0 ; i < 20 ; i ++ ) {
883- if ( seen ) break
884- yield * Effect . promise ( ( ) => Bun . sleep ( 0 ) )
885- }
886- expect ( seen ) . toEqual ( {
887+ expect ( yield * seen ) . toEqual ( {
887888 sessionID : SessionID . make ( "session_test" ) ,
888889 requestID : PermissionID . make ( "per_test7" ) ,
889890 reply : "once" ,
@@ -1057,27 +1058,23 @@ it.live("ask - abort should clear pending request", () =>
10571058 Effect . gen ( function * ( ) {
10581059 const dir = yield * tmpdirScoped ( { git : true } )
10591060 const run = withProvided ( dir )
1060- const ctl = new AbortController ( )
1061- const pending = Effect . runPromise (
1062- ask ( {
1063- sessionID : SessionID . make ( "session_test" ) ,
1064- permission : "bash" ,
1065- patterns : [ "ls" ] ,
1066- metadata : { } ,
1067- always : [ ] ,
1068- ruleset : [ { permission : "bash" , pattern : "*" , action : "ask" } ] ,
1069- } ) . pipe ( run , Effect . provide ( env ) ) ,
1070- { signal : ctl . signal } ,
1071- )
10721061
1073- yield * waitForPending ( 1 ) . pipe ( run )
1074- ctl . abort ( )
1075- yield * Effect . promise ( ( ) => pending . catch ( ( ) => undefined ) )
1062+ const fiber = yield * ask ( {
1063+ id : PermissionID . make ( "per_reload" ) ,
1064+ sessionID : SessionID . make ( "session_reload" ) ,
1065+ permission : "bash" ,
1066+ patterns : [ "ls" ] ,
1067+ metadata : { } ,
1068+ always : [ ] ,
1069+ ruleset : [ { permission : "bash" , pattern : "*" , action : "ask" } ] ,
1070+ } ) . pipe ( run , Effect . forkScoped )
10761071
1077- try {
1078- expect ( yield * list ( ) . pipe ( run ) ) . toHaveLength ( 0 )
1079- } finally {
1080- yield * rejectAll ( ) . pipe ( run )
1081- }
1072+ const pending = yield * waitForPending ( 1 ) . pipe ( run )
1073+ expect ( pending ) . toHaveLength ( 1 )
1074+ yield * Effect . promise ( ( ) => Instance . reload ( { directory : dir } ) )
1075+
1076+ const exit = yield * Fiber . await ( fiber )
1077+ expect ( Exit . isFailure ( exit ) ) . toBe ( true )
1078+ if ( Exit . isFailure ( exit ) ) expect ( Cause . squash ( exit . cause ) ) . toBeInstanceOf ( Permission . RejectedError )
10821079 } ) ,
10831080)
0 commit comments