mirror of
https://github.com/Azure/cosmos-explorer.git
synced 2025-12-29 13:51:49 +00:00
Added comprehensive unit test coverage for Container Copy jobs (#2275)
* copy job uts * unit test coverage * lint fix * normalize account dropdown id
This commit is contained in:
@@ -0,0 +1,334 @@
|
||||
import "@testing-library/jest-dom";
|
||||
import { act, render, screen } from "@testing-library/react";
|
||||
import React from "react";
|
||||
import { useCopyJobPrerequisitesCache } from "./useCopyJobPrerequisitesCache";
|
||||
|
||||
describe("useCopyJobPrerequisitesCache", () => {
|
||||
let hookResult: any;
|
||||
|
||||
const TestComponent = ({ onHookUpdate }: { onHookUpdate?: () => void }): JSX.Element => {
|
||||
hookResult = useCopyJobPrerequisitesCache();
|
||||
|
||||
React.useEffect(() => {
|
||||
if (onHookUpdate) {
|
||||
onHookUpdate();
|
||||
}
|
||||
}, [onHookUpdate]);
|
||||
|
||||
return (
|
||||
<div>
|
||||
<span data-testid="cache-size">{hookResult.validationCache.size}</span>
|
||||
<button
|
||||
data-testid="set-cache-button"
|
||||
onClick={() => {
|
||||
const testCache = new Map<string, boolean>();
|
||||
testCache.set("test-key", true);
|
||||
hookResult.setValidationCache(testCache);
|
||||
}}
|
||||
>
|
||||
Set Cache
|
||||
</button>
|
||||
<button
|
||||
data-testid="clear-cache-button"
|
||||
onClick={() => {
|
||||
hookResult.setValidationCache(new Map<string, boolean>());
|
||||
}}
|
||||
>
|
||||
Clear Cache
|
||||
</button>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
afterEach(() => {
|
||||
if (hookResult) {
|
||||
act(() => {
|
||||
hookResult.setValidationCache(new Map<string, boolean>());
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
it("should initialize with an empty validation cache", () => {
|
||||
render(<TestComponent />);
|
||||
|
||||
expect(hookResult.validationCache).toBeInstanceOf(Map);
|
||||
expect(hookResult.validationCache.size).toBe(0);
|
||||
expect(screen.getByTestId("cache-size")).toHaveTextContent("0");
|
||||
});
|
||||
|
||||
it("should provide a setValidationCache function", () => {
|
||||
render(<TestComponent />);
|
||||
|
||||
expect(typeof hookResult.setValidationCache).toBe("function");
|
||||
});
|
||||
|
||||
it("should update validation cache when setValidationCache is called", () => {
|
||||
render(<TestComponent />);
|
||||
|
||||
const testCache = new Map<string, boolean>();
|
||||
testCache.set("test-key", true);
|
||||
testCache.set("another-key", false);
|
||||
|
||||
act(() => {
|
||||
hookResult.setValidationCache(testCache);
|
||||
});
|
||||
|
||||
expect(hookResult.validationCache).toBe(testCache);
|
||||
expect(hookResult.validationCache.size).toBe(2);
|
||||
expect(hookResult.validationCache.get("test-key")).toBe(true);
|
||||
expect(hookResult.validationCache.get("another-key")).toBe(false);
|
||||
expect(screen.getByTestId("cache-size")).toHaveTextContent("2");
|
||||
});
|
||||
|
||||
it("should replace the entire validation cache when setValidationCache is called", () => {
|
||||
render(<TestComponent />);
|
||||
|
||||
const initialCache = new Map<string, boolean>();
|
||||
initialCache.set("initial-key", true);
|
||||
|
||||
act(() => {
|
||||
hookResult.setValidationCache(initialCache);
|
||||
});
|
||||
|
||||
expect(hookResult.validationCache.get("initial-key")).toBe(true);
|
||||
expect(screen.getByTestId("cache-size")).toHaveTextContent("1");
|
||||
|
||||
const newCache = new Map<string, boolean>();
|
||||
newCache.set("new-key", false);
|
||||
|
||||
act(() => {
|
||||
hookResult.setValidationCache(newCache);
|
||||
});
|
||||
|
||||
expect(hookResult.validationCache.get("initial-key")).toBeUndefined();
|
||||
expect(hookResult.validationCache.get("new-key")).toBe(false);
|
||||
expect(hookResult.validationCache.size).toBe(1);
|
||||
expect(screen.getByTestId("cache-size")).toHaveTextContent("1");
|
||||
});
|
||||
|
||||
it("should handle empty Map updates", () => {
|
||||
render(<TestComponent />);
|
||||
|
||||
const initialCache = new Map<string, boolean>();
|
||||
initialCache.set("test-key", true);
|
||||
|
||||
act(() => {
|
||||
hookResult.setValidationCache(initialCache);
|
||||
});
|
||||
|
||||
expect(hookResult.validationCache.size).toBe(1);
|
||||
expect(screen.getByTestId("cache-size")).toHaveTextContent("1");
|
||||
|
||||
act(() => {
|
||||
screen.getByTestId("clear-cache-button").click();
|
||||
});
|
||||
|
||||
expect(hookResult.validationCache.size).toBe(0);
|
||||
expect(screen.getByTestId("cache-size")).toHaveTextContent("0");
|
||||
});
|
||||
|
||||
it("should maintain state across multiple hook instances (global store behavior)", () => {
|
||||
let firstHookResult: any;
|
||||
let secondHookResult: any;
|
||||
|
||||
const FirstComponent = (): JSX.Element => {
|
||||
firstHookResult = useCopyJobPrerequisitesCache();
|
||||
return <div data-testid="first-component">First</div>;
|
||||
};
|
||||
|
||||
const SecondComponent = (): JSX.Element => {
|
||||
secondHookResult = useCopyJobPrerequisitesCache();
|
||||
return <div data-testid="second-component">Second</div>;
|
||||
};
|
||||
|
||||
render(
|
||||
<div>
|
||||
<FirstComponent />
|
||||
<SecondComponent />
|
||||
</div>,
|
||||
);
|
||||
|
||||
const testCache = new Map<string, boolean>();
|
||||
testCache.set("shared-key", true);
|
||||
|
||||
act(() => {
|
||||
firstHookResult.setValidationCache(testCache);
|
||||
});
|
||||
|
||||
expect(secondHookResult.validationCache.get("shared-key")).toBe(true);
|
||||
expect(secondHookResult.validationCache.size).toBe(1);
|
||||
expect(firstHookResult.validationCache.get("shared-key")).toBe(true);
|
||||
expect(firstHookResult.validationCache.size).toBe(1);
|
||||
});
|
||||
|
||||
it("should allow updates from different hook instances", () => {
|
||||
let firstHookResult: any;
|
||||
let secondHookResult: any;
|
||||
|
||||
const FirstComponent = (): JSX.Element => {
|
||||
firstHookResult = useCopyJobPrerequisitesCache();
|
||||
return (
|
||||
<button
|
||||
data-testid="first-update"
|
||||
onClick={() => {
|
||||
const testCache = new Map<string, boolean>();
|
||||
testCache.set("key-from-first", true);
|
||||
firstHookResult.setValidationCache(testCache);
|
||||
}}
|
||||
>
|
||||
Update from First
|
||||
</button>
|
||||
);
|
||||
};
|
||||
|
||||
const SecondComponent = (): JSX.Element => {
|
||||
secondHookResult = useCopyJobPrerequisitesCache();
|
||||
return (
|
||||
<button
|
||||
data-testid="second-update"
|
||||
onClick={() => {
|
||||
const testCache = new Map<string, boolean>();
|
||||
testCache.set("key-from-second", false);
|
||||
secondHookResult.setValidationCache(testCache);
|
||||
}}
|
||||
>
|
||||
Update from Second
|
||||
</button>
|
||||
);
|
||||
};
|
||||
|
||||
render(
|
||||
<div>
|
||||
<FirstComponent />
|
||||
<SecondComponent />
|
||||
</div>,
|
||||
);
|
||||
|
||||
act(() => {
|
||||
screen.getByTestId("first-update").click();
|
||||
});
|
||||
|
||||
expect(secondHookResult.validationCache.get("key-from-first")).toBe(true);
|
||||
|
||||
act(() => {
|
||||
screen.getByTestId("second-update").click();
|
||||
});
|
||||
|
||||
expect(firstHookResult.validationCache.get("key-from-second")).toBe(false);
|
||||
expect(firstHookResult.validationCache.get("key-from-first")).toBeUndefined();
|
||||
});
|
||||
|
||||
it("should handle complex validation scenarios", () => {
|
||||
const ComplexTestComponent = (): JSX.Element => {
|
||||
hookResult = useCopyJobPrerequisitesCache();
|
||||
|
||||
const handleComplexUpdate = () => {
|
||||
const complexCache = new Map<string, boolean>();
|
||||
complexCache.set("database-validation", true);
|
||||
complexCache.set("container-validation", true);
|
||||
complexCache.set("network-validation", false);
|
||||
complexCache.set("authentication-validation", true);
|
||||
complexCache.set("permission-validation", false);
|
||||
hookResult.setValidationCache(complexCache);
|
||||
};
|
||||
|
||||
return (
|
||||
<button data-testid="complex-update" onClick={handleComplexUpdate}>
|
||||
Set Complex Cache
|
||||
</button>
|
||||
);
|
||||
};
|
||||
|
||||
render(<ComplexTestComponent />);
|
||||
|
||||
act(() => {
|
||||
screen.getByTestId("complex-update").click();
|
||||
});
|
||||
|
||||
expect(hookResult.validationCache.size).toBe(5);
|
||||
expect(hookResult.validationCache.get("database-validation")).toBe(true);
|
||||
expect(hookResult.validationCache.get("container-validation")).toBe(true);
|
||||
expect(hookResult.validationCache.get("network-validation")).toBe(false);
|
||||
expect(hookResult.validationCache.get("authentication-validation")).toBe(true);
|
||||
expect(hookResult.validationCache.get("permission-validation")).toBe(false);
|
||||
});
|
||||
|
||||
it("should handle edge case keys", () => {
|
||||
const EdgeCaseTestComponent = (): JSX.Element => {
|
||||
hookResult = useCopyJobPrerequisitesCache();
|
||||
|
||||
const handleEdgeCaseUpdate = () => {
|
||||
const edgeCaseCache = new Map<string, boolean>();
|
||||
edgeCaseCache.set("", true);
|
||||
edgeCaseCache.set(" ", false);
|
||||
edgeCaseCache.set("special-chars!@#$%^&*()", true);
|
||||
edgeCaseCache.set("very-long-key-".repeat(10), false);
|
||||
edgeCaseCache.set("unicode-key-🔑", true);
|
||||
hookResult.setValidationCache(edgeCaseCache);
|
||||
};
|
||||
|
||||
return (
|
||||
<button data-testid="edge-case-update" onClick={handleEdgeCaseUpdate}>
|
||||
Set Edge Case Cache
|
||||
</button>
|
||||
);
|
||||
};
|
||||
|
||||
render(<EdgeCaseTestComponent />);
|
||||
|
||||
act(() => {
|
||||
screen.getByTestId("edge-case-update").click();
|
||||
});
|
||||
|
||||
expect(hookResult.validationCache.size).toBe(5);
|
||||
expect(hookResult.validationCache.get("")).toBe(true);
|
||||
expect(hookResult.validationCache.get(" ")).toBe(false);
|
||||
expect(hookResult.validationCache.get("special-chars!@#$%^&*()")).toBe(true);
|
||||
expect(hookResult.validationCache.get("very-long-key-".repeat(10))).toBe(false);
|
||||
expect(hookResult.validationCache.get("unicode-key-🔑")).toBe(true);
|
||||
});
|
||||
|
||||
it("should handle setting the same cache reference without errors", () => {
|
||||
let testCache: Map<string, boolean>;
|
||||
|
||||
const SameReferenceTestComponent = (): JSX.Element => {
|
||||
hookResult = useCopyJobPrerequisitesCache();
|
||||
|
||||
const handleFirstUpdate = () => {
|
||||
testCache = new Map<string, boolean>();
|
||||
testCache.set("test-key", true);
|
||||
hookResult.setValidationCache(testCache);
|
||||
};
|
||||
|
||||
const handleSecondUpdate = () => {
|
||||
hookResult.setValidationCache(testCache);
|
||||
};
|
||||
|
||||
return (
|
||||
<div>
|
||||
<button data-testid="first-update" onClick={handleFirstUpdate}>
|
||||
First Update
|
||||
</button>
|
||||
<button data-testid="second-update" onClick={handleSecondUpdate}>
|
||||
Second Update (Same Reference)
|
||||
</button>
|
||||
<span data-testid="cache-content">{hookResult.validationCache.get("test-key")?.toString()}</span>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
render(<SameReferenceTestComponent />);
|
||||
act(() => {
|
||||
screen.getByTestId("first-update").click();
|
||||
});
|
||||
expect(hookResult.validationCache.get("test-key")).toBe(true);
|
||||
expect(screen.getByTestId("cache-content")).toHaveTextContent("true");
|
||||
|
||||
act(() => {
|
||||
screen.getByTestId("second-update").click();
|
||||
});
|
||||
expect(hookResult.validationCache).toBe(testCache);
|
||||
expect(hookResult.validationCache.get("test-key")).toBe(true);
|
||||
expect(screen.getByTestId("cache-content")).toHaveTextContent("true");
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user