test("Informs about disconnected kernels, allows reconnection", async () => { const state$ = { value: { core: stateModule.makeStateRecord({ kernelRef: "fake", entities: stateModule.makeEntitiesRecord({ contents: stateModule.makeContentsRecord({ byRef: Immutable.Map({ fakeContent: stateModule.makeNotebookContentRecord() }) }), kernels: stateModule.makeKernelsRecord({ byRef: Immutable.Map({ fake: stateModule.makeRemoteKernelRecord({ channels: null, status: "not connected" }) }) }) }) }), app: { notificationSystem: { addNotification: jest.fn() } } } }; const action$ = ActionsObservable.of( actions.executeCell({ id: "first", contentRef: "fakeContentRef" }) ); const responses = await executeCellEpic(action$, state$) .pipe(toArray()) .toPromise(); expect(responses).toEqual([]); });
export function fixtureStore(config: JSONObject) { const dummyNotebook = buildFixtureNotebook(config); const frontendToShell = new Subject(); const shellToFrontend = new Subject(); const mockShell = Subject.create(frontendToShell, shellToFrontend); const channels = mockShell; const kernelRef = createKernelRef(); const contentRef = createContentRef(); const initialAppState: AppState = { core: makeStateRecord({ kernelRef, entities: makeEntitiesRecord({ contents: makeContentsRecord({ byRef: Immutable.Map({ [contentRef]: makeNotebookContentRecord({ model: makeDocumentRecord({ notebook: dummyNotebook, savedNotebook: config && config.saved === true ? dummyNotebook : emptyNotebook, cellPagers: Immutable.Map(), cellFocused: config && config.codeCellCount && config.codeCellCount > 1 ? dummyNotebook.get("cellOrder", Immutable.List()).get(1) : null }), filepath: config && config.noFilename ? "" : "dummy-store-nb.ipynb" }) }) }), kernels: makeKernelsRecord({ byRef: Immutable.Map({ [kernelRef]: makeRemoteKernelRecord({ channels, status: "not connected" }) }) }) }) }), app: makeAppRecord({ notificationSystem: { addNotification: () => {} // most of the time you'll want to mock this }, githubToken: "TOKEN" }), config: Immutable.Map({ theme: "light" }), comms: makeCommsRecord() }; return createStore(rootReducer, initialAppState as any); }
export const contents = ( state: ContentsRecord = makeContentsRecord(), action: Action ): ContentsRecord => { return state.merge({ byRef: byRef(state.byRef, action) }); };
test("launches remote kernels", async function() { const contentRef = "fakeContentRef"; const kernelRef = "fake"; const value = { app: stateModule.makeAppRecord({ host: stateModule.makeJupyterHostRecord({ type: "jupyter", token: "eh", basePath: "http://localhost:8888/" }), notificationSystem: { addNotification: jest.fn() } }), comms: stateModule.makeCommsRecord(), config: Immutable.Map({}), core: stateModule.makeStateRecord({ kernelRef: "fake", entities: stateModule.makeEntitiesRecord({ contents: stateModule.makeContentsRecord({ byRef: Immutable.Map({ fakeContentRef: stateModule.makeNotebookContentRecord() }) }), kernels: stateModule.makeKernelsRecord({ byRef: Immutable.Map({ fake: stateModule.makeRemoteKernelRecord({ type: "websocket", channels: new Subject<any>(), kernelSpecName: "fancy", id: "0" }) }) }) }) }) }; const state$ = new StateObservable( new Subject<stateModule.AppState>(), value ); const action$ = ActionsObservable.of( actions.launchKernelByName({ contentRef, kernelRef, kernelSpecName: "fancy", cwd: "/", selectNextKernel: true }) ); const responseActions = await coreEpics .launchWebSocketKernelEpic(action$, state$) .pipe(toArray()) .toPromise(); expect(responseActions).toEqual([ { type: "LAUNCH_KERNEL_SUCCESSFUL", payload: { contentRef, kernelRef, selectNextKernel: true, kernel: { info: null, sessionId: "1", type: "websocket", channels: expect.any(Subject), kernelSpecName: "fancy", cwd: "/", id: "0" } } } ]); });