diff --git a/spinifex/services/spinifexui/frontend/oxlint.config.ts b/spinifex/services/spinifexui/frontend/oxlint.config.ts
index d64e831a3..72e2ec8f1 100644
--- a/spinifex/services/spinifexui/frontend/oxlint.config.ts
+++ b/spinifex/services/spinifexui/frontend/oxlint.config.ts
@@ -2,9 +2,10 @@ import { defineConfig } from "oxlint"
import core from "ultracite/oxlint/core"
import react from "ultracite/oxlint/react"
import remix from "ultracite/oxlint/remix"
+import vitest from "ultracite/oxlint/vitest"
export default defineConfig({
- extends: [core, react, remix],
+ extends: [core, react, remix, vitest],
jsPlugins: [
"@tanstack/eslint-plugin-query",
"@tanstack/eslint-plugin-router",
@@ -65,6 +66,7 @@ export default defineConfig({
"**/*.{test,spec}.{ts,tsx,js,jsx}",
"**/__tests__/**/*.{ts,tsx,js,jsx}",
],
+ plugins: ["vitest"],
rules: {
"eslint/require-await": "off",
"import/first": "off",
@@ -74,6 +76,11 @@ export default defineConfig({
"typescript/no-unsafe-member-access": "off",
"typescript/no-unsafe-type-assertion": "off",
"unicorn/no-useless-undefined": "off",
+ "vitest/max-expects": "off",
+ "vitest/prefer-called-with": "off",
+ "vitest/prefer-describe-function-title": "off",
+ "vitest/prefer-import-in-mock": "off",
+ "vitest/require-mock-type-parameters": "off",
},
},
],
diff --git a/spinifex/services/spinifexui/frontend/package.json b/spinifex/services/spinifexui/frontend/package.json
index 61bd00331..b634121b4 100644
--- a/spinifex/services/spinifexui/frontend/package.json
+++ b/spinifex/services/spinifexui/frontend/package.json
@@ -6,7 +6,7 @@
"dev": "vite --port 3000",
"build": "vite build",
"preview": "vite preview",
- "check": "oxlint; oxfmt --check",
+ "lint": "oxlint; oxfmt --check",
"fix": "oxlint --fix; oxfmt",
"test": "vitest run",
"test:coverage": "vitest run --coverage",
diff --git a/spinifex/services/spinifexui/frontend/src/components/elbv2/attributes-editor.test.tsx b/spinifex/services/spinifexui/frontend/src/components/elbv2/attributes-editor.test.tsx
index c28c033ac..3c87fcf06 100644
--- a/spinifex/services/spinifexui/frontend/src/components/elbv2/attributes-editor.test.tsx
+++ b/spinifex/services/spinifexui/frontend/src/components/elbv2/attributes-editor.test.tsx
@@ -156,7 +156,7 @@ describe("AttributesEditor", () => {
expect(lbKeys).toContain("connection_logs.s3.prefix")
const tgKeys = targetGroupAttributeSpecs.map((s) => s.key)
- expect(tgKeys).toEqual([
+ expect(tgKeys).toStrictEqual([
"deregistration_delay.timeout_seconds",
"stickiness.enabled",
"stickiness.type",
diff --git a/spinifex/services/spinifexui/frontend/src/components/elbv2/listeners-tab.test.tsx b/spinifex/services/spinifexui/frontend/src/components/elbv2/listeners-tab.test.tsx
index d51ff5342..a289fcdc2 100644
--- a/spinifex/services/spinifexui/frontend/src/components/elbv2/listeners-tab.test.tsx
+++ b/spinifex/services/spinifexui/frontend/src/components/elbv2/listeners-tab.test.tsx
@@ -49,11 +49,11 @@ function seedClient(opts: {
return queryClient
}
-afterEach(() => {
- mockSend.mockReset()
-})
-
describe("ListenersTab", () => {
+ afterEach(() => {
+ mockSend.mockReset()
+ })
+
it("renders empty state and delete-note when no listeners", () => {
const queryClient = seedClient({})
render( Test
Test
, ) - expect(document.documentElement.classList.contains("dark")).toBe(true) + expect(document.documentElement.classList.contains("dark")).toBeTruthy() }) it("uses system theme when set to system", () => { @@ -55,7 +57,7 @@ describe("ThemeProvider", () => {Test
, ) - expect(document.documentElement.classList.contains("dark")).toBe(true) + expect(document.documentElement.classList.contains("dark")).toBeTruthy() }) it("reads stored theme from localStorage", () => { @@ -65,7 +67,7 @@ describe("ThemeProvider", () => {Test
, ) - expect(document.documentElement.classList.contains("dark")).toBe(true) + expect(document.documentElement.classList.contains("dark")).toBeTruthy() }) it("ignores invalid stored theme", () => { @@ -75,7 +77,7 @@ describe("ThemeProvider", () => {Test
, ) - expect(document.documentElement.classList.contains("light")).toBe(true) + expect(document.documentElement.classList.contains("light")).toBeTruthy() }) it("uses custom storageKey", () => { @@ -85,11 +87,13 @@ describe("ThemeProvider", () => {Test
, ) - expect(document.documentElement.classList.contains("dark")).toBe(true) + expect(document.documentElement.classList.contains("dark")).toBeTruthy() }) }) describe("useTheme", () => { + beforeEach(setupThemeEnv) + it("throws when used outside ThemeProvider", () => { expect(() => renderHook(() => useTheme())).toThrow( "useTheme must be used within a ThemeProvider", @@ -114,13 +118,13 @@ describe("useTheme", () => { it("removes previous class when theme changes", () => { const { result } = renderHook(() => useTheme(), { wrapper }) - expect(document.documentElement.classList.contains("light")).toBe(true) + expect(document.documentElement.classList.contains("light")).toBeTruthy() act(() => { result.current.setTheme("dark") }) - expect(document.documentElement.classList.contains("dark")).toBe(true) - expect(document.documentElement.classList.contains("light")).toBe(false) + expect(document.documentElement.classList.contains("dark")).toBeTruthy() + expect(document.documentElement.classList.contains("light")).toBeFalsy() }) }) diff --git a/spinifex/services/spinifexui/frontend/src/hooks/use-copy-to-clipboard.test.tsx b/spinifex/services/spinifexui/frontend/src/hooks/use-copy-to-clipboard.test.tsx index 4cfa1db34..3979fb8cc 100644 --- a/spinifex/services/spinifexui/frontend/src/hooks/use-copy-to-clipboard.test.tsx +++ b/spinifex/services/spinifexui/frontend/src/hooks/use-copy-to-clipboard.test.tsx @@ -3,23 +3,23 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest" import { useCopyToClipboard } from "./use-copy-to-clipboard" -beforeEach(() => { - vi.useFakeTimers() - Object.defineProperty(navigator, "clipboard", { - value: { writeText: vi.fn().mockResolvedValue(undefined) }, - writable: true, - configurable: true, - }) -}) - -afterEach(() => { - vi.useRealTimers() -}) - describe("useCopyToClipboard", () => { + beforeEach(() => { + vi.useFakeTimers() + Object.defineProperty(navigator, "clipboard", { + value: { writeText: vi.fn().mockResolvedValue(undefined) }, + writable: true, + configurable: true, + }) + }) + + afterEach(() => { + vi.useRealTimers() + }) + it("starts with copied as false", () => { const { result } = renderHook(() => useCopyToClipboard()) - expect(result.current.copied).toBe(false) + expect(result.current.copied).toBeFalsy() }) it("sets copied to true after calling copy", async () => { @@ -31,7 +31,7 @@ describe("useCopyToClipboard", () => { // oxlint-disable-next-line typescript/unbound-method -- vitest mock expect(navigator.clipboard.writeText).toHaveBeenCalledWith("hello") - expect(result.current.copied).toBe(true) + expect(result.current.copied).toBeTruthy() }) it("resets copied to false after 2 seconds", async () => { @@ -40,12 +40,12 @@ describe("useCopyToClipboard", () => { await act(async () => { await result.current.copy("hello") }) - expect(result.current.copied).toBe(true) + expect(result.current.copied).toBeTruthy() act(() => { vi.advanceTimersByTime(2000) }) - expect(result.current.copied).toBe(false) + expect(result.current.copied).toBeFalsy() }) it("resets the timer on rapid successive copies", async () => { @@ -59,7 +59,7 @@ describe("useCopyToClipboard", () => { act(() => { vi.advanceTimersByTime(1500) }) - expect(result.current.copied).toBe(true) + expect(result.current.copied).toBeTruthy() await act(async () => { await result.current.copy("second") @@ -69,13 +69,13 @@ describe("useCopyToClipboard", () => { act(() => { vi.advanceTimersByTime(1500) }) - expect(result.current.copied).toBe(true) + expect(result.current.copied).toBeTruthy() // 2s after second copy — should reset act(() => { vi.advanceTimersByTime(500) }) - expect(result.current.copied).toBe(false) + expect(result.current.copied).toBeFalsy() }) it("clears the timer on unmount", async () => { @@ -87,9 +87,10 @@ describe("useCopyToClipboard", () => { unmount() - // Advancing time after unmount should not throw - act(() => { - vi.advanceTimersByTime(2000) - }) + expect(() => { + act(() => { + vi.advanceTimersByTime(2000) + }) + }).not.toThrow() }) }) diff --git a/spinifex/services/spinifexui/frontend/src/hooks/use-initial-sidebar.test.tsx b/spinifex/services/spinifexui/frontend/src/hooks/use-initial-sidebar.test.tsx index b46ca4dbe..fcbade1b1 100644 --- a/spinifex/services/spinifexui/frontend/src/hooks/use-initial-sidebar.test.tsx +++ b/spinifex/services/spinifexui/frontend/src/hooks/use-initial-sidebar.test.tsx @@ -26,10 +26,10 @@ describe("useInitialSidebar", () => { ({ isOpen }: { isOpen: boolean }) => useInitialSidebar(isOpen), { initialProps: { isOpen: true } }, ) - expect(mockSetOpen).toHaveBeenCalledTimes(1) + expect(mockSetOpen).toHaveBeenCalledOnce() rerender({ isOpen: false }) // Should still only have been called once (the initial mount) - expect(mockSetOpen).toHaveBeenCalledTimes(1) + expect(mockSetOpen).toHaveBeenCalledOnce() }) }) diff --git a/spinifex/services/spinifexui/frontend/src/hooks/use-mobile.test.tsx b/spinifex/services/spinifexui/frontend/src/hooks/use-mobile.test.tsx index 3d14e18e0..be248f7c8 100644 --- a/spinifex/services/spinifexui/frontend/src/hooks/use-mobile.test.tsx +++ b/spinifex/services/spinifexui/frontend/src/hooks/use-mobile.test.tsx @@ -19,28 +19,28 @@ function mockMatchMedia(matches: boolean) { }) } -beforeEach(() => { - vi.resetModules() - changeListener = null -}) - -afterEach(() => { - changeListener = null -}) - describe("useIsMobile", () => { + beforeEach(() => { + vi.resetModules() + changeListener = null + }) + + afterEach(() => { + changeListener = null + }) + it("returns false on desktop viewport", async () => { mockMatchMedia(false) const { useIsMobile } = await import("./use-mobile") const { result } = renderHook(() => useIsMobile()) - expect(result.current).toBe(false) + expect(result.current).toBeFalsy() }) it("returns true on mobile viewport", async () => { mockMatchMedia(true) const { useIsMobile } = await import("./use-mobile") const { result } = renderHook(() => useIsMobile()) - expect(result.current).toBe(true) + expect(result.current).toBeTruthy() }) it("updates when viewport changes", async () => { @@ -62,14 +62,14 @@ describe("useIsMobile", () => { const { useIsMobile } = await import("./use-mobile") const { result } = renderHook(() => useIsMobile()) - expect(result.current).toBe(false) + expect(result.current).toBeFalsy() // Simulate viewport shrink mqlMock.matches = true act(() => { changeListener?.() }) - expect(result.current).toBe(true) + expect(result.current).toBeTruthy() }) it("cleans up listener on unmount", async () => { diff --git a/spinifex/services/spinifexui/frontend/src/lib/auth.test.ts b/spinifex/services/spinifexui/frontend/src/lib/auth.test.ts index 257a85c74..1ac98093a 100644 --- a/spinifex/services/spinifexui/frontend/src/lib/auth.test.ts +++ b/spinifex/services/spinifexui/frontend/src/lib/auth.test.ts @@ -11,35 +11,40 @@ let getCredentials: typeof import("./auth").getCredentials let setCredentials: typeof import("./auth").setCredentials let clearCredentials: typeof import("./auth").clearCredentials -beforeEach(async () => { - // Reset module to get a fresh in-memory cache for each test +async function loadAuth() { vi.resetModules() const auth = await import("./auth") getCredentials = auth.getCredentials setCredentials = auth.setCredentials clearCredentials = auth.clearCredentials -}) - -afterEach(() => { - localStorage.clear() -}) +} describe("setCredentials", () => { + beforeEach(loadAuth) + afterEach(() => { + localStorage.clear() + }) + it("stores credentials in localStorage", () => { setCredentials(validCreds) const stored = localStorage.getItem("spinifex:v1:aws-credentials") - expect(JSON.parse(stored ?? "")).toEqual(validCreds) + expect(JSON.parse(stored ?? "")).toStrictEqual(validCreds) }) it("caches credentials in memory", () => { setCredentials(validCreds) // Clear localStorage to prove it reads from cache localStorage.clear() - expect(getCredentials()).toEqual(validCreds) + expect(getCredentials()).toStrictEqual(validCreds) }) }) describe("getCredentials", () => { + beforeEach(loadAuth) + afterEach(() => { + localStorage.clear() + }) + it("returns null when nothing is stored", () => { expect(getCredentials()).toBeNull() }) @@ -49,15 +54,15 @@ describe("getCredentials", () => { "spinifex:v1:aws-credentials", JSON.stringify(validCreds), ) - expect(getCredentials()).toEqual(validCreds) + expect(getCredentials()).toStrictEqual(validCreds) }) it("returns cached value on subsequent calls", () => { setCredentials(validCreds) localStorage.clear() // Should still return from cache - expect(getCredentials()).toEqual(validCreds) - expect(getCredentials()).toEqual(validCreds) + expect(getCredentials()).toStrictEqual(validCreds) + expect(getCredentials()).toStrictEqual(validCreds) }) it("returns null for invalid JSON in localStorage", () => { @@ -83,6 +88,11 @@ describe("getCredentials", () => { }) describe("clearCredentials", () => { + beforeEach(loadAuth) + afterEach(() => { + localStorage.clear() + }) + it("removes credentials from localStorage", () => { setCredentials(validCreds) clearCredentials() diff --git a/spinifex/services/spinifexui/frontend/src/lib/subnet-calculator.test.ts b/spinifex/services/spinifexui/frontend/src/lib/subnet-calculator.test.ts index c0fc73e55..bd8ac0e02 100644 --- a/spinifex/services/spinifexui/frontend/src/lib/subnet-calculator.test.ts +++ b/spinifex/services/spinifexui/frontend/src/lib/subnet-calculator.test.ts @@ -88,54 +88,54 @@ describe("calculateSubnetCidrs", () => { describe("cidrsOverlap", () => { it("detects overlapping CIDRs", () => { - expect(cidrsOverlap("10.0.0.0/20", "10.0.8.0/24")).toBe(true) + expect(cidrsOverlap("10.0.0.0/20", "10.0.8.0/24")).toBeTruthy() }) it("returns false for non-overlapping CIDRs", () => { - expect(cidrsOverlap("10.0.0.0/20", "10.0.128.0/20")).toBe(false) + expect(cidrsOverlap("10.0.0.0/20", "10.0.128.0/20")).toBeFalsy() }) it("detects identical CIDRs as overlapping", () => { - expect(cidrsOverlap("10.0.0.0/20", "10.0.0.0/20")).toBe(true) + expect(cidrsOverlap("10.0.0.0/20", "10.0.0.0/20")).toBeTruthy() }) }) describe("cidrContains", () => { it("returns true when subnet fits inside VPC", () => { - expect(cidrContains("10.0.0.0/16", "10.0.0.0/20")).toBe(true) + expect(cidrContains("10.0.0.0/16", "10.0.0.0/20")).toBeTruthy() }) it("returns false when subnet exceeds VPC range", () => { - expect(cidrContains("10.0.0.0/16", "10.1.0.0/20")).toBe(false) + expect(cidrContains("10.0.0.0/16", "10.1.0.0/20")).toBeFalsy() }) it("returns true for VPC containing itself", () => { - expect(cidrContains("10.0.0.0/16", "10.0.0.0/16")).toBe(true) + expect(cidrContains("10.0.0.0/16", "10.0.0.0/16")).toBeTruthy() }) }) describe("isValidCidr", () => { it("accepts valid /16 CIDR", () => { - expect(isValidCidr("10.0.0.0/16")).toBe(true) + expect(isValidCidr("10.0.0.0/16")).toBeTruthy() }) it("accepts valid /28 CIDR", () => { - expect(isValidCidr("10.0.0.0/28")).toBe(true) + expect(isValidCidr("10.0.0.0/28")).toBeTruthy() }) it("rejects /15 (too large)", () => { - expect(isValidCidr("10.0.0.0/15")).toBe(false) + expect(isValidCidr("10.0.0.0/15")).toBeFalsy() }) it("rejects /29 (too small)", () => { - expect(isValidCidr("10.0.0.0/29")).toBe(false) + expect(isValidCidr("10.0.0.0/29")).toBeFalsy() }) it("rejects invalid format", () => { - expect(isValidCidr("not-a-cidr")).toBe(false) + expect(isValidCidr("not-a-cidr")).toBeFalsy() }) it("rejects octets > 255", () => { - expect(isValidCidr("256.0.0.0/16")).toBe(false) + expect(isValidCidr("256.0.0.0/16")).toBeFalsy() }) }) diff --git a/spinifex/services/spinifexui/frontend/src/lib/system-managed.test.ts b/spinifex/services/spinifexui/frontend/src/lib/system-managed.test.ts index 695af3fd8..86fc7eb13 100644 --- a/spinifex/services/spinifexui/frontend/src/lib/system-managed.test.ts +++ b/spinifex/services/spinifexui/frontend/src/lib/system-managed.test.ts @@ -15,7 +15,7 @@ describe("isSystemManagedImage", () => { ImageId: "ami-1", Tags: [{ Key: SYSTEM_MANAGED_TAG_KEY, Value: "elbv2" }], } - expect(isSystemManagedImage(image)).toBe(true) + expect(isSystemManagedImage(image)).toBeTruthy() }) it("returns false for customer images with unrelated tags", () => { @@ -23,11 +23,11 @@ describe("isSystemManagedImage", () => { ImageId: "ami-2", Tags: [{ Key: "Name", Value: "my-ami" }], } - expect(isSystemManagedImage(image)).toBe(false) + expect(isSystemManagedImage(image)).toBeFalsy() }) it("returns false for images with no tags", () => { - expect(isSystemManagedImage({ ImageId: "ami-3" })).toBe(false) + expect(isSystemManagedImage({ ImageId: "ami-3" })).toBeFalsy() }) }) @@ -37,7 +37,7 @@ describe("isLbImage", () => { ImageId: "ami-lb", Tags: [{ Key: SYSTEM_MANAGED_TAG_KEY, Value: LB_MANAGED_BY_VALUE }], } - expect(isLbImage(image)).toBe(true) + expect(isLbImage(image)).toBeTruthy() }) it("returns false for system-managed images owned by other components", () => { @@ -45,11 +45,11 @@ describe("isLbImage", () => { ImageId: "ami-other", Tags: [{ Key: SYSTEM_MANAGED_TAG_KEY, Value: "other-service" }], } - expect(isLbImage(image)).toBe(false) + expect(isLbImage(image)).toBeFalsy() }) it("returns false for customer images", () => { - expect(isLbImage({ ImageId: "ami-cust" })).toBe(false) + expect(isLbImage({ ImageId: "ami-cust" })).toBeFalsy() }) }) @@ -62,17 +62,17 @@ describe("hasLbImage", () => { Tags: [{ Key: SYSTEM_MANAGED_TAG_KEY, Value: LB_MANAGED_BY_VALUE }], }, ] - expect(hasLbImage(images)).toBe(true) + expect(hasLbImage(images)).toBeTruthy() }) it("returns false for an empty list", () => { - expect(hasLbImage([])).toBe(false) + expect(hasLbImage([])).toBeFalsy() }) it("returns false when no image carries the elbv2 tag", () => { const images: Image[] = [ { ImageId: "ami-cust", Tags: [{ Key: "Name", Value: "ubuntu" }] }, ] - expect(hasLbImage(images)).toBe(false) + expect(hasLbImage(images)).toBeFalsy() }) }) diff --git a/spinifex/services/spinifexui/frontend/src/mutations/ec2.test.tsx b/spinifex/services/spinifexui/frontend/src/mutations/ec2.test.tsx index b0d9e9d5f..0bde77c8d 100644 --- a/spinifex/services/spinifexui/frontend/src/mutations/ec2.test.tsx +++ b/spinifex/services/spinifexui/frontend/src/mutations/ec2.test.tsx @@ -1,7 +1,7 @@ import { QueryClient, QueryClientProvider } from "@tanstack/react-query" import { renderHook, waitFor } from "@testing-library/react" import type { ReactNode } from "react" -import { afterEach, describe, expect, it, vi } from "vitest" +import { describe, expect, it, vi } from "vitest" const mockSend = vi.fn().mockResolvedValue({}) @@ -54,10 +54,6 @@ function wrapper({ children }: { children: ReactNode }) { ) } -afterEach(() => { - mockSend.mockClear() -}) - function createQueryClient() { queryClient = new QueryClient({ defaultOptions: { @@ -75,11 +71,11 @@ describe("useStartInstance", () => { result.current.mutate("i-abc123") - await waitFor(() => expect(result.current.isSuccess).toBe(true)) + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) expect(mockSend).toHaveBeenCalledOnce() const command = mockSend.mock.calls[0]?.[0] - expect(command.input).toEqual({ InstanceIds: ["i-abc123"] }) + expect(command.input).toStrictEqual({ InstanceIds: ["i-abc123"] }) }) it("invalidates instances query on success", async () => { @@ -89,7 +85,7 @@ describe("useStartInstance", () => { result.current.mutate("i-abc123") - await waitFor(() => expect(result.current.isSuccess).toBe(true)) + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) expect(spy).toHaveBeenCalledWith({ queryKey: ["ec2", "instances"] }) }) }) @@ -101,8 +97,8 @@ describe("useStopInstance", () => { result.current.mutate("i-abc123") - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ InstanceIds: ["i-abc123"], }) }) @@ -115,8 +111,8 @@ describe("useTerminateInstance", () => { result.current.mutate("i-abc123") - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ InstanceIds: ["i-abc123"], }) }) @@ -135,8 +131,8 @@ describe("useCreateInstance", () => { subnetId: "subnet-1", }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toMatchObject({ ImageId: "ami-123", InstanceType: "t2.micro", KeyName: "my-key", @@ -158,7 +154,7 @@ describe("useCreateInstance", () => { subnetId: "", }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) expect(mockSend.mock.calls[0]?.[0].input.SubnetId).toBeUndefined() }) @@ -174,8 +170,8 @@ describe("useCreateInstance", () => { placementGroupName: "my-group", }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input.Placement).toEqual({ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input.Placement).toStrictEqual({ GroupName: "my-group", }) }) @@ -192,7 +188,7 @@ describe("useCreateInstance", () => { placementGroupName: "", }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) expect(mockSend.mock.calls[0]?.[0].input.Placement).toBeUndefined() }) @@ -208,7 +204,7 @@ describe("useCreateInstance", () => { rootDeviceName: "/dev/sda1", }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) expect( mockSend.mock.calls[0]?.[0].input.BlockDeviceMappings, ).toBeUndefined() @@ -229,17 +225,19 @@ describe("useCreateInstance", () => { rootDeleteOnTermination: true, }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input.BlockDeviceMappings).toEqual([ - { - DeviceName: "/dev/sda1", - Ebs: { - VolumeSize: 100, - VolumeType: "gp3", - DeleteOnTermination: true, + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input.BlockDeviceMappings).toStrictEqual( + [ + { + DeviceName: "/dev/sda1", + Ebs: { + VolumeSize: 100, + VolumeType: "gp3", + DeleteOnTermination: true, + }, }, - }, - ]) + ], + ) }) it("includes only the storage fields the user set", async () => { @@ -255,15 +253,17 @@ describe("useCreateInstance", () => { rootDeleteOnTermination: false, }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input.BlockDeviceMappings).toEqual([ - { - DeviceName: "/dev/sda1", - Ebs: { - DeleteOnTermination: false, + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input.BlockDeviceMappings).toStrictEqual( + [ + { + DeviceName: "/dev/sda1", + Ebs: { + DeleteOnTermination: false, + }, }, - }, - ]) + ], + ) }) }) @@ -277,7 +277,7 @@ describe("useImportKeyPair", () => { publicKeyMaterial: "ssh-rsa AAAAB3Nza... user@host", }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) const input = mockSend.mock.calls[0]?.[0].input expect(input.KeyName).toBe("my-key") @@ -295,7 +295,7 @@ describe("useImportKeyPair", () => { publicKeyMaterial: "ssh-rsa AAAAB3Nza...", }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) const decoded = new TextDecoder().decode( mockSend.mock.calls[0]?.[0].input.PublicKeyMaterial, ) @@ -311,7 +311,7 @@ describe("useImportKeyPair", () => { publicKeyMaterial: " ssh-rsa AAAAB3Nza... user@host ", }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) const decoded = new TextDecoder().decode( mockSend.mock.calls[0]?.[0].input.PublicKeyMaterial, ) @@ -326,8 +326,8 @@ describe("useRebootInstance", () => { result.current.mutate("i-abc123") - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ InstanceIds: ["i-abc123"], }) }) @@ -340,8 +340,8 @@ describe("useCreateKeyPair", () => { result.current.mutate({ keyName: "my-key" }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ KeyName: "my-key", KeyType: "rsa", }) @@ -355,8 +355,8 @@ describe("useDeleteKeyPair", () => { result.current.mutate("kp-abc123") - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ KeyPairId: "kp-abc123", }) }) @@ -369,8 +369,8 @@ describe("useCreateVolume", () => { result.current.mutate({ size: 100, availabilityZone: "us-east-1a" }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ Size: 100, AvailabilityZone: "us-east-1a", VolumeType: "gp3", @@ -385,8 +385,8 @@ describe("useModifyVolume", () => { result.current.mutate({ volumeId: "vol-123", size: 200 }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ VolumeId: "vol-123", Size: 200, }) @@ -400,8 +400,8 @@ describe("useDeleteVolume", () => { result.current.mutate("vol-123") - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ VolumeId: "vol-123", }) }) @@ -414,8 +414,8 @@ describe("useCreateSnapshot", () => { result.current.mutate({ volumeId: "vol-123", description: "backup" }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ VolumeId: "vol-123", Description: "backup", }) @@ -427,7 +427,7 @@ describe("useCreateSnapshot", () => { result.current.mutate({ volumeId: "vol-123", description: "" }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) expect(mockSend.mock.calls[0]?.[0].input.Description).toBeUndefined() }) }) @@ -439,8 +439,8 @@ describe("useDeleteSnapshot", () => { result.current.mutate("snap-123") - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ SnapshotId: "snap-123", }) }) @@ -457,8 +457,8 @@ describe("useCopySnapshot", () => { description: "copy", }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ SourceSnapshotId: "snap-123", SourceRegion: "us-east-1", Description: "copy", @@ -477,8 +477,8 @@ describe("useAttachVolume", () => { device: "/dev/sdf", }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ VolumeId: "vol-123", InstanceId: "i-abc", Device: "/dev/sdf", @@ -497,8 +497,8 @@ describe("useDetachVolume", () => { force: true, }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ VolumeId: "vol-123", InstanceId: "i-abc", Force: true, @@ -518,8 +518,8 @@ describe("useModifyInstanceAttribute", () => { instanceType: "t3.large", }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ InstanceId: "i-abc", InstanceType: { Value: "t3.large" }, }) @@ -533,8 +533,8 @@ describe("useGetConsoleOutput", () => { result.current.mutate("i-abc123") - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ InstanceId: "i-abc123", }) }) @@ -551,8 +551,8 @@ describe("useCreateImage", () => { description: "test image", }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ InstanceId: "i-abc", Name: "my-image", Description: "test image", @@ -567,8 +567,8 @@ describe("useCreateVpc", () => { result.current.mutate({ cidrBlock: "10.0.0.0/16", name: "my-vpc" }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ CidrBlock: "10.0.0.0/16", TagSpecifications: [ { @@ -585,7 +585,7 @@ describe("useCreateVpc", () => { result.current.mutate({ cidrBlock: "10.0.0.0/16", name: "" }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) expect(mockSend.mock.calls[0]?.[0].input.TagSpecifications).toBeUndefined() }) }) @@ -597,8 +597,8 @@ describe("useDeleteVpc", () => { result.current.mutate("vpc-123") - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ VpcId: "vpc-123", }) }) @@ -615,8 +615,8 @@ describe("useCreateSubnet", () => { availabilityZone: "us-east-1a", }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ VpcId: "vpc-123", CidrBlock: "10.0.1.0/24", AvailabilityZone: "us-east-1a", @@ -631,8 +631,8 @@ describe("useDeleteSubnet", () => { result.current.mutate("subnet-123") - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ SubnetId: "subnet-123", }) }) @@ -645,8 +645,8 @@ describe("useCreatePlacementGroup", () => { result.current.mutate({ groupName: "my-group", strategy: "spread" }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ GroupName: "my-group", Strategy: "spread", }) @@ -659,7 +659,7 @@ describe("useCreatePlacementGroup", () => { result.current.mutate({ groupName: "my-group", strategy: "cluster" }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) expect(spy).toHaveBeenCalledWith({ queryKey: ["ec2", "placementGroups"], }) @@ -673,8 +673,8 @@ describe("useDeletePlacementGroup", () => { result.current.mutate("my-group") - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ GroupName: "my-group", }) }) @@ -686,7 +686,7 @@ describe("useDeletePlacementGroup", () => { result.current.mutate("my-group") - await waitFor(() => expect(result.current.isSuccess).toBe(true)) + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) expect(spy).toHaveBeenCalledWith({ queryKey: ["ec2", "placementGroups"], }) @@ -704,8 +704,8 @@ describe("useCreateSecurityGroup", () => { vpcId: "vpc-123", }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ GroupName: "web-sg", Description: "Allow web traffic", VpcId: "vpc-123", @@ -723,7 +723,7 @@ describe("useCreateSecurityGroup", () => { vpcId: "vpc-123", }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) expect(spy).toHaveBeenCalledWith({ queryKey: ["ec2", "securityGroups"], }) @@ -737,8 +737,8 @@ describe("useDeleteSecurityGroup", () => { result.current.mutate("sg-123") - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ GroupId: "sg-123", }) }) @@ -750,7 +750,7 @@ describe("useDeleteSecurityGroup", () => { result.current.mutate("sg-123") - await waitFor(() => expect(result.current.isSuccess).toBe(true)) + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) expect(spy).toHaveBeenCalledWith({ queryKey: ["ec2", "securityGroups"], }) @@ -774,8 +774,8 @@ describe("useAuthorizeSecurityGroupIngress", () => { result.current.mutate(ruleParams) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ GroupId: "sg-123", IpPermissions: [ { @@ -797,7 +797,7 @@ describe("useAuthorizeSecurityGroupIngress", () => { result.current.mutate(ruleParams) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) expect(spy).toHaveBeenCalledWith({ queryKey: ["ec2", "securityGroups"], }) @@ -822,8 +822,8 @@ describe("useAuthorizeSecurityGroupEgress", () => { cidrIp: "0.0.0.0/0", }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ GroupId: "sg-456", IpPermissions: [ { @@ -852,8 +852,8 @@ describe("useRevokeSecurityGroupIngress", () => { cidrIp: "10.0.0.0/16", }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ GroupId: "sg-123", IpPermissions: [ { @@ -881,7 +881,7 @@ describe("useRevokeSecurityGroupIngress", () => { cidrIp: "10.0.0.0/16", }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) expect(spy).toHaveBeenCalledWith({ queryKey: ["ec2", "securityGroups"], }) @@ -906,8 +906,8 @@ describe("useRevokeSecurityGroupEgress", () => { cidrIp: "0.0.0.0/0", }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ GroupId: "sg-456", IpPermissions: [ { @@ -944,7 +944,7 @@ describe("useCreateVpcWizard", () => { result.current.mutate(baseParams) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) expect(mockSend).toHaveBeenCalledOnce() expect(mockSend.mock.calls[0]?.[0].input.CidrBlock).toBe("10.0.0.0/16") expect(result.current.data?.vpcId).toBe("vpc-111") @@ -964,7 +964,7 @@ describe("useCreateVpcWizard", () => { autoGenerateNames: true, }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) const tags = mockSend.mock.calls[0]?.[0].input.TagSpecifications expect(tags?.[0]?.Tags).toContainEqual({ Key: "Name", @@ -1005,7 +1005,7 @@ describe("useCreateVpcWizard", () => { privateSubnetCount: 1, }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) expect(mockSend).toHaveBeenCalledTimes(10) expect(result.current.data?.vpcId).toBe("vpc-111") expect(result.current.data?.created).toHaveLength(6) @@ -1032,7 +1032,7 @@ describe("useCreateVpcWizard", () => { privateSubnetCount: 1, }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) expect(mockSend).toHaveBeenCalledTimes(4) const types = result.current.data?.created.map((r) => r.type) expect(types).not.toContain("Internet Gateway") @@ -1055,7 +1055,7 @@ describe("useCreateVpcWizard", () => { privateSubnetCount: 1, }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) expect(result.current.data?.error?.message).toBe("CIDR conflict") expect(result.current.data?.failedStep).toBe( "Failed while creating private subnets", @@ -1072,7 +1072,7 @@ describe("useCreateVpcWizard", () => { result.current.mutate(baseParams) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) expect(result.current.data?.error?.message).toBe("Access denied") expect(result.current.data?.failedStep).toBe("Failed while creating VPC") expect(result.current.data?.vpcId).toBeUndefined() @@ -1087,7 +1087,7 @@ describe("useCreateVpcWizard", () => { result.current.mutate(baseParams) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) expect(result.current.data?.error?.message).toContain( "no VPC ID was returned", ) @@ -1102,7 +1102,7 @@ describe("useCreateVpcWizard", () => { result.current.mutate(baseParams) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) expect(spy).toHaveBeenCalledWith({ queryKey: ["ec2", "vpcs"] }) expect(spy).toHaveBeenCalledWith({ queryKey: ["ec2", "subnets"] }) expect(spy).toHaveBeenCalledWith({ @@ -1122,7 +1122,7 @@ describe("useCreateVpcWizard", () => { tags: [{ key: "Env", value: "prod" }], }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) const tags = mockSend.mock.calls[0]?.[0].input.TagSpecifications?.[0]?.Tags expect(tags).toContainEqual({ Key: "Env", Value: "prod" }) }) diff --git a/spinifex/services/spinifexui/frontend/src/mutations/elbv2.test.tsx b/spinifex/services/spinifexui/frontend/src/mutations/elbv2.test.tsx index bf0cfc572..e31b96e6e 100644 --- a/spinifex/services/spinifexui/frontend/src/mutations/elbv2.test.tsx +++ b/spinifex/services/spinifexui/frontend/src/mutations/elbv2.test.tsx @@ -1,7 +1,7 @@ import { QueryClient, QueryClientProvider } from "@tanstack/react-query" import { renderHook, waitFor } from "@testing-library/react" import type { ReactNode } from "react" -import { afterEach, describe, expect, it, vi } from "vitest" +import { describe, expect, it, vi } from "vitest" const mockSend = vi.fn().mockResolvedValue({}) @@ -35,10 +35,6 @@ function wrapper({ children }: { children: ReactNode }) { ) } -afterEach(() => { - mockSend.mockClear() -}) - function createQueryClient() { queryClient = new QueryClient({ defaultOptions: { @@ -64,8 +60,8 @@ describe("useModifyLoadBalancerAttributes", () => { ], }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ LoadBalancerArn: "arn:lb:1", Attributes: [ { Key: "deletion_protection.enabled", Value: "true" }, @@ -87,8 +83,8 @@ describe("useModifyTargetGroupAttributes", () => { attributes: [{ key: "stickiness.enabled", value: "true" }], }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ TargetGroupArn: TG_ARN, Attributes: [{ Key: "stickiness.enabled", Value: "true" }], }) @@ -102,8 +98,8 @@ describe("useDeleteLoadBalancer", () => { result.current.mutate("arn:aws:elasticloadbalancing:lb/app/foo/abc") - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ LoadBalancerArn: "arn:aws:elasticloadbalancing:lb/app/foo/abc", }) }) @@ -116,8 +112,8 @@ describe("useDeleteTargetGroup", () => { result.current.mutate("arn:aws:elasticloadbalancing:tg/app/foo/abc") - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ TargetGroupArn: "arn:aws:elasticloadbalancing:tg/app/foo/abc", }) }) @@ -148,8 +144,8 @@ describe("useCreateTargetGroup", () => { result.current.mutate(baseParams) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ Name: "my-tg", Protocol: "HTTP", Port: 80, @@ -179,8 +175,8 @@ describe("useCreateTargetGroup", () => { ], }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input.Tags).toEqual([ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input.Tags).toStrictEqual([ { Key: "env", Value: "prod" }, ]) }) @@ -199,8 +195,8 @@ describe("useCreateLoadBalancer", () => { tags: [{ key: "env", value: "prod" }], }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ Name: "my-alb", Scheme: "internet-facing", Type: "application", @@ -223,7 +219,7 @@ describe("useCreateLoadBalancer", () => { tags: [], }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) const input = mockSend.mock.calls[0]?.[0].input expect(input.SecurityGroups).toBeUndefined() expect(input.Tags).toBeUndefined() @@ -242,8 +238,8 @@ describe("useCreateListener", () => { defaultTargetGroupArn: "arn:tg:1", }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ LoadBalancerArn: "arn:lb:1", Protocol: "HTTP", Port: 80, @@ -262,8 +258,8 @@ describe("useRegisterTargets", () => { targets: [{ id: "i-aaa" }, { id: "i-bbb" }], }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ TargetGroupArn: TG_ARN, Targets: [ { Id: "i-aaa", Port: undefined }, @@ -281,8 +277,8 @@ describe("useRegisterTargets", () => { targets: [{ id: "i-aaa", port: 8080 }], }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input.Targets).toEqual([ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input.Targets).toStrictEqual([ { Id: "i-aaa", Port: 8080 }, ]) }) @@ -298,8 +294,8 @@ describe("useDeregisterTargets", () => { targets: [{ id: "i-aaa", port: 80 }], }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ TargetGroupArn: TG_ARN, Targets: [{ Id: "i-aaa", Port: 80 }], }) @@ -313,8 +309,8 @@ describe("useDeleteListener", () => { result.current.mutate("arn:listener:1") - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ ListenerArn: "arn:listener:1", }) }) @@ -373,7 +369,7 @@ describe("useCreateLoadBalancerWizard", () => { }, }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) expect(result.current.data?.error).toBeUndefined() expect(result.current.data?.loadBalancerArn).toBe("arn:lb:new") expect(result.current.data?.created).toHaveLength(3) @@ -402,7 +398,7 @@ describe("useCreateLoadBalancerWizard", () => { }, }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) expect(mockSend).toHaveBeenCalledTimes(2) expect(result.current.data?.created).toHaveLength(2) }) @@ -429,10 +425,10 @@ describe("useCreateLoadBalancerWizard", () => { }, }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) expect(result.current.data?.error?.message).toBe("lb boom") expect(result.current.data?.failedStep).toBe("creating load balancer") - expect(result.current.data?.created).toEqual([ + expect(result.current.data?.created).toStrictEqual([ { type: "Target Group", id: "arn:tg:new" }, ]) expect(result.current.data?.loadBalancerArn).toBeUndefined() diff --git a/spinifex/services/spinifexui/frontend/src/mutations/iam.test.tsx b/spinifex/services/spinifexui/frontend/src/mutations/iam.test.tsx index 99a120efb..6e49aaaf1 100644 --- a/spinifex/services/spinifexui/frontend/src/mutations/iam.test.tsx +++ b/spinifex/services/spinifexui/frontend/src/mutations/iam.test.tsx @@ -1,7 +1,7 @@ import { QueryClient, QueryClientProvider } from "@tanstack/react-query" import { renderHook, waitFor } from "@testing-library/react" import type { ReactNode } from "react" -import { afterEach, describe, expect, it, vi } from "vitest" +import { describe, expect, it, vi } from "vitest" const mockSend = vi.fn().mockResolvedValue({}) @@ -39,10 +39,6 @@ function createQueryClient() { return queryClient } -afterEach(() => { - mockSend.mockClear() -}) - describe("useCreateUser", () => { it("sends CreateUserCommand with userName", async () => { createQueryClient() @@ -50,8 +46,8 @@ describe("useCreateUser", () => { result.current.mutate({ userName: "admin" }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ UserName: "admin", Path: undefined, }) @@ -63,8 +59,8 @@ describe("useCreateUser", () => { result.current.mutate({ userName: "admin", path: "/engineering/" }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ UserName: "admin", Path: "/engineering/", }) @@ -77,7 +73,7 @@ describe("useCreateUser", () => { result.current.mutate({ userName: "admin" }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) expect(spy).toHaveBeenCalledWith({ queryKey: ["iam", "users"] }) }) }) @@ -89,8 +85,10 @@ describe("useDeleteUser", () => { result.current.mutate("admin") - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ UserName: "admin" }) + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ + UserName: "admin", + }) }) }) @@ -101,8 +99,10 @@ describe("useCreateAccessKey", () => { result.current.mutate("admin") - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ UserName: "admin" }) + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ + UserName: "admin", + }) }) it("invalidates access-keys query on success", async () => { @@ -112,7 +112,7 @@ describe("useCreateAccessKey", () => { result.current.mutate("admin") - await waitFor(() => expect(result.current.isSuccess).toBe(true)) + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) expect(spy).toHaveBeenCalledWith({ queryKey: ["iam", "access-keys"] }) }) }) @@ -124,8 +124,8 @@ describe("useDeleteAccessKey", () => { result.current.mutate({ userName: "admin", accessKeyId: "AKIA123" }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ UserName: "admin", AccessKeyId: "AKIA123", }) @@ -143,8 +143,8 @@ describe("useUpdateAccessKey", () => { status: "Inactive", }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ UserName: "admin", AccessKeyId: "AKIA123", Status: "Inactive", @@ -162,8 +162,8 @@ describe("useCreatePolicy", () => { policyDocument: '{"Version":"2012-10-17"}', }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ PolicyName: "ReadOnly", Description: undefined, PolicyDocument: '{"Version":"2012-10-17"}', @@ -180,7 +180,7 @@ describe("useCreatePolicy", () => { policyDocument: "{}", }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) expect(mockSend.mock.calls[0]?.[0].input.Description).toBe( "Read-only access", ) @@ -193,7 +193,7 @@ describe("useCreatePolicy", () => { result.current.mutate({ policyName: "ReadOnly", policyDocument: "{}" }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) expect(spy).toHaveBeenCalledWith({ queryKey: ["iam", "policies"] }) }) }) @@ -205,8 +205,8 @@ describe("useDeletePolicy", () => { result.current.mutate("arn:aws:iam::123:policy/ReadOnly") - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ PolicyArn: "arn:aws:iam::123:policy/ReadOnly", }) }) @@ -219,8 +219,8 @@ describe("useAttachUserPolicy", () => { result.current.mutate({ userName: "admin", policyArn: "arn:test" }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ UserName: "admin", PolicyArn: "arn:test", }) @@ -233,7 +233,7 @@ describe("useAttachUserPolicy", () => { result.current.mutate({ userName: "admin", policyArn: "arn:test" }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) expect(spy).toHaveBeenCalledWith({ queryKey: ["iam", "attached-user-policies"], }) @@ -247,8 +247,8 @@ describe("useDetachUserPolicy", () => { result.current.mutate({ userName: "admin", policyArn: "arn:test" }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ UserName: "admin", PolicyArn: "arn:test", }) @@ -261,7 +261,7 @@ describe("useDetachUserPolicy", () => { result.current.mutate({ userName: "admin", policyArn: "arn:test" }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) expect(spy).toHaveBeenCalledWith({ queryKey: ["iam", "attached-user-policies"], }) diff --git a/spinifex/services/spinifexui/frontend/src/mutations/s3.test.tsx b/spinifex/services/spinifexui/frontend/src/mutations/s3.test.tsx index 700209178..d2126d090 100644 --- a/spinifex/services/spinifexui/frontend/src/mutations/s3.test.tsx +++ b/spinifex/services/spinifexui/frontend/src/mutations/s3.test.tsx @@ -1,7 +1,7 @@ import { QueryClient, QueryClientProvider } from "@tanstack/react-query" import { renderHook, waitFor } from "@testing-library/react" import type { ReactNode } from "react" -import { afterEach, describe, expect, it, vi } from "vitest" +import { describe, expect, it, vi } from "vitest" const mockSend = vi.fn().mockResolvedValue({}) @@ -41,10 +41,6 @@ function createQueryClient() { return queryClient } -afterEach(() => { - mockSend.mockClear() -}) - describe("useCreateBucket", () => { it("sends CreateBucketCommand with bucket name", async () => { createQueryClient() @@ -52,8 +48,10 @@ describe("useCreateBucket", () => { result.current.mutate({ bucketName: "my-bucket" }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ Bucket: "my-bucket" }) + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ + Bucket: "my-bucket", + }) }) it("invalidates buckets query on success", async () => { @@ -63,7 +61,7 @@ describe("useCreateBucket", () => { result.current.mutate({ bucketName: "my-bucket" }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) expect(spy).toHaveBeenCalledWith({ queryKey: ["s3", "buckets"] }) }) }) @@ -75,8 +73,8 @@ describe("useDeleteObject", () => { result.current.mutate({ bucket: "my-bucket", key: "photos/cat.jpg" }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) - expect(mockSend.mock.calls[0]?.[0].input).toEqual({ + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) + expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ Bucket: "my-bucket", Key: "photos/cat.jpg", }) @@ -89,7 +87,7 @@ describe("useDeleteObject", () => { result.current.mutate({ bucket: "my-bucket", key: "file.txt" }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) expect(spy).toHaveBeenCalledWith({ queryKey: ["s3", "buckets", "my-bucket", "objects"], }) @@ -105,7 +103,7 @@ describe("useUploadObject", () => { const file = new File(["hello"], "test.txt", { type: "text/plain" }) result.current.mutate({ bucket: "my-bucket", key: "test.txt", file }) - await waitFor(() => expect(result.current.isSuccess).toBe(true)) + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()) expect(spy).toHaveBeenCalledWith({ queryKey: ["s3", "buckets", "my-bucket", "objects"], }) diff --git a/spinifex/services/spinifexui/frontend/src/queries/admin.test.ts b/spinifex/services/spinifexui/frontend/src/queries/admin.test.ts index c4e6fb85f..f0545ca64 100644 --- a/spinifex/services/spinifexui/frontend/src/queries/admin.test.ts +++ b/spinifex/services/spinifexui/frontend/src/queries/admin.test.ts @@ -31,7 +31,7 @@ function getQueryFn(opts: { describe("adminNodesQueryOptions", () => { it("has the correct query key", () => { - expect(adminNodesQueryOptions.queryKey).toEqual(["admin", "nodes"]) + expect(adminNodesQueryOptions.queryKey).toStrictEqual(["admin", "nodes"]) }) it("throws when not authenticated", async () => { @@ -57,7 +57,7 @@ describe("adminNodesQueryOptions", () => { describe("adminVMsQueryOptions", () => { it("has the correct query key", () => { - expect(adminVMsQueryOptions.queryKey).toEqual(["admin", "vms"]) + expect(adminVMsQueryOptions.queryKey).toStrictEqual(["admin", "vms"]) }) it("throws when not authenticated", async () => { @@ -83,7 +83,7 @@ describe("adminVMsQueryOptions", () => { describe("adminStorageStatusQueryOptions", () => { it("has the correct query key", () => { - expect(adminStorageStatusQueryOptions.queryKey).toEqual([ + expect(adminStorageStatusQueryOptions.queryKey).toStrictEqual([ "admin", "storageStatus", ]) diff --git a/spinifex/services/spinifexui/frontend/src/queries/ec2.test.ts b/spinifex/services/spinifexui/frontend/src/queries/ec2.test.ts index e075d62cf..eaa63a748 100644 --- a/spinifex/services/spinifexui/frontend/src/queries/ec2.test.ts +++ b/spinifex/services/spinifexui/frontend/src/queries/ec2.test.ts @@ -32,11 +32,14 @@ import { describe("query keys", () => { it("ec2InstancesQueryOptions has correct key", () => { - expect(ec2InstancesQueryOptions.queryKey).toEqual(["ec2", "instances"]) + expect(ec2InstancesQueryOptions.queryKey).toStrictEqual([ + "ec2", + "instances", + ]) }) it("ec2InstanceQueryOptions includes instanceId in key", () => { - expect(ec2InstanceQueryOptions("i-123").queryKey).toEqual([ + expect(ec2InstanceQueryOptions("i-123").queryKey).toStrictEqual([ "ec2", "instances", "i-123", @@ -44,11 +47,11 @@ describe("query keys", () => { }) it("ec2ImagesQueryOptions has correct key", () => { - expect(ec2ImagesQueryOptions.queryKey).toEqual(["ec2", "images"]) + expect(ec2ImagesQueryOptions.queryKey).toStrictEqual(["ec2", "images"]) }) it("ec2ImageQueryOptions uses 'none' for undefined imageId", () => { - expect(ec2ImageQueryOptions(undefined).queryKey).toEqual([ + expect(ec2ImageQueryOptions(undefined).queryKey).toStrictEqual([ "ec2", "images", "none", @@ -56,11 +59,11 @@ describe("query keys", () => { }) it("ec2KeyPairsQueryOptions has correct key", () => { - expect(ec2KeyPairsQueryOptions.queryKey).toEqual(["ec2", "keypairs"]) + expect(ec2KeyPairsQueryOptions.queryKey).toStrictEqual(["ec2", "keypairs"]) }) it("ec2KeyPairQueryOptions includes keyPairId", () => { - expect(ec2KeyPairQueryOptions("kp-abc").queryKey).toEqual([ + expect(ec2KeyPairQueryOptions("kp-abc").queryKey).toStrictEqual([ "ec2", "keypairs", "kp-abc", @@ -68,11 +71,11 @@ describe("query keys", () => { }) it("ec2VolumesQueryOptions has correct key", () => { - expect(ec2VolumesQueryOptions.queryKey).toEqual(["ec2", "volumes"]) + expect(ec2VolumesQueryOptions.queryKey).toStrictEqual(["ec2", "volumes"]) }) it("ec2VolumeQueryOptions includes volumeId", () => { - expect(ec2VolumeQueryOptions("vol-1").queryKey).toEqual([ + expect(ec2VolumeQueryOptions("vol-1").queryKey).toStrictEqual([ "ec2", "volumes", "vol-1", @@ -80,11 +83,14 @@ describe("query keys", () => { }) it("ec2SnapshotsQueryOptions has correct key", () => { - expect(ec2SnapshotsQueryOptions.queryKey).toEqual(["ec2", "snapshots"]) + expect(ec2SnapshotsQueryOptions.queryKey).toStrictEqual([ + "ec2", + "snapshots", + ]) }) it("ec2SnapshotQueryOptions includes snapshotId", () => { - expect(ec2SnapshotQueryOptions("snap-1").queryKey).toEqual([ + expect(ec2SnapshotQueryOptions("snap-1").queryKey).toStrictEqual([ "ec2", "snapshots", "snap-1", @@ -92,11 +98,11 @@ describe("query keys", () => { }) it("ec2VpcsQueryOptions has correct key", () => { - expect(ec2VpcsQueryOptions.queryKey).toEqual(["ec2", "vpcs"]) + expect(ec2VpcsQueryOptions.queryKey).toStrictEqual(["ec2", "vpcs"]) }) it("ec2VpcQueryOptions includes vpcId", () => { - expect(ec2VpcQueryOptions("vpc-1").queryKey).toEqual([ + expect(ec2VpcQueryOptions("vpc-1").queryKey).toStrictEqual([ "ec2", "vpcs", "vpc-1", @@ -104,11 +110,11 @@ describe("query keys", () => { }) it("ec2SubnetsQueryOptions has correct key", () => { - expect(ec2SubnetsQueryOptions.queryKey).toEqual(["ec2", "subnets"]) + expect(ec2SubnetsQueryOptions.queryKey).toStrictEqual(["ec2", "subnets"]) }) it("ec2SubnetQueryOptions includes subnetId", () => { - expect(ec2SubnetQueryOptions("subnet-1").queryKey).toEqual([ + expect(ec2SubnetQueryOptions("subnet-1").queryKey).toStrictEqual([ "ec2", "subnets", "subnet-1", @@ -116,7 +122,7 @@ describe("query keys", () => { }) it("ec2InstanceTypesQueryOptions has correct key", () => { - expect(ec2InstanceTypesQueryOptions.queryKey).toEqual([ + expect(ec2InstanceTypesQueryOptions.queryKey).toStrictEqual([ "ec2", "instances", "types", @@ -124,14 +130,14 @@ describe("query keys", () => { }) it("ec2PlacementGroupsQueryOptions has correct key", () => { - expect(ec2PlacementGroupsQueryOptions.queryKey).toEqual([ + expect(ec2PlacementGroupsQueryOptions.queryKey).toStrictEqual([ "ec2", "placementGroups", ]) }) it("ec2PlacementGroupQueryOptions includes groupId in key", () => { - expect(ec2PlacementGroupQueryOptions("pg-123").queryKey).toEqual([ + expect(ec2PlacementGroupQueryOptions("pg-123").queryKey).toStrictEqual([ "ec2", "placementGroups", "pg-123", @@ -139,14 +145,14 @@ describe("query keys", () => { }) it("ec2SecurityGroupsQueryOptions has correct key", () => { - expect(ec2SecurityGroupsQueryOptions.queryKey).toEqual([ + expect(ec2SecurityGroupsQueryOptions.queryKey).toStrictEqual([ "ec2", "securityGroups", ]) }) it("ec2SecurityGroupQueryOptions includes groupId in key", () => { - expect(ec2SecurityGroupQueryOptions("sg-123").queryKey).toEqual([ + expect(ec2SecurityGroupQueryOptions("sg-123").queryKey).toStrictEqual([ "ec2", "securityGroups", "sg-123", @@ -189,7 +195,7 @@ describe("queryFn", () => { const options = ec2ImageQueryOptions(undefined) const queryFn = options.queryFn as (ctx: never) => Promise