Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -40,53 +40,77 @@ describe("HostUniversityTab image uploads", () => {
totalElements: 0,
totalPages: 0,
});
vi.stubGlobal("URL", {
createObjectURL: vi.fn(() => "blob:mock-url"),
revokeObjectURL: vi.fn(),
});
});

afterEach(() => {
cleanup();
vi.restoreAllMocks();
vi.unstubAllGlobals();
toastError.mockReset();
toastSuccess.mockReset();
});

it("uploads a selected logo with formatName and writes the returned URL", async () => {
const upload = vi
.spyOn(adminApi, "uploadAdminUniversityLogo")
.mockResolvedValue({ fileUrl: "admin/logo/test.webp" });
it("shows logo preview immediately after file selection without calling the API", async () => {
await openCreateModal();
fireEvent.change(screen.getByLabelText("표시명 *"), { target: { value: "university_of_test" } });
const file = new File(["logo"], "logo.png", { type: "image/png" });
fireEvent.change(screen.getByLabelText("로고 이미지 파일"), { target: { files: [file] } });

await waitFor(() => expect(upload).toHaveBeenCalledWith(file, "university_of_test"));
await waitFor(() =>
expect((screen.getByLabelText("로고 이미지 URL *") as HTMLInputElement).value).toBe("admin/logo/test.webp"),
);
expect(screen.getByRole("img", { name: "로고 미리보기" }).getAttribute("src")).toBe(
"https://cdn.upload.solid-connection.com/admin/logo/test.webp",
);
await waitFor(() => expect(screen.getByRole("img", { name: "로고 미리보기" })).toBeTruthy());
expect(toastError).not.toHaveBeenCalled();
});

it("does not upload when formatName is blank", async () => {
const upload = vi.spyOn(adminApi, "uploadAdminUniversityLogo");
it("shows background preview immediately after file selection without calling the API", async () => {
await openCreateModal();
const file = new File(["logo"], "logo.png", { type: "image/png" });
fireEvent.change(screen.getByLabelText("로고 이미지 파일"), { target: { files: [file] } });
const file = new File(["bg"], "background.png", { type: "image/png" });
fireEvent.change(screen.getByLabelText("배경 이미지 파일"), { target: { files: [file] } });

expect(upload).not.toHaveBeenCalled();
expect(toastError).toHaveBeenCalledWith("표시명을 먼저 입력해 주세요.");
await waitFor(() => expect(screen.getByRole("img", { name: "배경 미리보기" })).toBeTruthy());
expect(toastError).not.toHaveBeenCalled();
});

it("preserves the current background URL when upload fails", async () => {
vi.spyOn(adminApi, "uploadAdminUniversityBackground").mockRejectedValue(new Error("업로드 실패"));
it("shows an error toast and does not submit when files are not selected on create", async () => {
const create = vi.spyOn(adminApi, "createHostUniversity").mockResolvedValue({} as never);
await openCreateModal();
fireEvent.change(screen.getByLabelText("표시명 *"), { target: { value: "university_of_test" } });
const urlInput = screen.getByLabelText("배경 이미지 URL *") as HTMLInputElement;
fireEvent.change(urlInput, { target: { value: "existing/background.webp" } });
const file = new File(["background"], "background.png", { type: "image/png" });
fireEvent.change(screen.getByLabelText("배경 이미지 파일"), { target: { files: [file] } });

await waitFor(() => expect(toastError).toHaveBeenCalledWith("업로드 실패"));
expect(urlInput.value).toBe("existing/background.webp");
fireEvent.change(screen.getByLabelText("한글명 *"), { target: { value: "테스트 대학교" } });
fireEvent.change(screen.getByLabelText("영문명 *"), { target: { value: "Test University" } });
fireEvent.change(screen.getByLabelText("표시명 *"), { target: { value: "Test U" } });
fireEvent.change(screen.getByLabelText("국가코드 *"), { target: { value: "JP" } });
fireEvent.change(screen.getByLabelText("권역코드 *"), { target: { value: "ASIA" } });

fireEvent.click(screen.getByRole("button", { name: "생성" }));

await waitFor(() => expect(toastError).toHaveBeenCalledWith("로고 및 배경 이미지를 모두 선택해 주세요."));
expect(create).not.toHaveBeenCalled();
});

it("calls createHostUniversity with form data and selected files on submit", async () => {
const create = vi.spyOn(adminApi, "createHostUniversity").mockResolvedValue({} as never);
await openCreateModal();

fireEvent.change(screen.getByLabelText("한글명 *"), { target: { value: "테스트 대학교" } });
fireEvent.change(screen.getByLabelText("영문명 *"), { target: { value: "Test University" } });
fireEvent.change(screen.getByLabelText("표시명 *"), { target: { value: "Test U" } });
fireEvent.change(screen.getByLabelText("국가코드 *"), { target: { value: "JP" } });
fireEvent.change(screen.getByLabelText("권역코드 *"), { target: { value: "ASIA" } });

const logoFile = new File(["logo"], "logo.png", { type: "image/png" });
const backgroundFile = new File(["bg"], "bg.png", { type: "image/png" });
fireEvent.change(screen.getByLabelText("로고 이미지 파일"), { target: { files: [logoFile] } });
fireEvent.change(screen.getByLabelText("배경 이미지 파일"), { target: { files: [backgroundFile] } });

fireEvent.click(screen.getByRole("button", { name: "생성" }));

await waitFor(() =>
expect(create).toHaveBeenCalledWith(
expect.objectContaining({ koreanName: "테스트 대학교", countryCode: "JP" }),
logoFile,
backgroundFile,
),
);
});
});
Loading
Loading