From 4aa861270bb391a5497425e2ef993ebda3b6f7c4 Mon Sep 17 00:00:00 2001 From: Antonio Barcelos Date: Mon, 31 Jan 2022 12:19:12 +0100 Subject: [PATCH 1/2] Add back `(rx)session.lastBookmark` methods These method were added back deprecated for keeping the driver backward compatible. --- packages/core/src/session.ts | 11 ++++ packages/core/test/driver.test.ts | 13 +++++ packages/core/test/session.test.ts | 36 +++++++++++- packages/neo4j-driver/src/driver.js | 2 +- packages/neo4j-driver/src/session-rx.js | 19 ++++++- packages/neo4j-driver/test/driver.test.js | 28 +++++++++- packages/neo4j-driver/test/rx/session.test.js | 55 ++++++++++++++++++- .../test/types/session-rx.test.ts | 3 +- packages/neo4j-driver/types/session-rx.d.ts | 3 +- 9 files changed, 161 insertions(+), 9 deletions(-) diff --git a/packages/core/src/session.ts b/packages/core/src/session.ts index 0cf4de8f9..c3c31b8a2 100644 --- a/packages/core/src/session.ts +++ b/packages/core/src/session.ts @@ -304,6 +304,17 @@ class Session { this._hasTx = false } + /** + * Return the bookmarks received following the last completed {@link Transaction}. + * + * @deprecated This method will be removed in 6.0 version. Please, use {@link Session#lastBookmarks} instead. + * + * @return {string[]} A reference to a previous transaction. + */ + lastBookmark(): string[] { + return this.lastBookmarks() + } + /** * Return the bookmarks received following the last completed {@link Transaction}. * diff --git a/packages/core/test/driver.test.ts b/packages/core/test/driver.test.ts index 36f8efd70..8b920ad51 100644 --- a/packages/core/test/driver.test.ts +++ b/packages/core/test/driver.test.ts @@ -70,6 +70,19 @@ describe('Driver', () => { expect(session).not.toBeUndefined() expect(createSession).toHaveBeenCalledWith(expectedSessionParams()) }) + + it.each([ + [undefined, Bookmarks.empty()], + [null, Bookmarks.empty()], + ['bookmark', new Bookmarks('bookmark')], + [['bookmark'], new Bookmarks(['bookmark'])], + [['bookmark1', 'bookmark2'], new Bookmarks(['bookmark1', 'bookmark2'])], + ])('should create session using param bookmarks', (bookmarks, expectedBookmarks) => { + // @ts-ignore + const session = driver!.session({ bookmarks }) + + expect(session.lastBookmarks()).toEqual(expectedBookmarks.values()) + }) }) it.each([ diff --git a/packages/core/test/session.test.ts b/packages/core/test/session.test.ts index 8bdd36921..829450e97 100644 --- a/packages/core/test/session.test.ts +++ b/packages/core/test/session.test.ts @@ -17,6 +17,7 @@ * limitations under the License. */ import { ConnectionProvider, Session, Connection } from '../src' +import { bookmarks } from '../src/internal' import { ACCESS_MODE_READ, FETCH_ALL } from '../src/internal/constants' import FakeConnection from './utils/connection.fake' @@ -202,9 +203,39 @@ describe('session', () => { done() }) }, 70000) + + describe('.lastBookmark()', () => { + it.each([ + [bookmarks.Bookmarks.empty()], + [new bookmarks.Bookmarks('bookmark1')], + [new bookmarks.Bookmarks(['bookmark1', 'bookmark2'])] + ])('should return the bookmark informed in the object creation', (bookmarks) => { + const session = newSessionWithConnection(newFakeConnection(), false, 1000, bookmarks) + + expect(session.lastBookmark()).toEqual(bookmarks.values()) + }) + }) + + describe('.lastBookmark()', () => { + it.each([ + [bookmarks.Bookmarks.empty()], + [new bookmarks.Bookmarks('bookmark1')], + [new bookmarks.Bookmarks(['bookmark1', 'bookmark2'])] + ])('should return the bookmark informed in the object creation', (bookmarks) => { + const session = newSessionWithConnection(newFakeConnection(), false, 1000, bookmarks) + + expect(session.lastBookmarks()).toEqual(bookmarks.values()) + }) + }) }) -function newSessionWithConnection(connection: Connection, beginTx: boolean = true, fetchSize: number = 1000): Session { +function newSessionWithConnection( + connection: Connection, + beginTx: boolean = true, + fetchSize: number = 1000, + lastBookmarks: bookmarks.Bookmarks = bookmarks.Bookmarks.empty() +): Session { + const connectionProvider = new ConnectionProvider() connectionProvider.acquireConnection = () => Promise.resolve(connection) connectionProvider.close = () => Promise.resolve() @@ -215,7 +246,8 @@ function newSessionWithConnection(connection: Connection, beginTx: boolean = tru database: "", fetchSize, config: {}, - reactive: false + reactive: false, + bookmarks: lastBookmarks }) if (beginTx) { diff --git a/packages/neo4j-driver/src/driver.js b/packages/neo4j-driver/src/driver.js index cb20bb3dd..f1c8d6889 100644 --- a/packages/neo4j-driver/src/driver.js +++ b/packages/neo4j-driver/src/driver.js @@ -67,7 +67,7 @@ class Driver extends CoreDriver { return new RxSession({ session: this._newSession({ defaultAccessMode, - bookmarks, + bookmarkOrBookmarks: bookmarks, database, impersonatedUser, reactive: true, diff --git a/packages/neo4j-driver/src/session-rx.js b/packages/neo4j-driver/src/session-rx.js index 71d72f6d5..863d451d3 100644 --- a/packages/neo4j-driver/src/session-rx.js +++ b/packages/neo4j-driver/src/session-rx.js @@ -121,6 +121,23 @@ export default class RxSession { }) } + /** + * Returns the bookmarks received following the last successfully completed query, which is executed + * either in an {@link RxTransaction} obtained from this session instance or directly through one of + * the {@link RxSession#run} method of this session instance. + * + * If no bookmarks were received or if this transaction was rolled back, the bookmarks value will not be + * changed. + * + * @deprecated This method will be removed in 6.0 version. Please, use {@link RxSession#lastBookmarks} instead. + * + * @public + * @returns {string[]} + */ + lastBookmark () { + return this.lastBookmarks() + } + /** * Returns the bookmarks received following the last successfully completed query, which is executed * either in an {@link RxTransaction} obtained from this session instance or directly through one of @@ -130,7 +147,7 @@ export default class RxSession { * changed. * * @public - * @returns {string} + * @returns {string[]} */ lastBookmarks () { return this._session.lastBookmarks() diff --git a/packages/neo4j-driver/test/driver.test.js b/packages/neo4j-driver/test/driver.test.js index d2f45b626..4af6664dc 100644 --- a/packages/neo4j-driver/test/driver.test.js +++ b/packages/neo4j-driver/test/driver.test.js @@ -24,9 +24,12 @@ import { DEFAULT_ACQUISITION_TIMEOUT, DEFAULT_MAX_SIZE } from '../../bolt-connection/lib/pool/pool-config' -import { ServerVersion, VERSION_4_0_0 } from '../src/internal/server-version' import testUtils from './internal/test-utils' -import { json } from 'neo4j-driver-core' +import { json, internal } from 'neo4j-driver-core' + +const { + bookmarks: { Bookmarks } +} = internal // As long as driver creation doesn't touch the network it's fine to run // this as a unit test. @@ -114,6 +117,27 @@ describe('#unit driver', () => { }) ).toThrow() }) + + describe('.rxSession()', () => { + ;[ + [undefined, Bookmarks.empty()], + [null, Bookmarks.empty()], + ['bookmark', new Bookmarks('bookmark')], + [['bookmark'], new Bookmarks(['bookmark'])], + [['bookmark1', 'bookmark2'], new Bookmarks(['bookmark1', 'bookmark2'])] + ].forEach(([bookmarks, expectedBookmarks]) => { + it(`should create session using param bookmarks=${bookmarks}`, () => { + driver = neo4j.driver( + `neo4j+ssc://${sharedNeo4j.hostname}`, + sharedNeo4j.authToken + ) + + const session = driver.rxSession({ bookmarks }) + + expect(session.lastBookmarks()).toEqual(expectedBookmarks.values()) + }) + }) + }) }) describe('#integration driver', () => { diff --git a/packages/neo4j-driver/test/rx/session.test.js b/packages/neo4j-driver/test/rx/session.test.js index d4d82ddfd..089d6099b 100644 --- a/packages/neo4j-driver/test/rx/session.test.js +++ b/packages/neo4j-driver/test/rx/session.test.js @@ -20,10 +20,18 @@ import { Notification, throwError } from 'rxjs' import { map, materialize, toArray, concat } from 'rxjs/operators' import neo4j from '../../src' +import RxSession from '../../src/session-rx' import sharedNeo4j from '../internal/shared-neo4j' -import { newError, error } from 'neo4j-driver-core' +import { + newError, + error, + internal, + Session, + ConnectionProvider +} from 'neo4j-driver-core' const { SERVICE_UNAVAILABLE, SESSION_EXPIRED } = error +const { bookmarks } = internal describe('#integration rx-session', () => { let driver @@ -274,3 +282,48 @@ describe('#integration rx-session', () => { } } }) + +describe('#unit rx-session', () => { + describe('lastBookmark', () => { + ;[ + bookmarks.Bookmarks.empty(), + new bookmarks.Bookmarks('bookmark1'), + new bookmarks.Bookmarks(['bookmark1', 'bookmark2']) + ].forEach(bookmarks => { + it(`should return ${bookmarks}`, () => { + const session = newSession(bookmarks) + expect(session.lastBookmark()).toBe(bookmarks.values()) + }) + }) + }) + + describe('lastBookmarks', () => { + ;[ + bookmarks.Bookmarks.empty(), + new bookmarks.Bookmarks('bookmark1'), + new bookmarks.Bookmarks(['bookmark1', 'bookmark2']) + ].forEach(bookmarks => { + it(`should return ${bookmarks}`, () => { + const session = newSession(bookmarks) + expect(session.lastBookmarks()).toBe(bookmarks.values()) + }) + }) + }) + + function newSession (lastBookmarks = bookmarks.Bookmarks.empty()) { + const connectionProvider = new ConnectionProvider() + connectionProvider.acquireConnection = () => Promise.resolve(null) + connectionProvider.close = () => Promise.resolve() + + const session = new Session({ + mode: 'READ', + connectionProvider, + database: '', + config: {}, + reactive: true, + bookmarks: lastBookmarks + }) + + return new RxSession({ session }) + } +}) diff --git a/packages/neo4j-driver/test/types/session-rx.test.ts b/packages/neo4j-driver/test/types/session-rx.test.ts index 995d83034..4c768cac9 100644 --- a/packages/neo4j-driver/test/types/session-rx.test.ts +++ b/packages/neo4j-driver/test/types/session-rx.test.ts @@ -74,7 +74,8 @@ const txConfig7: TransactionConfig = { } const tx1: Observable = rxSession.beginTransaction() -const bookmarks: null | string = rxSession.lastBookmarks() +const bookmarks: string[] = rxSession.lastBookmarks() +const bookmark: string[] = rxSession.lastBookmark() const observable1: Observable = rxSession.readTransaction( (tx: RxTransaction) => { diff --git a/packages/neo4j-driver/types/session-rx.d.ts b/packages/neo4j-driver/types/session-rx.d.ts index e1fa83d75..396e137f2 100644 --- a/packages/neo4j-driver/types/session-rx.d.ts +++ b/packages/neo4j-driver/types/session-rx.d.ts @@ -33,7 +33,8 @@ declare interface RxSession { beginTransaction(config?: TransactionConfig): Observable - lastBookmarks(): string | null + lastBookmarks(): string[] + lastBookmark(): string[] readTransaction( work: RxTransactionWork, From 0c6b79861c47b4a8663f2448699cad15b028adf0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antonio=20Barc=C3=A9los?= Date: Mon, 31 Jan 2022 13:01:51 -0300 Subject: [PATCH 2/2] Apply suggestions from code review Co-authored-by: Robsdedude --- packages/core/src/session.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/session.ts b/packages/core/src/session.ts index c3c31b8a2..3f6f3b2d4 100644 --- a/packages/core/src/session.ts +++ b/packages/core/src/session.ts @@ -307,7 +307,7 @@ class Session { /** * Return the bookmarks received following the last completed {@link Transaction}. * - * @deprecated This method will be removed in 6.0 version. Please, use {@link Session#lastBookmarks} instead. + * @deprecated This method will be removed in version 6.0. Please, use {@link Session#lastBookmarks} instead. * * @return {string[]} A reference to a previous transaction. */