Skip to content

Commit b2532ad

Browse files
committed
type almost fully working
1 parent a4dcf87 commit b2532ad

File tree

9 files changed

+809
-744
lines changed

9 files changed

+809
-744
lines changed

__mocks__/neo4j-driver.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { ObservablePromise } from '../__tests__/testUtils';
33
const Neo4j: typeof Neo4jType = jest.requireActual('neo4j-driver');
44

55
// eslint-disable-next-line @typescript-eslint/no-unused-vars
6-
export const mockSessionRun: jest.Mock<ObservablePromise<any>, [cypher: string, b: Record<string, any>]> = jest.fn((..._) => {
6+
export const mockSessionRun: jest.Mock<ObservablePromise<unknown>, [cypher: string, b: Record<string, unknown>]> = jest.fn((..._) => {
77
const observablePromise: Partial<ObservablePromise<void>> = Promise.resolve();
88
// eslint-disable-next-line @typescript-eslint/no-empty-function
99
observablePromise.subscribe = jest.fn(() => {});

__tests__/neovis.tests.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
import Neo4j, * as Neo4jMockImport from 'neo4j-driver';
22
import Neovis, {
3-
NEOVIS_DEFAULT_CONFIG,
4-
NEOVIS_ADVANCED_CONFIG,
53
migrateFromOldConfig,
6-
NeovisConfig, NonFlatNeovisConfig, OldNeoVisConfig
4+
OldNeoVisConfig
75
} from '../src/neovis';
86
import { NeoVisEvents } from '../src/events';
97
import * as testUtils from './testUtils';
@@ -12,6 +10,7 @@ import * as testUtils from './testUtils';
1210
import type * as Neo4jMockType from '../__mocks__/neo4j-driver';
1311
import type NeoVis from '../src/neovis';
1412
import type VisNetwork from 'vis-network';
13+
import { NEOVIS_ADVANCED_CONFIG, NEOVIS_DEFAULT_CONFIG, NeovisConfig, NonFlatNeovisConfig } from '../src/types';
1514

1615
jest.mock('neo4j-driver');
1716

@@ -390,15 +389,15 @@ describe('Neovis', () => {
390389
// TODO: After upgrading to merge config, type casting is failing due to not able to detect target type. A proper way
391390
// either let the user to define type casting or do it automaticlly need to be implemented.
392391
describe('neovis type casting test', () => {
393-
const intProperty = 'intProperity';
392+
const intProperty = 'intProperty';
394393
const intPropertyValue = 40;
395394

396395
it('should merge property name type to vis.js config properly', async () => {
397-
const config = {
396+
const config: NeovisConfig = {
398397
container_id: container_id,
399398
labels: {
400399
[label1]: {
401-
'label': intProperty
400+
402401
}
403402
},
404403
initial_cypher: initial_cypher
@@ -413,7 +412,9 @@ describe('Neovis', () => {
413412
neovis.render();
414413
await testUtils.neovisRenderDonePromise(neovis);
415414
expect(Neo4jMock.mockSessionRun).toHaveBeenCalledTimes(1);
416-
expect(neovis.nodes.get(1)).toHaveProperty('label', intPropertyValue);
415+
expect(neovis.nodes.get(1)).toHaveProperty('font');
416+
expect(neovis.nodes.get(1).font).toHaveProperty('size', intPropertyValue);
417+
expect(neovis.nodes.get(1).font).toHaveProperty('color', intPropertyValue);
417418
});
418419

419420
it('should merge static type to vis.js config properly', async () => {

__tests__/testUtils.ts

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import type * as Neo4jType from 'neo4j-driver';
22
import * as Neo4jMockImport from 'neo4j-driver';
3-
import { NeoVisEvents } from '../src/events';
3+
import { EventFunctionTypes, NeoVisEvents } from '../src/events';
44
import * as Neo4jCore from 'neo4j-driver-core';
55

66
// eslint-disable-next-line jest/no-mocks-import
@@ -18,11 +18,11 @@ export function clearIdCounter(): void {
1818
counter = 1;
1919
}
2020

21-
export function makeNode(labels: string[], properties: any = {}): Neo4jCore.Node<number> {
21+
export function makeNode(labels: string[], properties: unknown = {}): Neo4jCore.Node<number> {
2222
return new Neo4jCore.Node(counter++, labels, properties);
2323
}
2424

25-
export function makeRelationship(type: string, startNode: Neo4jCore.Node<number>, endNode: Neo4jCore.Node<number>, properties: any = {}): Neo4jCore.Relationship<number> {
25+
export function makeRelationship(type: string, startNode: Neo4jCore.Node<number>, endNode: Neo4jCore.Node<number>, properties: unknown = {}): Neo4jCore.Relationship<number> {
2626
return new Neo4jCore.Relationship(counter++, startNode.identity, endNode.identity, type, properties);
2727
}
2828

@@ -38,7 +38,7 @@ export function makePathFromNodes(nodes: Neo4jType.Node<number>[], relationshipT
3838
return new Neo4jCore.Path(nodes[0], nodes[nodes.length - 1], pathSegments);
3939
}
4040

41-
export function makeRecord(parameters: any[]): Neo4jCore.Record {
41+
export function makeRecord<T>(parameters: T[]): Neo4jCore.Record<{ [key: string] : unknown }> {
4242
const recordKeys = parameters.map((_, index) => index.toString());
4343
return new Neo4jCore.Record(recordKeys, parameters);
4444
}
@@ -57,36 +57,36 @@ export function assertEdges(neovis: NeoVis, edges: Neo4jType.Relationship<number
5757
});
5858
}
5959

60-
export function mockNormalRunSubscribe(records: Neo4jType.Record<any>[] = []): void {
60+
export function mockNormalRunSubscribe(records: Neo4jType.Record<{ [key: string]: unknown }>[] = []): void {
6161
Neo4jMock.mockSessionRun.mockImplementation(() => {
62-
const observablePromise: Partial<ObservablePromise<{ records: Neo4jType.Record<any>[] }>> = Promise.resolve({ records });
62+
const observablePromise: Partial<ObservablePromise<{ records: Neo4jType.Record<{ [key: string]: unknown }>[] }>> = Promise.resolve({ records });
6363
observablePromise.subscribe = ({ onNext, onCompleted }) => {
6464
records.forEach(onNext);
6565
onCompleted();
6666
};
67-
return observablePromise as ObservablePromise<{ records: Neo4jType.Record<any>[] }>;
67+
return observablePromise as ObservablePromise<{ records: Neo4jType.Record<unknown>[] }>;
6868
});
6969
}
7070

71-
export function mockFullRunSubscribe(cypherIdsAndAnswers: Record<string, { default?: Neo4jType.Record<any>[], [id: number]: Neo4jType.Record<any>[] } >): void {
72-
Neo4jMock.mockSessionRun.mockImplementation((cypher: string, parameters: Record<string, any>) => {
71+
export function mockFullRunSubscribe(cypherIdsAndAnswers: Record<string, { default?: Neo4jType.Record<{ [key: string]: unknown }>[], [id: number]: Neo4jType.Record<{ [key: string]: unknown }>[] } >): void {
72+
Neo4jMock.mockSessionRun.mockImplementation((cypher: string, parameters: { id: number}) => {
7373
if (!cypherIdsAndAnswers[cypher]) {
7474
throw new Error(`the cypher '${cypher}' was not expected`);
7575
}
7676
if (!cypherIdsAndAnswers[cypher].default && !cypherIdsAndAnswers[cypher][parameters.id]) {
7777
throw new Error(`the id '${parameters.id}' was not expected for cypher ${cypher}`);
7878
}
7979
const records = cypherIdsAndAnswers[cypher].default || cypherIdsAndAnswers[cypher][parameters.id];
80-
const observablePromise: Partial<ObservablePromise<{ records: Neo4jType.Record<any>[] }>> = Promise.resolve({ records });
80+
const observablePromise: Partial<ObservablePromise<{ records: Neo4jType.Record<{ [key: string]: unknown }>[] }>> = Promise.resolve({ records });
8181
observablePromise.subscribe = ({ onNext, onCompleted }) => {
8282
records.forEach(onNext);
8383
onCompleted();
8484
};
85-
return observablePromise as ObservablePromise<{ records: Neo4jType.Record<any>[] }>;
85+
return observablePromise as ObservablePromise<{ records: Neo4jType.Record<unknown>[] }>;
8686
});
8787
}
8888

8989

90-
export function neovisRenderDonePromise(neovis: NeoVis): Promise<void> {
90+
export function neovisRenderDonePromise(neovis: NeoVis): Promise<Parameters<EventFunctionTypes[NeoVisEvents.CompletionEvent]>[0]> {
9191
return new Promise(res => neovis.registerOnEvent(NeoVisEvents.CompletionEvent, res));
9292
}

dist/events.d.ts

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,39 @@
1+
import { Edge, Node } from './types';
12
export declare enum NeoVisEvents {
23
CompletionEvent = "completed",
34
ClickNodeEvent = "clickNode",
45
ClickEdgeEvent = "clickEdge",
56
ErrorEvent = "error"
67
}
8+
export interface EventFunctionTypes {
9+
[NeoVisEvents.CompletionEvent]: (event: {
10+
recordCount: number;
11+
}) => void;
12+
[NeoVisEvents.ClickNodeEvent]: (event: {
13+
nodeId: number;
14+
node: Node;
15+
}) => void;
16+
[NeoVisEvents.ClickEdgeEvent]: (event: {
17+
edgeId: number;
18+
edge: Edge;
19+
}) => void;
20+
[NeoVisEvents.ErrorEvent]: (event: {
21+
error: Error;
22+
}) => void;
23+
}
724
export declare class EventController {
825
private readonly _handlers;
926
constructor();
1027
/**
1128
*
12-
* @param {string} eventType - Type of the event to be handled
13-
* @param {callback} handler - Handler to manage the event
29+
* @param eventType - Type of the event to be handled
30+
* @param handler - Handler to manage the event
1431
*/
15-
register(eventType: NeoVisEvents, handler: Function): void;
32+
register<T extends NeoVisEvents>(eventType: T, handler: EventFunctionTypes[T]): void;
1633
/**
1734
*
1835
* @param {string} eventType - Type of the event generated
1936
* @param {any} values - Values associated to the event
2037
*/
21-
generateEvent(eventType: NeoVisEvents, values: any): void;
38+
generateEvent<T extends NeoVisEvents>(eventType: T, values: Parameters<EventFunctionTypes[T]>[0]): void;
2239
}

0 commit comments

Comments
 (0)