Skip to content

Commit

Permalink
stash
Browse files Browse the repository at this point in the history
  • Loading branch information
MajorLift committed Nov 30, 2023
1 parent 05c7694 commit 6ecd249
Show file tree
Hide file tree
Showing 2 changed files with 199 additions and 182 deletions.
227 changes: 95 additions & 132 deletions packages/composable-controller/src/ComposableController.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import {
import type { Patch } from 'immer';
import * as sinon from 'sinon';

import type { ComposableControllerStateChangeEvent } from './ComposableController';
import { ComposableController } from './ComposableController';

// Mock BaseController classes
Expand All @@ -26,7 +27,7 @@ type FooMessenger = RestrictedControllerMessenger<
'FooController',
never,
FooControllerEvent,
string,
never,
never
>;

Expand Down Expand Up @@ -64,6 +65,11 @@ type BarControllerState = BaseState & {
bar: string;
};

type BarControllerStateChangeEvent = {
type: `BarController:stateChange`;
payload: [BarControllerState, Patch[]];
};

class BarController extends BaseControllerV1<never, BarControllerState> {
defaultState = {
bar: 'bar',
Expand Down Expand Up @@ -105,15 +111,13 @@ describe('ComposableController', () => {

describe('BaseControllerV1', () => {
it('should compose controller state', () => {
const composableMessenger = new ControllerMessenger().getRestricted<
'ComposableController',
never,
never
>({ name: 'ComposableController' });
const controller = new ComposableController(
[new BarController(), new BazController()],
composableMessenger,
);
const composableMessenger = new ControllerMessenger().getRestricted({
name: 'ComposableController',
});
const controller = new ComposableController({
controllers: [new BarController(), new BazController()],
messenger: composableMessenger,
});

expect(controller.state).toStrictEqual({
BarController: { bar: 'bar' },
Expand All @@ -122,15 +126,13 @@ describe('ComposableController', () => {
});

it('should compose flat controller state', () => {
const composableMessenger = new ControllerMessenger().getRestricted<
'ComposableController',
never,
never
>({ name: 'ComposableController' });
const controller = new ComposableController(
[new BarController(), new BazController()],
composableMessenger,
);
const composableMessenger = new ControllerMessenger().getRestricted({
name: 'ComposableController',
});
const controller = new ComposableController({
controllers: [new BarController(), new BazController()],
messenger: composableMessenger,
});

expect(controller.flatState).toStrictEqual({
bar: 'bar',
Expand All @@ -139,19 +141,23 @@ describe('ComposableController', () => {
});

it('should notify listeners of nested state change', () => {
const composableMessenger = new ControllerMessenger().getRestricted<
'ComposableController',
const controllerMessenger = new ControllerMessenger<
never,
never
>({ name: 'ComposableController' });
ComposableControllerStateChangeEvent | BarControllerStateChangeEvent
>();
const composableMessenger = controllerMessenger.getRestricted({
name: 'ComposableController',
});
const barController = new BarController();
const controller = new ComposableController(
[barController],
composableMessenger,
);
new ComposableController({
controllers: [barController],
messenger: composableMessenger,
});
const listener = sinon.stub();
controller.subscribe(listener);

controllerMessenger.subscribe(
'ComposableController:stateChange',
listener,
);
barController.updateBar('something different');

expect(listener.calledOnce).toBe(true);
Expand All @@ -169,27 +175,19 @@ describe('ComposableController', () => {
never,
FooControllerEvent
>();
const fooControllerMessenger = controllerMessenger.getRestricted<
'FooController',
never,
never
>({
const fooControllerMessenger = controllerMessenger.getRestricted({
name: 'FooController',
});
const fooController = new FooController(fooControllerMessenger);

const composableControllerMessenger = controllerMessenger.getRestricted<
'ComposableController',
never,
'FooController:stateChange'
>({
const composableControllerMessenger = controllerMessenger.getRestricted({
name: 'ComposableController',
allowedEvents: ['FooController:stateChange'],
});
const composableController = new ComposableController(
[fooController],
composableControllerMessenger,
);
const composableController = new ComposableController({
controllers: [fooController],
messenger: composableControllerMessenger,
});
expect(composableController.state).toStrictEqual({
FooController: { foo: 'foo' },
});
Expand All @@ -200,26 +198,18 @@ describe('ComposableController', () => {
never,
FooControllerEvent
>();
const fooControllerMessenger = controllerMessenger.getRestricted<
'FooController',
never,
never
>({
const fooControllerMessenger = controllerMessenger.getRestricted({
name: 'FooController',
});
const fooController = new FooController(fooControllerMessenger);
const composableControllerMessenger = controllerMessenger.getRestricted<
'ComposableController',
never,
'FooController:stateChange'
>({
const composableControllerMessenger = controllerMessenger.getRestricted({
name: 'ComposableController',
allowedEvents: ['FooController:stateChange'],
});
const composableController = new ComposableController(
[fooController],
composableControllerMessenger,
);
const composableController = new ComposableController({
controllers: [fooController],
messenger: composableControllerMessenger,
});
expect(composableController.flatState).toStrictEqual({
foo: 'foo',
});
Expand All @@ -230,36 +220,29 @@ describe('ComposableController', () => {
never,
FooControllerEvent
>();
const fooControllerMessenger = controllerMessenger.getRestricted<
'FooController',
never,
never
>({
const fooControllerMessenger = controllerMessenger.getRestricted({
name: 'FooController',
});
const fooController = new FooController(fooControllerMessenger);
const composableControllerMessenger = controllerMessenger.getRestricted<
'ComposableController',
never,
'FooController:stateChange'
>({
const composableControllerMessenger = controllerMessenger.getRestricted({
name: 'ComposableController',
allowedEvents: ['FooController:stateChange'],
});
const composableController = new ComposableController(
[fooController],
composableControllerMessenger,
);
new ComposableController({
controllers: [fooController],
messenger: composableControllerMessenger,
});

const listener = sinon.stub();
composableController.subscribe(listener);
composableControllerMessenger.subscribe(
'FooController:stateChange',
listener,
);
fooController.updateFoo('bar');

expect(listener.calledOnce).toBe(true);
expect(listener.getCall(0).args[0]).toStrictEqual({
FooController: {
foo: 'bar',
},
foo: 'bar',
});
});
});
Expand All @@ -271,26 +254,18 @@ describe('ComposableController', () => {
never,
FooControllerEvent
>();
const fooControllerMessenger = controllerMessenger.getRestricted<
'FooController',
never,
never
>({
const fooControllerMessenger = controllerMessenger.getRestricted({
name: 'FooController',
});
const fooController = new FooController(fooControllerMessenger);
const composableControllerMessenger = controllerMessenger.getRestricted<
'ComposableController',
never,
'FooController:stateChange'
>({
const composableControllerMessenger = controllerMessenger.getRestricted({
name: 'ComposableController',
allowedEvents: ['FooController:stateChange'],
});
const composableController = new ComposableController(
[barController, fooController],
composableControllerMessenger,
);
const composableController = new ComposableController({
controllers: [barController, fooController],
messenger: composableControllerMessenger,
});
expect(composableController.state).toStrictEqual({
BarController: { bar: 'bar' },
FooController: { foo: 'foo' },
Expand All @@ -303,26 +278,18 @@ describe('ComposableController', () => {
never,
FooControllerEvent
>();
const fooControllerMessenger = controllerMessenger.getRestricted<
'FooController',
never,
never
>({
const fooControllerMessenger = controllerMessenger.getRestricted({
name: 'FooController',
});
const fooController = new FooController(fooControllerMessenger);
const composableControllerMessenger = controllerMessenger.getRestricted<
'ComposableController',
never,
'FooController:stateChange'
>({
const composableControllerMessenger = controllerMessenger.getRestricted({
name: 'ComposableController',
allowedEvents: ['FooController:stateChange'],
});
const composableController = new ComposableController(
[barController, fooController],
composableControllerMessenger,
);
const composableController = new ComposableController({
controllers: [barController, fooController],
messenger: composableControllerMessenger,
});
expect(composableController.flatState).toStrictEqual({
bar: 'bar',
foo: 'foo',
Expand All @@ -333,7 +300,7 @@ describe('ComposableController', () => {
const barController = new BarController();
const controllerMessenger = new ControllerMessenger<
never,
FooControllerEvent
ComposableControllerStateChangeEvent | FooControllerEvent
>();
const fooControllerMessenger = controllerMessenger.getRestricted<
'FooController',
Expand All @@ -343,21 +310,19 @@ describe('ComposableController', () => {
name: 'FooController',
});
const fooController = new FooController(fooControllerMessenger);
const composableControllerMessenger = controllerMessenger.getRestricted<
'ComposableController',
never,
'FooController:stateChange'
>({
const composableControllerMessenger = controllerMessenger.getRestricted({
name: 'ComposableController',
allowedEvents: ['FooController:stateChange'],
});
const composableController = new ComposableController(
[barController, fooController],
composableControllerMessenger,
);

new ComposableController({
controllers: [barController, fooController],
messenger: composableControllerMessenger,
});
const listener = sinon.stub();
composableController.subscribe(listener);
controllerMessenger.subscribe(
'ComposableController:stateChange',
listener,
);
barController.updateBar('foo');

expect(listener.calledOnce).toBe(true);
Expand All @@ -375,7 +340,7 @@ describe('ComposableController', () => {
const barController = new BarController();
const controllerMessenger = new ControllerMessenger<
never,
FooControllerEvent
ComposableControllerStateChangeEvent | FooControllerEvent
>();
const fooControllerMessenger = controllerMessenger.getRestricted<
'FooController',
Expand All @@ -385,21 +350,20 @@ describe('ComposableController', () => {
name: 'FooController',
});
const fooController = new FooController(fooControllerMessenger);
const composableControllerMessenger = controllerMessenger.getRestricted<
'ComposableController',
never,
'FooController:stateChange'
>({
const composableControllerMessenger = controllerMessenger.getRestricted({
name: 'ComposableController',
allowedEvents: ['FooController:stateChange'],
});
const composableController = new ComposableController(
[barController, fooController],
composableControllerMessenger,
);
new ComposableController({
controllers: [barController, fooController],
messenger: composableControllerMessenger,
});

const listener = sinon.stub();
composableController.subscribe(listener);
controllerMessenger.subscribe(
'ComposableController:stateChange',
listener,
);
fooController.updateFoo('bar');

expect(listener.calledOnce).toBe(true);
Expand All @@ -419,16 +383,15 @@ describe('ComposableController', () => {
never,
FooControllerEvent
>();
const fooControllerMessenger = controllerMessenger.getRestricted<
'FooController',
never,
never
>({
const fooControllerMessenger = controllerMessenger.getRestricted({
name: 'FooController',
});
const fooController = new FooController(fooControllerMessenger);
expect(
() => new ComposableController([barController, fooController]),
() =>
new ComposableController({
controllers: [barController, fooController],
}),
).toThrow(
'Messaging system required if any BaseController controllers are used',
);
Expand Down
Loading

0 comments on commit 6ecd249

Please sign in to comment.