From 243bbffd31021cd8be0b6c662efad4cdbb53e206 Mon Sep 17 00:00:00 2001 From: Antonio Barcelos Date: Wed, 9 Feb 2022 17:16:12 +0100 Subject: [PATCH] Enabling Optimization:ImplicitDefaultArguments Omiting un-needed query ids optimization was not possible to be implemented in a simple and reliable way, the query id was being wrongly omitted in situation where it was need when the omitting logic was in place. --- packages/core/src/auth.ts | 43 +++++++++++-------- packages/core/test/auth.test.ts | 39 ++++++++++++++++- .../testkit-backend/src/request-handlers.js | 1 + .../src/skipped-tests/common.js | 6 +++ 4 files changed, 69 insertions(+), 20 deletions(-) diff --git a/packages/core/src/auth.ts b/packages/core/src/auth.ts index 3b87f2de3..0a193e90c 100644 --- a/packages/core/src/auth.ts +++ b/packages/core/src/auth.ts @@ -27,7 +27,7 @@ * @property {function(principal: string, credentials: string, realm: string, scheme: string, parameters: ?object)} custom * the function to create a custom authentication token. */ - const auth = { +const auth = { basic: (username: string, password: string, realm?: string) => { if (realm) { return { @@ -58,25 +58,32 @@ credentials: string, realm: string, scheme: string, - parameters?: string + parameters?: object ) => { - if (parameters) { - return { - scheme: scheme, - principal: principal, - credentials: credentials, - realm: realm, - parameters: parameters - } - } else { - return { - scheme: scheme, - principal: principal, - credentials: credentials, - realm: realm - } + const output: any = { + scheme: scheme, + principal: principal } + if (isNotEmpty(credentials)) { + output.credentials = credentials + } + if (isNotEmpty(realm)) { + output.realm = realm + } + if (isNotEmpty(parameters)) { + output.parameters = parameters + } + return output } } -export default auth \ No newline at end of file +function isNotEmpty(value: T | null | undefined): boolean { + return !( + value === null || + value === undefined || + value === '' || + Object.getPrototypeOf(value) === Object.prototype && Object.keys(value).length === 0 + ) +} + +export default auth diff --git a/packages/core/test/auth.test.ts b/packages/core/test/auth.test.ts index e9f56f14d..22f35e1d3 100644 --- a/packages/core/test/auth.test.ts +++ b/packages/core/test/auth.test.ts @@ -21,7 +21,42 @@ import auth from '../src/auth' describe('auth', () => { test('.bearer()', () => { - expect(auth.bearer('==Qyahiadakkda')).toEqual({ scheme: 'bearer', credentials: '==Qyahiadakkda' } ) + expect(auth.bearer('==Qyahiadakkda')).toEqual({ scheme: 'bearer', credentials: '==Qyahiadakkda' }) + }) + + test.each([ + [ + ['user', 'pass', 'realm', 'scheme', { param: 'param' }], + { + scheme: 'scheme', + principal: 'user', + credentials: 'pass', + realm: 'realm', + parameters: { param: 'param' } + } + ], + [ + ['user', '', '', 'scheme', {}], + { + scheme: 'scheme', + principal: 'user' + } + ], + [ + ['user', undefined, undefined, 'scheme', undefined], + { + scheme: 'scheme', + principal: 'user' + } + ], + [ + ['user', null, null, 'scheme', null], + { + scheme: 'scheme', + principal: 'user' + } + ] + ])('.custom()', (args, output) => { + expect(auth.custom.apply(auth, args)).toEqual(output) }) - }) diff --git a/packages/testkit-backend/src/request-handlers.js b/packages/testkit-backend/src/request-handlers.js index a6403e471..4c05da641 100644 --- a/packages/testkit-backend/src/request-handlers.js +++ b/packages/testkit-backend/src/request-handlers.js @@ -372,6 +372,7 @@ export function GetFeatures (_context, _params, wire) { 'Feature:Bolt:4.4', 'Feature:API:Result.List', 'Feature:API:Result.Peek', + 'Optimization:ImplicitDefaultArguments', 'Temporary:ConnectionAcquisitionTimeout', 'Temporary:CypherPathAndRelationship', 'Temporary:DriverFetchSize', diff --git a/packages/testkit-backend/src/skipped-tests/common.js b/packages/testkit-backend/src/skipped-tests/common.js index 6af9f7b49..ca224c8f7 100644 --- a/packages/testkit-backend/src/skipped-tests/common.js +++ b/packages/testkit-backend/src/skipped-tests/common.js @@ -1,6 +1,12 @@ import skip, { ifEquals, ifEndsWith, ifStartsWith } from './skip' const skippedTests = [ + skip( + 'Handle qid omission optmization can cause issues in nested queries', + ifEquals('stub.optimizations.test_optimizations.TestOptimizations.test_uses_implicit_default_arguments'), + ifEquals('stub.optimizations.test_optimizations.TestOptimizations.test_uses_implicit_default_arguments_multi_query'), + ifEquals('stub.optimizations.test_optimizations.TestOptimizations.test_uses_implicit_default_arguments_multi_query_nested') + ), skip( 'Fail while enable Temporary::ResultKeys', ifEquals('neo4j.test_bookmarks.TestBookmarks.test_can_pass_bookmark_into_next_session'),