Skip to content

Commit 6a09eae

Browse files
Add tests for extensionHandle-based event routing
Co-authored-by: Claude Code <claude-code@anthropic.com>
1 parent cc5abaa commit 6a09eae

2 files changed

Lines changed: 47 additions & 4 deletions

File tree

packages/app/src/cli/services/dev/app-events/app-event-watcher.test.ts

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@ vi.mock('../../../models/app/loader.js')
2525
vi.mock('./app-watcher-esbuild.js')
2626

2727
// Extensions 1 and 1B simulate extensions defined in the same directory (same toml)
28-
const extension1 = await testUIExtension({type: 'ui_extension', directory: '/extensions/ui_extension_1', uid: 'uid1'})
29-
const extension1B = await testUIExtension({type: 'ui_extension', directory: '/extensions/ui_extension_1', uid: 'uid1B'})
30-
const extension2 = await testUIExtension({type: 'ui_extension', directory: '/extensions/ui_extension_2', uid: 'uid2'})
28+
const extension1 = await testUIExtension({type: 'ui_extension', handle: 'h1', directory: '/extensions/ui_extension_1', uid: 'uid1'})
29+
const extension1B = await testUIExtension({type: 'ui_extension', handle: 'h2', directory: '/extensions/ui_extension_1', uid: 'uid1B'})
30+
const extension2 = await testUIExtension({type: 'ui_extension', handle: 'h3', directory: '/extensions/ui_extension_2', uid: 'uid2'})
3131
const flowExtension = await testFlowActionExtension('/extensions/flow_action')
3232
const posExtension = await testAppConfigExtensions()
3333
const appAccessExtension = await testAppAccessConfigExtension()
@@ -36,12 +36,14 @@ const webhookExtension = await testSingleWebhookSubscriptionExtension()
3636
// Simulate updated extensions
3737
const extension1Updated = await testUIExtension({
3838
type: 'ui_extension',
39+
handle: 'h1',
3940
name: 'updated_name1',
4041
directory: '/extensions/ui_extension_1',
4142
uid: 'uid1',
4243
})
4344
const extension1BUpdated = await testUIExtension({
4445
type: 'ui_extension',
46+
handle: 'h2',
4547
name: 'updated_name1B',
4648
directory: '/extensions/ui_extension_1',
4749
uid: 'uid1B',
@@ -212,6 +214,32 @@ const testCases: TestCase[] = [
212214
{type: EventType.Updated, extension: extension1B, buildResult: {status: 'ok', uid: 'uid1B'}},
213215
],
214216
},
217+
{
218+
name: 'file_updated with extensionHandle targets only the specified extension',
219+
fileWatchEvent: {
220+
type: 'file_updated',
221+
path: '/extensions/ui_extension_1/src/file.js',
222+
extensionPath: '/extensions/ui_extension_1',
223+
extensionHandle: 'h1',
224+
startTime: [0, 0],
225+
},
226+
initialExtensions: [extension1, extension1B, extension2, posExtension],
227+
finalExtensions: [extension1, extension1B, extension2, posExtension],
228+
extensionEvents: [{type: EventType.Updated, extension: extension1, buildResult: {status: 'ok', uid: 'uid1'}}],
229+
},
230+
{
231+
name: 'file_created with extensionHandle targets only the specified extension',
232+
fileWatchEvent: {
233+
type: 'file_created',
234+
path: '/extensions/ui_extension_1/src/new-file.js',
235+
extensionPath: '/extensions/ui_extension_1',
236+
extensionHandle: 'h2',
237+
startTime: [0, 0],
238+
},
239+
initialExtensions: [extension1, extension1B, extension2, posExtension],
240+
finalExtensions: [extension1, extension1B, extension2, posExtension],
241+
extensionEvents: [{type: EventType.Updated, extension: extension1B, buildResult: {status: 'ok', uid: 'uid1B'}}],
242+
},
215243
{
216244
name: 'app config updated with multiple extensions affected',
217245
fileWatchEvent: {

packages/app/src/cli/services/dev/app-events/file-watcher.test.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ interface TestCaseSingleEvent {
7777
path: string
7878
expectedEvent?: Omit<WatcherEvent, 'startTime'> & {startTime?: WatcherEvent['startTime']}
7979
expectedEventCount?: number
80+
expectedHandles?: string[]
8081
}
8182

8283
/**
@@ -104,8 +105,10 @@ const singleEventTestCases: TestCaseSingleEvent[] = [
104105
type: 'file_updated',
105106
path: '/extensions/ui_extension_1/index.js',
106107
extensionPath: '/extensions/ui_extension_1',
108+
extensionHandle: 'h1',
107109
},
108110
expectedEventCount: 2,
111+
expectedHandles: ['h1', 'h2'],
109112
},
110113
{
111114
name: 'change in toml',
@@ -115,8 +118,10 @@ const singleEventTestCases: TestCaseSingleEvent[] = [
115118
type: 'extensions_config_updated',
116119
path: '/extensions/ui_extension_1/shopify.ui.extension.toml',
117120
extensionPath: '/extensions/ui_extension_1',
121+
extensionHandle: 'h1',
118122
},
119123
expectedEventCount: 2,
124+
expectedHandles: ['h1', 'h2'],
120125
},
121126
{
122127
name: 'change in app config',
@@ -136,8 +141,10 @@ const singleEventTestCases: TestCaseSingleEvent[] = [
136141
type: 'file_created',
137142
path: '/extensions/ui_extension_1/new-file.js',
138143
extensionPath: '/extensions/ui_extension_1',
144+
extensionHandle: 'h1',
139145
},
140146
expectedEventCount: 2,
147+
expectedHandles: ['h1', 'h2'],
141148
},
142149
{
143150
name: 'delete a file',
@@ -284,7 +291,7 @@ describe('file-watcher events', () => {
284291

285292
test.each(singleEventTestCases)(
286293
'The event $name returns the expected WatcherEvent',
287-
async ({fileSystemEvent, path, expectedEvent, expectedEventCount}) => {
294+
async ({fileSystemEvent, path, expectedEvent, expectedEventCount, expectedHandles}) => {
288295
// Given
289296
let eventHandler: any
290297

@@ -382,6 +389,14 @@ describe('file-watcher events', () => {
382389
expect(actualEvent.extensionPath).toBe(normalizePath(expectedEvent.extensionPath))
383390
expect(Array.isArray(actualEvent.startTime)).toBe(true)
384391
expect(actualEvent.startTime).toHaveLength(2)
392+
393+
// Verify extensionHandle is set correctly on file-level events
394+
if (expectedHandles) {
395+
const actualHandles = actualEvents.map((e: WatcherEvent) => e.extensionHandle).sort()
396+
expect(actualHandles).toEqual(expectedHandles.sort())
397+
} else if (expectedEvent.extensionHandle) {
398+
expect(actualEvent.extensionHandle).toBe(expectedEvent.extensionHandle)
399+
}
385400
},
386401
{timeout: 1000, interval: 50},
387402
)

0 commit comments

Comments
 (0)