-
Notifications
You must be signed in to change notification settings - Fork 490
Road to No explicit any: Group 8 (part 6) test files #8344
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
177ccbf
326494c
1d231c8
3c22a74
4f96152
cb8a953
3cc2232
6cf3133
4fc88e6
ef9dff8
b056c14
b120db1
f0d02bc
8f5463e
aedbb53
57eb02e
4824945
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -3,19 +3,20 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' | |||||||||||||||||
|
|
||||||||||||||||||
| import type { IWidget } from '@/lib/litegraph/src/litegraph' | ||||||||||||||||||
| import { api } from '@/scripts/api' | ||||||||||||||||||
| import { LGraphNode } from '@/lib/litegraph/src/litegraph' | ||||||||||||||||||
| import { useRemoteWidget } from '@/renderer/extensions/vueNodes/widgets/composables/useRemoteWidget' | ||||||||||||||||||
| import type { RemoteWidgetConfig } from '@/schemas/nodeDefSchema' | ||||||||||||||||||
| import { createMockLGraphNode } from '@/utils/__tests__/litegraphTestUtils' | ||||||||||||||||||
|
|
||||||||||||||||||
| const createMockNode = (overrides: Partial<LGraphNode> = {}): LGraphNode => { | ||||||||||||||||||
| const node = new LGraphNode('TestNode') | ||||||||||||||||||
| Object.assign(node, overrides) | ||||||||||||||||||
| return node | ||||||||||||||||||
| function createMockWidget(overrides: Partial<IWidget> = {}): IWidget { | ||||||||||||||||||
| return { | ||||||||||||||||||
| name: 'test_widget', | ||||||||||||||||||
| type: 'text', | ||||||||||||||||||
| value: '', | ||||||||||||||||||
| options: {}, | ||||||||||||||||||
| ...overrides | ||||||||||||||||||
| } as Partial<IWidget> as IWidget | ||||||||||||||||||
| } | ||||||||||||||||||
|
|
||||||||||||||||||
| const createMockWidget = (overrides = {}): IWidget => | ||||||||||||||||||
| ({ ...overrides }) as unknown as IWidget | ||||||||||||||||||
|
|
||||||||||||||||||
| const mockCloudAuth = vi.hoisted(() => ({ | ||||||||||||||||||
| isCloud: false, | ||||||||||||||||||
| authHeader: null as { Authorization: string } | null | ||||||||||||||||||
|
|
@@ -67,7 +68,10 @@ function createMockConfig(overrides = {}): RemoteWidgetConfig { | |||||||||||||||||
| const createMockOptions = (inputOverrides = {}) => ({ | ||||||||||||||||||
| remoteConfig: createMockConfig(inputOverrides), | ||||||||||||||||||
| defaultValue: DEFAULT_VALUE, | ||||||||||||||||||
| node: createMockNode(), | ||||||||||||||||||
| node: createMockLGraphNode({ | ||||||||||||||||||
| addWidget: vi.fn(() => createMockWidget()), | ||||||||||||||||||
| onRemoved: undefined | ||||||||||||||||||
| }), | ||||||||||||||||||
| widget: createMockWidget() | ||||||||||||||||||
| }) | ||||||||||||||||||
|
|
||||||||||||||||||
|
|
@@ -499,12 +503,14 @@ describe('useRemoteWidget', () => { | |||||||||||||||||
| }) | ||||||||||||||||||
|
|
||||||||||||||||||
| it('should handle rapid cache clearing during fetch', async () => { | ||||||||||||||||||
| let resolvePromise: (value: any) => void | ||||||||||||||||||
| const delayedPromise = new Promise((resolve) => { | ||||||||||||||||||
| resolvePromise = resolve | ||||||||||||||||||
| }) | ||||||||||||||||||
| let resolvePromise: (value: { data: unknown; status?: number }) => void | ||||||||||||||||||
| const delayedPromise = new Promise<{ data: unknown; status?: number }>( | ||||||||||||||||||
| (resolve) => { | ||||||||||||||||||
| resolvePromise = resolve | ||||||||||||||||||
| } | ||||||||||||||||||
| ) | ||||||||||||||||||
|
|
||||||||||||||||||
| vi.mocked(axios.get).mockImplementationOnce(() => delayedPromise as any) | ||||||||||||||||||
| vi.mocked(axios.get).mockImplementationOnce(() => delayedPromise) | ||||||||||||||||||
|
|
||||||||||||||||||
| const hook = useRemoteWidget(createMockOptions()) | ||||||||||||||||||
| hook.getValue() | ||||||||||||||||||
|
|
@@ -520,17 +526,20 @@ describe('useRemoteWidget', () => { | |||||||||||||||||
| }) | ||||||||||||||||||
|
|
||||||||||||||||||
| it('should handle widget destroyed during fetch', async () => { | ||||||||||||||||||
| let resolvePromise: (value: any) => void | ||||||||||||||||||
| const delayedPromise = new Promise((resolve) => { | ||||||||||||||||||
| resolvePromise = resolve | ||||||||||||||||||
| }) | ||||||||||||||||||
| let resolvePromise: (value: { data: unknown; status?: number }) => void | ||||||||||||||||||
| const delayedPromise = new Promise<{ data: unknown; status?: number }>( | ||||||||||||||||||
| (resolve) => { | ||||||||||||||||||
| resolvePromise = resolve | ||||||||||||||||||
| } | ||||||||||||||||||
| ) | ||||||||||||||||||
|
|
||||||||||||||||||
| vi.mocked(axios.get).mockImplementationOnce(() => delayedPromise as any) | ||||||||||||||||||
| vi.mocked(axios.get).mockImplementationOnce(() => delayedPromise) | ||||||||||||||||||
|
|
||||||||||||||||||
| let hook = useRemoteWidget(createMockOptions()) | ||||||||||||||||||
| let hook: ReturnType<typeof useRemoteWidget> | null = | ||||||||||||||||||
| useRemoteWidget(createMockOptions()) | ||||||||||||||||||
| const fetchPromise = hook.getValue() | ||||||||||||||||||
|
|
||||||||||||||||||
| hook = null as any | ||||||||||||||||||
| hook = null | ||||||||||||||||||
|
|
||||||||||||||||||
| resolvePromise!({ data: ['delayed data'] }) | ||||||||||||||||||
| await fetchPromise | ||||||||||||||||||
|
|
@@ -583,19 +592,19 @@ describe('useRemoteWidget', () => { | |||||||||||||||||
|
|
||||||||||||||||||
| describe('auto-refresh on task completion', () => { | ||||||||||||||||||
| it('should add auto-refresh toggle widget', () => { | ||||||||||||||||||
| const mockNode = { | ||||||||||||||||||
| const mockNode = createMockLGraphNode({ | ||||||||||||||||||
| addWidget: vi.fn(), | ||||||||||||||||||
| widgets: [] | ||||||||||||||||||
| } | ||||||||||||||||||
| const mockWidget = { | ||||||||||||||||||
| }) | ||||||||||||||||||
| const mockWidget = createMockWidget({ | ||||||||||||||||||
| refresh: vi.fn() | ||||||||||||||||||
| } | ||||||||||||||||||
| }) | ||||||||||||||||||
|
|
||||||||||||||||||
| useRemoteWidget({ | ||||||||||||||||||
| remoteConfig: createMockConfig(), | ||||||||||||||||||
| defaultValue: DEFAULT_VALUE, | ||||||||||||||||||
| node: mockNode as any, | ||||||||||||||||||
| widget: mockWidget as any | ||||||||||||||||||
| node: mockNode, | ||||||||||||||||||
| widget: mockWidget | ||||||||||||||||||
| }) | ||||||||||||||||||
|
|
||||||||||||||||||
| // Should add auto-refresh toggle widget | ||||||||||||||||||
|
|
@@ -613,19 +622,19 @@ describe('useRemoteWidget', () => { | |||||||||||||||||
| it('should register event listener when enabled', async () => { | ||||||||||||||||||
| const addEventListenerSpy = vi.spyOn(api, 'addEventListener') | ||||||||||||||||||
|
|
||||||||||||||||||
| const mockNode = { | ||||||||||||||||||
| const mockNode = createMockLGraphNode({ | ||||||||||||||||||
| addWidget: vi.fn(), | ||||||||||||||||||
| widgets: [] | ||||||||||||||||||
| } | ||||||||||||||||||
| const mockWidget = { | ||||||||||||||||||
| }) | ||||||||||||||||||
| const mockWidget = createMockWidget({ | ||||||||||||||||||
| refresh: vi.fn() | ||||||||||||||||||
| } | ||||||||||||||||||
| }) | ||||||||||||||||||
|
|
||||||||||||||||||
| useRemoteWidget({ | ||||||||||||||||||
| remoteConfig: createMockConfig(), | ||||||||||||||||||
| defaultValue: DEFAULT_VALUE, | ||||||||||||||||||
| node: mockNode as any, | ||||||||||||||||||
| widget: mockWidget as any | ||||||||||||||||||
| node: mockNode, | ||||||||||||||||||
| widget: mockWidget | ||||||||||||||||||
| }) | ||||||||||||||||||
|
|
||||||||||||||||||
| // Event listener should be registered immediately | ||||||||||||||||||
|
|
@@ -644,25 +653,26 @@ describe('useRemoteWidget', () => { | |||||||||||||||||
| } | ||||||||||||||||||
| }) | ||||||||||||||||||
|
|
||||||||||||||||||
| const mockNode = { | ||||||||||||||||||
| const mockNode = createMockLGraphNode({ | ||||||||||||||||||
| addWidget: vi.fn(), | ||||||||||||||||||
| widgets: [] | ||||||||||||||||||
| } | ||||||||||||||||||
| const mockWidget = {} as any | ||||||||||||||||||
| }) | ||||||||||||||||||
| const mockWidget = createMockWidget({}) | ||||||||||||||||||
|
|
||||||||||||||||||
| useRemoteWidget({ | ||||||||||||||||||
| remoteConfig: createMockConfig(), | ||||||||||||||||||
| defaultValue: DEFAULT_VALUE, | ||||||||||||||||||
| node: mockNode as any, | ||||||||||||||||||
| node: mockNode, | ||||||||||||||||||
| widget: mockWidget | ||||||||||||||||||
| }) | ||||||||||||||||||
|
|
||||||||||||||||||
| // Spy on the refresh function that was added by useRemoteWidget | ||||||||||||||||||
| const refreshSpy = vi.spyOn(mockWidget, 'refresh') | ||||||||||||||||||
|
|
||||||||||||||||||
| // Get the toggle callback and enable auto-refresh | ||||||||||||||||||
| const toggleCallback = mockNode.addWidget.mock.calls.find( | ||||||||||||||||||
| (call) => call[0] === 'toggle' | ||||||||||||||||||
| const addWidgetMock = mockNode.addWidget as ReturnType<typeof vi.fn> | ||||||||||||||||||
| const toggleCallback = addWidgetMock.mock.calls.find( | ||||||||||||||||||
| (call: unknown[]) => call[0] === 'toggle' | ||||||||||||||||||
| )?.[3] | ||||||||||||||||||
|
Comment on lines
+673
to
676
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧹 Nitpick | 🔵 Trivial Consider a more type-safe approach for accessing mock calls. The cast to ♻️ Optional refactor for clarity+ const addWidgetMock = vi.mocked(mockNode.addWidget)
- const addWidgetMock = mockNode.addWidget as ReturnType<typeof vi.fn>
- const toggleCallback = addWidgetMock.mock.calls.find(
- (call: unknown[]) => call[0] === 'toggle'
+ const toggleCallback = addWidgetMock.mock.calls.find(
+ (call) => call[0] === 'toggle'
)?.[3]📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||
| toggleCallback?.(true) | ||||||||||||||||||
|
|
||||||||||||||||||
|
|
@@ -681,16 +691,16 @@ describe('useRemoteWidget', () => { | |||||||||||||||||
| } | ||||||||||||||||||
| }) | ||||||||||||||||||
|
|
||||||||||||||||||
| const mockNode = { | ||||||||||||||||||
| const mockNode = createMockLGraphNode({ | ||||||||||||||||||
| addWidget: vi.fn(), | ||||||||||||||||||
| widgets: [] | ||||||||||||||||||
| } | ||||||||||||||||||
| const mockWidget = {} as any | ||||||||||||||||||
| }) | ||||||||||||||||||
| const mockWidget = createMockWidget({}) | ||||||||||||||||||
|
|
||||||||||||||||||
| useRemoteWidget({ | ||||||||||||||||||
| remoteConfig: createMockConfig(), | ||||||||||||||||||
| defaultValue: DEFAULT_VALUE, | ||||||||||||||||||
| node: mockNode as any, | ||||||||||||||||||
| node: mockNode, | ||||||||||||||||||
| widget: mockWidget | ||||||||||||||||||
| }) | ||||||||||||||||||
|
|
||||||||||||||||||
|
|
@@ -715,20 +725,20 @@ describe('useRemoteWidget', () => { | |||||||||||||||||
|
|
||||||||||||||||||
| const removeEventListenerSpy = vi.spyOn(api, 'removeEventListener') | ||||||||||||||||||
|
|
||||||||||||||||||
| const mockNode = { | ||||||||||||||||||
| const mockNode = createMockLGraphNode({ | ||||||||||||||||||
| addWidget: vi.fn(), | ||||||||||||||||||
| widgets: [], | ||||||||||||||||||
| onRemoved: undefined as any | ||||||||||||||||||
| } | ||||||||||||||||||
| const mockWidget = { | ||||||||||||||||||
| onRemoved: undefined | ||||||||||||||||||
| }) | ||||||||||||||||||
| const mockWidget = createMockWidget({ | ||||||||||||||||||
| refresh: vi.fn() | ||||||||||||||||||
| } | ||||||||||||||||||
| }) | ||||||||||||||||||
|
|
||||||||||||||||||
| useRemoteWidget({ | ||||||||||||||||||
| remoteConfig: createMockConfig(), | ||||||||||||||||||
| defaultValue: DEFAULT_VALUE, | ||||||||||||||||||
| node: mockNode as any, | ||||||||||||||||||
| widget: mockWidget as any | ||||||||||||||||||
| node: mockNode, | ||||||||||||||||||
| widget: mockWidget | ||||||||||||||||||
| }) | ||||||||||||||||||
|
|
||||||||||||||||||
| // Simulate node removal | ||||||||||||||||||
|
|
||||||||||||||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧹 Nitpick | 🔵 Trivial
Prefer a function declaration for this pure helper.
Repository guidance favors function declarations for pure helpers like this.
♻️ Suggested refactor
Based on learnings: Prefer pure function declarations over function expressions (use
function foo()instead ofconst foo = () => {}) unless a function expression is required.📝 Committable suggestion
🤖 Prompt for AI Agents