Files
hanko/frontend/frontend-sdk/tests/lib/client/EmailClient.spec.ts
bjoern-m ca62cf421f feat: introduce hanko profile element and related api changes (#495)
* feat: introduce hanko profile element and related api changes
2023-01-25 10:55:23 +01:00

192 lines
5.7 KiB
TypeScript

import { EmailClient } from "../../../src";
import { Response } from "../../../src/lib/client/HttpClient";
const emailID = "test-email-1";
const emailAddress = "test-email-1@test";
let emailClient: EmailClient;
beforeEach(() => {
emailClient = new EmailClient("http://test.api");
});
describe("EmailClient.list()", () => {
it("should list email addresses", async () => {
const response = new Response(new XMLHttpRequest());
response.ok = true;
response._decodedJSON = [
{
id: emailID,
address: emailAddress,
is_verified: false,
is_primary: true,
},
];
jest.spyOn(emailClient.client, "get").mockResolvedValue(response);
const list = await emailClient.list();
expect(emailClient.client.get).toHaveBeenCalledWith("/emails");
expect(list).toEqual(response._decodedJSON);
});
it.each`
status | error
${401} | ${"Unauthorized error"}
${500} | ${"Technical error"}
`(
"should throw error if API returns an error status",
async ({ status, error }) => {
const response = new Response(new XMLHttpRequest());
response.status = status;
response.ok = status >= 200 && status <= 299;
jest.spyOn(emailClient.client, "get").mockResolvedValueOnce(response);
const email = emailClient.list();
await expect(email).rejects.toThrow(error);
}
);
it("should throw error on API communication failure", async () => {
emailClient.client.get = jest
.fn()
.mockRejectedValue(new Error("Test error"));
const user = emailClient.list();
await expect(user).rejects.toThrowError("Test error");
});
});
describe("EmailClient.create()", () => {
it("should create a email address", async () => {
const response = new Response(new XMLHttpRequest());
response.ok = true;
response._decodedJSON = {
id: "",
address: "",
is_verified: false,
is_primary: true,
};
jest.spyOn(emailClient.client, "post").mockResolvedValue(response);
const createResponse = emailClient.create(emailAddress);
await expect(createResponse).resolves.toBe(response._decodedJSON);
expect(emailClient.client.post).toHaveBeenCalledWith(`/emails`, {
address: emailAddress,
});
});
it.each`
status | error
${400} | ${"The email address already exists"}
${401} | ${"Unauthorized error"}
${409} | ${"Maximum number of email addresses reached error"}
${500} | ${"Technical error"}
`(
"should throw error if API returns an error status",
async ({ status, error }) => {
const response = new Response(new XMLHttpRequest());
response.status = status;
response.ok = status >= 200 && status <= 299;
jest.spyOn(emailClient.client, "post").mockResolvedValueOnce(response);
const email = emailClient.create(emailAddress);
await expect(email).rejects.toThrow(error);
}
);
it("should throw error on API communication failure", async () => {
emailClient.client.post = jest
.fn()
.mockRejectedValue(new Error("Test error"));
const user = emailClient.create(emailAddress);
await expect(user).rejects.toThrowError("Test error");
});
});
describe("EmailClient.setPrimaryEmail()", () => {
it("should set a primary email address", async () => {
const response = new Response(new XMLHttpRequest());
response.ok = true;
jest.spyOn(emailClient.client, "post").mockResolvedValue(response);
const update = await emailClient.setPrimaryEmail(emailID);
expect(emailClient.client.post).toHaveBeenCalledWith(
`/emails/${emailID}/set_primary`
);
expect(update).toEqual(undefined);
});
it.each`
status | error
${401} | ${"Unauthorized error"}
${500} | ${"Technical error"}
`(
"should throw error if API returns an error status",
async ({ status, error }) => {
const response = new Response(new XMLHttpRequest());
response.status = status;
response.ok = status >= 200 && status <= 299;
jest.spyOn(emailClient.client, "post").mockResolvedValueOnce(response);
const email = emailClient.setPrimaryEmail(emailID);
await expect(email).rejects.toThrow(error);
}
);
it("should throw error on API communication failure", async () => {
emailClient.client.post = jest
.fn()
.mockRejectedValue(new Error("Test error"));
const user = emailClient.setPrimaryEmail(emailID);
await expect(user).rejects.toThrowError("Test error");
});
});
describe("EmailClient.delete()", () => {
it("should delete email addresses", async () => {
const response = new Response(new XMLHttpRequest());
response.ok = true;
jest.spyOn(emailClient.client, "delete").mockResolvedValue(response);
const deleteResponse = await emailClient.delete(emailID);
expect(emailClient.client.delete).toHaveBeenCalledWith(
`/emails/${emailID}`
);
expect(deleteResponse).toEqual(undefined);
});
it.each`
status | error
${401} | ${"Unauthorized error"}
${500} | ${"Technical error"}
`(
"should throw error if API returns an error status",
async ({ status, error }) => {
const response = new Response(new XMLHttpRequest());
response.status = status;
response.ok = status >= 200 && status <= 299;
jest.spyOn(emailClient.client, "delete").mockResolvedValueOnce(response);
const deleteResponse = emailClient.delete(emailID);
await expect(deleteResponse).rejects.toThrow(error);
}
);
it("should throw error on API communication failure", async () => {
emailClient.client.delete = jest
.fn()
.mockRejectedValue(new Error("Test error"));
const user = emailClient.delete(emailID);
await expect(user).rejects.toThrowError("Test error");
});
});