refactor: remove any types from useMinimap and firebaseAuthStore tests

- useMinimap.test.ts: Created comprehensive mock interfaces for Node, Graph, Canvas, CanvasElement, ContainerElement, and Context2D
- firebaseAuthStore.test.ts: Imported User type from firebase/auth and created MockUser type for mocking

Part 8 - Phase 5 complete: 2 files fixed, 14 any instances removed (9 + 5)
This commit is contained in:
Johnpaul
2026-01-21 23:46:43 +01:00
parent 20a0ae04cf
commit dc9f75c011
2 changed files with 103 additions and 25 deletions

View File

@@ -1,6 +1,68 @@
import type { Mock } from 'vitest'
import { beforeEach, describe, expect, it, vi } from 'vitest'
import { nextTick, shallowRef } from 'vue'
interface MockNode {
id: string
pos: number[]
size: number[]
color?: string
constructor?: { color: string }
outputs?: { links: string[] }[] | null
}
interface MockGraph {
_nodes: MockNode[]
links: Record<string, { id: string; target_id: string }>
getNodeById: Mock
setDirtyCanvas: Mock
onNodeAdded: ((node: MockNode) => void) | null
onNodeRemoved: ((node: MockNode) => void) | null
onConnectionChange: ((node: MockNode) => void) | null
}
interface MockCanvas {
graph: MockGraph
canvas: {
width: number
height: number
clientWidth: number
clientHeight: number
}
ds: {
scale: number
offset: [number, number]
}
setDirty: Mock
}
interface MockCanvasElement {
getContext: Mock
width: number
height: number
clientWidth: number
clientHeight: number
}
interface MockContainerElement {
getBoundingClientRect: Mock
}
interface MockContext2D {
clearRect: Mock
fillRect: Mock
strokeRect: Mock
beginPath: Mock
moveTo: Mock
lineTo: Mock
stroke: Mock
arc: Mock
fill: Mock
fillStyle: string
strokeStyle: string
lineWidth: number
}
const flushPromises = () => new Promise((resolve) => setTimeout(resolve, 0))
const triggerRAF = async () => {
@@ -39,15 +101,15 @@ vi.mock('@vueuse/core', () => {
}
}),
useThrottleFn: vi.fn((callback) => {
return (...args: any[]) => {
return (...args: unknown[]) => {
return callback(...args)
}
})
}
})
let mockCanvas: any
let mockGraph: any
let mockCanvas: MockCanvas = null!
let mockGraph: MockGraph = null!
const setupMocks = () => {
const mockNodes = [
@@ -105,7 +167,10 @@ const setupMocks = () => {
setupMocks()
const defaultCanvasStore = {
const defaultCanvasStore: {
canvas: MockCanvas | null
getCanvas: () => MockCanvas | null
} = {
canvas: mockCanvas,
getCanvas: () => defaultCanvasStore.canvas
}
@@ -158,16 +223,20 @@ const { useMinimap } =
const { api } = await import('@/scripts/api')
describe('useMinimap', () => {
let mockCanvas: any
let mockGraph: any
let mockCanvasElement: any
let mockContainerElement: any
let mockContext2D: any
let mockCanvas: MockCanvas
let mockGraph: MockGraph
let mockCanvasElement: MockCanvasElement
let mockContainerElement: MockContainerElement
let mockContext2D: MockContext2D
async function createAndInitializeMinimap() {
const minimap = useMinimap({
containerRefMaybe: shallowRef(mockContainerElement),
canvasRefMaybe: shallowRef(mockCanvasElement)
containerRefMaybe: shallowRef(
mockContainerElement as unknown as HTMLDivElement
),
canvasRefMaybe: shallowRef(
mockCanvasElement as unknown as HTMLCanvasElement
)
})
await minimap.init()
await nextTick()
@@ -432,7 +501,8 @@ describe('useMinimap', () => {
mockGraph._nodes.push({
id: 'new-node',
pos: [150, 150],
size: [100, 50]
size: [100, 50],
constructor: { color: '#666' }
})
// Trigger RAF to process changes
@@ -793,12 +863,14 @@ describe('useMinimap', () => {
mockCanvas.canvas.clientWidth = 1200
mockCanvas.canvas.clientHeight = 900
const resizeHandler = (window.addEventListener as any).mock.calls.find(
(call: any) => call[0] === 'resize'
)?.[1]
const resizeHandler = vi
.mocked(window.addEventListener)
.mock.calls.find((call) => call[0] === 'resize')?.[1] as
| EventListener
| undefined
if (resizeHandler) {
resizeHandler()
resizeHandler(new Event('resize'))
}
await nextTick()

View File

@@ -1,12 +1,18 @@
import { FirebaseError } from 'firebase/app'
import type { User } from 'firebase/auth'
import * as firebaseAuth from 'firebase/auth'
import { createPinia, setActivePinia } from 'pinia'
import type { Mock } from 'vitest'
import { beforeEach, describe, expect, it, vi } from 'vitest'
import * as vuefire from 'vuefire'
import { useDialogService } from '@/services/dialogService'
import { useFirebaseAuthStore } from '@/stores/firebaseAuthStore'
type MockUser = Omit<User, 'getIdToken'> & {
getIdToken: Mock
}
// Mock fetch
const mockFetch = vi.fn()
vi.stubGlobal('fetch', mockFetch)
@@ -84,18 +90,18 @@ vi.mock('@/services/dialogService')
describe('useFirebaseAuthStore', () => {
let store: ReturnType<typeof useFirebaseAuthStore>
let authStateCallback: (user: any) => void
let idTokenCallback: (user: any) => void
let authStateCallback: (user: User | null) => void
let idTokenCallback: (user: User | null) => void
const mockAuth = {
/* mock Auth object */
}
const mockUser = {
const mockUser: MockUser = {
uid: 'test-user-id',
email: 'test@example.com',
getIdToken: vi.fn().mockResolvedValue('mock-id-token')
}
} as unknown as MockUser
beforeEach(() => {
vi.resetAllMocks()
@@ -112,9 +118,9 @@ describe('useFirebaseAuthStore', () => {
// Mock onAuthStateChanged to capture the callback and simulate initial auth state
vi.mocked(firebaseAuth.onAuthStateChanged).mockImplementation(
(_, callback) => {
authStateCallback = callback as (user: any) => void
authStateCallback = callback as (user: User | null) => void
// Call the callback with our mock user
;(callback as (user: any) => void)(mockUser)
;(callback as (user: User | null) => void)(mockUser)
// Return an unsubscribe function
return vi.fn()
}
@@ -156,7 +162,7 @@ describe('useFirebaseAuthStore', () => {
vi.mocked(firebaseAuth.onIdTokenChanged).mockImplementation(
(_auth, callback) => {
idTokenCallback = callback as (user: any) => void
idTokenCallback = callback as (user: User | null) => void
return vi.fn()
}
)
@@ -180,14 +186,14 @@ describe('useFirebaseAuthStore', () => {
})
it('should not increment when ID token event is for a different user UID', () => {
const otherUser = { uid: 'other-user-id' }
const otherUser = { uid: 'other-user-id' } as unknown as User
idTokenCallback?.(mockUser)
idTokenCallback?.(otherUser)
expect(store.tokenRefreshTrigger).toBe(0)
})
it('should increment after switching to a new UID and receiving a second event for that UID', () => {
const otherUser = { uid: 'other-user-id' }
const otherUser = { uid: 'other-user-id' } as unknown as User
idTokenCallback?.(mockUser)
idTokenCallback?.(otherUser)
idTokenCallback?.(otherUser)