89 lines
2.7 KiB
JavaScript
89 lines
2.7 KiB
JavaScript
jest.mock("../models/household.model", () => ({
|
|
getUserRole: jest.fn(),
|
|
transferOwnership: jest.fn(),
|
|
updateMemberRole: jest.fn(),
|
|
}));
|
|
|
|
jest.mock("../utils/logger", () => ({
|
|
logError: jest.fn(),
|
|
}));
|
|
|
|
const householdModel = require("../models/household.model");
|
|
const controller = require("../controllers/households.controller");
|
|
|
|
function createResponse() {
|
|
const res = {};
|
|
res.status = jest.fn().mockReturnValue(res);
|
|
res.json = jest.fn().mockReturnValue(res);
|
|
return res;
|
|
}
|
|
|
|
describe("households.controller updateMemberRole", () => {
|
|
beforeEach(() => {
|
|
jest.clearAllMocks();
|
|
householdModel.getUserRole.mockResolvedValue("member");
|
|
householdModel.transferOwnership.mockResolvedValue({ user_id: 7, role: "owner" });
|
|
householdModel.updateMemberRole.mockResolvedValue({ user_id: 7, role: "admin" });
|
|
});
|
|
|
|
test("owner can transfer household ownership", async () => {
|
|
const req = {
|
|
params: { householdId: "3", userId: "7" },
|
|
body: { role: "owner" },
|
|
user: { id: 1 },
|
|
household: { id: 3, role: "owner" },
|
|
};
|
|
const res = createResponse();
|
|
|
|
await controller.updateMemberRole(req, res);
|
|
|
|
expect(householdModel.transferOwnership).toHaveBeenCalledWith("3", 1, 7);
|
|
expect(householdModel.updateMemberRole).not.toHaveBeenCalled();
|
|
expect(res.json).toHaveBeenCalledWith({
|
|
message: "Household ownership transferred successfully",
|
|
member: { user_id: 7, role: "owner" },
|
|
});
|
|
});
|
|
|
|
test("admin cannot transfer household ownership", async () => {
|
|
const req = {
|
|
params: { householdId: "3", userId: "7" },
|
|
body: { role: "owner" },
|
|
user: { id: 1 },
|
|
household: { id: 3, role: "admin" },
|
|
};
|
|
const res = createResponse();
|
|
|
|
await controller.updateMemberRole(req, res);
|
|
|
|
expect(householdModel.transferOwnership).not.toHaveBeenCalled();
|
|
expect(res.status).toHaveBeenCalledWith(403);
|
|
expect(res.json).toHaveBeenCalledWith(
|
|
expect.objectContaining({
|
|
error: expect.objectContaining({
|
|
message: "Only the household owner can transfer ownership",
|
|
}),
|
|
})
|
|
);
|
|
});
|
|
|
|
test("owner can still update a member to admin without transfer flow", async () => {
|
|
const req = {
|
|
params: { householdId: "3", userId: "7" },
|
|
body: { role: "admin" },
|
|
user: { id: 1 },
|
|
household: { id: 3, role: "owner" },
|
|
};
|
|
const res = createResponse();
|
|
|
|
await controller.updateMemberRole(req, res);
|
|
|
|
expect(householdModel.updateMemberRole).toHaveBeenCalledWith("3", "7", "admin");
|
|
expect(householdModel.transferOwnership).not.toHaveBeenCalled();
|
|
expect(res.json).toHaveBeenCalledWith({
|
|
message: "Member role updated successfully",
|
|
member: { user_id: 7, role: "admin" },
|
|
});
|
|
});
|
|
});
|