Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 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
2 changes: 2 additions & 0 deletions .changeset/slimy-maps-read.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
---
---
Original file line number Diff line number Diff line change
@@ -1,42 +1,205 @@
// TODO: jest fails because of a circular dependency on Client -> Base -> Client
// This circular dep is a known issue we plan to address soon. Enable the tests then
import { describe, it } from 'vitest';
import type { Resources, UserJSON } from '@clerk/shared/types';
import { describe, expect, it, vi } from 'vitest';

describe.skip('memoizeStateListenerCallback', () => {
it.skip('runs', () => {
// TODO
import { User } from '../../core/resources/User';
import { memoizeListenerCallback } from '../memoizeStateListenerCallback';

describe('memoizeStateListenerCallback', () => {
it('returns same user ref if user obj state has not changed', () => {
const user1 = new User({
id: 'u1',
updated_at: 1,
first_name: 'clerk',
email_addresses: [],
external_accounts: [],
phone_numbers: [],
web3_wallets: [],
} as unknown as UserJSON);

const user2 = new User({
id: 'u1',
updated_at: 1,
first_name: 'clerk',
email_addresses: [],
external_accounts: [],
phone_numbers: [],
web3_wallets: [],
} as unknown as UserJSON);

let calledWith: Resources | undefined;
const listener = memoizeListenerCallback(
vi.fn((e: Resources) => {
calledWith = e;
}),
);

listener({ client: null, organization: null, session: null, user: user1 });
listener({ client: null, organization: null, session: null, user: user2 });

expect(calledWith?.user).toBe(user1);
});
});

// import { Resources, UserJSON } from '@clerk/shared/types';
//
// const frontEndApi = '';
// const path = '';
//
// describe('memoizeStateListenerCallback', () => {
// it('returns same user ref if user obj state has not changed', () => {
// const user1 = new User(frontEndApi, path, {
// id: 'u1',
// updated_at: 1,
// first_name: 'clerk',
// } as UserJSON);
//
// const user2 = new User(frontEndApi, path, {
// id: 'u1',
// updated_at: 1,
// first_name: 'clerk',
// } as UserJSON);
//
// let calledWith: any;
// const listener = memoizeListenerCallback(
// jest.fn((e: Resources) => {
// console.log(e);
// calledWith = e.user;
// }),
// );
//
// listener(({ user: user1 } as any) as Resources);
// listener(({ user: user2 } as any) as Resources);
// expect(calledWith).toBe(user1);
// });
// });
it('returns new user ref if user obj state has changed', () => {
const user1 = new User({
id: 'u1',
updated_at: 1,
first_name: 'clerk',
email_addresses: [],
external_accounts: [],
phone_numbers: [],
web3_wallets: [],
} as unknown as UserJSON);

const user2 = new User({
id: 'u1',
updated_at: 2,
first_name: 'clerk',
email_addresses: [],
external_accounts: [],
phone_numbers: [],
web3_wallets: [],
} as unknown as UserJSON);

let calledWith: Resources | undefined;
const listener = memoizeListenerCallback(
vi.fn((e: Resources) => {
calledWith = e;
}),
);

listener({ client: null, organization: null, session: null, user: user1 });
listener({ client: null, organization: null, session: null, user: user2 });

expect(calledWith?.user).toBe(user2);
});

it('returns new user ref if user id has changed', () => {
const user1 = new User({
id: 'u1',
updated_at: 1,
first_name: 'clerk',
email_addresses: [],
external_accounts: [],
phone_numbers: [],
web3_wallets: [],
} as unknown as UserJSON);

const user2 = new User({
id: 'u2',
updated_at: 1,
first_name: 'clerk',
email_addresses: [],
external_accounts: [],
phone_numbers: [],
web3_wallets: [],
} as unknown as UserJSON);

let calledWith: Resources | undefined;
const listener = memoizeListenerCallback(
vi.fn((e: Resources) => {
calledWith = e;
}),
);

listener({ client: null, organization: null, session: null, user: user1 });
listener({ client: null, organization: null, session: null, user: user2 });

expect(calledWith?.user).toBe(user2);
});

it('handles user becoming null', () => {
const user1 = new User({
id: 'u1',
updated_at: 1,
first_name: 'clerk',
email_addresses: [],
external_accounts: [],
phone_numbers: [],
web3_wallets: [],
} as unknown as UserJSON);

let calledWith: Resources | undefined;
const listener = memoizeListenerCallback(
vi.fn((e: Resources) => {
calledWith = e;
}),
);

listener({ client: null, organization: null, session: null, user: user1 });
listener({ client: null, organization: null, session: null, user: null });

expect(calledWith?.user).toBe(null);
});

it('handles user transitioning from null to defined', () => {
const user1 = new User({
id: 'u1',
updated_at: 1,
first_name: 'clerk',
email_addresses: [],
external_accounts: [],
phone_numbers: [],
web3_wallets: [],
} as unknown as UserJSON);

let calledWith: Resources | undefined;
const listener = memoizeListenerCallback(
vi.fn((e: Resources) => {
calledWith = e;
}),
);

listener({ client: null, organization: null, session: null, user: null });
listener({ client: null, organization: null, session: null, user: user1 });

expect(calledWith?.user).toBe(user1);
});

it('calls the callback function each time', () => {
const user1 = new User({
id: 'u1',
updated_at: 1,
first_name: 'clerk',
email_addresses: [],
external_accounts: [],
phone_numbers: [],
web3_wallets: [],
} as unknown as UserJSON);

const mockCallback = vi.fn();
const listener = memoizeListenerCallback(mockCallback);

listener({ client: null, organization: null, session: null, user: user1 });
listener({ client: null, organization: null, session: null, user: user1 });

expect(mockCallback).toHaveBeenCalledTimes(2);
});

it('treats null and undefined as different values (null to undefined)', () => {
let calledWith: Resources | undefined;
const listener = memoizeListenerCallback(
vi.fn((e: Resources) => {
calledWith = e;
}),
);

listener({ client: null, organization: null, session: null, user: null });
listener({ client: null, organization: null, session: null, user: undefined });

expect(calledWith?.user).toBe(undefined);
});

it('treats null and undefined as different values (undefined to null)', () => {
let calledWith: Resources | undefined;
const listener = memoizeListenerCallback(
vi.fn((e: Resources) => {
calledWith = e;
}),
);

listener({ client: null, organization: null, session: null, user: undefined });
listener({ client: null, organization: null, session: null, user: null });

expect(calledWith?.user).toBe(null);
});
});
Loading