Files
n8n-enterprise-unlocked/packages/frontend/editor-ui/src/stores/users.store.test.ts

153 lines
3.5 KiB
TypeScript

import type { CurrentUserResponse } from '@n8n/rest-api-client/api/users';
import { useUsersStore } from './users.store';
import { createPinia, setActivePinia } from 'pinia';
const { loginCurrentUser, inviteUsers } = vi.hoisted(() => {
return {
loginCurrentUser: vi.fn(),
identify: vi.fn(),
inviteUsers: vi.fn(),
};
});
vi.mock('@n8n/rest-api-client/api/users', () => ({
loginCurrentUser,
}));
vi.mock('@/api/invitation', () => ({
inviteUsers,
}));
vi.mock('@n8n/stores/useRootStore', () => ({
useRootStore: vi.fn(() => ({
instanceId: 'test-instance-id',
})),
}));
const mockUser: CurrentUserResponse = {
id: '1',
firstName: 'John Doe',
role: 'global:owner',
isPending: false,
};
describe('users.store', () => {
beforeEach(() => {
vi.restoreAllMocks();
setActivePinia(createPinia());
});
describe('loginWithCookie', () => {
it('should set current user', async () => {
const usersStore = useUsersStore();
loginCurrentUser.mockResolvedValueOnce(mockUser);
await usersStore.loginWithCookie();
expect(loginCurrentUser).toHaveBeenCalled();
expect(usersStore.currentUserId).toEqual(mockUser.id);
expect(usersStore.currentUser).toEqual({
...mockUser,
fullName: `${mockUser.firstName} `,
isDefaultUser: false,
isPendingUser: false,
});
});
});
describe('inviteUsers', () => {
it('should add pending user to the store', async () => {
const usersStore = useUsersStore();
inviteUsers.mockResolvedValueOnce([
{
user: { id: 'random-id', email: 'test@n8n.io', emailSent: true, role: 'global:member' },
},
]);
await usersStore.inviteUsers([{ email: 'test@n8n.io', role: 'global:member' }]);
expect(usersStore.allUsers[0]).toMatchObject(
expect.objectContaining({
id: 'random-id',
email: 'test@n8n.io',
role: 'global:member',
isPending: true,
isDefaultUser: false,
isPendingUser: true,
fullName: undefined,
emailSent: true,
}),
);
});
});
describe('isCalloutDismissed', () => {
it('should return true if callout is dismissed', () => {
const usersStore = useUsersStore();
usersStore.usersById['1'] = {
...mockUser,
isDefaultUser: false,
isPendingUser: false,
mfaEnabled: false,
settings: {
dismissedCallouts: {
testCallout: true,
},
},
};
usersStore.currentUserId = '1';
const isDismissed = usersStore.isCalloutDismissed('testCallout');
expect(isDismissed).toBe(true);
});
});
describe('setCalloutDismissed', () => {
it('should set callout as dismissed in user settings', () => {
const usersStore = useUsersStore();
usersStore.usersById['1'] = {
...mockUser,
isDefaultUser: false,
isPendingUser: false,
mfaEnabled: false,
settings: {},
};
usersStore.currentUserId = '1';
usersStore.setCalloutDismissed('testCallout');
expect(usersStore.usersById['1'].settings?.dismissedCallouts).toEqual({
testCallout: true,
});
});
it('should not lose existing dismissed callouts', () => {
const usersStore = useUsersStore();
usersStore.usersById['1'] = {
...mockUser,
isDefaultUser: false,
isPendingUser: false,
mfaEnabled: false,
settings: {
dismissedCallouts: {
previousCallout: true,
},
},
};
usersStore.currentUserId = '1';
usersStore.setCalloutDismissed('testCallout');
expect(usersStore.usersById['1'].settings?.dismissedCallouts).toEqual({
previousCallout: true,
testCallout: true,
});
});
});
});