import React from 'react';
import { initStore, collect, WithStoreProp } from '../..';
import * as testUtils from '../testUtils';
it('should do the right thing', () => {
initStore({
prop1: 'Prop 1',
prop2: 'Prop 2',
tasks: [
{
id: 0,
name: 'Task 0',
},
{
id: 1,
name: 'Task 1',
},
],
});
type TaskProps = WithStoreProp & {
taskId: number;
};
const Task = ({ store, taskId }: TaskProps) => {
if (!store.tasks) return null;
const task = store.tasks.find(({ id }) => id === taskId);
if (!task) return null;
return (
{store.prop2}
{task.name}
);
};
const TaskCollected = collect(Task);
const TaskList = ({ store }: WithStoreProp) => (
{store.prop1}
{store.tasks &&
store.tasks.map((task) => (
))}
);
testUtils.collectAndRenderStrict(TaskList);
expect(window.__RR__.getListenersByComponent()).toEqual({
Task: [
'tasks',
'tasks.0',
'tasks.0.id',
'tasks.1',
'tasks.1.id',
'prop2',
'tasks.0.name',
'tasks.1.name',
],
TaskList: [
'prop1',
'tasks',
'tasks.0',
'tasks.0.id',
'tasks.1',
'tasks.1.id',
],
});
// Filter for the task list only
expect(window.__RR__.getListenersByComponent(/TaskList/)).toEqual({
TaskList: [
'prop1',
'tasks',
'tasks.0',
'tasks.0.id',
'tasks.1',
'tasks.1.id',
],
});
// Put the ID in the key and filter for a specific instance
expect(
window.__RR__.getListenersByComponent(
'Task0',
(props: TaskProps) => props.taskId
)
).toEqual({
Task0: ['tasks', 'tasks.0', 'tasks.0.id', 'prop2', 'tasks.0.name'],
});
expect(window.__RR__.getComponentsByListener()).toEqual({
tasks: ['TaskList', 'Task'],
'tasks.0': ['TaskList', 'Task'],
'tasks.0.id': ['TaskList', 'Task'],
'tasks.1': ['TaskList', 'Task'],
'tasks.1.id': ['TaskList', 'Task'],
prop2: ['Task'],
'tasks.0.name': ['Task'],
'tasks.1.name': ['Task'],
prop1: ['TaskList'],
});
// Which components _instances_ listen to `tasks.0.id`?
// Note that Task1 listens too because it loops over all tasks
expect(
window.__RR__.getComponentsByListener(
'tasks.0.id',
(props: TaskProps) => props.taskId
)['tasks.0.id']
).toEqual(['TaskList', 'Task0', 'Task1']);
expect(
window.__RR__.getComponentsByListener(
null,
(props: TaskProps) => props.taskId
)
).toEqual({
tasks: ['TaskList', 'Task0', 'Task1'],
'tasks.0': ['TaskList', 'Task0', 'Task1'],
'tasks.0.id': ['TaskList', 'Task0', 'Task1'],
'tasks.1': ['TaskList', 'Task1'],
'tasks.1.id': ['TaskList', 'Task1'],
prop2: ['Task0', 'Task1'],
'tasks.0.name': ['Task0'],
'tasks.1.name': ['Task1'],
prop1: ['TaskList'],
});
});