Skip to content

Commit 76c43d1

Browse files
committed
test(permission): stabilize windows event tests
1 parent 6dbf83c commit 76c43d1

1 file changed

Lines changed: 34 additions & 37 deletions

File tree

packages/opencode/test/permission/next.test.ts

Lines changed: 34 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import * as CrossSpawnSpawner from "../../src/effect/cross-spawn-spawner"
66
import { Permission } from "../../src/permission"
77
import { PermissionID } from "../../src/permission/schema"
88
import { Instance } from "../../src/project/instance"
9-
import { provideInstance, provideTmpdirInstance, tmpdirScoped } from "../fixture/fixture"
9+
import { provideInstance, provideTmpdirInstance, tmpdir, tmpdirScoped } from "../fixture/fixture"
1010
import { testEffect } from "../lib/effect"
1111
import { MessageID, SessionID } from "../../src/session/schema"
1212

@@ -33,12 +33,12 @@ const rejectAll = (message?: string) =>
3333
const 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

4444
const 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

Comments
 (0)