chore(ui): enable vitest lint rules

This commit is contained in:
Julian Sommer
2026-05-08 12:36:33 +10:00
parent 6fa82c470d
commit fc0cc85731
30 changed files with 545 additions and 532 deletions
@@ -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",
},
},
],
@@ -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",
@@ -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",
@@ -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(<ListenersTab loadBalancerArn={LB_ARN} vpcId="vpc-aaa" />, {
@@ -128,7 +128,7 @@ describe("ListenersTab", () => {
expect(mockSend.mock.calls.length).toBeGreaterThan(before),
)
const call = mockSend.mock.calls[before]?.[0]
expect(call.input).toEqual({ ListenerArn: "arn:listener/1" })
expect(call.input).toStrictEqual({ ListenerArn: "arn:listener/1" })
})
it("filters target groups by vpcId in the add-listener dialog", async () => {
@@ -158,7 +158,7 @@ describe("ListenersTab", () => {
})
await user.click(screen.getByRole("button", { name: "Add listener" }))
await user.click(screen.getByLabelText("Default target group"))
expect(await screen.findByText(/tg-in-vpc/)).toBeInTheDocument()
await expect(screen.findByText(/tg-in-vpc/)).resolves.toBeInTheDocument()
expect(screen.queryByText(/tg-other-vpc/)).not.toBeInTheDocument()
})
@@ -190,7 +190,7 @@ describe("ListenersTab", () => {
expect(mockSend.mock.calls.length).toBeGreaterThan(before),
)
const call = mockSend.mock.calls[before]?.[0]
expect(call.input).toEqual({
expect(call.input).toStrictEqual({
LoadBalancerArn: LB_ARN,
Protocol: "HTTP",
Port: 80,
@@ -48,11 +48,11 @@ function seedClient(opts: {
return queryClient
}
afterEach(() => {
mockSend.mockReset()
})
describe("TargetsTab", () => {
afterEach(() => {
mockSend.mockReset()
})
it("renders empty state when no targets registered", () => {
const queryClient = seedClient({})
render(
@@ -134,7 +134,7 @@ describe("TargetsTab", () => {
expect(mockSend.mock.calls.length).toBeGreaterThan(deregCallsBefore),
)
const deregCall = mockSend.mock.calls[deregCallsBefore]?.[0]
expect(deregCall.input).toEqual({
expect(deregCall.input).toStrictEqual({
TargetGroupArn: TG_ARN,
Targets: [{ Id: "i-aaa", Port: 80 }],
})
@@ -8,16 +8,18 @@ function wrapper({ children }: { children: ReactNode }) {
return <ThemeProvider defaultTheme="light">{children}</ThemeProvider>
}
beforeEach(() => {
function setupThemeEnv() {
localStorage.clear()
document.documentElement.classList.remove("light", "dark")
Object.defineProperty(window, "matchMedia", {
writable: true,
value: vi.fn().mockReturnValue({ matches: false }),
})
})
}
describe("ThemeProvider", () => {
beforeEach(setupThemeEnv)
it("renders children", () => {
render(
<ThemeProvider>
@@ -33,7 +35,7 @@ describe("ThemeProvider", () => {
<p>Test</p>
</ThemeProvider>,
)
expect(document.documentElement.classList.contains("light")).toBe(true)
expect(document.documentElement.classList.contains("light")).toBeTruthy()
})
it("applies dark class to documentElement", () => {
@@ -42,7 +44,7 @@ describe("ThemeProvider", () => {
<p>Test</p>
</ThemeProvider>,
)
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", () => {
<p>Test</p>
</ThemeProvider>,
)
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", () => {
<p>Test</p>
</ThemeProvider>,
)
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", () => {
<p>Test</p>
</ThemeProvider>,
)
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", () => {
<p>Test</p>
</ThemeProvider>,
)
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()
})
})
@@ -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()
})
})
@@ -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()
})
})
@@ -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 () => {
@@ -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()
@@ -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()
})
})
@@ -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()
})
})
@@ -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" })
})
@@ -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()
@@ -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"],
})
@@ -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"],
})
@@ -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",
])
@@ -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<unknown>
const result = await queryFn({} as never)
expect(result).toEqual({ Images: [], $metadata: {} })
expect(result).toStrictEqual({ Images: [], $metadata: {} })
expect(mockSend).not.toHaveBeenCalled()
})
@@ -199,7 +205,7 @@ describe("queryFn", () => {
) => Promise<unknown>
await queryFn({} as never)
expect(mockSend).toHaveBeenCalledOnce()
expect(mockSend.mock.calls[0]?.[0].input).toEqual({
expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({
ImageIds: ["ami-123"],
})
})
@@ -210,7 +216,7 @@ describe("queryFn", () => {
) => Promise<unknown>
await queryFn({} as never)
expect(mockSend).toHaveBeenCalledOnce()
expect(mockSend.mock.calls[0]?.[0].input).toEqual({})
expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({})
})
it("ec2InstanceQueryOptions sends DescribeInstancesCommand with ID", async () => {
@@ -218,7 +224,7 @@ describe("queryFn", () => {
ctx: never,
) => Promise<unknown>
await queryFn({} as never)
expect(mockSend.mock.calls[0]?.[0].input).toEqual({
expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({
InstanceIds: ["i-123"],
})
})
@@ -229,7 +235,7 @@ describe("queryFn", () => {
) => Promise<unknown>
await queryFn({} as never)
expect(mockSend).toHaveBeenCalledOnce()
expect(mockSend.mock.calls[0]?.[0].input).toEqual({})
expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({})
})
it("ec2KeyPairQueryOptions sends DescribeKeyPairsCommand with ID", async () => {
@@ -237,7 +243,7 @@ describe("queryFn", () => {
ctx: never,
) => Promise<unknown>
await queryFn({} as never)
expect(mockSend.mock.calls[0]?.[0].input).toEqual({
expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({
KeyPairIds: ["kp-abc"],
})
})
@@ -255,7 +261,7 @@ describe("queryFn", () => {
ctx: never,
) => Promise<unknown>
await queryFn({} as never)
expect(mockSend.mock.calls[0]?.[0].input).toEqual({
expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({
VolumeIds: ["vol-1"],
})
})
@@ -273,7 +279,7 @@ describe("queryFn", () => {
ctx: never,
) => Promise<unknown>
await queryFn({} as never)
expect(mockSend.mock.calls[0]?.[0].input).toEqual({
expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({
SnapshotIds: ["snap-1"],
})
})
@@ -291,7 +297,7 @@ describe("queryFn", () => {
ctx: never,
) => Promise<unknown>
await queryFn({} as never)
expect(mockSend.mock.calls[0]?.[0].input).toEqual({
expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({
VpcIds: ["vpc-1"],
})
})
@@ -309,7 +315,7 @@ describe("queryFn", () => {
ctx: never,
) => Promise<unknown>
await queryFn({} as never)
expect(mockSend.mock.calls[0]?.[0].input).toEqual({
expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({
SubnetIds: ["subnet-1"],
})
})
@@ -343,7 +349,7 @@ describe("queryFn", () => {
ctx: never,
) => Promise<unknown>
await queryFn({} as never)
expect(mockSend.mock.calls[0]?.[0].input).toEqual({
expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({
Filters: [{ Name: "capacity", Values: ["true"] }],
})
})
@@ -354,7 +360,7 @@ describe("queryFn", () => {
) => Promise<unknown>
await queryFn({} as never)
expect(mockSend).toHaveBeenCalledOnce()
expect(mockSend.mock.calls[0]?.[0].input).toEqual({})
expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({})
})
it("ec2PlacementGroupQueryOptions sends DescribePlacementGroupsCommand with ID", async () => {
@@ -362,7 +368,7 @@ describe("queryFn", () => {
ctx: never,
) => Promise<unknown>
await queryFn({} as never)
expect(mockSend.mock.calls[0]?.[0].input).toEqual({
expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({
GroupIds: ["pg-123"],
})
})
@@ -373,7 +379,7 @@ describe("queryFn", () => {
) => Promise<unknown>
await queryFn({} as never)
expect(mockSend).toHaveBeenCalledOnce()
expect(mockSend.mock.calls[0]?.[0].input).toEqual({})
expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({})
})
it("ec2SecurityGroupQueryOptions sends DescribeSecurityGroupsCommand with ID", async () => {
@@ -381,7 +387,7 @@ describe("queryFn", () => {
ctx: never,
) => Promise<unknown>
await queryFn({} as never)
expect(mockSend.mock.calls[0]?.[0].input).toEqual({
expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({
GroupIds: ["sg-123"],
})
})
@@ -1,4 +1,4 @@
import { afterEach, describe, expect, it, vi } from "vitest"
import { describe, expect, it, vi } from "vitest"
const mockSend = vi.fn()
@@ -18,20 +18,16 @@ import {
elbv2TargetHealthQueryOptions,
} from "./elbv2"
afterEach(() => {
mockSend.mockReset()
})
describe("elbv2 query keys", () => {
it("elbv2LoadBalancersQueryOptions has correct key", () => {
expect(elbv2LoadBalancersQueryOptions.queryKey).toEqual([
expect(elbv2LoadBalancersQueryOptions.queryKey).toStrictEqual([
"elbv2",
"loadBalancers",
])
})
it("elbv2LoadBalancerQueryOptions includes arn", () => {
expect(elbv2LoadBalancerQueryOptions("arn:lb").queryKey).toEqual([
expect(elbv2LoadBalancerQueryOptions("arn:lb").queryKey).toStrictEqual([
"elbv2",
"loadBalancers",
"arn:lb",
@@ -39,23 +35,20 @@ describe("elbv2 query keys", () => {
})
it("elbv2LoadBalancerAttributesQueryOptions includes arn + attributes", () => {
expect(elbv2LoadBalancerAttributesQueryOptions("arn:lb").queryKey).toEqual([
"elbv2",
"loadBalancers",
"arn:lb",
"attributes",
])
expect(
elbv2LoadBalancerAttributesQueryOptions("arn:lb").queryKey,
).toStrictEqual(["elbv2", "loadBalancers", "arn:lb", "attributes"])
})
it("elbv2TargetGroupsQueryOptions has correct key", () => {
expect(elbv2TargetGroupsQueryOptions.queryKey).toEqual([
expect(elbv2TargetGroupsQueryOptions.queryKey).toStrictEqual([
"elbv2",
"targetGroups",
])
})
it("elbv2TargetGroupQueryOptions includes arn", () => {
expect(elbv2TargetGroupQueryOptions("arn:tg").queryKey).toEqual([
expect(elbv2TargetGroupQueryOptions("arn:tg").queryKey).toStrictEqual([
"elbv2",
"targetGroups",
"arn:tg",
@@ -63,16 +56,13 @@ describe("elbv2 query keys", () => {
})
it("elbv2TargetGroupAttributesQueryOptions includes arn + attributes", () => {
expect(elbv2TargetGroupAttributesQueryOptions("arn:tg").queryKey).toEqual([
"elbv2",
"targetGroups",
"arn:tg",
"attributes",
])
expect(
elbv2TargetGroupAttributesQueryOptions("arn:tg").queryKey,
).toStrictEqual(["elbv2", "targetGroups", "arn:tg", "attributes"])
})
it("elbv2ListenersQueryOptions includes lb arn", () => {
expect(elbv2ListenersQueryOptions("arn:lb").queryKey).toEqual([
expect(elbv2ListenersQueryOptions("arn:lb").queryKey).toStrictEqual([
"elbv2",
"listeners",
"arn:lb",
@@ -80,7 +70,7 @@ describe("elbv2 query keys", () => {
})
it("elbv2TargetHealthQueryOptions includes tg arn + health", () => {
expect(elbv2TargetHealthQueryOptions("arn:tg").queryKey).toEqual([
expect(elbv2TargetHealthQueryOptions("arn:tg").queryKey).toStrictEqual([
"elbv2",
"targetGroups",
"arn:tg",
@@ -89,7 +79,7 @@ describe("elbv2 query keys", () => {
})
it("elbv2TagsQueryOptions spreads resource arns into key", () => {
expect(elbv2TagsQueryOptions(["arn:lb", "arn:tg"]).queryKey).toEqual([
expect(elbv2TagsQueryOptions(["arn:lb", "arn:tg"]).queryKey).toStrictEqual([
"elbv2",
"tags",
"arn:lb",
@@ -111,13 +101,13 @@ describe("elbv2 implemented queries send the right command", () => {
mockSend.mockResolvedValueOnce({ LoadBalancers: [] })
await callQueryFn(elbv2LoadBalancersQueryOptions.queryFn)
expect(mockSend).toHaveBeenCalledOnce()
expect(mockSend.mock.calls[0]?.[0].input).toEqual({})
expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({})
})
it("loadBalancer detail filters by ARN", async () => {
mockSend.mockResolvedValueOnce({ LoadBalancers: [] })
await callQueryFn(elbv2LoadBalancerQueryOptions("arn:lb").queryFn)
expect(mockSend.mock.calls[0]?.[0].input).toEqual({
expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({
LoadBalancerArns: ["arn:lb"],
})
})
@@ -125,7 +115,7 @@ describe("elbv2 implemented queries send the right command", () => {
it("loadBalancer attributes sends arn", async () => {
mockSend.mockResolvedValueOnce({ Attributes: [] })
await callQueryFn(elbv2LoadBalancerAttributesQueryOptions("arn:lb").queryFn)
expect(mockSend.mock.calls[0]?.[0].input).toEqual({
expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({
LoadBalancerArn: "arn:lb",
})
})
@@ -133,7 +123,7 @@ describe("elbv2 implemented queries send the right command", () => {
it("listeners filters by load balancer arn", async () => {
mockSend.mockResolvedValueOnce({ Listeners: [] })
await callQueryFn(elbv2ListenersQueryOptions("arn:lb").queryFn)
expect(mockSend.mock.calls[0]?.[0].input).toEqual({
expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({
LoadBalancerArn: "arn:lb",
})
})
@@ -141,7 +131,7 @@ describe("elbv2 implemented queries send the right command", () => {
it("tags sends resource arns", async () => {
mockSend.mockResolvedValueOnce({ TagDescriptions: [] })
await callQueryFn(elbv2TagsQueryOptions(["arn:lb"]).queryFn)
expect(mockSend.mock.calls[0]?.[0].input).toEqual({
expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({
ResourceArns: ["arn:lb"],
})
})
@@ -149,13 +139,13 @@ describe("elbv2 implemented queries send the right command", () => {
it("targetGroups list sends DescribeTargetGroupsCommand", async () => {
mockSend.mockResolvedValueOnce({ TargetGroups: [] })
await callQueryFn(elbv2TargetGroupsQueryOptions.queryFn)
expect(mockSend.mock.calls[0]?.[0].input).toEqual({})
expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({})
})
it("targetGroup detail filters by ARN", async () => {
mockSend.mockResolvedValueOnce({ TargetGroups: [] })
await callQueryFn(elbv2TargetGroupQueryOptions("arn:tg").queryFn)
expect(mockSend.mock.calls[0]?.[0].input).toEqual({
expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({
TargetGroupArns: ["arn:tg"],
})
})
@@ -163,7 +153,7 @@ describe("elbv2 implemented queries send the right command", () => {
it("targetGroup attributes sends arn", async () => {
mockSend.mockResolvedValueOnce({ Attributes: [] })
await callQueryFn(elbv2TargetGroupAttributesQueryOptions("arn:tg").queryFn)
expect(mockSend.mock.calls[0]?.[0].input).toEqual({
expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({
TargetGroupArn: "arn:tg",
})
})
@@ -171,7 +161,7 @@ describe("elbv2 implemented queries send the right command", () => {
it("targetHealth sends target group arn", async () => {
mockSend.mockResolvedValueOnce({ TargetHealthDescriptions: [] })
await callQueryFn(elbv2TargetHealthQueryOptions("arn:tg").queryFn)
expect(mockSend.mock.calls[0]?.[0].input).toEqual({
expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({
TargetGroupArn: "arn:tg",
})
})
@@ -201,6 +191,6 @@ describe("elbv2 load balancer list poll cadence", () => {
data: { LoadBalancers: [{ State: { Code: "active" } }] },
},
} as never)
expect(result).toBe(false)
expect(result).toBeFalsy()
})
})
@@ -18,11 +18,11 @@ import {
describe("query keys", () => {
it("iamUsersQueryOptions has correct key", () => {
expect(iamUsersQueryOptions.queryKey).toEqual(["iam", "users"])
expect(iamUsersQueryOptions.queryKey).toStrictEqual(["iam", "users"])
})
it("iamUserQueryOptions includes userName in key", () => {
expect(iamUserQueryOptions("admin").queryKey).toEqual([
expect(iamUserQueryOptions("admin").queryKey).toStrictEqual([
"iam",
"users",
"admin",
@@ -30,7 +30,7 @@ describe("query keys", () => {
})
it("iamAccessKeysQueryOptions includes userName in key", () => {
expect(iamAccessKeysQueryOptions("admin").queryKey).toEqual([
expect(iamAccessKeysQueryOptions("admin").queryKey).toStrictEqual([
"iam",
"access-keys",
"admin",
@@ -38,20 +38,20 @@ describe("query keys", () => {
})
it("iamPoliciesQueryOptions has correct key", () => {
expect(iamPoliciesQueryOptions.queryKey).toEqual(["iam", "policies"])
expect(iamPoliciesQueryOptions.queryKey).toStrictEqual(["iam", "policies"])
})
it("iamPolicyQueryOptions includes policyArn in key", () => {
expect(
iamPolicyQueryOptions("arn:aws:iam::123:policy/ReadOnly").queryKey,
).toEqual(["iam", "policies", "arn:aws:iam::123:policy/ReadOnly"])
).toStrictEqual(["iam", "policies", "arn:aws:iam::123:policy/ReadOnly"])
})
it("iamPolicyVersionQueryOptions includes policyArn and versionId in key", () => {
expect(
iamPolicyVersionQueryOptions("arn:aws:iam::123:policy/ReadOnly", "v1")
.queryKey,
).toEqual([
).toStrictEqual([
"iam",
"policy-versions",
"arn:aws:iam::123:policy/ReadOnly",
@@ -60,11 +60,9 @@ describe("query keys", () => {
})
it("iamAttachedUserPoliciesQueryOptions includes userName in key", () => {
expect(iamAttachedUserPoliciesQueryOptions("admin").queryKey).toEqual([
"iam",
"attached-user-policies",
"admin",
])
expect(iamAttachedUserPoliciesQueryOptions("admin").queryKey).toStrictEqual(
["iam", "attached-user-policies", "admin"],
)
})
})
@@ -111,7 +109,7 @@ describe("queryFn", () => {
) => Promise<unknown>
await queryFn({} as never)
expect(mockSend).toHaveBeenCalledOnce()
expect(mockSend.mock.calls[0]?.[0].input).toEqual({})
expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({})
})
it("iamUserQueryOptions sends GetUserCommand with userName", async () => {
@@ -119,7 +117,9 @@ describe("queryFn", () => {
ctx: never,
) => Promise<unknown>
await queryFn({} as never)
expect(mockSend.mock.calls[0]?.[0].input).toEqual({ UserName: "admin" })
expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({
UserName: "admin",
})
})
it("iamAccessKeysQueryOptions sends ListAccessKeysCommand", async () => {
@@ -127,7 +127,9 @@ describe("queryFn", () => {
ctx: never,
) => Promise<unknown>
await queryFn({} as never)
expect(mockSend.mock.calls[0]?.[0].input).toEqual({ UserName: "admin" })
expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({
UserName: "admin",
})
})
it("iamPoliciesQueryOptions sends ListPoliciesCommand with Local scope", async () => {
@@ -135,7 +137,7 @@ describe("queryFn", () => {
ctx: never,
) => Promise<unknown>
await queryFn({} as never)
expect(mockSend.mock.calls[0]?.[0].input).toEqual({ Scope: "Local" })
expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({ Scope: "Local" })
})
it("iamPolicyQueryOptions sends GetPolicyCommand with policyArn", async () => {
@@ -143,7 +145,7 @@ describe("queryFn", () => {
ctx: never,
) => Promise<unknown>
await queryFn({} as never)
expect(mockSend.mock.calls[0]?.[0].input).toEqual({
expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({
PolicyArn: "arn:test",
})
})
@@ -153,7 +155,7 @@ describe("queryFn", () => {
ctx: never,
) => Promise<unknown>
await queryFn({} as never)
expect(mockSend.mock.calls[0]?.[0].input).toEqual({
expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({
PolicyArn: "arn:test",
VersionId: "v1",
})
@@ -164,6 +166,8 @@ describe("queryFn", () => {
ctx: never,
) => Promise<unknown>
await queryFn({} as never)
expect(mockSend.mock.calls[0]?.[0].input).toEqual({ UserName: "admin" })
expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({
UserName: "admin",
})
})
})
@@ -10,11 +10,11 @@ import { s3BucketObjectsQueryOptions, s3BucketsQueryOptions } from "./s3"
describe("query keys", () => {
it("s3BucketsQueryOptions has correct key", () => {
expect(s3BucketsQueryOptions.queryKey).toEqual(["s3", "buckets"])
expect(s3BucketsQueryOptions.queryKey).toStrictEqual(["s3", "buckets"])
})
it("s3BucketObjectsQueryOptions includes bucket and empty prefix in key", () => {
expect(s3BucketObjectsQueryOptions("my-bucket").queryKey).toEqual([
expect(s3BucketObjectsQueryOptions("my-bucket").queryKey).toStrictEqual([
"s3",
"buckets",
"my-bucket",
@@ -26,7 +26,7 @@ describe("query keys", () => {
it("s3BucketObjectsQueryOptions includes prefix in key", () => {
expect(
s3BucketObjectsQueryOptions("my-bucket", "photos/").queryKey,
).toEqual(["s3", "buckets", "my-bucket", "objects", "photos/"])
).toStrictEqual(["s3", "buckets", "my-bucket", "objects", "photos/"])
})
})
@@ -41,7 +41,7 @@ describe("queryFn", () => {
) => Promise<unknown>
await queryFn({} as never)
expect(mockSend).toHaveBeenCalledOnce()
expect(mockSend.mock.calls[0]?.[0].input).toEqual({})
expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({})
})
it("s3BucketObjectsQueryOptions sends ListObjectsV2Command with bucket and delimiter", async () => {
@@ -49,7 +49,7 @@ describe("queryFn", () => {
ctx: never,
) => Promise<unknown>
await queryFn({} as never)
expect(mockSend.mock.calls[0]?.[0].input).toEqual({
expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({
Bucket: "my-bucket",
Prefix: undefined,
Delimiter: "/",
@@ -60,7 +60,7 @@ describe("queryFn", () => {
const queryFn = s3BucketObjectsQueryOptions("my-bucket", "docs/")
.queryFn as (ctx: never) => Promise<unknown>
await queryFn({} as never)
expect(mockSend.mock.calls[0]?.[0].input).toEqual({
expect(mockSend.mock.calls[0]?.[0].input).toStrictEqual({
Bucket: "my-bucket",
Prefix: "docs/",
Delimiter: "/",
@@ -169,7 +169,7 @@ describe("create-load-balancer route", () => {
(call[0] as { constructor: { name: string } }).constructor.name,
)
.filter((name) => name.startsWith("Create"))
expect(createCommands).toEqual([
expect(createCommands).toStrictEqual([
"CreateTargetGroupCommand",
"CreateLoadBalancerCommand",
"CreateListenerCommand",
@@ -222,14 +222,14 @@ describe("create-load-balancer route", () => {
const createNames = createCalls.map(
(call) => (call[0] as { constructor: { name: string } }).constructor.name,
)
expect(createNames).toEqual([
expect(createNames).toStrictEqual([
"CreateLoadBalancerCommand",
"CreateListenerCommand",
])
const listenerInput = createCalls[1]?.[0].input as {
DefaultActions: { Type: string; TargetGroupArn: string }[]
}
expect(listenerInput.DefaultActions).toEqual([
expect(listenerInput.DefaultActions).toStrictEqual([
{ Type: "forward", TargetGroupArn: "arn:tg:existing" },
])
})
@@ -259,9 +259,9 @@ describe("create-load-balancer route", () => {
screen.getByRole("button", { name: "Create load balancer" }),
)
expect(
await screen.findByText(/Wizard failed: creating load balancer/i),
).toBeInTheDocument()
await expect(
screen.findByText(/Wizard failed: creating load balancer/i),
).resolves.toBeInTheDocument()
expect(screen.getByText(/subnets span must be ≥2 AZs/)).toBeInTheDocument()
// Partial-cleanup list should mention the orphaned TG
expect(screen.getByText(/Target Group:/)).toBeInTheDocument()
@@ -86,14 +86,14 @@ describe("create-target-group route", () => {
setup()
expect(await screen.findByLabelText("Name")).toBeInTheDocument()
await expect(screen.findByLabelText("Name")).resolves.toBeInTheDocument()
await user.type(screen.getByLabelText("Name"), "my-tg")
await user.click(
screen.getByRole("button", { name: "Create target group" }),
)
await waitFor(() => {
expect(sdk.send).toHaveBeenCalledTimes(1)
expect(sdk.send).toHaveBeenCalledOnce()
})
const input = sdk.send.mock.calls[0]?.[0].input as {
Name: string
@@ -122,7 +122,9 @@ describe("create-target-group route", () => {
screen.getByRole("button", { name: "Create target group" }),
)
expect(await screen.findByText("Name is required")).toBeInTheDocument()
await expect(
screen.findByText("Name is required"),
).resolves.toBeInTheDocument()
expect(sdk.send).not.toHaveBeenCalled()
expect(routerState.navigate).not.toHaveBeenCalled()
})
@@ -140,9 +142,9 @@ describe("create-target-group route", () => {
screen.getByRole("button", { name: "Create target group" }),
)
expect(
await screen.findByText(/Failed to create target group/i),
).toBeInTheDocument()
await expect(
screen.findByText(/Failed to create target group/i),
).resolves.toBeInTheDocument()
expect(routerState.navigate).not.toHaveBeenCalled()
})
})
@@ -1,6 +1,6 @@
import { screen, within } from "@testing-library/react"
import userEvent from "@testing-library/user-event"
import { beforeEach, describe, expect, it, vi } from "vitest"
import { describe, expect, it, vi } from "vitest"
import { renderWithProviders } from "@/test/utils"
@@ -21,10 +21,6 @@ vi.mock("@/mutations/ec2", () => ({
useTerminateInstance: () => ({ ...defaultMutation }),
}))
beforeEach(() => {
mockMutate.mockReset()
})
describe("InstanceActions", () => {
describe("running instance", () => {
it("shows Stop, Reboot, and Terminate buttons", () => {
@@ -237,11 +237,11 @@ function mustString(value: string | undefined, label: string): string {
return value
}
beforeEach(() => {
sdk.reset()
})
describe("ELBv2 cross-slice flow (mocked SDK)", () => {
beforeEach(() => {
sdk.reset()
})
it("creates TG → LB → listener → registers targets → observes healthy state", async () => {
const qc = createQueryClient()
@@ -26,7 +26,7 @@ describe("createInstanceSchema", () => {
keyName: "my-key",
count: 1,
})
expect(result.success).toBe(true)
expect(result.success).toBeTruthy()
})
it("requires count to be at least 1", () => {
@@ -36,7 +36,7 @@ describe("createInstanceSchema", () => {
keyName: "my-key",
count: 0,
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("requires count to be an integer", () => {
@@ -46,7 +46,7 @@ describe("createInstanceSchema", () => {
keyName: "my-key",
count: 1.5,
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("allows optional subnetId", () => {
@@ -57,7 +57,7 @@ describe("createInstanceSchema", () => {
count: 1,
subnetId: "subnet-abc",
})
expect(result.success).toBe(true)
expect(result.success).toBeTruthy()
})
it("allows optional placementGroupName", () => {
@@ -68,7 +68,7 @@ describe("createInstanceSchema", () => {
count: 1,
placementGroupName: "my-group",
})
expect(result.success).toBe(true)
expect(result.success).toBeTruthy()
})
it("supports capacity refine", () => {
@@ -82,12 +82,12 @@ describe("createInstanceSchema", () => {
keyName: "my-key",
count: 5,
})
expect(result.success).toBe(false)
if (!result.success) {
expect(result.error.issues[0]?.message).toBe(
"Cannot exceed available capacity",
)
if (result.success) {
throw new Error("expected validation to fail")
}
expect(result.error.issues[0]?.message).toBe(
"Cannot exceed available capacity",
)
})
it("accepts optional root volume fields", () => {
@@ -101,7 +101,7 @@ describe("createInstanceSchema", () => {
rootVolumeType: "gp3",
rootDeleteOnTermination: true,
})
expect(result.success).toBe(true)
expect(result.success).toBeTruthy()
})
it("rejects rootVolumeSize below 1 GiB", () => {
@@ -112,7 +112,7 @@ describe("createInstanceSchema", () => {
count: 1,
rootVolumeSize: 0,
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("rejects rootVolumeSize above 16384 GiB", () => {
@@ -123,7 +123,7 @@ describe("createInstanceSchema", () => {
count: 1,
rootVolumeSize: 16_385,
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("rejects non-integer rootVolumeSize", () => {
@@ -134,7 +134,7 @@ describe("createInstanceSchema", () => {
count: 1,
rootVolumeSize: 50.5,
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("rejects unsupported rootVolumeType", () => {
@@ -145,24 +145,24 @@ describe("createInstanceSchema", () => {
count: 1,
rootVolumeType: "io2",
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
})
describe("createKeyPairSchema", () => {
it("accepts a valid key name", () => {
const result = createKeyPairSchema.safeParse({ keyName: "my-key" })
expect(result.success).toBe(true)
expect(result.success).toBeTruthy()
})
it("rejects empty key name", () => {
const result = createKeyPairSchema.safeParse({ keyName: "" })
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("rejects key name over 255 chars", () => {
const result = createKeyPairSchema.safeParse({ keyName: "a".repeat(256) })
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
})
@@ -172,7 +172,7 @@ describe("importKeyPairSchema", () => {
keyName: "my-key",
publicKeyMaterial: "ssh-rsa AAAAB3Nza...",
})
expect(result.success).toBe(true)
expect(result.success).toBeTruthy()
})
it("rejects empty public key", () => {
@@ -180,7 +180,7 @@ describe("importKeyPairSchema", () => {
keyName: "my-key",
publicKeyMaterial: "",
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("rejects whitespace-only public key", () => {
@@ -188,7 +188,7 @@ describe("importKeyPairSchema", () => {
keyName: "my-key",
publicKeyMaterial: " ",
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
})
@@ -198,7 +198,7 @@ describe("createVolumeSchema", () => {
size: 10,
availabilityZone: "us-east-1a",
})
expect(result.success).toBe(true)
expect(result.success).toBeTruthy()
})
it("rejects size below 1", () => {
@@ -206,7 +206,7 @@ describe("createVolumeSchema", () => {
size: 0,
availabilityZone: "us-east-1a",
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("rejects size above 16384", () => {
@@ -214,7 +214,7 @@ describe("createVolumeSchema", () => {
size: 16_385,
availabilityZone: "us-east-1a",
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("rejects fractional size", () => {
@@ -222,26 +222,26 @@ describe("createVolumeSchema", () => {
size: 10.5,
availabilityZone: "us-east-1a",
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
})
describe("modifyVolumeSchema", () => {
it("accepts valid size", () => {
const result = modifyVolumeSchema.safeParse({ size: 20 })
expect(result.success).toBe(true)
expect(result.success).toBeTruthy()
})
it("rejects size below 1", () => {
const result = modifyVolumeSchema.safeParse({ size: 0 })
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
})
describe("createVpcSchema", () => {
it("accepts valid CIDR block", () => {
const result = createVpcSchema.safeParse({ cidrBlock: "10.0.0.0/16" })
expect(result.success).toBe(true)
expect(result.success).toBeTruthy()
})
it("accepts CIDR block with optional name", () => {
@@ -249,17 +249,17 @@ describe("createVpcSchema", () => {
cidrBlock: "10.0.0.0/16",
name: "my-vpc",
})
expect(result.success).toBe(true)
expect(result.success).toBeTruthy()
})
it("rejects invalid CIDR format", () => {
const result = createVpcSchema.safeParse({ cidrBlock: "not-a-cidr" })
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("rejects empty CIDR block", () => {
const result = createVpcSchema.safeParse({ cidrBlock: "" })
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
})
@@ -269,7 +269,7 @@ describe("createSubnetSchema", () => {
vpcId: "vpc-123",
cidrBlock: "10.0.1.0/24",
})
expect(result.success).toBe(true)
expect(result.success).toBeTruthy()
})
it("rejects invalid CIDR block", () => {
@@ -277,7 +277,7 @@ describe("createSubnetSchema", () => {
vpcId: "vpc-123",
cidrBlock: "invalid",
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("allows optional availability zone", () => {
@@ -286,19 +286,19 @@ describe("createSubnetSchema", () => {
cidrBlock: "10.0.1.0/24",
availabilityZone: "us-east-1a",
})
expect(result.success).toBe(true)
expect(result.success).toBeTruthy()
})
})
describe("createSnapshotSchema", () => {
it("accepts valid snapshot params", () => {
const result = createSnapshotSchema.safeParse({ volumeId: "vol-123" })
expect(result.success).toBe(true)
expect(result.success).toBeTruthy()
})
it("rejects empty volumeId", () => {
const result = createSnapshotSchema.safeParse({ volumeId: "" })
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
})
@@ -308,7 +308,7 @@ describe("copySnapshotSchema", () => {
sourceSnapshotId: "snap-123",
sourceRegion: "us-east-1",
})
expect(result.success).toBe(true)
expect(result.success).toBeTruthy()
})
})
@@ -318,7 +318,7 @@ describe("attachVolumeSchema", () => {
volumeId: "vol-123",
instanceId: "i-123",
})
expect(result.success).toBe(true)
expect(result.success).toBeTruthy()
})
it("rejects empty instanceId", () => {
@@ -326,7 +326,7 @@ describe("attachVolumeSchema", () => {
volumeId: "vol-123",
instanceId: "",
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
})
@@ -336,7 +336,7 @@ describe("createPlacementGroupSchema", () => {
groupName: "my-group",
strategy: "spread",
})
expect(result.success).toBe(true)
expect(result.success).toBeTruthy()
})
it("rejects empty group name", () => {
@@ -344,7 +344,7 @@ describe("createPlacementGroupSchema", () => {
groupName: "",
strategy: "spread",
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("rejects group name over 255 chars", () => {
@@ -352,7 +352,7 @@ describe("createPlacementGroupSchema", () => {
groupName: "a".repeat(256),
strategy: "cluster",
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("accepts group name at 255 chars", () => {
@@ -360,7 +360,7 @@ describe("createPlacementGroupSchema", () => {
groupName: "a".repeat(255),
strategy: "spread",
})
expect(result.success).toBe(true)
expect(result.success).toBeTruthy()
})
it("rejects empty strategy", () => {
@@ -368,38 +368,38 @@ describe("createPlacementGroupSchema", () => {
groupName: "my-group",
strategy: "",
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("rejects missing strategy", () => {
const result = createPlacementGroupSchema.safeParse({
groupName: "my-group",
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("rejects missing group name", () => {
const result = createPlacementGroupSchema.safeParse({
strategy: "spread",
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
})
describe("formTagSchema", () => {
it("accepts valid tag with key and value", () => {
const result = formTagSchema.safeParse({ key: "Env", value: "prod" })
expect(result.success).toBe(true)
expect(result.success).toBeTruthy()
})
it("accepts tag with empty value", () => {
const result = formTagSchema.safeParse({ key: "Env", value: "" })
expect(result.success).toBe(true)
expect(result.success).toBeTruthy()
})
it("rejects tag with empty key", () => {
const result = formTagSchema.safeParse({ key: "", value: "prod" })
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
})
@@ -410,7 +410,7 @@ describe("createSecurityGroupSchema", () => {
description: "Allow web traffic",
vpcId: "vpc-123",
})
expect(result.success).toBe(true)
expect(result.success).toBeTruthy()
})
it("rejects empty group name", () => {
@@ -419,7 +419,7 @@ describe("createSecurityGroupSchema", () => {
description: "Allow web traffic",
vpcId: "vpc-123",
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("rejects group name over 255 chars", () => {
@@ -428,7 +428,7 @@ describe("createSecurityGroupSchema", () => {
description: "Allow web traffic",
vpcId: "vpc-123",
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("accepts group name at 255 chars", () => {
@@ -437,7 +437,7 @@ describe("createSecurityGroupSchema", () => {
description: "Allow web traffic",
vpcId: "vpc-123",
})
expect(result.success).toBe(true)
expect(result.success).toBeTruthy()
})
it("rejects empty description", () => {
@@ -446,7 +446,7 @@ describe("createSecurityGroupSchema", () => {
description: "",
vpcId: "vpc-123",
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("rejects description over 255 chars", () => {
@@ -455,7 +455,7 @@ describe("createSecurityGroupSchema", () => {
description: "a".repeat(256),
vpcId: "vpc-123",
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("rejects empty vpcId", () => {
@@ -464,7 +464,7 @@ describe("createSecurityGroupSchema", () => {
description: "Allow web traffic",
vpcId: "",
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
})
@@ -476,7 +476,7 @@ describe("securityGroupRuleSchema", () => {
toPort: 443,
cidrIp: "0.0.0.0/0",
})
expect(result.success).toBe(true)
expect(result.success).toBeTruthy()
})
it("accepts all-traffic protocol with port -1", () => {
@@ -486,7 +486,7 @@ describe("securityGroupRuleSchema", () => {
toPort: -1,
cidrIp: "10.0.0.0/16",
})
expect(result.success).toBe(true)
expect(result.success).toBeTruthy()
})
it("accepts port 65535 (upper boundary)", () => {
@@ -496,7 +496,7 @@ describe("securityGroupRuleSchema", () => {
toPort: 65_535,
cidrIp: "0.0.0.0/0",
})
expect(result.success).toBe(true)
expect(result.success).toBeTruthy()
})
it("rejects port 65536 (above boundary)", () => {
@@ -506,7 +506,7 @@ describe("securityGroupRuleSchema", () => {
toPort: 443,
cidrIp: "0.0.0.0/0",
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("rejects port -2 (below boundary)", () => {
@@ -516,7 +516,7 @@ describe("securityGroupRuleSchema", () => {
toPort: 443,
cidrIp: "0.0.0.0/0",
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("rejects fractional port", () => {
@@ -526,7 +526,7 @@ describe("securityGroupRuleSchema", () => {
toPort: 443,
cidrIp: "0.0.0.0/0",
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("rejects invalid CIDR format", () => {
@@ -536,7 +536,7 @@ describe("securityGroupRuleSchema", () => {
toPort: 22,
cidrIp: "not-a-cidr",
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("rejects empty CIDR", () => {
@@ -546,7 +546,7 @@ describe("securityGroupRuleSchema", () => {
toPort: 22,
cidrIp: "",
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("rejects empty protocol", () => {
@@ -556,7 +556,7 @@ describe("securityGroupRuleSchema", () => {
toPort: 22,
cidrIp: "0.0.0.0/0",
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
})
@@ -576,7 +576,7 @@ describe("createVpcWizardSchema", () => {
it("accepts valid vpc-only mode with minimal fields", () => {
const result = createVpcWizardSchema.safeParse(validBase)
expect(result.success).toBe(true)
expect(result.success).toBeTruthy()
})
it("accepts valid vpc-and-more mode", () => {
@@ -586,7 +586,7 @@ describe("createVpcWizardSchema", () => {
publicSubnetCount: 1,
privateSubnetCount: 1,
})
expect(result.success).toBe(true)
expect(result.success).toBeTruthy()
})
it("rejects invalid mode", () => {
@@ -594,7 +594,7 @@ describe("createVpcWizardSchema", () => {
...validBase,
mode: "invalid",
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("rejects empty CIDR block", () => {
@@ -602,7 +602,7 @@ describe("createVpcWizardSchema", () => {
...validBase,
cidrBlock: "",
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("rejects invalid CIDR format", () => {
@@ -610,7 +610,7 @@ describe("createVpcWizardSchema", () => {
...validBase,
cidrBlock: "not-a-cidr",
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("rejects CIDR with out-of-range octets", () => {
@@ -618,7 +618,7 @@ describe("createVpcWizardSchema", () => {
...validBase,
cidrBlock: "999.0.0.0/16",
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("rejects CIDR with prefix out of /16-/28 range", () => {
@@ -626,7 +626,7 @@ describe("createVpcWizardSchema", () => {
...validBase,
cidrBlock: "10.0.0.0/8",
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("rejects invalid tenancy", () => {
@@ -634,7 +634,7 @@ describe("createVpcWizardSchema", () => {
...validBase,
tenancy: "shared",
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("rejects publicSubnetCount above 4", () => {
@@ -642,7 +642,7 @@ describe("createVpcWizardSchema", () => {
...validBase,
publicSubnetCount: 5,
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("rejects negative privateSubnetCount", () => {
@@ -650,7 +650,7 @@ describe("createVpcWizardSchema", () => {
...validBase,
privateSubnetCount: -1,
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("rejects fractional subnet count", () => {
@@ -658,7 +658,7 @@ describe("createVpcWizardSchema", () => {
...validBase,
publicSubnetCount: 1.5,
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("rejects invalid custom subnet CIDR in vpc-and-more mode", () => {
@@ -668,7 +668,7 @@ describe("createVpcWizardSchema", () => {
publicSubnetCount: 1,
publicSubnetCidrs: ["not-a-cidr"],
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("rejects subnet CIDR outside VPC range", () => {
@@ -678,13 +678,13 @@ describe("createVpcWizardSchema", () => {
publicSubnetCount: 1,
publicSubnetCidrs: ["192.168.0.0/20"],
})
expect(result.success).toBe(false)
if (!result.success) {
const issue = result.error.issues.find(
(i) => i.path[0] === "publicSubnetCidrs",
)
expect(issue?.message).toContain("within the VPC CIDR")
if (result.success) {
throw new Error("expected validation to fail")
}
const issue = result.error.issues.find(
(i) => i.path[0] === "publicSubnetCidrs",
)
expect(issue?.message).toContain("within the VPC CIDR")
})
it("rejects overlapping subnet CIDRs", () => {
@@ -696,13 +696,11 @@ describe("createVpcWizardSchema", () => {
publicSubnetCidrs: ["10.0.0.0/20"],
privateSubnetCidrs: ["10.0.0.0/20"],
})
expect(result.success).toBe(false)
if (!result.success) {
const issue = result.error.issues.find((i) =>
i.message.includes("overlap"),
)
expect(issue).toBeDefined()
if (result.success) {
throw new Error("expected validation to fail")
}
const issue = result.error.issues.find((i) => i.message.includes("overlap"))
expect(issue).toBeDefined()
})
it("accepts valid custom subnet CIDRs within VPC range", () => {
@@ -714,7 +712,7 @@ describe("createVpcWizardSchema", () => {
publicSubnetCidrs: ["10.0.0.0/20"],
privateSubnetCidrs: ["10.0.128.0/20"],
})
expect(result.success).toBe(true)
expect(result.success).toBeTruthy()
})
it("skips subnet CIDR validation in vpc-only mode", () => {
@@ -723,7 +721,7 @@ describe("createVpcWizardSchema", () => {
mode: "vpc-only",
publicSubnetCidrs: ["not-a-cidr"],
})
expect(result.success).toBe(true)
expect(result.success).toBeTruthy()
})
it("accepts valid tags", () => {
@@ -731,7 +729,7 @@ describe("createVpcWizardSchema", () => {
...validBase,
tags: [{ key: "Env", value: "prod" }],
})
expect(result.success).toBe(true)
expect(result.success).toBeTruthy()
})
it("rejects tags with empty key", () => {
@@ -739,6 +737,6 @@ describe("createVpcWizardSchema", () => {
...validBase,
tags: [{ key: "", value: "prod" }],
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
})
@@ -29,7 +29,7 @@ describe("createTargetGroupSchema", () => {
healthCheck: defaultHealthCheck,
tags: [],
})
expect(result.success).toBe(true)
expect(result.success).toBeTruthy()
})
it("rejects name with invalid characters", () => {
@@ -41,7 +41,7 @@ describe("createTargetGroupSchema", () => {
healthCheck: defaultHealthCheck,
tags: [],
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("rejects name >32 chars", () => {
@@ -53,7 +53,7 @@ describe("createTargetGroupSchema", () => {
healthCheck: defaultHealthCheck,
tags: [],
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("rejects port out of range", () => {
@@ -65,7 +65,7 @@ describe("createTargetGroupSchema", () => {
healthCheck: defaultHealthCheck,
tags: [],
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
})
@@ -87,7 +87,7 @@ describe("createLoadBalancerSchema", () => {
tags: [],
listener: baseListener,
})
expect(result.success).toBe(true)
expect(result.success).toBeTruthy()
})
it("rejects <2 subnets", () => {
@@ -100,7 +100,7 @@ describe("createLoadBalancerSchema", () => {
tags: [],
listener: baseListener,
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("rejects names starting with 'internal-'", () => {
@@ -113,7 +113,7 @@ describe("createLoadBalancerSchema", () => {
tags: [],
listener: baseListener,
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("accepts listener with mode=new without existingTargetGroupArn", () => {
@@ -130,7 +130,7 @@ describe("createLoadBalancerSchema", () => {
targetGroupMode: "new",
},
})
expect(result.success).toBe(true)
expect(result.success).toBeTruthy()
})
it("rejects listener with mode=existing but no existingTargetGroupArn", () => {
@@ -147,7 +147,7 @@ describe("createLoadBalancerSchema", () => {
targetGroupMode: "existing",
},
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
})
@@ -158,7 +158,7 @@ describe("createListenerSchema", () => {
port: 80,
defaultTargetGroupArn: "arn:tg:1",
})
expect(result.success).toBe(true)
expect(result.success).toBeTruthy()
})
it("rejects listener missing default target group", () => {
@@ -167,7 +167,7 @@ describe("createListenerSchema", () => {
port: 80,
defaultTargetGroupArn: "",
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
})
@@ -176,18 +176,18 @@ describe("registerTargetsSchema", () => {
const result = registerTargetsSchema.safeParse({
targets: [{ instanceId: "i-123" }, { instanceId: "i-456", port: 8080 }],
})
expect(result.success).toBe(true)
expect(result.success).toBeTruthy()
})
it("rejects empty target list", () => {
const result = registerTargetsSchema.safeParse({ targets: [] })
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
})
describe("healthCheckSchema", () => {
it("accepts the documented default values", () => {
expect(healthCheckSchema.parse(defaultHealthCheck)).toEqual(
expect(healthCheckSchema.parse(defaultHealthCheck)).toStrictEqual(
defaultHealthCheck,
)
})
@@ -197,7 +197,7 @@ describe("healthCheckSchema", () => {
...defaultHealthCheck,
intervalSeconds: 1,
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("rejects a malformed matcher", () => {
@@ -205,6 +205,6 @@ describe("healthCheckSchema", () => {
...defaultHealthCheck,
matcher: "OK",
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
})
@@ -5,27 +5,27 @@ import { createPolicySchema, createUserSchema } from "./iam"
describe("createUserSchema", () => {
it("accepts a valid user name", () => {
const result = createUserSchema.safeParse({ userName: "admin" })
expect(result.success).toBe(true)
expect(result.success).toBeTruthy()
})
it("rejects empty user name", () => {
const result = createUserSchema.safeParse({ userName: "" })
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("rejects user name over 64 chars", () => {
const result = createUserSchema.safeParse({ userName: "a".repeat(65) })
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("rejects user name with invalid characters", () => {
const result = createUserSchema.safeParse({ userName: "user name!" })
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("accepts user name with allowed special characters", () => {
const result = createUserSchema.safeParse({ userName: "user+=,.@-test" })
expect(result.success).toBe(true)
expect(result.success).toBeTruthy()
})
it("allows optional path", () => {
@@ -33,7 +33,7 @@ describe("createUserSchema", () => {
userName: "admin",
path: "/engineering/",
})
expect(result.success).toBe(true)
expect(result.success).toBeTruthy()
})
})
@@ -43,7 +43,7 @@ describe("createPolicySchema", () => {
policyName: "ReadOnly",
policyDocument: '{"Version":"2012-10-17","Statement":[]}',
})
expect(result.success).toBe(true)
expect(result.success).toBeTruthy()
})
it("rejects empty policy name", () => {
@@ -51,7 +51,7 @@ describe("createPolicySchema", () => {
policyName: "",
policyDocument: "{}",
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("rejects policy name over 128 chars", () => {
@@ -59,7 +59,7 @@ describe("createPolicySchema", () => {
policyName: "a".repeat(129),
policyDocument: "{}",
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("rejects invalid JSON in policy document", () => {
@@ -67,7 +67,7 @@ describe("createPolicySchema", () => {
policyName: "ReadOnly",
policyDocument: "not json",
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("rejects empty policy document", () => {
@@ -75,7 +75,7 @@ describe("createPolicySchema", () => {
policyName: "ReadOnly",
policyDocument: "",
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("allows optional description", () => {
@@ -84,6 +84,6 @@ describe("createPolicySchema", () => {
description: "Read-only access",
policyDocument: "{}",
})
expect(result.success).toBe(true)
expect(result.success).toBeTruthy()
})
})
@@ -5,60 +5,60 @@ import { createBucketSchema } from "./s3"
describe("createBucketSchema", () => {
it("accepts a valid bucket name", () => {
const result = createBucketSchema.safeParse({ bucketName: "my-bucket" })
expect(result.success).toBe(true)
expect(result.success).toBeTruthy()
})
it("rejects bucket name under 3 characters", () => {
const result = createBucketSchema.safeParse({ bucketName: "ab" })
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("rejects bucket name over 63 characters", () => {
const result = createBucketSchema.safeParse({
bucketName: "a".repeat(64),
})
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("rejects uppercase letters", () => {
const result = createBucketSchema.safeParse({ bucketName: "MyBucket" })
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("rejects names starting with a period", () => {
const result = createBucketSchema.safeParse({ bucketName: ".my-bucket" })
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("rejects names ending with a hyphen", () => {
const result = createBucketSchema.safeParse({ bucketName: "my-bucket-" })
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("rejects consecutive periods", () => {
const result = createBucketSchema.safeParse({ bucketName: "my..bucket" })
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("rejects adjacent period and hyphen", () => {
const result = createBucketSchema.safeParse({ bucketName: "my.-bucket" })
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("rejects adjacent hyphen and period", () => {
const result = createBucketSchema.safeParse({ bucketName: "my-.bucket" })
expect(result.success).toBe(false)
expect(result.success).toBeFalsy()
})
it("accepts bucket name with periods and hyphens", () => {
const result = createBucketSchema.safeParse({
bucketName: "my.test-bucket.v2",
})
expect(result.success).toBe(true)
expect(result.success).toBeTruthy()
})
it("accepts all-numeric bucket name", () => {
const result = createBucketSchema.safeParse({ bucketName: "123" })
expect(result.success).toBe(true)
expect(result.success).toBeTruthy()
})
})
@@ -43,6 +43,7 @@ export default defineConfig({
globals: true,
environment: "happy-dom",
setupFiles: "./src/test/setup.ts",
clearMocks: true,
coverage: {
include: ["src/**/*.{ts,tsx}"],
exclude: [