From 33ba95846eda19019485e22be661b9c11b781bac Mon Sep 17 00:00:00 2001 From: alex Date: Tue, 28 Jul 2020 17:54:39 -0400 Subject: [PATCH 01/13] feat: add resource header prefix --- src/backup.ts | 24 ++-- src/batch-transaction.ts | 7 +- src/common.ts | 22 ++++ src/database.ts | 105 ++++++++++-------- src/index.ts | 138 +++++++++++------------ src/instance.ts | 224 +++++++++++++++++++------------------- src/session.ts | 18 ++- src/transaction.ts | 37 +++++-- test/backup.ts | 21 +++- test/batch-transaction.ts | 35 +++++- test/database.ts | 97 +++++++++++++---- test/index.ts | 98 +++++++++++++---- test/instance.ts | 156 ++++++++++++++++++++------ test/session.ts | 27 ++++- test/transaction.ts | 51 +++++++-- 15 files changed, 711 insertions(+), 349 deletions(-) diff --git a/src/backup.ts b/src/backup.ts index 444d49791..308b0d611 100644 --- a/src/backup.ts +++ b/src/backup.ts @@ -21,6 +21,7 @@ import { RequestCallback, ResourceCallback, NormalCallback, + addResourcePrefixHeader, } from './common'; import {EnumKey, Spanner, RequestConfig, TranslateEnumKeys} from '.'; import { @@ -164,7 +165,10 @@ class Backup { options: CreateBackupOptions, callback?: CreateBackupCallback ): Promise | void { - const gaxOpts = options.gaxOptions; + const gaxOpts = addResourcePrefixHeader( + options.gaxOptions!, + this.instanceFormattedName_ + ); const reqOpts: databaseAdmin.spanner.admin.database.v1.ICreateBackupRequest = { parent: this.instanceFormattedName_, backupId: this.id, @@ -233,10 +237,12 @@ class Backup { typeof gaxOptionsOrCallback === 'function' ? (gaxOptionsOrCallback as GetMetadataCallback) : cb; - const gaxOpts = + const gaxOpts = addResourcePrefixHeader( typeof gaxOptionsOrCallback === 'object' ? (gaxOptionsOrCallback as CallOptions) - : {}; + : {}, + this.instanceFormattedName_ + ); const reqOpts: databaseAdmin.spanner.admin.database.v1.IGetBackupRequest = { name: this.formattedName_, }; @@ -401,10 +407,12 @@ class Backup { typeof gaxOptionsOrCallback === 'function' ? (gaxOptionsOrCallback as UpdateExpireTimeCallback) : cb; - const gaxOpts = + const gaxOpts = addResourcePrefixHeader( typeof gaxOptionsOrCallback === 'object' ? (gaxOptionsOrCallback as CallOptions) - : {}; + : {}, + this.instanceFormattedName_ + ); const reqOpts: databaseAdmin.spanner.admin.database.v1.IUpdateBackupRequest = { backup: { name: this.formattedName_, @@ -454,10 +462,12 @@ class Backup { typeof gaxOptionsOrCallback === 'function' ? (gaxOptionsOrCallback as DeleteCallback) : cb; - const gaxOpts = + const gaxOpts = addResourcePrefixHeader( typeof gaxOptionsOrCallback === 'object' ? (gaxOptionsOrCallback as CallOptions) - : {}; + : {}, + this.instanceFormattedName_ + ); const reqOpts: databaseAdmin.spanner.admin.database.v1.IDeleteBackupRequest = { name: this.formattedName_, }; diff --git a/src/batch-transaction.ts b/src/batch-transaction.ts index f321966ab..aa88c69fa 100644 --- a/src/batch-transaction.ts +++ b/src/batch-transaction.ts @@ -20,7 +20,8 @@ import * as extend from 'extend'; import * as is from 'is'; import {Snapshot} from './transaction'; import {google} from '../protos/protos'; -import {Session} from '.'; +import {Session, Database} from '.'; +import {addResourcePrefixHeader} from '../src/common'; export interface TransactionIdentifier { session: string | Session; @@ -152,6 +153,10 @@ class BatchTransaction extends Snapshot { transaction: {id: this.id}, }); config.reqOpts = extend({}, query); + config.gaxOpts = addResourcePrefixHeader( + config.gaxOpts, + (this.session.parent as Database).formattedName_ + ); delete query.partitionOptions; this.session.request(config, (err, resp) => { if (err) { diff --git a/src/common.ts b/src/common.ts index 4aa371387..e90960b47 100644 --- a/src/common.ts +++ b/src/common.ts @@ -17,6 +17,7 @@ import {grpc, CallOptions, Operation as GaxOperation} from 'google-gax'; import {google as instanceAdmin} from '../protos/protos'; import {google as databaseAdmin} from '../protos/protos'; +import * as extend from 'extend'; export type IOperation = instanceAdmin.longrunning.IOperation; @@ -69,3 +70,24 @@ export interface PagedOptions { export interface PagedOptionsWithFilter extends PagedOptions { filter?: string; } + +/*! + * HTTP header for the resource prefix to improve routing + * by the backend. + */ +export const CLOUD_RESOURCE_HEADER = 'google-cloud-resource-prefix'; + +/** + * Returns GAX call options that set the cloud resource header. + * @private + */ +export function addResourcePrefixHeader( + gaxOpts: CallOptions, + headerValue: string +): CallOptions { + return extend(true, {}, gaxOpts, { + otherArgs: { + headers: {[CLOUD_RESOURCE_HEADER]: headerValue}, + }, + }); +} diff --git a/src/database.ts b/src/database.ts index efbec1f55..fb121d2ac 100644 --- a/src/database.ts +++ b/src/database.ts @@ -76,6 +76,7 @@ import { NormalCallback, LongRunningCallback, PagedOptionsWithFilter, + addResourcePrefixHeader, } from './common'; import {Readable, Transform, Duplex} from 'stream'; import {PreciseDate} from '@google-cloud/precise-date'; @@ -418,7 +419,10 @@ class Database extends GrpcServiceObject { client: 'SpannerClient', method: 'batchCreateSessions', reqOpts, - gaxOpts: options.gaxOptions, + gaxOpts: addResourcePrefixHeader( + options.gaxOptions!, + this.formattedName_ + ), }, (err, resp) => { if (err) { @@ -672,7 +676,10 @@ class Database extends GrpcServiceObject { client: 'SpannerClient', method: 'createSession', reqOpts, - gaxOpts: options.gaxOptions, + gaxOpts: addResourcePrefixHeader( + options.gaxOptions!, + this.formattedName_ + ), }, (err, resp) => { if (err) { @@ -849,6 +856,7 @@ class Database extends GrpcServiceObject { client: 'DatabaseAdminClient', method: 'dropDatabase', reqOpts, + gaxOpts: addResourcePrefixHeader({}, this.formattedName_), }, callback! ); @@ -1051,10 +1059,12 @@ class Database extends GrpcServiceObject { typeof gaxOptionsOrCallback === 'function' ? (gaxOptionsOrCallback as GetMetadataCallback) : cb; - const gaxOpts = + const gaxOpts = addResourcePrefixHeader( typeof gaxOptionsOrCallback === 'object' ? (gaxOptionsOrCallback as CallOptions) - : {}; + : {}, + this.formattedName_ + ); const reqOpts: databaseAdmin.spanner.admin.database.v1.IGetDatabaseRequest = { name: this.formattedName_, @@ -1185,8 +1195,10 @@ class Database extends GrpcServiceObject { optionsOrCallback?: CallOptions | GetSchemaCallback, cb?: GetSchemaCallback ): void | Promise { - const gaxOpts = - typeof optionsOrCallback === 'object' ? optionsOrCallback : {}; + const gaxOpts = addResourcePrefixHeader( + typeof optionsOrCallback === 'object' ? optionsOrCallback : {}, + this.formattedName_ + ); const callback = typeof optionsOrCallback === 'function' ? optionsOrCallback : cb!; @@ -1305,26 +1317,26 @@ class Database extends GrpcServiceObject { typeof optionsOrCallback === 'object' ? optionsOrCallback : ({} as GetSessionsOptions); - const gaxOpts = extend(true, {}, options.gaxOptions); - let reqOpts = extend({}, options, { - database: this.formattedName_, - }); - delete reqOpts.gaxOptions; + const gaxOpts = addResourcePrefixHeader( + options.gaxOptions!, + this.formattedName_ + ); // Copy over pageSize and pageToken values from gaxOptions. // However values set on options take precedence. - if (gaxOpts) { - reqOpts = extend( - {}, - { - pageSize: gaxOpts.pageSize, - pageToken: gaxOpts.pageToken, - }, - reqOpts - ); - delete gaxOpts.pageSize; - delete gaxOpts.pageToken; - } + const reqOpts = extend( + {}, + { + database: this.formattedName_, + pageSize: gaxOpts.pageSize, + pageToken: gaxOpts.pageToken, + }, + options + ); + + delete reqOpts.gaxOptions; + delete gaxOpts.pageSize; + delete gaxOpts.pageToken; this.request< google.spanner.v1.ISession, @@ -1389,27 +1401,26 @@ class Database extends GrpcServiceObject { * }); */ getSessionsStream(options: GetSessionsOptions = {}): NodeJS.ReadableStream { - const gaxOpts = extend(true, {}, options.gaxOptions); - - let reqOpts = extend({}, options, { - database: this.formattedName_, - }); - delete reqOpts.gaxOptions; + const gaxOpts = addResourcePrefixHeader( + options.gaxOptions!, + this.formattedName_ + ); // Copy over pageSize and pageToken values from gaxOptions. // However values set on options take precedence. - if (gaxOpts) { - reqOpts = extend( - {}, - { - pageSize: gaxOpts.pageSize, - pageToken: gaxOpts.pageToken, - }, - reqOpts - ); - delete gaxOpts.pageSize; - delete gaxOpts.pageToken; - } + const reqOpts = extend( + {}, + { + database: this.formattedName_, + pageSize: gaxOpts.pageSize, + pageToken: gaxOpts.pageToken, + }, + options + ); + + delete reqOpts.gaxOptions; + delete gaxOpts.pageSize; + delete gaxOpts.pageToken; return this.requestStream({ client: 'SpannerClient', @@ -1775,10 +1786,12 @@ class Database extends GrpcServiceObject { typeof optionsOrCallback === 'function' ? (optionsOrCallback as RestoreDatabaseCallback) : cb; - const gaxOpts = + const gaxOpts = addResourcePrefixHeader( typeof optionsOrCallback === 'object' ? (optionsOrCallback as CallOptions) - : {}; + : {}, + this.instance.formattedName_ + ); const reqOpts: databaseAdmin.spanner.admin.database.v1.IRestoreDatabaseRequest = { parent: this.instance.formattedName_, databaseId: this.id, @@ -2562,8 +2575,10 @@ class Database extends GrpcServiceObject { optionsOrCallback?: CallOptions | UpdateSchemaCallback, cb?: UpdateSchemaCallback ): Promise | void { - const gaxOpts = - typeof optionsOrCallback === 'object' ? optionsOrCallback : {}; + const gaxOpts = addResourcePrefixHeader( + typeof optionsOrCallback === 'object' ? optionsOrCallback : {}, + this.formattedName_ + ); const callback = typeof optionsOrCallback === 'function' ? optionsOrCallback : cb!; diff --git a/src/index.ts b/src/index.ts index 618a70b52..fe5be96e9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -39,6 +39,7 @@ import { PagedResponse, PagedCallback, PagedOptionsWithFilter, + addResourcePrefixHeader, } from './common'; import {Session} from './session'; import {SessionPool} from './session-pool'; @@ -391,7 +392,7 @@ class Spanner extends GrpcService { client: 'InstanceAdminClient', method: 'createInstance', reqOpts, - gaxOpts: config.gaxOptions, + gaxOpts: addResourcePrefixHeader(config.gaxOptions!, reqOpts.parent), }, (err, operation, resp) => { if (err) { @@ -504,28 +505,25 @@ class Spanner extends GrpcService { const callback = typeof optionsOrCallback === 'function' ? optionsOrCallback : cb!; - const gaxOpts = extend(true, {}, options.gaxOptions); - - let reqOpts = extend({}, options, { - parent: 'projects/' + this.projectId, - }); - - delete reqOpts.gaxOptions; + const gaxOpts = addResourcePrefixHeader( + options.gaxOptions!, + 'projects/' + this.projectId + ); // Copy over pageSize and pageToken values from gaxOptions. // However values set on options take precedence. - if (gaxOpts) { - reqOpts = extend( - {}, - { - pageSize: gaxOpts.pageSize, - pageToken: gaxOpts.pageToken, - }, - reqOpts - ); - delete gaxOpts.pageSize; - delete gaxOpts.pageToken; - } + const reqOpts = extend( + {}, + { + parent: 'projects/' + this.projectId, + pageSize: gaxOpts.pageSize, + pageToken: gaxOpts.pageToken, + }, + options + ); + delete gaxOpts.pageSize; + delete gaxOpts.pageToken; + delete reqOpts.gaxOptions; this.request( { @@ -584,27 +582,25 @@ class Spanner extends GrpcService { * }); */ getInstancesStream(options: GetInstancesOptions = {}): NodeJS.ReadableStream { - const gaxOpts = extend(true, {}, options.gaxOptions); - - let reqOpts = extend({}, options, { - parent: 'projects/' + this.projectId, - }); - delete reqOpts.gaxOptions; + const gaxOpts = addResourcePrefixHeader( + options.gaxOptions!, + 'projects/' + this.projectId + ); // Copy over pageSize and pageToken values from gaxOptions. // However values set on options take precedence. - if (gaxOpts) { - reqOpts = extend( - {}, - { - pageSize: gaxOpts.pageSize, - pageToken: gaxOpts.pageToken, - }, - reqOpts - ); - delete gaxOpts.pageSize; - delete gaxOpts.pageToken; - } + const reqOpts = extend( + {}, + { + parent: 'projects/' + this.projectId, + pageSize: gaxOpts.pageSize, + pageToken: gaxOpts.pageToken, + }, + options + ); + delete gaxOpts.pageSize; + delete gaxOpts.pageToken; + delete reqOpts.gaxOptions; return this.requestStream({ client: 'InstanceAdminClient', @@ -709,26 +705,25 @@ class Spanner extends GrpcService { ? optionsOrCallback : ({} as GetInstanceConfigsOptions); - const gaxOpts = extend(true, {}, options.gaxOptions); - let reqOpts = extend({}, options, { - parent: 'projects/' + this.projectId, - }); - delete reqOpts.gaxOptions; + const gaxOpts = addResourcePrefixHeader( + options.gaxOptions!, + 'projects/' + this.projectId + ); // Copy over pageSize and pageToken values from gaxOptions. // However values set on options take precedence. - if (gaxOpts) { - reqOpts = extend( - {}, - { - pageSize: gaxOpts.pageSize, - pageToken: gaxOpts.pageToken, - }, - reqOpts - ); - delete gaxOpts.pageSize; - delete gaxOpts.pageToken; - } + const reqOpts = extend( + {}, + { + parent: 'projects/' + this.projectId, + pageSize: gaxOpts.pageSize, + pageToken: gaxOpts.pageToken, + }, + options + ); + delete gaxOpts.pageSize; + delete gaxOpts.pageToken; + delete reqOpts.gaxOptions; return this.request( { @@ -777,26 +772,25 @@ class Spanner extends GrpcService { getInstanceConfigsStream( options: GetInstanceConfigsOptions = {} ): NodeJS.ReadableStream { - const gaxOpts = extend(true, {}, options.gaxOptions); - - let reqOpts = extend({}, options, { - parent: 'projects/' + this.projectId, - }); + const gaxOpts = addResourcePrefixHeader( + options.gaxOptions!, + 'projects/' + this.projectId + ); // Copy over pageSize and pageToken values from gaxOptions. // However values set on options take precedence. - if (gaxOpts) { - reqOpts = extend( - {}, - { - pageSize: gaxOpts.pageSize, - pageToken: gaxOpts.pageToken, - }, - reqOpts - ); - delete gaxOpts.pageSize; - delete gaxOpts.pageToken; - } + const reqOpts = extend( + {}, + { + parent: 'projects/' + this.projectId, + pageSize: gaxOpts.pageSize, + pageToken: gaxOpts.pageToken, + }, + options + ); + delete gaxOpts.pageSize; + delete gaxOpts.pageToken; + delete reqOpts.gaxOptions; delete reqOpts.gaxOptions; return this.requestStream({ diff --git a/src/instance.ts b/src/instance.ts index c352336f9..3aa9b642b 100644 --- a/src/instance.ts +++ b/src/instance.ts @@ -31,6 +31,7 @@ import { NormalCallback, ResourceCallback, PagedOptionsWithFilter, + addResourcePrefixHeader, } from './common'; import {Duplex} from 'stream'; import {SessionPoolOptions, SessionPool} from './session-pool'; @@ -320,26 +321,25 @@ class Instance extends common.GrpcServiceObject { typeof optionsOrCallback === 'object' ? optionsOrCallback : ({} as GetBackupsOptions); - const gaxOpts = extend(true, {}, options.gaxOptions); - let reqOpts = extend({}, options, { - parent: this.formattedName_, - }); - delete reqOpts.gaxOptions; + const gaxOpts = addResourcePrefixHeader( + options.gaxOptions!, + this.formattedName_ + ); // Copy over pageSize and pageToken values from gaxOptions. // However values set on options take precedence. - if (gaxOpts) { - reqOpts = extend( - {}, - { - pageSize: gaxOpts.pageSize, - pageToken: gaxOpts.pageToken, - }, - reqOpts - ); - delete gaxOpts.pageSize; - delete gaxOpts.pageToken; - } + const reqOpts = extend( + {}, + { + parent: this.formattedName_, + pageSize: gaxOpts.pageSize, + pageToken: gaxOpts.pageToken, + }, + options + ); + delete gaxOpts.pageSize; + delete gaxOpts.pageToken; + delete reqOpts.gaxOptions; this.request< IBackup, @@ -402,27 +402,25 @@ class Instance extends common.GrpcServiceObject { * }); */ getBackupsStream(options: GetBackupsOptions = {}): NodeJS.ReadableStream { - const gaxOpts = extend(true, {}, options.gaxOptions); - - let reqOpts = extend({}, options, { - parent: this.formattedName_, - }); - delete reqOpts.gaxOptions; + const gaxOpts = addResourcePrefixHeader( + options.gaxOptions!, + this.formattedName_ + ); // Copy over pageSize and pageToken values from gaxOptions. // However values set on options take precedence. - if (gaxOpts) { - reqOpts = extend( - {}, - { - pageSize: gaxOpts.pageSize, - pageToken: gaxOpts.pageToken, - }, - reqOpts - ); - delete gaxOpts.pageSize; - delete gaxOpts.pageToken; - } + const reqOpts = extend( + {}, + { + parent: this.formattedName_, + pageSize: gaxOpts.pageSize, + pageToken: gaxOpts.pageToken, + }, + options + ); + delete gaxOpts.pageSize; + delete gaxOpts.pageToken; + delete reqOpts.gaxOptions; return this.requestStream({ client: 'DatabaseAdminClient', @@ -514,26 +512,25 @@ class Instance extends common.GrpcServiceObject { typeof optionsOrCallback === 'object' ? optionsOrCallback : ({} as GetBackupOperationsOptions); - const gaxOpts = extend(true, {}, options.gaxOptions); - let reqOpts = extend({}, options, { - parent: this.formattedName_, - }); - delete reqOpts.gaxOptions; + const gaxOpts = addResourcePrefixHeader( + options.gaxOptions!, + this.formattedName_ + ); // Copy over pageSize and pageToken values from gaxOptions. // However values set on options take precedence. - if (gaxOpts) { - reqOpts = extend( - {}, - { - pageSize: gaxOpts.pageSize, - pageToken: gaxOpts.pageToken, - }, - reqOpts - ); - delete gaxOpts.pageSize; - delete gaxOpts.pageToken; - } + const reqOpts = extend( + {}, + { + parent: this.formattedName_, + pageSize: gaxOpts.pageSize, + pageToken: gaxOpts.pageToken, + }, + options + ); + delete gaxOpts.pageSize; + delete gaxOpts.pageToken; + delete reqOpts.gaxOptions; this.request< IOperation, @@ -632,26 +629,25 @@ class Instance extends common.GrpcServiceObject { typeof optionsOrCallback === 'object' ? optionsOrCallback : ({} as GetDatabaseOperationsOptions); - const gaxOpts = extend(true, {}, options.gaxOptions); - let reqOpts = extend({}, options, { - parent: this.formattedName_, - }); - delete reqOpts.gaxOptions; + const gaxOpts = addResourcePrefixHeader( + options.gaxOptions!, + this.formattedName_ + ); // Copy over pageSize and pageToken values from gaxOptions. // However values set on options take precedence. - if (gaxOpts) { - reqOpts = extend( - {}, - { - pageSize: gaxOpts.pageSize, - pageToken: gaxOpts.pageToken, - }, - reqOpts - ); - delete gaxOpts.pageSize; - delete gaxOpts.pageToken; - } + const reqOpts = extend( + {}, + { + parent: this.formattedName_, + pageSize: gaxOpts.pageSize, + pageToken: gaxOpts.pageToken, + }, + options + ); + delete gaxOpts.pageSize; + delete gaxOpts.pageToken; + delete reqOpts.gaxOptions; this.request< IOperation, @@ -799,7 +795,10 @@ class Instance extends common.GrpcServiceObject { client: 'DatabaseAdminClient', method: 'createDatabase', reqOpts, - gaxOpts: options.gaxOptions, + gaxOpts: addResourcePrefixHeader( + options.gaxOptions!, + this.formattedName_ + ), }, (err, operation, resp) => { if (err) { @@ -911,8 +910,10 @@ class Instance extends common.GrpcServiceObject { optionsOrCallback?: CallOptions | DeleteInstanceCallback, cb?: DeleteInstanceCallback ): void | Promise { - const gaxOpts = - typeof optionsOrCallback === 'object' ? optionsOrCallback : {}; + const gaxOpts = addResourcePrefixHeader( + typeof optionsOrCallback === 'object' ? optionsOrCallback : {}, + this.formattedName_ + ); const callback = typeof optionsOrCallback === 'function' ? optionsOrCallback : cb!; @@ -1190,26 +1191,24 @@ class Instance extends common.GrpcServiceObject { ? optionsOrCallback : ({} as GetDatabasesOptions); - const gaxOpts = extend(true, {}, options.gaxOptions); - let reqOpts = extend({}, options, { - parent: this.formattedName_, - }); - delete reqOpts.gaxOptions; - + const gaxOpts = addResourcePrefixHeader( + options.gaxOptions!, + this.formattedName_ + ); // Copy over pageSize and pageToken values from gaxOptions. // However values set on options take precedence. - if (gaxOpts) { - reqOpts = extend( - {}, - { - pageSize: gaxOpts.pageSize, - pageToken: gaxOpts.pageToken, - }, - reqOpts - ); - delete gaxOpts.pageSize; - delete gaxOpts.pageToken; - } + const reqOpts = extend( + {}, + { + parent: this.formattedName_, + pageSize: gaxOpts.pageSize, + pageToken: gaxOpts.pageToken, + }, + options + ); + delete gaxOpts.pageSize; + delete gaxOpts.pageToken; + delete reqOpts.gaxOptions; this.request< IDatabase, @@ -1273,27 +1272,25 @@ class Instance extends common.GrpcServiceObject { * }); */ getDatabasesStream(options: GetDatabasesOptions = {}): NodeJS.ReadableStream { - const gaxOpts = extend(true, {}, options.gaxOptions); - - let reqOpts = extend({}, options, { - parent: this.formattedName_, - }); - delete reqOpts.gaxOptions; + const gaxOpts = addResourcePrefixHeader( + options.gaxOptions!, + this.formattedName_ + ); // Copy over pageSize and pageToken values from gaxOptions. // However values set on options take precedence. - if (gaxOpts) { - reqOpts = extend( - {}, - { - pageSize: gaxOpts.pageSize, - pageToken: gaxOpts.pageToken, - }, - reqOpts - ); - delete gaxOpts.pageSize; - delete gaxOpts.pageToken; - } + const reqOpts = extend( + {}, + { + parent: this.formattedName_, + pageSize: gaxOpts.pageSize, + pageToken: gaxOpts.pageToken, + }, + options + ); + delete gaxOpts.pageSize; + delete gaxOpts.pageToken; + delete reqOpts.gaxOptions; return this.requestStream({ client: 'DatabaseAdminClient', @@ -1393,7 +1390,10 @@ class Instance extends common.GrpcServiceObject { client: 'InstanceAdminClient', method: 'getInstance', reqOpts, - gaxOpts: options.gaxOptions, + gaxOpts: addResourcePrefixHeader( + options.gaxOptions!, + this.formattedName_ + ), }, callback! ); @@ -1459,8 +1459,10 @@ class Instance extends common.GrpcServiceObject { optionsOrCallback?: CallOptions | SetInstanceMetadataCallback, cb?: SetInstanceMetadataCallback ): void | Promise { - const gaxOpts = - typeof optionsOrCallback === 'object' ? optionsOrCallback : {}; + const gaxOpts = addResourcePrefixHeader( + typeof optionsOrCallback === 'object' ? optionsOrCallback : {}, + this.formattedName_ + ); const callback = typeof optionsOrCallback === 'function' ? optionsOrCallback : cb!; diff --git a/src/session.ts b/src/session.ts index 1c7b1a14a..24527cdee 100644 --- a/src/session.ts +++ b/src/session.ts @@ -35,7 +35,7 @@ import { CreateSessionOptions, } from './database'; import {ServiceObjectConfig, DeleteCallback} from '@google-cloud/common'; -import {NormalCallback} from './common'; +import {NormalCallback, addResourcePrefixHeader} from './common'; import {grpc, CallOptions} from 'google-gax'; export type GetSessionResponse = [Session, r.Response]; @@ -276,6 +276,10 @@ export class Session extends GrpcServiceObject { client: 'SpannerClient', method: 'deleteSession', reqOpts, + gaxOpts: addResourcePrefixHeader( + {}, + (this.parent as Database).formattedName_ + ), }, callback! ); @@ -325,8 +329,10 @@ export class Session extends GrpcServiceObject { optionsOrCallback?: CallOptions | GetSessionMetadataCallback, cb?: GetSessionMetadataCallback ): void | Promise { - const gaxOpts = - typeof optionsOrCallback === 'object' ? optionsOrCallback : {}; + const gaxOpts = addResourcePrefixHeader( + typeof optionsOrCallback === 'object' ? optionsOrCallback : {}, + (this.parent as Database).formattedName_ + ); const callback = typeof optionsOrCallback === 'function' ? optionsOrCallback : cb!; @@ -365,8 +371,10 @@ export class Session extends GrpcServiceObject { optionsOrCallback?: CallOptions | KeepAliveCallback, cb?: KeepAliveCallback ): void | Promise { - const gaxOpts = - typeof optionsOrCallback === 'object' ? optionsOrCallback : {}; + const gaxOpts = addResourcePrefixHeader( + typeof optionsOrCallback === 'object' ? optionsOrCallback : {}, + (this.parent as Database).formattedName_ + ); const callback = typeof optionsOrCallback === 'function' ? optionsOrCallback : cb!; diff --git a/src/transaction.ts b/src/transaction.ts index 1cdee0c3d..dd2debc7a 100644 --- a/src/transaction.ts +++ b/src/transaction.ts @@ -33,10 +33,11 @@ import { import {Session} from './session'; import {Key} from './table'; import {google as spannerClient} from '../protos/protos'; -import {NormalCallback} from './common'; +import {NormalCallback, addResourcePrefixHeader} from './common'; import {google} from '../protos/protos'; import IAny = google.protobuf.IAny; import IQueryOptions = google.spanner.v1.ExecuteSqlRequest.IQueryOptions; +import {Database} from '.'; export type Rows = Array; const RETRY_INFO_TYPE = 'type.googleapis.com/google.rpc.retryinfo'; @@ -310,8 +311,10 @@ export class Snapshot extends EventEmitter { gaxOptionsOrCallback?: CallOptions | BeginTransactionCallback, cb?: BeginTransactionCallback ): void | Promise { - const gaxOpts = - typeof gaxOptionsOrCallback === 'object' ? gaxOptionsOrCallback : {}; + const gaxOpts = addResourcePrefixHeader( + typeof gaxOptionsOrCallback === 'object' ? gaxOptionsOrCallback : {}, + (this.session.parent as Database).formattedName_ + ); const callback = typeof gaxOptionsOrCallback === 'function' ? gaxOptionsOrCallback : cb!; @@ -528,7 +531,10 @@ export class Snapshot extends EventEmitter { client: 'SpannerClient', method: 'streamingRead', reqOpts: Object.assign({}, reqOpts, {resumeToken}), - gaxOpts: gaxOptions, + gaxOpts: addResourcePrefixHeader( + gaxOptions!, + (this.session.parent as Database).formattedName_ + ), }); }; @@ -926,7 +932,10 @@ export class Snapshot extends EventEmitter { client: 'SpannerClient', method: 'executeStreamingSql', reqOpts: Object.assign({}, reqOpts, {resumeToken}), - gaxOpts: gaxOptions, + gaxOpts: addResourcePrefixHeader( + gaxOptions!, + (this.session.parent as Database).formattedName_ + ), }); }; @@ -1308,8 +1317,10 @@ export class Transaction extends Dml { gaxOptionsOrCallback?: CallOptions | BatchUpdateCallback, cb?: BatchUpdateCallback ): Promise | void { - const gaxOpts = - typeof gaxOptionsOrCallback === 'object' ? gaxOptionsOrCallback : {}; + const gaxOpts = addResourcePrefixHeader( + typeof gaxOptionsOrCallback === 'object' ? gaxOptionsOrCallback : {}, + (this.session.parent as Database).formattedName_ + ); const callback = typeof gaxOptionsOrCallback === 'function' ? gaxOptionsOrCallback : cb!; @@ -1459,8 +1470,10 @@ export class Transaction extends Dml { gaxOptionsOrCallback?: CallOptions | CommitCallback, cb?: CommitCallback ): void | Promise { - const gaxOpts = - typeof gaxOptionsOrCallback === 'object' ? gaxOptionsOrCallback : {}; + const gaxOpts = addResourcePrefixHeader( + typeof gaxOptionsOrCallback === 'object' ? gaxOptionsOrCallback : {}, + (this.session.parent as Database).formattedName_ + ); const callback = typeof gaxOptionsOrCallback === 'function' ? gaxOptionsOrCallback : cb!; @@ -1688,8 +1701,10 @@ export class Transaction extends Dml { | spannerClient.spanner.v1.Spanner.RollbackCallback, cb?: spannerClient.spanner.v1.Spanner.RollbackCallback ): void | Promise { - const gaxOpts = - typeof gaxOptionsOrCallback === 'object' ? gaxOptionsOrCallback : {}; + const gaxOpts = addResourcePrefixHeader( + typeof gaxOptionsOrCallback === 'object' ? gaxOptionsOrCallback : {}, + (this.session.parent as Database).formattedName_ + ); const callback = typeof gaxOptionsOrCallback === 'function' ? gaxOptionsOrCallback : cb!; diff --git a/test/backup.ts b/test/backup.ts index 344db45e4..ce3d5d096 100644 --- a/test/backup.ts +++ b/test/backup.ts @@ -27,6 +27,7 @@ import {Instance, Spanner} from '../src'; import * as bu from '../src/backup'; import {GetMetadataResponse} from '../src/backup'; import {grpc} from 'google-gax'; +import {addResourcePrefixHeader} from '../src/common'; let promisified = false; // let callbackified = false; @@ -182,7 +183,10 @@ describe('Backup', () => { }; backup.request = config => { - assert.deepStrictEqual(config.gaxOpts, gaxOptions); + assert.deepStrictEqual( + config.gaxOpts, + addResourcePrefixHeader(gaxOptions, backup.instanceFormattedName_) + ); done(); }; @@ -308,7 +312,10 @@ describe('Backup', () => { }; backup.request = config => { - assert.deepStrictEqual(config.gaxOpts, gaxOptions); + assert.deepStrictEqual( + config.gaxOpts, + addResourcePrefixHeader(gaxOptions, backup.instanceFormattedName_) + ); done(); }; @@ -563,7 +570,10 @@ describe('Backup', () => { }; backup.request = config => { - assert.deepStrictEqual(config.gaxOpts, gaxOpts); + assert.deepStrictEqual( + config.gaxOpts, + addResourcePrefixHeader(gaxOpts, backup.instanceFormattedName_) + ); done(); }; @@ -616,7 +626,10 @@ describe('Backup', () => { }; backup.request = config => { - assert.deepStrictEqual(config.gaxOpts, gaxOpts); + assert.deepStrictEqual( + config.gaxOpts, + addResourcePrefixHeader(gaxOpts, backup.instanceFormattedName_) + ); done(); }; diff --git a/test/batch-transaction.ts b/test/batch-transaction.ts index 8cb076d5b..2b13ffd2f 100644 --- a/test/batch-transaction.ts +++ b/test/batch-transaction.ts @@ -24,9 +24,10 @@ import * as extend from 'extend'; import * as proxyquire from 'proxyquire'; import * as sinon from 'sinon'; -import {Session} from '../src'; +import {Session, Database} from '../src'; import * as bt from '../src/batch-transaction'; import {PartialResultStream} from '../src/partial-result-stream'; +import {addResourcePrefixHeader} from '../src/common'; let promisified = false; const fakePfy = extend({}, pfy, { @@ -56,6 +57,10 @@ const fakeCodec: any = { convertProtoTimestampToDate() {}, }; +const DATABASE = { + formattedName_: 'database', +}; + class FakeTransaction { calledWith_: IArguments; session; @@ -80,8 +85,11 @@ describe('BatchTransaction', () => { let BatchTransaction: typeof bt.BatchTransaction; let batchTransaction: bt.BatchTransaction; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const SESSION: any = {}; + const SESSION = { + parent: DATABASE, + // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any + delete: (callback: any) => {}, + }; before(() => { BatchTransaction = proxyquire('../src/batch-transaction.js', { @@ -93,7 +101,7 @@ describe('BatchTransaction', () => { }); beforeEach(() => { - batchTransaction = new BatchTransaction(SESSION); + batchTransaction = new BatchTransaction((SESSION as {}) as Session); }); afterEach(() => sandbox.restore()); @@ -104,7 +112,7 @@ describe('BatchTransaction', () => { }); it('should extend the Snapshot class', () => { - const batchTransaction = new BatchTransaction(SESSION); + const batchTransaction = new BatchTransaction((SESSION as {}) as Session); assert(batchTransaction instanceof FakeTransaction); }); }); @@ -173,6 +181,7 @@ describe('BatchTransaction', () => { describe('createPartitions_', () => { const REQUEST = sandbox.stub(); const SESSION = { + parent: DATABASE, formattedName_: 'abcdef', request: REQUEST, }; @@ -183,7 +192,7 @@ describe('BatchTransaction', () => { const RESPONSE = {partitions: PARTITIONS}; const QUERY = {a: 'b'}; - const CONFIG = {reqOpts: QUERY}; + const CONFIG = {reqOpts: QUERY, gaxOpts: {timeout: 1000}}; beforeEach(() => { batchTransaction.session = (SESSION as {}) as Session; @@ -201,6 +210,20 @@ describe('BatchTransaction', () => { assert.deepStrictEqual(reqOpts.transaction, {id: ID}); }); + it('should add resource prefix to `gaxOpt`', done => { + batchTransaction.createPartitions_(CONFIG, assert.ifError); + const {gaxOpts} = REQUEST.lastCall.args[0]; + assert.deepStrictEqual( + gaxOpts, + addResourcePrefixHeader( + CONFIG.gaxOpts, + (batchTransaction.session.parent as Database).formattedName_ + ) + ); + console.log(gaxOpts); + done(); + }); + it('should return any request errors', done => { const error = new Error('err'); const response = {}; diff --git a/test/database.ts b/test/database.ts index 914b4803f..d33607c27 100644 --- a/test/database.ts +++ b/test/database.ts @@ -31,6 +31,7 @@ import * as db from '../src/database'; import {Instance} from '../src'; import {MockError} from './mockserver/mockspanner'; import {IOperation} from '../src/instance'; +import {addResourcePrefixHeader} from '../src/common'; let promisified = false; const fakePfy = extend({}, pfy, { @@ -380,13 +381,16 @@ describe('Database', () => { it('should accept gaxOptions', () => { const stub = sandbox.stub(database, 'request'); - const gaxOptions = {}; + const gaxOptions = {timeout: 1000}; database.batchCreateSessions({count: 10, gaxOptions}, assert.ifError); const {gaxOpts} = stub.lastCall.args[0]; - assert.strictEqual(gaxOpts, gaxOptions); + assert.deepStrictEqual( + gaxOpts, + addResourcePrefixHeader(gaxOptions, database.formattedName_) + ); }); it('should return any request errors', done => { @@ -705,6 +709,10 @@ describe('Database', () => { assert.deepStrictEqual(config.reqOpts, { database: database.formattedName_, }); + assert.deepStrictEqual( + config.gaxOpts, + addResourcePrefixHeader({}, database.formattedName_) + ); assert.strictEqual(callback, assert.ifError); }; @@ -975,7 +983,10 @@ describe('Database', () => { it('should accept gaxOptions', done => { const gaxOptions = {}; database.request = config => { - assert.strictEqual(config.gaxOpts, gaxOptions); + assert.deepStrictEqual( + config.gaxOpts, + addResourcePrefixHeader(gaxOptions, database.formattedName_) + ); done(); }; database.getMetadata(gaxOptions, assert.ifError); @@ -999,7 +1010,10 @@ describe('Database', () => { it('should accept gaxOptions', done => { const gaxOptions = {}; database.request = config => { - assert.strictEqual(config.gaxOpts, gaxOptions); + assert.deepStrictEqual( + config.gaxOpts, + addResourcePrefixHeader(gaxOptions, database.formattedName_) + ); done(); }; @@ -1630,7 +1644,10 @@ describe('Database', () => { it('should accept gaxOptions', done => { const gaxOptions = {}; database.request = config => { - assert.strictEqual(config.gaxOpts, gaxOptions); + assert.deepStrictEqual( + config.gaxOpts, + addResourcePrefixHeader(gaxOptions, database.formattedName_) + ); done(); }; database.updateSchema(STATEMENTS, gaxOptions, assert.ifError); @@ -1649,7 +1666,10 @@ describe('Database', () => { database: database.formattedName_, }); - assert.deepStrictEqual(config.gaxOpts, gaxOptions); + assert.deepStrictEqual( + config.gaxOpts, + addResourcePrefixHeader(gaxOptions, database.formattedName_) + ); done(); }; @@ -1663,8 +1683,10 @@ describe('Database', () => { database: database.formattedName_, }); - assert.deepStrictEqual(config.gaxOpts, undefined); - + assert.deepStrictEqual( + config.gaxOpts, + addResourcePrefixHeader({}, database.formattedName_) + ); done(); }; @@ -1977,7 +1999,10 @@ describe('Database', () => { assert.strictEqual(config.client, 'SpannerClient'); assert.strictEqual(config.method, 'listSessions'); assert.deepStrictEqual(config.reqOpts, expectedReqOpts); - assert.deepStrictEqual(config.gaxOpts, gaxOpts); + assert.deepStrictEqual( + config.gaxOpts, + addResourcePrefixHeader(gaxOpts, database.formattedName_) + ); done(); }; @@ -1988,7 +2013,10 @@ describe('Database', () => { const pageSize = 3; const pageToken = 'token'; const gaxOptions = {pageSize, pageToken, timeout: 1000}; - const expectedGaxOpts = {timeout: 1000}; + const expectedGaxOpts = addResourcePrefixHeader( + {timeout: 1000}, + database.formattedName_ + ); const options = {a: 'a', gaxOptions: gaxOptions}; const expectedReqOpts = extend( {}, @@ -2016,7 +2044,10 @@ describe('Database', () => { const pageSize = 3; const pageToken = 'token'; const gaxOptions = {pageSize, pageToken, timeout: 1000}; - const expectedGaxOpts = {timeout: 1000}; + const expectedGaxOpts = addResourcePrefixHeader( + {timeout: 1000}, + database.formattedName_ + ); const optionsPageSize = 5; const optionsPageToken = 'optionsToken'; @@ -2055,7 +2086,10 @@ describe('Database', () => { assert.deepStrictEqual(config.reqOpts, { database: database.formattedName_, }); - assert.deepStrictEqual(config.gaxOpts, {}); + assert.deepStrictEqual( + config.gaxOpts, + addResourcePrefixHeader({}, database.formattedName_) + ); done(); }; database.getSessions(assert.ifError); @@ -2114,7 +2148,10 @@ describe('Database', () => { assert.notStrictEqual(config.reqOpts, OPTIONS); - assert.deepStrictEqual(config.gaxOpts, OPTIONS.gaxOptions); + assert.deepStrictEqual( + config.gaxOpts, + addResourcePrefixHeader(OPTIONS.gaxOptions!, database.formattedName_) + ); return returnValue; }; @@ -2126,7 +2163,10 @@ describe('Database', () => { const pageSize = 3; const pageToken = 'token'; const gaxOptions = {pageSize, pageToken, timeout: 1000}; - const expectedGaxOpts = {timeout: 1000}; + const expectedGaxOpts = addResourcePrefixHeader( + {timeout: 1000}, + database.formattedName_ + ); const options = {gaxOptions}; const expectedReqOpts = extend( {}, @@ -2153,7 +2193,10 @@ describe('Database', () => { const pageSize = 3; const pageToken = 'token'; const gaxOptions = {pageSize, pageToken, timeout: 1000}; - const expectedGaxOpts = {timeout: 1000}; + const expectedGaxOpts = addResourcePrefixHeader( + {timeout: 1000}, + database.formattedName_ + ); const optionsPageSize = 5; const optionsPageToken = 'optionsToken'; @@ -2189,7 +2232,10 @@ describe('Database', () => { database: database.formattedName_, }); - assert.deepStrictEqual(config.gaxOpts, {}); + assert.deepStrictEqual( + config.gaxOpts, + addResourcePrefixHeader({}, database.formattedName_) + ); return returnValue; }; @@ -2564,7 +2610,7 @@ describe('Database', () => { const BACKUP_FORMATTED_NAME = INSTANCE.formattedName_ + '/backups/' + BACKUP_NAME; - it('should make the correct request', async () => { + it('should make the correct request', done => { const QUERY = {}; const ORIGINAL_QUERY = extend({}, QUERY); const expectedReqOpts = extend({}, QUERY, { @@ -2581,12 +2627,13 @@ describe('Database', () => { assert.notStrictEqual(config.reqOpts, QUERY); assert.deepStrictEqual(QUERY, ORIGINAL_QUERY); + done(); }; - await database.restore(BACKUP_FORMATTED_NAME); + database.restore(BACKUP_FORMATTED_NAME, assert.ifError); }); - it('should accept a backup name', async () => { + it('should accept a backup name', done => { const QUERY = {}; const expectedReqOpts = extend({}, QUERY, { databaseId: NAME, @@ -2597,22 +2644,26 @@ describe('Database', () => { database.id = NAME; database.request = config => { assert.deepStrictEqual(config.reqOpts, expectedReqOpts); + done(); }; - await database.restore(BACKUP_NAME); + database.restore(BACKUP_NAME, assert.ifError); }); - it('should accept gaxOpts and a callback', async done => { + it('should accept gaxOpts', done => { const options = { timeout: 1000, }; database.request = config => { - assert.deepStrictEqual(config.gaxOpts, options); + assert.deepStrictEqual( + config.gaxOpts, + addResourcePrefixHeader(options, database.instance.formattedName_) + ); done(); }; - await database.restore(BACKUP_NAME, options, assert.ifError); + database.restore(BACKUP_NAME, options, assert.ifError); }); describe('error', () => { diff --git a/test/index.ts b/test/index.ts index 31c66c18a..1be6cfa12 100644 --- a/test/index.ts +++ b/test/index.ts @@ -32,6 +32,7 @@ import * as spnr from '../src'; import {Duplex} from 'stream'; import {CreateInstanceRequest} from '../src/index'; import {GetInstanceConfigsOptions, GetInstancesOptions} from '../src'; +import {addResourcePrefixHeader} from '../src/common'; // eslint-disable-next-line @typescript-eslint/no-var-requires const apiConfig = require('../src/spanner_grpc_config.json'); @@ -478,7 +479,8 @@ describe('Spanner', () => { const NAME = 'instance-name'; let PATH; - const CONFIG = { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const CONFIG: any = { config: 'b', }; const ORIGINAL_CONFIG = extend({}, CONFIG); @@ -523,7 +525,10 @@ describe('Spanner', () => { config: `projects/project-id/instanceConfigs/${CONFIG.config}`, }, }); - assert.strictEqual(config.gaxOpts, undefined); + assert.deepStrictEqual( + config.gaxOpts, + addResourcePrefixHeader(CONFIG.gaxOptions, reqOpts.parent) + ); done(); }; spanner.createInstance(NAME, CONFIG, assert.ifError); @@ -552,7 +557,10 @@ describe('Spanner', () => { it('should accept gaxOptions', done => { const cfg = Object.assign({}, CONFIG, {gaxOptions: {}}); spanner.request = config => { - assert.strictEqual(config.gaxOpts, cfg.gaxOptions); + assert.deepStrictEqual( + config.gaxOpts, + addResourcePrefixHeader(cfg.gaxOptions, config.reqOpts.parent) + ); done(); }; spanner.createInstance(NAME, cfg, assert.ifError); @@ -664,7 +672,10 @@ describe('Spanner', () => { assert.notStrictEqual(config.reqOpts, OPTIONS); assert.deepStrictEqual(OPTIONS, ORIGINAL_OPTIONS); - assert.deepStrictEqual(config.gaxOpts, {}); + assert.deepStrictEqual( + config.gaxOpts, + addResourcePrefixHeader(OPTIONS.gaxOptions!, expectedReqOpts.parent) + ); done(); }; @@ -676,7 +687,6 @@ describe('Spanner', () => { const pageSize = 3; const pageToken = 'token'; const gaxOptions = {pageSize, pageToken, timeout: 1000}; - const expectedGaxOpts = {timeout: 1000}; const options = Object.assign({}, OPTIONS, {gaxOptions}); const expectedReqOpts = extend( {}, @@ -686,6 +696,10 @@ describe('Spanner', () => { }, {pageSize: gaxOptions.pageSize, pageToken: gaxOptions.pageToken} ); + const expectedGaxOpts = addResourcePrefixHeader( + {timeout: 1000}, + expectedReqOpts.parent + ); spanner.request = config => { assert.deepStrictEqual(config.reqOpts, expectedReqOpts); @@ -703,7 +717,6 @@ describe('Spanner', () => { const pageSize = 3; const pageToken = 'token'; const gaxOptions = {pageSize, pageToken, timeout: 1000}; - const expectedGaxOpts = {timeout: 1000}; const optionsPageSize = 5; const optionsPageToken = 'optionsToken'; @@ -721,6 +734,11 @@ describe('Spanner', () => { {pageSize: optionsPageSize, pageToken: optionsPageToken} ); + const expectedGaxOpts = addResourcePrefixHeader( + {timeout: 1000}, + expectedReqOpts.parent + ); + spanner.request = config => { assert.deepStrictEqual(config.reqOpts, expectedReqOpts); assert.notStrictEqual(config.gaxOpts, gaxOptions); @@ -739,7 +757,10 @@ describe('Spanner', () => { parent: 'projects/' + spanner.projectId, }); - assert.deepStrictEqual(config.gaxOpts, {}); + assert.deepStrictEqual( + config.gaxOpts, + addResourcePrefixHeader({}, config.reqOpts.parent) + ); done(); }; @@ -820,7 +841,10 @@ describe('Spanner', () => { assert.notStrictEqual(config.reqOpts, OPTIONS); assert.deepStrictEqual(OPTIONS, ORIGINAL_OPTIONS); - assert.deepStrictEqual(config.gaxOpts, {}); + assert.deepStrictEqual( + config.gaxOpts, + addResourcePrefixHeader(OPTIONS.gaxOptions!, expectedReqOpts.parent) + ); return returnValue as Duplex; }; @@ -832,7 +856,6 @@ describe('Spanner', () => { const pageSize = 3; const pageToken = 'token'; const gaxOptions = {pageSize, pageToken, timeout: 1000}; - const expectedGaxOpts = {timeout: 1000}; const options = {gaxOptions}; const expectedReqOpts = extend( {}, @@ -841,6 +864,10 @@ describe('Spanner', () => { }, {pageSize: gaxOptions.pageSize, pageToken: gaxOptions.pageToken} ); + const expectedGaxOpts = addResourcePrefixHeader( + {timeout: 1000}, + expectedReqOpts.parent + ); spanner.requestStream = config => { assert.deepStrictEqual(config.reqOpts, expectedReqOpts); @@ -859,7 +886,6 @@ describe('Spanner', () => { const pageSize = 3; const pageToken = 'token'; const gaxOptions = {pageSize, pageToken, timeout: 1000}; - const expectedGaxOpts = {timeout: 1000}; const optionsPageSize = 5; const optionsPageToken = 'optionsToken'; @@ -875,6 +901,10 @@ describe('Spanner', () => { }, {pageSize: optionsPageSize, pageToken: optionsPageToken} ); + const expectedGaxOpts = addResourcePrefixHeader( + {timeout: 1000}, + expectedReqOpts.parent + ); spanner.requestStream = config => { assert.deepStrictEqual(config.reqOpts, expectedReqOpts); @@ -895,7 +925,10 @@ describe('Spanner', () => { parent: 'projects/' + spanner.projectId, }); - assert.deepStrictEqual(config.gaxOpts, {}); + assert.deepStrictEqual( + config.gaxOpts, + addResourcePrefixHeader({}, config.reqOpts.parent) + ); return returnValue; }; @@ -933,8 +966,10 @@ describe('Spanner', () => { assert.notStrictEqual(reqOpts, options); const gaxOpts = config.gaxOpts; - assert.deepStrictEqual(gaxOpts, options.gaxOptions); - + assert.deepStrictEqual( + gaxOpts, + addResourcePrefixHeader(options.gaxOptions!, expectedQuery.parent) + ); assert.strictEqual(callback_, callback); return returnValue; @@ -948,7 +983,6 @@ describe('Spanner', () => { const pageSize = 3; const pageToken = 'token'; const gaxOptions = {pageSize, pageToken, timeout: 1000}; - const expectedGaxOpts = {timeout: 1000}; const options = Object.assign({}, OPTIONS, {gaxOptions}); const expectedReqOpts = extend( {}, @@ -958,6 +992,10 @@ describe('Spanner', () => { }, {pageSize: gaxOptions.pageSize, pageToken: gaxOptions.pageToken} ); + const expectedGaxOpts = addResourcePrefixHeader( + {timeout: 1000}, + expectedReqOpts.parent + ); spanner.request = config => { assert.deepStrictEqual(config.reqOpts, expectedReqOpts); @@ -975,7 +1013,6 @@ describe('Spanner', () => { const pageSize = 3; const pageToken = 'token'; const gaxOptions = {pageSize, pageToken, timeout: 1000}; - const expectedGaxOpts = {timeout: 1000}; const optionsPageSize = 5; const optionsPageToken = 'optionsToken'; @@ -992,6 +1029,10 @@ describe('Spanner', () => { }, {pageSize: optionsPageSize, pageToken: optionsPageToken} ); + const expectedGaxOpts = addResourcePrefixHeader( + {timeout: 1000}, + expectedReqOpts.parent + ); spanner.request = config => { assert.deepStrictEqual(config.reqOpts, expectedReqOpts); @@ -1011,6 +1052,11 @@ describe('Spanner', () => { assert.deepStrictEqual(reqOpts, { parent: 'projects/' + spanner.projectId, }); + assert.deepStrictEqual( + config.gaxOpts, + addResourcePrefixHeader({}, config.reqOpts.parent) + ); + done(); }; @@ -1043,8 +1089,10 @@ describe('Spanner', () => { assert.deepStrictEqual(reqOpts, expectedOptions); assert.notStrictEqual(reqOpts, OPTIONS); - const gaxOpts = config.gaxOpts; - assert.deepStrictEqual(gaxOpts, OPTIONS.gaxOptions); + assert.deepStrictEqual( + config.gaxOpts, + addResourcePrefixHeader(OPTIONS.gaxOptions!, expectedOptions.parent) + ); return returnValue; }; @@ -1068,8 +1116,10 @@ describe('Spanner', () => { const reqOpts = config.reqOpts; assert.deepStrictEqual(reqOpts, expectedOptions); - const gaxOpts = config.gaxOpts; - assert.deepStrictEqual(gaxOpts, {}); + assert.deepStrictEqual( + config.gaxOpts, + addResourcePrefixHeader({}, config.reqOpts.parent) + ); return returnValue; }; @@ -1081,7 +1131,6 @@ describe('Spanner', () => { const pageSize = 3; const pageToken = 'token'; const gaxOptions = {pageSize, pageToken, timeout: 1000}; - const expectedGaxOpts = {timeout: 1000}; const options = {gaxOptions}; const expectedReqOpts = extend( true, @@ -1093,6 +1142,10 @@ describe('Spanner', () => { {pageSize: gaxOptions.pageSize, pageToken: gaxOptions.pageToken} ); delete expectedReqOpts.gaxOptions; + const expectedGaxOpts = addResourcePrefixHeader( + {timeout: 1000}, + expectedReqOpts.parent + ); spanner.requestStream = config => { assert.deepStrictEqual(config.reqOpts, expectedReqOpts); @@ -1111,7 +1164,6 @@ describe('Spanner', () => { const pageSize = 3; const pageToken = 'token'; const gaxOptions = {pageSize, pageToken, timeout: 1000}; - const expectedGaxOpts = {timeout: 1000}; const optionsPageSize = 5; const optionsPageToken = 'optionsToken'; @@ -1132,6 +1184,10 @@ describe('Spanner', () => { {pageSize: optionsPageSize, pageToken: optionsPageToken} ); delete expectedReqOpts.gaxOptions; + const expectedGaxOpts = addResourcePrefixHeader( + {timeout: 1000}, + expectedReqOpts.parent + ); spanner.request = config => { assert.deepStrictEqual(config.reqOpts, expectedReqOpts); diff --git a/test/instance.ts b/test/instance.ts index 66eb823d2..0c0a2239d 100644 --- a/test/instance.ts +++ b/test/instance.ts @@ -33,6 +33,7 @@ import arrify = require('arrify'); import {SessionPoolOptions} from '../src/session-pool'; import {Backup} from '../src/backup'; import {PreciseDate} from '@google-cloud/precise-date'; +import {addResourcePrefixHeader} from '../src/common'; let promisified = false; const fakePfy = extend({}, pfy, { @@ -258,7 +259,10 @@ describe('Instance', () => { it('should accept gaxOptions', done => { const options = Object.assign({}, OPTIONS, {gaxOptions: {}}); instance.request = config => { - assert.strictEqual(config.gaxOpts, options.gaxOptions); + assert.deepStrictEqual( + config.gaxOpts, + addResourcePrefixHeader(options.gaxOptions, instance.formattedName_) + ); assert.strictEqual(config.reqOpts.gaxOptions, undefined); done(); @@ -555,7 +559,10 @@ describe('Instance', () => { const gaxOptions = {}; instance.request = (config, callback: Function) => { - assert.strictEqual(config.gaxOpts, gaxOptions); + assert.deepStrictEqual( + config.gaxOpts, + addResourcePrefixHeader(gaxOptions, instance.formattedName_) + ); callback(); // done() }; @@ -900,7 +907,10 @@ describe('Instance', () => { assert.notStrictEqual(config.reqOpts, OPTIONS); assert.deepStrictEqual(OPTIONS, ORIGINAL_OPTIONS); - assert.deepStrictEqual(config.gaxOpts, OPTIONS.gaxOptions); + assert.deepStrictEqual( + config.gaxOpts, + addResourcePrefixHeader(OPTIONS.gaxOptions!, instance.formattedName_) + ); done(); }; @@ -911,7 +921,10 @@ describe('Instance', () => { it('should pass pageSize and pageToken from gaxOptions into reqOpts', done => { const pageToken = 'token'; const gaxOptions = {pageSize, pageToken, timeout: 1000}; - const expectedGaxOpts = {timeout: 1000}; + const expectedGaxOpts = addResourcePrefixHeader( + {timeout: 1000}, + instance.formattedName_ + ); const options = {gaxOptions}; const expectedReqOpts = extend( {}, @@ -938,7 +951,10 @@ describe('Instance', () => { it('pageSize and pageToken in options should take precedence over gaxOptions', done => { const pageToken = 'token'; const gaxOptions = {pageSize, pageToken, timeout: 1000}; - const expectedGaxOpts = {timeout: 1000}; + const expectedGaxOpts = addResourcePrefixHeader( + {timeout: 1000}, + instance.formattedName_ + ); const optionsPageSize = 5; const optionsPageToken = 'optionsToken'; @@ -975,7 +991,10 @@ describe('Instance', () => { parent: instance.formattedName_, }); - assert.deepStrictEqual(config.gaxOpts, {}); + assert.deepStrictEqual( + config.gaxOpts, + addResourcePrefixHeader({}, instance.formattedName_) + ); done(); }; @@ -1056,7 +1075,10 @@ describe('Instance', () => { assert.notStrictEqual(config.reqOpts, OPTIONS); - assert.deepStrictEqual(config.gaxOpts, OPTIONS.gaxOptions); + assert.deepStrictEqual( + config.gaxOpts, + addResourcePrefixHeader(OPTIONS.gaxOptions!, instance.formattedName_) + ); return returnValue; }; @@ -1068,7 +1090,10 @@ describe('Instance', () => { const pageSize = 3; const pageToken = 'token'; const gaxOptions = {pageSize, pageToken, timeout: 1000}; - const expectedGaxOpts = {timeout: 1000}; + const expectedGaxOpts = addResourcePrefixHeader( + {timeout: 1000}, + instance.formattedName_ + ); const options = {gaxOptions}; const expectedReqOpts = extend( {}, @@ -1095,7 +1120,10 @@ describe('Instance', () => { const pageSize = 3; const pageToken = 'token'; const gaxOptions = {pageSize, pageToken, timeout: 1000}; - const expectedGaxOpts = {timeout: 1000}; + const expectedGaxOpts = addResourcePrefixHeader( + {timeout: 1000}, + instance.formattedName_ + ); const optionsPageSize = 5; const optionsPageToken = 'optionsToken'; @@ -1133,7 +1161,10 @@ describe('Instance', () => { parent: instance.formattedName_, }); - assert.deepStrictEqual(config.gaxOpts, {}); + assert.deepStrictEqual( + config.gaxOpts, + addResourcePrefixHeader({}, instance.formattedName_) + ); return returnValue; }; @@ -1196,7 +1227,10 @@ describe('Instance', () => { it('should accept gaxOptions', done => { const gaxOptions = {}; instance.request = config => { - assert.strictEqual(config.gaxOpts, gaxOptions); + assert.deepStrictEqual( + config.gaxOpts, + addResourcePrefixHeader(gaxOptions, instance.formattedName_) + ); done(); }; instance.getMetadata({gaxOptions}, assert.ifError); @@ -1241,7 +1275,10 @@ describe('Instance', () => { it('should accept gaxOptions', done => { const gaxOptions = {}; instance.request = config => { - assert.strictEqual(config.gaxOpts, gaxOptions); + assert.deepStrictEqual( + config.gaxOpts, + addResourcePrefixHeader(gaxOptions, instance.formattedName_) + ); done(); }; instance.setMetadata(METADATA, gaxOptions, assert.ifError); @@ -1260,7 +1297,7 @@ describe('Instance', () => { } as inst.GetBackupsOptions; const ORIGINAL_OPTIONS = extend({}, OPTIONS); - it('should make the correct request', async () => { + it('should make the correct request', done => { const gaxOpts = { timeout: 1000, }; @@ -1278,17 +1315,24 @@ describe('Instance', () => { assert.notStrictEqual(config.reqOpts, OPTIONS); assert.deepStrictEqual(OPTIONS, ORIGINAL_OPTIONS); - assert.deepStrictEqual(config.gaxOpts, options.gaxOptions); + assert.deepStrictEqual( + config.gaxOpts, + addResourcePrefixHeader(options.gaxOptions, instance.formattedName_) + ); + done(); }; - await instance.getBackups(options); + instance.getBackups(options, assert.ifError); }); it('should pass pageSize and pageToken from gaxOptions into reqOpts', done => { const pageSize = 3; const pageToken = 'token'; const gaxOptions = {pageSize, pageToken, timeout: 1000}; - const expectedGaxOpts = {timeout: 1000}; + const expectedGaxOpts = addResourcePrefixHeader( + {timeout: 1000}, + instance.formattedName_ + ); const options = {gaxOptions}; const expectedReqOpts = extend( {}, @@ -1314,7 +1358,10 @@ describe('Instance', () => { const pageSize = 3; const pageToken = 'token'; const gaxOptions = {pageSize, pageToken, timeout: 1000}; - const expectedGaxOpts = {timeout: 1000}; + const expectedGaxOpts = addResourcePrefixHeader( + {timeout: 1000}, + instance.formattedName_ + ); const optionsPageSize = 5; const optionsPageToken = 'optionsToken'; @@ -1348,7 +1395,10 @@ describe('Instance', () => { assert.deepStrictEqual(config.reqOpts, { parent: instance.formattedName_, }); - assert.deepStrictEqual(config.gaxOpts, {}); + assert.deepStrictEqual( + config.gaxOpts, + addResourcePrefixHeader({}, instance.formattedName_) + ); done(); }; @@ -1429,7 +1479,10 @@ describe('Instance', () => { assert.notStrictEqual(config.reqOpts, OPTIONS); - assert.deepStrictEqual(config.gaxOpts, OPTIONS.gaxOptions); + assert.deepStrictEqual( + config.gaxOpts, + addResourcePrefixHeader(OPTIONS.gaxOptions!, instance.formattedName_) + ); return returnValue; }; @@ -1441,7 +1494,10 @@ describe('Instance', () => { const pageSize = 3; const pageToken = 'token'; const gaxOptions = {pageSize, pageToken, timeout: 1000}; - const expectedGaxOpts = {timeout: 1000}; + const expectedGaxOpts = addResourcePrefixHeader( + {timeout: 1000}, + instance.formattedName_ + ); const options = {gaxOptions}; const expectedReqOpts = extend( {}, @@ -1468,7 +1524,10 @@ describe('Instance', () => { const pageSize = 3; const pageToken = 'token'; const gaxOptions = {pageSize, pageToken, timeout: 1000}; - const expectedGaxOpts = {timeout: 1000}; + const expectedGaxOpts = addResourcePrefixHeader( + {timeout: 1000}, + instance.formattedName_ + ); const optionsPageSize = 5; const optionsPageToken = 'optionsToken'; @@ -1506,7 +1565,10 @@ describe('Instance', () => { parent: instance.formattedName_, }); - assert.deepStrictEqual(config.gaxOpts, {}); + assert.deepStrictEqual( + config.gaxOpts, + addResourcePrefixHeader({}, instance.formattedName_) + ); return returnValue; }; @@ -1539,7 +1601,7 @@ describe('Instance', () => { } as inst.GetBackupOperationsOptions; const ORIGINAL_OPTIONS = extend({}, OPTIONS); - it('should make the correct request', async () => { + it('should make the correct request', done => { const gaxOpts = { timeout: 1000, }; @@ -1557,17 +1619,24 @@ describe('Instance', () => { assert.notStrictEqual(config.reqOpts, OPTIONS); assert.deepStrictEqual(OPTIONS, ORIGINAL_OPTIONS); - assert.deepStrictEqual(config.gaxOpts, options.gaxOptions); + assert.deepStrictEqual( + config.gaxOpts, + addResourcePrefixHeader(options.gaxOptions, instance.formattedName_) + ); + done(); }; - await instance.getBackupOperations(options); + instance.getBackupOperations(options, assert.ifError); }); it('should pass pageSize and pageToken from gaxOptions into reqOpts', done => { const pageSize = 3; const pageToken = 'token'; const gaxOptions = {pageSize, pageToken, timeout: 1000}; - const expectedGaxOpts = {timeout: 1000}; + const expectedGaxOpts = addResourcePrefixHeader( + {timeout: 1000}, + instance.formattedName_ + ); const options = Object.assign({}, OPTIONS, {gaxOptions}); const expectedReqOpts = extend( {}, @@ -1594,7 +1663,10 @@ describe('Instance', () => { const pageSize = 3; const pageToken = 'token'; const gaxOptions = {pageSize, pageToken, timeout: 1000}; - const expectedGaxOpts = {timeout: 1000}; + const expectedGaxOpts = addResourcePrefixHeader( + {timeout: 1000}, + instance.formattedName_ + ); const optionsPageSize = 5; const optionsPageToken = 'optionsToken'; @@ -1630,7 +1702,10 @@ describe('Instance', () => { parent: instance.formattedName_, }); - assert.deepStrictEqual(config.gaxOpts, {}); + assert.deepStrictEqual( + config.gaxOpts, + addResourcePrefixHeader({}, instance.formattedName_) + ); done(); }; @@ -1644,7 +1719,7 @@ describe('Instance', () => { } as inst.GetDatabaseOperationsOptions; const ORIGINAL_OPTIONS = extend({}, OPTIONS); - it('should make the correct request', async () => { + it('should make the correct request', done => { const gaxOpts = { timeout: 1000, }; @@ -1662,17 +1737,24 @@ describe('Instance', () => { assert.notStrictEqual(config.reqOpts, OPTIONS); assert.deepStrictEqual(OPTIONS, ORIGINAL_OPTIONS); - assert.deepStrictEqual(config.gaxOpts, options.gaxOptions); + assert.deepStrictEqual( + config.gaxOpts, + addResourcePrefixHeader(options.gaxOptions, instance.formattedName_) + ); + done(); }; - await instance.getDatabaseOperations(options); + instance.getDatabaseOperations(options, assert.ifError); }); it('should pass pageSize and pageToken from gaxOptions into reqOpts', done => { const pageSize = 3; const pageToken = 'token'; const gaxOptions = {pageSize, pageToken, timeout: 1000}; - const expectedGaxOpts = {timeout: 1000}; + const expectedGaxOpts = addResourcePrefixHeader( + {timeout: 1000}, + instance.formattedName_ + ); const options = Object.assign({}, OPTIONS, {gaxOptions}); const expectedReqOpts = extend( {}, @@ -1699,7 +1781,10 @@ describe('Instance', () => { const pageSize = 3; const pageToken = 'token'; const gaxOptions = {pageSize, pageToken, timeout: 1000}; - const expectedGaxOpts = {timeout: 1000}; + const expectedGaxOpts = addResourcePrefixHeader( + {timeout: 1000}, + instance.formattedName_ + ); const optionsPageSize = 5; const optionsPageToken = 'optionsToken'; @@ -1735,7 +1820,10 @@ describe('Instance', () => { parent: instance.formattedName_, }); - assert.deepStrictEqual(config.gaxOpts, {}); + assert.deepStrictEqual( + config.gaxOpts, + addResourcePrefixHeader({}, instance.formattedName_) + ); done(); }; diff --git a/test/session.ts b/test/session.ts index d82b984ef..92588e52d 100644 --- a/test/session.ts +++ b/test/session.ts @@ -21,6 +21,7 @@ import * as assert from 'assert'; import {before, beforeEach, describe, it} from 'mocha'; import * as extend from 'extend'; import * as proxyquire from 'proxyquire'; +import {addResourcePrefixHeader} from '../src/common'; let promisified = false; const fakePfy = extend({}, pfy, { @@ -228,6 +229,9 @@ describe('Session', () => { }); describe('delete', () => { + beforeEach(() => { + session.parent = DATABASE; + }); it('should correctly call and return the request', () => { const requestReturnValue = {}; @@ -239,6 +243,11 @@ describe('Session', () => { assert.deepStrictEqual(config.reqOpts, { name: session.formattedName_, }); + assert.deepStrictEqual( + config.gaxOpts, + addResourcePrefixHeader({}, session.parent.formattedName_) + ); + assert.strictEqual(callback_, callback); return requestReturnValue; }; @@ -249,6 +258,10 @@ describe('Session', () => { }); describe('getMetadata', () => { + beforeEach(() => { + session.parent = DATABASE; + }); + it('should correctly call and return the request', () => { const requestReturnValue = {}; @@ -271,7 +284,10 @@ describe('Session', () => { it('should accept and pass gaxOptions to getMetadata', done => { const gaxOptions = {}; session.request = config => { - assert.strictEqual(config.gaxOpts, gaxOptions); + assert.deepStrictEqual( + config.gaxOpts, + addResourcePrefixHeader(gaxOptions, session.parent.formattedName_) + ); done(); }; session.getMetadata(gaxOptions, assert.ifError); @@ -279,6 +295,10 @@ describe('Session', () => { }); describe('keepAlive', () => { + beforeEach(() => { + session.parent = DATABASE; + }); + it('should correctly call and return the request', () => { const requestReturnValue = {}; @@ -302,7 +322,10 @@ describe('Session', () => { it('should accept gaxOptions', done => { const gaxOptions = {}; session.request = config => { - assert.strictEqual(config.gaxOpts, gaxOptions); + assert.deepStrictEqual( + config.gaxOpts, + addResourcePrefixHeader({}, session.parent.formattedName_) + ); done(); }; session.keepAlive(gaxOptions, assert.ifError); diff --git a/test/transaction.ts b/test/transaction.ts index 4b54cf79f..504739769 100644 --- a/test/transaction.ts +++ b/test/transaction.ts @@ -24,11 +24,12 @@ import * as sinon from 'sinon'; import {codec} from '../src/codec'; import {google} from '../protos/protos'; +import {addResourcePrefixHeader} from '../src/common'; describe('Transaction', () => { const sandbox = sinon.createSandbox(); - const PARENT = {}; + const PARENT = {formattedName_: 'formatted-database-name'}; const REQUEST = sandbox.stub(); const REQUEST_STREAM = sandbox.stub(); const SESSION_NAME = 'session-123'; @@ -278,7 +279,13 @@ describe('Transaction', () => { const {gaxOpts, reqOpts} = REQUEST_STREAM.lastCall.args[0]; - assert.strictEqual(gaxOpts, fakeOptions); + assert.deepStrictEqual( + gaxOpts, + addResourcePrefixHeader( + fakeOptions, + snapshot.session.parent.formattedName_ + ) + ); assert.strictEqual(reqOpts.gaxOptions, undefined); }); @@ -558,7 +565,13 @@ describe('Transaction', () => { const {gaxOpts, reqOpts} = REQUEST_STREAM.lastCall.args[0]; assert.strictEqual(reqOpts.gaxOptions, undefined); - assert.strictEqual(gaxOpts, fakeQuery.gaxOptions); + assert.deepStrictEqual( + gaxOpts, + addResourcePrefixHeader( + fakeQuery.gaxOptions, + snapshot.session.parent.formattedName_ + ) + ); }); it('should update the `seqno` for each call', () => { @@ -1022,7 +1035,13 @@ describe('Transaction', () => { it('should accept gaxOptions', done => { const gaxOptions = {}; transaction.request = config => { - assert.strictEqual(config.gaxOpts, gaxOptions); + assert.deepStrictEqual( + config.gaxOpts, + addResourcePrefixHeader( + gaxOptions, + transaction.session.parent.formattedName_ + ) + ); done(); }; transaction.batchUpdate(STRING_STATEMENTS, gaxOptions, assert.ifError); @@ -1198,7 +1217,13 @@ describe('Transaction', () => { it('should accept gaxOptions', done => { const gaxOptions = {}; transaction.request = config => { - assert.strictEqual(config.gaxOpts, gaxOptions); + assert.deepStrictEqual( + config.gaxOpts, + addResourcePrefixHeader( + gaxOptions, + transaction.session.parent.formattedName_ + ) + ); done(); }; transaction.begin(gaxOptions, assert.ifError); @@ -1222,7 +1247,13 @@ describe('Transaction', () => { it('should accept gaxOptions', done => { const gaxOptions = {}; transaction.request = config => { - assert.strictEqual(config.gaxOpts, gaxOptions); + assert.deepStrictEqual( + config.gaxOpts, + addResourcePrefixHeader( + gaxOptions, + transaction.session.parent.formattedName_ + ) + ); done(); }; transaction.commit(gaxOptions, assert.ifError); @@ -1421,7 +1452,13 @@ describe('Transaction', () => { it('should accept gaxOptions', done => { const gaxOptions = {}; transaction.request = config => { - assert.strictEqual(config.gaxOpts, gaxOptions); + assert.deepStrictEqual( + config.gaxOpts, + addResourcePrefixHeader( + gaxOptions, + transaction.session.parent.formattedName_ + ) + ); done(); }; transaction.rollback(gaxOptions, assert.ifError); From 1c3b8495c84d337886c1acbbd2c2bb5a940217e6 Mon Sep 17 00:00:00 2001 From: Alex <7764119+AVaksman@users.noreply.github.com> Date: Thu, 30 Jul 2020 16:29:35 -0400 Subject: [PATCH 02/13] test: typo Co-authored-by: skuruppu --- test/batch-transaction.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/batch-transaction.ts b/test/batch-transaction.ts index 2b13ffd2f..2bc4e5822 100644 --- a/test/batch-transaction.ts +++ b/test/batch-transaction.ts @@ -210,7 +210,7 @@ describe('BatchTransaction', () => { assert.deepStrictEqual(reqOpts.transaction, {id: ID}); }); - it('should add resource prefix to `gaxOpt`', done => { + it('should add resource prefix to `gaxOpts`', done => { batchTransaction.createPartitions_(CONFIG, assert.ifError); const {gaxOpts} = REQUEST.lastCall.args[0]; assert.deepStrictEqual( From 1c920dbc6ff94155e84e7bd5bc682607031581fc Mon Sep 17 00:00:00 2001 From: alex Date: Thu, 30 Jul 2020 16:31:06 -0400 Subject: [PATCH 03/13] chore: clean up --- test/batch-transaction.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/test/batch-transaction.ts b/test/batch-transaction.ts index 2bc4e5822..5fff059e2 100644 --- a/test/batch-transaction.ts +++ b/test/batch-transaction.ts @@ -220,7 +220,6 @@ describe('BatchTransaction', () => { (batchTransaction.session.parent as Database).formattedName_ ) ); - console.log(gaxOpts); done(); }); From a2d23d50662ee4c2efb50b07269e4ec24134295e Mon Sep 17 00:00:00 2001 From: alex Date: Thu, 30 Jul 2020 17:02:33 -0400 Subject: [PATCH 04/13] chore: add projectFormattedName_ to index class --- src/index.ts | 20 +++++++++++--------- test/index.ts | 2 ++ 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/index.ts b/src/index.ts index fe5be96e9..9a07d25cf 100644 --- a/src/index.ts +++ b/src/index.ts @@ -155,6 +155,7 @@ class Spanner extends GrpcService { auth: GoogleAuth; clients_: Map; instances_: Map; + projectFormattedName_: string; /** * Placeholder used to auto populate a column with the commit timestamp. @@ -255,6 +256,7 @@ class Spanner extends GrpcService { this.auth = new GoogleAuth(this.options); this.clients_ = new Map(); this.instances_ = new Map(); + this.projectFormattedName_ = 'projects/' + this.projectId; } createInstance( @@ -369,7 +371,7 @@ class Spanner extends GrpcService { const formattedName = Instance.formatName_(this.projectId, name); const displayName = config.displayName || formattedName.split('/').pop(); const reqOpts = { - parent: 'projects/' + this.projectId, + parent: this.projectFormattedName_, instanceId: formattedName.split('/').pop(), instance: extend( { @@ -507,7 +509,7 @@ class Spanner extends GrpcService { const gaxOpts = addResourcePrefixHeader( options.gaxOptions!, - 'projects/' + this.projectId + this.projectFormattedName_ ); // Copy over pageSize and pageToken values from gaxOptions. @@ -515,7 +517,7 @@ class Spanner extends GrpcService { const reqOpts = extend( {}, { - parent: 'projects/' + this.projectId, + parent: this.projectFormattedName_, pageSize: gaxOpts.pageSize, pageToken: gaxOpts.pageToken, }, @@ -584,7 +586,7 @@ class Spanner extends GrpcService { getInstancesStream(options: GetInstancesOptions = {}): NodeJS.ReadableStream { const gaxOpts = addResourcePrefixHeader( options.gaxOptions!, - 'projects/' + this.projectId + this.projectFormattedName_ ); // Copy over pageSize and pageToken values from gaxOptions. @@ -592,7 +594,7 @@ class Spanner extends GrpcService { const reqOpts = extend( {}, { - parent: 'projects/' + this.projectId, + parent: this.projectFormattedName_, pageSize: gaxOpts.pageSize, pageToken: gaxOpts.pageToken, }, @@ -707,7 +709,7 @@ class Spanner extends GrpcService { const gaxOpts = addResourcePrefixHeader( options.gaxOptions!, - 'projects/' + this.projectId + this.projectFormattedName_ ); // Copy over pageSize and pageToken values from gaxOptions. @@ -715,7 +717,7 @@ class Spanner extends GrpcService { const reqOpts = extend( {}, { - parent: 'projects/' + this.projectId, + parent: this.projectFormattedName_, pageSize: gaxOpts.pageSize, pageToken: gaxOpts.pageToken, }, @@ -774,7 +776,7 @@ class Spanner extends GrpcService { ): NodeJS.ReadableStream { const gaxOpts = addResourcePrefixHeader( options.gaxOptions!, - 'projects/' + this.projectId + this.projectFormattedName_ ); // Copy over pageSize and pageToken values from gaxOptions. @@ -782,7 +784,7 @@ class Spanner extends GrpcService { const reqOpts = extend( {}, { - parent: 'projects/' + this.projectId, + parent: this.projectFormattedName_, pageSize: gaxOpts.pageSize, pageToken: gaxOpts.pageToken, }, diff --git a/test/index.ts b/test/index.ts index 1be6cfa12..711316e5a 100644 --- a/test/index.ts +++ b/test/index.ts @@ -108,8 +108,10 @@ const fakeCodec: any = { class FakeGrpcService { calledWith_: IArguments; + projectId: string; constructor() { this.calledWith_ = arguments; + this.projectId = arguments[1].projectId; } } From 1a56146585a1685338cfe93030e02e370cee10a3 Mon Sep 17 00:00:00 2001 From: alex Date: Thu, 30 Jul 2020 17:20:07 -0400 Subject: [PATCH 05/13] refactor: use projectFormattedName_ --- src/index.ts | 5 ++++- src/instance.ts | 9 ++++++--- test/index.ts | 4 ++-- test/instance.ts | 17 ++++++++++++----- 4 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/index.ts b/src/index.ts index 9a07d25cf..e9f9bf1db 100644 --- a/src/index.ts +++ b/src/index.ts @@ -368,7 +368,10 @@ class Spanner extends GrpcService { ['A configuration object is required to create an instance.'].join('') ); } - const formattedName = Instance.formatName_(this.projectId, name); + const formattedName = Instance.formatName_( + this.projectFormattedName_, + name + ); const displayName = config.displayName || formattedName.split('/').pop(); const reqOpts = { parent: this.projectFormattedName_, diff --git a/src/instance.ts b/src/instance.ts index 3aa9b642b..537fe733c 100644 --- a/src/instance.ts +++ b/src/instance.ts @@ -153,7 +153,10 @@ class Instance extends common.GrpcServiceObject { databases_: Map; metadata?: IInstance; constructor(spanner: Spanner, name: string) { - const formattedName_ = Instance.formatName_(spanner.projectId, name); + const formattedName_ = Instance.formatName_( + spanner.projectFormattedName_, + name + ); const methods = { /** * Create an instance. @@ -1500,12 +1503,12 @@ class Instance extends common.GrpcServiceObject { * Instance.formatName_('grape-spaceship-123', 'my-instance'); * // 'projects/grape-spaceship-123/instances/my-instance' */ - static formatName_(projectId: string, name: string) { + static formatName_(projectName: string, name: string) { if (name.indexOf('/') > -1) { return name; } const instanceName = name.split('/').pop(); - return 'projects/' + projectId + '/instances/' + instanceName; + return projectName + '/instances/' + instanceName; } } diff --git a/test/index.ts b/test/index.ts index 711316e5a..293e87d76 100644 --- a/test/index.ts +++ b/test/index.ts @@ -508,8 +508,8 @@ describe('Spanner', () => { const stub = sandbox.stub(FakeInstance, 'formatName_').returns(PATH); spanner.request = config => { - const [projectId, name] = stub.lastCall.args; - assert.strictEqual(projectId, spanner.projectId); + const [projectName, name] = stub.lastCall.args; + assert.strictEqual(projectName, spanner.projectFormattedName_); assert.strictEqual(name, NAME); assert.deepStrictEqual(CONFIG, ORIGINAL_CONFIG); diff --git a/test/instance.ts b/test/instance.ts index 0c0a2239d..bba8ac515 100644 --- a/test/instance.ts +++ b/test/instance.ts @@ -78,6 +78,7 @@ describe('Instance', () => { requestStream: () => {}, projectId: 'project-id', instances_: new Map(), + projectFormattedName_: 'projects/project-id', } as {}) as Spanner; const NAME = 'instance-name'; @@ -110,10 +111,10 @@ describe('Instance', () => { const formatName_ = Instance.formatName_; const formattedName = 'formatted-name'; - Instance.formatName_ = (projectId, name) => { + Instance.formatName_ = (projectName, name) => { Instance.formatName_ = formatName_; - assert.strictEqual(projectId, SPANNER.projectId); + assert.strictEqual(projectName, SPANNER.projectFormattedName_); assert.strictEqual(name, NAME); return formattedName; @@ -174,14 +175,20 @@ describe('Instance', () => { }); describe('formatName_', () => { - const PATH = 'projects/' + SPANNER.projectId + '/instances/' + NAME; + const PATH = SPANNER.projectFormattedName_ + '/instances/' + NAME; it('should return the name if already formatted', () => { - assert.strictEqual(Instance.formatName_(SPANNER.projectId, PATH), PATH); + assert.strictEqual( + Instance.formatName_(SPANNER.projectFormattedName_, PATH), + PATH + ); }); it('should format the name', () => { - const formattedName = Instance.formatName_(SPANNER.projectId, NAME); + const formattedName = Instance.formatName_( + SPANNER.projectFormattedName_, + NAME + ); assert.strictEqual(formattedName, PATH); }); }); From a834cb5d9603413e4b51514c3ec43bd7fe6830b4 Mon Sep 17 00:00:00 2001 From: alex Date: Tue, 4 Aug 2020 15:54:50 -0400 Subject: [PATCH 06/13] refactor: refactor --- src/backup.ts | 33 ++++---- src/batch-transaction.ts | 9 +-- src/common.ts | 4 +- src/database.ts | 60 ++++++-------- src/index.ts | 35 ++++----- src/instance.ts | 68 +++++++--------- src/session.ts | 25 +++--- src/transaction.ts | 46 +++++------ test/backup.ts | 28 +++---- test/batch-transaction.ts | 17 ++-- test/database.ts | 101 ++++++++---------------- test/index.ts | 116 ++++++++++----------------- test/instance.ts | 161 ++++++++++++-------------------------- test/session.ts | 39 ++++----- test/transaction.ts | 84 ++++++++------------ 15 files changed, 315 insertions(+), 511 deletions(-) diff --git a/src/backup.ts b/src/backup.ts index 308b0d611..1b1715288 100644 --- a/src/backup.ts +++ b/src/backup.ts @@ -21,7 +21,7 @@ import { RequestCallback, ResourceCallback, NormalCallback, - addResourcePrefixHeader, + CLOUD_RESOURCE_HEADER, } from './common'; import {EnumKey, Spanner, RequestConfig, TranslateEnumKeys} from '.'; import { @@ -101,12 +101,16 @@ class Backup { id: string; formattedName_: string; instanceFormattedName_: string; + resourceHeader_: {[k: string]: string}; request: BackupRequest; constructor(instance: Instance, name: string) { this.request = instance.request; this.instanceFormattedName_ = instance.formattedName_; this.formattedName_ = Backup.formatName_(instance.formattedName_, name); this.id = this.formattedName_.split('/').pop() || ''; + this.resourceHeader_ = { + [CLOUD_RESOURCE_HEADER]: this.instanceFormattedName_, + }; } create(options: CreateBackupOptions): Promise; @@ -165,10 +169,7 @@ class Backup { options: CreateBackupOptions, callback?: CreateBackupCallback ): Promise | void { - const gaxOpts = addResourcePrefixHeader( - options.gaxOptions!, - this.instanceFormattedName_ - ); + const gaxOpts = options.gaxOptions; const reqOpts: databaseAdmin.spanner.admin.database.v1.ICreateBackupRequest = { parent: this.instanceFormattedName_, backupId: this.id, @@ -184,6 +185,7 @@ class Backup { method: 'createBackup', reqOpts, gaxOpts, + headers: this.resourceHeader_, }, (err, operation, resp) => { if (err) { @@ -237,12 +239,10 @@ class Backup { typeof gaxOptionsOrCallback === 'function' ? (gaxOptionsOrCallback as GetMetadataCallback) : cb; - const gaxOpts = addResourcePrefixHeader( + const gaxOpts = typeof gaxOptionsOrCallback === 'object' ? (gaxOptionsOrCallback as CallOptions) - : {}, - this.instanceFormattedName_ - ); + : {}; const reqOpts: databaseAdmin.spanner.admin.database.v1.IGetBackupRequest = { name: this.formattedName_, }; @@ -252,6 +252,7 @@ class Backup { method: 'getBackup', reqOpts, gaxOpts, + headers: this.resourceHeader_, }, (err, response) => { callback!(err, response); @@ -407,12 +408,10 @@ class Backup { typeof gaxOptionsOrCallback === 'function' ? (gaxOptionsOrCallback as UpdateExpireTimeCallback) : cb; - const gaxOpts = addResourcePrefixHeader( + const gaxOpts = typeof gaxOptionsOrCallback === 'object' ? (gaxOptionsOrCallback as CallOptions) - : {}, - this.instanceFormattedName_ - ); + : {}; const reqOpts: databaseAdmin.spanner.admin.database.v1.IUpdateBackupRequest = { backup: { name: this.formattedName_, @@ -428,6 +427,7 @@ class Backup { method: 'updateBackup', reqOpts, gaxOpts, + headers: this.resourceHeader_, }, (err, response) => { callback!(err, response); @@ -462,12 +462,10 @@ class Backup { typeof gaxOptionsOrCallback === 'function' ? (gaxOptionsOrCallback as DeleteCallback) : cb; - const gaxOpts = addResourcePrefixHeader( + const gaxOpts = typeof gaxOptionsOrCallback === 'object' ? (gaxOptionsOrCallback as CallOptions) - : {}, - this.instanceFormattedName_ - ); + : {}; const reqOpts: databaseAdmin.spanner.admin.database.v1.IDeleteBackupRequest = { name: this.formattedName_, }; @@ -477,6 +475,7 @@ class Backup { method: 'deleteBackup', reqOpts, gaxOpts, + headers: this.resourceHeader_, }, err => { callback!(err); diff --git a/src/batch-transaction.ts b/src/batch-transaction.ts index aa88c69fa..5fdccda25 100644 --- a/src/batch-transaction.ts +++ b/src/batch-transaction.ts @@ -21,7 +21,7 @@ import * as is from 'is'; import {Snapshot} from './transaction'; import {google} from '../protos/protos'; import {Session, Database} from '.'; -import {addResourcePrefixHeader} from '../src/common'; +import {CLOUD_RESOURCE_HEADER} from '../src/common'; export interface TransactionIdentifier { session: string | Session; @@ -153,10 +153,9 @@ class BatchTransaction extends Snapshot { transaction: {id: this.id}, }); config.reqOpts = extend({}, query); - config.gaxOpts = addResourcePrefixHeader( - config.gaxOpts, - (this.session.parent as Database).formattedName_ - ); + config.headers = { + [CLOUD_RESOURCE_HEADER]: (this.session.parent as Database).formattedName_, + }; delete query.partitionOptions; this.session.request(config, (err, resp) => { if (err) { diff --git a/src/common.ts b/src/common.ts index e90960b47..d205aad9a 100644 --- a/src/common.ts +++ b/src/common.ts @@ -83,11 +83,11 @@ export const CLOUD_RESOURCE_HEADER = 'google-cloud-resource-prefix'; */ export function addResourcePrefixHeader( gaxOpts: CallOptions, - headerValue: string + headers: {[k: string]: string} ): CallOptions { return extend(true, {}, gaxOpts, { otherArgs: { - headers: {[CLOUD_RESOURCE_HEADER]: headerValue}, + headers, }, }); } diff --git a/src/database.ts b/src/database.ts index fb121d2ac..71592399f 100644 --- a/src/database.ts +++ b/src/database.ts @@ -76,7 +76,7 @@ import { NormalCallback, LongRunningCallback, PagedOptionsWithFilter, - addResourcePrefixHeader, + CLOUD_RESOURCE_HEADER, } from './common'; import {Readable, Transform, Duplex} from 'stream'; import {PreciseDate} from '@google-cloud/precise-date'; @@ -244,6 +244,7 @@ class Database extends GrpcServiceObject { formattedName_: string; pool_: SessionPoolInterface; queryOptions_?: spannerClient.spanner.v1.ExecuteSqlRequest.IQueryOptions; + resourceHeader_: {[k: string]: string}; request: DatabaseRequest; constructor( instance: Instance, @@ -316,6 +317,9 @@ class Database extends GrpcServiceObject { : new SessionPool(this, poolOptions); this.formattedName_ = formattedName_; this.instance = instance; + this.resourceHeader_ = { + [CLOUD_RESOURCE_HEADER]: this.formattedName_, + }; this.request = instance.request; // eslint-disable-next-line @typescript-eslint/no-explicit-any this.requestStream = instance.requestStream as any; @@ -419,10 +423,8 @@ class Database extends GrpcServiceObject { client: 'SpannerClient', method: 'batchCreateSessions', reqOpts, - gaxOpts: addResourcePrefixHeader( - options.gaxOptions!, - this.formattedName_ - ), + gaxOpts: options.gaxOptions, + headers: this.resourceHeader_, }, (err, resp) => { if (err) { @@ -676,10 +678,8 @@ class Database extends GrpcServiceObject { client: 'SpannerClient', method: 'createSession', reqOpts, - gaxOpts: addResourcePrefixHeader( - options.gaxOptions!, - this.formattedName_ - ), + gaxOpts: options.gaxOptions, + headers: this.resourceHeader_, }, (err, resp) => { if (err) { @@ -856,7 +856,7 @@ class Database extends GrpcServiceObject { client: 'DatabaseAdminClient', method: 'dropDatabase', reqOpts, - gaxOpts: addResourcePrefixHeader({}, this.formattedName_), + headers: this.resourceHeader_, }, callback! ); @@ -1059,12 +1059,10 @@ class Database extends GrpcServiceObject { typeof gaxOptionsOrCallback === 'function' ? (gaxOptionsOrCallback as GetMetadataCallback) : cb; - const gaxOpts = addResourcePrefixHeader( + const gaxOpts = typeof gaxOptionsOrCallback === 'object' ? (gaxOptionsOrCallback as CallOptions) - : {}, - this.formattedName_ - ); + : {}; const reqOpts: databaseAdmin.spanner.admin.database.v1.IGetDatabaseRequest = { name: this.formattedName_, @@ -1075,6 +1073,7 @@ class Database extends GrpcServiceObject { method: 'getDatabase', reqOpts, gaxOpts, + headers: this.resourceHeader_, }, callback! ); @@ -1195,10 +1194,8 @@ class Database extends GrpcServiceObject { optionsOrCallback?: CallOptions | GetSchemaCallback, cb?: GetSchemaCallback ): void | Promise { - const gaxOpts = addResourcePrefixHeader( - typeof optionsOrCallback === 'object' ? optionsOrCallback : {}, - this.formattedName_ - ); + const gaxOpts = + typeof optionsOrCallback === 'object' ? optionsOrCallback : {}; const callback = typeof optionsOrCallback === 'function' ? optionsOrCallback : cb!; @@ -1213,6 +1210,7 @@ class Database extends GrpcServiceObject { method: 'getDatabaseDdl', reqOpts, gaxOpts, + headers: this.resourceHeader_, }, // eslint-disable-next-line @typescript-eslint/no-explicit-any (err, statements, ...args: any[]) => { @@ -1317,10 +1315,7 @@ class Database extends GrpcServiceObject { typeof optionsOrCallback === 'object' ? optionsOrCallback : ({} as GetSessionsOptions); - const gaxOpts = addResourcePrefixHeader( - options.gaxOptions!, - this.formattedName_ - ); + const gaxOpts = extend(true, {}, options.gaxOptions); // Copy over pageSize and pageToken values from gaxOptions. // However values set on options take precedence. @@ -1347,6 +1342,7 @@ class Database extends GrpcServiceObject { method: 'listSessions', reqOpts, gaxOpts, + headers: this.resourceHeader_, }, (err, sessions, ...args) => { let sessionInstances: Session[] | null = null; @@ -1401,10 +1397,7 @@ class Database extends GrpcServiceObject { * }); */ getSessionsStream(options: GetSessionsOptions = {}): NodeJS.ReadableStream { - const gaxOpts = addResourcePrefixHeader( - options.gaxOptions!, - this.formattedName_ - ); + const gaxOpts = extend(true, {}, options.gaxOptions); // Copy over pageSize and pageToken values from gaxOptions. // However values set on options take precedence. @@ -1427,6 +1420,7 @@ class Database extends GrpcServiceObject { method: 'listSessionsStream', reqOpts, gaxOpts, + headers: this.resourceHeader_, }); } @@ -1786,12 +1780,10 @@ class Database extends GrpcServiceObject { typeof optionsOrCallback === 'function' ? (optionsOrCallback as RestoreDatabaseCallback) : cb; - const gaxOpts = addResourcePrefixHeader( + const gaxOpts = typeof optionsOrCallback === 'object' ? (optionsOrCallback as CallOptions) - : {}, - this.instance.formattedName_ - ); + : {}; const reqOpts: databaseAdmin.spanner.admin.database.v1.IRestoreDatabaseRequest = { parent: this.instance.formattedName_, databaseId: this.id, @@ -1803,6 +1795,7 @@ class Database extends GrpcServiceObject { method: 'restoreDatabase', reqOpts, gaxOpts, + headers: this.resourceHeader_, }, (err, operation, resp) => { if (err) { @@ -2575,10 +2568,8 @@ class Database extends GrpcServiceObject { optionsOrCallback?: CallOptions | UpdateSchemaCallback, cb?: UpdateSchemaCallback ): Promise | void { - const gaxOpts = addResourcePrefixHeader( - typeof optionsOrCallback === 'object' ? optionsOrCallback : {}, - this.formattedName_ - ); + const gaxOpts = + typeof optionsOrCallback === 'object' ? optionsOrCallback : {}; const callback = typeof optionsOrCallback === 'function' ? optionsOrCallback : cb!; @@ -2599,6 +2590,7 @@ class Database extends GrpcServiceObject { method: 'updateDatabaseDdl', reqOpts, gaxOpts, + headers: this.resourceHeader_, }, callback! ); diff --git a/src/index.ts b/src/index.ts index e9f9bf1db..0a4a0b2b6 100644 --- a/src/index.ts +++ b/src/index.ts @@ -40,6 +40,7 @@ import { PagedCallback, PagedOptionsWithFilter, addResourcePrefixHeader, + CLOUD_RESOURCE_HEADER, } from './common'; import {Session} from './session'; import {SessionPool} from './session-pool'; @@ -87,6 +88,7 @@ export interface RequestConfig { // eslint-disable-next-line @typescript-eslint/no-explicit-any reqOpts: any; gaxOpts?: CallOptions; + headers: {[k: string]: string}; } export interface CreateInstanceRequest { config?: string; @@ -156,6 +158,7 @@ class Spanner extends GrpcService { clients_: Map; instances_: Map; projectFormattedName_: string; + resourceHeader_: {[k: string]: string}; /** * Placeholder used to auto populate a column with the commit timestamp. @@ -257,6 +260,9 @@ class Spanner extends GrpcService { this.clients_ = new Map(); this.instances_ = new Map(); this.projectFormattedName_ = 'projects/' + this.projectId; + this.resourceHeader_ = { + [CLOUD_RESOURCE_HEADER]: this.projectFormattedName_, + }; } createInstance( @@ -397,7 +403,8 @@ class Spanner extends GrpcService { client: 'InstanceAdminClient', method: 'createInstance', reqOpts, - gaxOpts: addResourcePrefixHeader(config.gaxOptions!, reqOpts.parent), + gaxOpts: config.gaxOptions, + headers: this.resourceHeader_, }, (err, operation, resp) => { if (err) { @@ -510,10 +517,7 @@ class Spanner extends GrpcService { const callback = typeof optionsOrCallback === 'function' ? optionsOrCallback : cb!; - const gaxOpts = addResourcePrefixHeader( - options.gaxOptions!, - this.projectFormattedName_ - ); + const gaxOpts = extend(true, {}, options.gaxOptions); // Copy over pageSize and pageToken values from gaxOptions. // However values set on options take precedence. @@ -536,6 +540,7 @@ class Spanner extends GrpcService { method: 'listInstances', reqOpts, gaxOpts, + headers: this.resourceHeader_, }, (err, instances, ...args) => { let instanceInstances: Instance[] | null = null; @@ -587,10 +592,7 @@ class Spanner extends GrpcService { * }); */ getInstancesStream(options: GetInstancesOptions = {}): NodeJS.ReadableStream { - const gaxOpts = addResourcePrefixHeader( - options.gaxOptions!, - this.projectFormattedName_ - ); + const gaxOpts = extend(true, {}, options.gaxOptions); // Copy over pageSize and pageToken values from gaxOptions. // However values set on options take precedence. @@ -612,6 +614,7 @@ class Spanner extends GrpcService { method: 'listInstancesStream', reqOpts, gaxOpts, + headers: this.resourceHeader_, }); } @@ -710,10 +713,7 @@ class Spanner extends GrpcService { ? optionsOrCallback : ({} as GetInstanceConfigsOptions); - const gaxOpts = addResourcePrefixHeader( - options.gaxOptions!, - this.projectFormattedName_ - ); + const gaxOpts = extend(true, {}, options.gaxOptions); // Copy over pageSize and pageToken values from gaxOptions. // However values set on options take precedence. @@ -736,6 +736,7 @@ class Spanner extends GrpcService { method: 'listInstanceConfigs', reqOpts, gaxOpts, + headers: this.resourceHeader_, }, callback ); @@ -777,10 +778,7 @@ class Spanner extends GrpcService { getInstanceConfigsStream( options: GetInstanceConfigsOptions = {} ): NodeJS.ReadableStream { - const gaxOpts = addResourcePrefixHeader( - options.gaxOptions!, - this.projectFormattedName_ - ); + const gaxOpts = extend(true, {}, options.gaxOptions); // Copy over pageSize and pageToken values from gaxOptions. // However values set on options take precedence. @@ -803,6 +801,7 @@ class Spanner extends GrpcService { method: 'listInstanceConfigsStream', reqOpts, gaxOpts, + headers: this.resourceHeader_, }); } @@ -855,7 +854,7 @@ class Spanner extends GrpcService { const requestFn = gaxClient[config.method].bind( gaxClient, reqOpts, - config.gaxOpts + addResourcePrefixHeader(config.gaxOpts, config.headers) ); callback(null, requestFn); }); diff --git a/src/instance.ts b/src/instance.ts index 537fe733c..e9a3bd772 100644 --- a/src/instance.ts +++ b/src/instance.ts @@ -31,7 +31,7 @@ import { NormalCallback, ResourceCallback, PagedOptionsWithFilter, - addResourcePrefixHeader, + CLOUD_RESOURCE_HEADER, } from './common'; import {Duplex} from 'stream'; import {SessionPoolOptions, SessionPool} from './session-pool'; @@ -152,6 +152,7 @@ class Instance extends common.GrpcServiceObject { requestStream: (config: RequestConfig) => Duplex; databases_: Map; metadata?: IInstance; + resourceHeader_: {[k: string]: string}; constructor(spanner: Spanner, name: string) { const formattedName_ = Instance.formatName_( spanner.projectFormattedName_, @@ -225,6 +226,9 @@ class Instance extends common.GrpcServiceObject { this.request = spanner.request.bind(spanner); this.requestStream = spanner.requestStream.bind(spanner); this.databases_ = new Map(); + this.resourceHeader_ = { + [CLOUD_RESOURCE_HEADER]: this.formattedName_, + }; } /** @@ -324,10 +328,7 @@ class Instance extends common.GrpcServiceObject { typeof optionsOrCallback === 'object' ? optionsOrCallback : ({} as GetBackupsOptions); - const gaxOpts = addResourcePrefixHeader( - options.gaxOptions!, - this.formattedName_ - ); + const gaxOpts = extend(true, {}, options.gaxOptions); // Copy over pageSize and pageToken values from gaxOptions. // However values set on options take precedence. @@ -353,6 +354,7 @@ class Instance extends common.GrpcServiceObject { method: 'listBackups', reqOpts, gaxOpts, + headers: this.resourceHeader_, }, (err, backups, ...args) => { let backupInstances: Backup[] | null = null; @@ -405,10 +407,7 @@ class Instance extends common.GrpcServiceObject { * }); */ getBackupsStream(options: GetBackupsOptions = {}): NodeJS.ReadableStream { - const gaxOpts = addResourcePrefixHeader( - options.gaxOptions!, - this.formattedName_ - ); + const gaxOpts = extend(true, {}, options.gaxOptions); // Copy over pageSize and pageToken values from gaxOptions. // However values set on options take precedence. @@ -430,6 +429,7 @@ class Instance extends common.GrpcServiceObject { method: 'listBackupsStream', reqOpts, gaxOpts, + headers: this.resourceHeader_, }); } @@ -515,10 +515,7 @@ class Instance extends common.GrpcServiceObject { typeof optionsOrCallback === 'object' ? optionsOrCallback : ({} as GetBackupOperationsOptions); - const gaxOpts = addResourcePrefixHeader( - options.gaxOptions!, - this.formattedName_ - ); + const gaxOpts = extend(true, {}, options.gaxOptions); // Copy over pageSize and pageToken values from gaxOptions. // However values set on options take precedence. @@ -544,6 +541,7 @@ class Instance extends common.GrpcServiceObject { method: 'listBackupOperations', reqOpts, gaxOpts, + headers: this.resourceHeader_, }, callback ); @@ -632,10 +630,7 @@ class Instance extends common.GrpcServiceObject { typeof optionsOrCallback === 'object' ? optionsOrCallback : ({} as GetDatabaseOperationsOptions); - const gaxOpts = addResourcePrefixHeader( - options.gaxOptions!, - this.formattedName_ - ); + const gaxOpts = extend(true, {}, options.gaxOptions); // Copy over pageSize and pageToken values from gaxOptions. // However values set on options take precedence. @@ -661,6 +656,7 @@ class Instance extends common.GrpcServiceObject { method: 'listDatabaseOperations', reqOpts, gaxOpts, + headers: this.resourceHeader_, }, callback ); @@ -798,10 +794,8 @@ class Instance extends common.GrpcServiceObject { client: 'DatabaseAdminClient', method: 'createDatabase', reqOpts, - gaxOpts: addResourcePrefixHeader( - options.gaxOptions!, - this.formattedName_ - ), + gaxOpts: options.gaxOptions, + headers: this.resourceHeader_, }, (err, operation, resp) => { if (err) { @@ -913,10 +907,8 @@ class Instance extends common.GrpcServiceObject { optionsOrCallback?: CallOptions | DeleteInstanceCallback, cb?: DeleteInstanceCallback ): void | Promise { - const gaxOpts = addResourcePrefixHeader( - typeof optionsOrCallback === 'object' ? optionsOrCallback : {}, - this.formattedName_ - ); + const gaxOpts = + typeof optionsOrCallback === 'object' ? optionsOrCallback : {}; const callback = typeof optionsOrCallback === 'function' ? optionsOrCallback : cb!; @@ -937,6 +929,7 @@ class Instance extends common.GrpcServiceObject { method: 'deleteInstance', reqOpts, gaxOpts, + headers: this.resourceHeader_, }, (err, resp) => { if (!err) { @@ -1194,10 +1187,7 @@ class Instance extends common.GrpcServiceObject { ? optionsOrCallback : ({} as GetDatabasesOptions); - const gaxOpts = addResourcePrefixHeader( - options.gaxOptions!, - this.formattedName_ - ); + const gaxOpts = extend(true, {}, options.gaxOptions); // Copy over pageSize and pageToken values from gaxOptions. // However values set on options take precedence. const reqOpts = extend( @@ -1222,6 +1212,7 @@ class Instance extends common.GrpcServiceObject { method: 'listDatabases', reqOpts, gaxOpts, + headers: this.resourceHeader_, }, (err, rowDatabases, ...args) => { let databases: Database[] | null = null; @@ -1275,10 +1266,7 @@ class Instance extends common.GrpcServiceObject { * }); */ getDatabasesStream(options: GetDatabasesOptions = {}): NodeJS.ReadableStream { - const gaxOpts = addResourcePrefixHeader( - options.gaxOptions!, - this.formattedName_ - ); + const gaxOpts = extend(true, {}, options.gaxOptions); // Copy over pageSize and pageToken values from gaxOptions. // However values set on options take precedence. @@ -1300,6 +1288,7 @@ class Instance extends common.GrpcServiceObject { method: 'listDatabasesStream', reqOpts, gaxOpts, + headers: this.resourceHeader_, }); } @@ -1393,10 +1382,8 @@ class Instance extends common.GrpcServiceObject { client: 'InstanceAdminClient', method: 'getInstance', reqOpts, - gaxOpts: addResourcePrefixHeader( - options.gaxOptions!, - this.formattedName_ - ), + gaxOpts: options.gaxOptions, + headers: this.resourceHeader_, }, callback! ); @@ -1462,10 +1449,8 @@ class Instance extends common.GrpcServiceObject { optionsOrCallback?: CallOptions | SetInstanceMetadataCallback, cb?: SetInstanceMetadataCallback ): void | Promise { - const gaxOpts = addResourcePrefixHeader( - typeof optionsOrCallback === 'object' ? optionsOrCallback : {}, - this.formattedName_ - ); + const gaxOpts = + typeof optionsOrCallback === 'object' ? optionsOrCallback : {}; const callback = typeof optionsOrCallback === 'function' ? optionsOrCallback : cb!; @@ -1486,6 +1471,7 @@ class Instance extends common.GrpcServiceObject { method: 'updateInstance', reqOpts, gaxOpts, + headers: this.resourceHeader_, }, callback! ); diff --git a/src/session.ts b/src/session.ts index 24527cdee..b5ce4e995 100644 --- a/src/session.ts +++ b/src/session.ts @@ -35,7 +35,7 @@ import { CreateSessionOptions, } from './database'; import {ServiceObjectConfig, DeleteCallback} from '@google-cloud/common'; -import {NormalCallback, addResourcePrefixHeader} from './common'; +import {NormalCallback, CLOUD_RESOURCE_HEADER} from './common'; import {grpc, CallOptions} from 'google-gax'; export type GetSessionResponse = [Session, r.Response]; @@ -101,6 +101,7 @@ export class Session extends GrpcServiceObject { txn?: Transaction; lastUsed?: number; lastError?: grpc.ServiceError; + resourceHeader_: {[k: string]: string}; constructor(database: Database, name?: string) { const methods = { /** @@ -231,6 +232,9 @@ export class Session extends GrpcServiceObject { }, } as {}) as ServiceObjectConfig); + this.resourceHeader_ = { + [CLOUD_RESOURCE_HEADER]: (this.parent as Database).formattedName_, + }; this.request = database.request; this.requestStream = database.requestStream; @@ -276,10 +280,7 @@ export class Session extends GrpcServiceObject { client: 'SpannerClient', method: 'deleteSession', reqOpts, - gaxOpts: addResourcePrefixHeader( - {}, - (this.parent as Database).formattedName_ - ), + headers: this.resourceHeader_, }, callback! ); @@ -329,10 +330,8 @@ export class Session extends GrpcServiceObject { optionsOrCallback?: CallOptions | GetSessionMetadataCallback, cb?: GetSessionMetadataCallback ): void | Promise { - const gaxOpts = addResourcePrefixHeader( - typeof optionsOrCallback === 'object' ? optionsOrCallback : {}, - (this.parent as Database).formattedName_ - ); + const gaxOpts = + typeof optionsOrCallback === 'object' ? optionsOrCallback : {}; const callback = typeof optionsOrCallback === 'function' ? optionsOrCallback : cb!; @@ -345,6 +344,7 @@ export class Session extends GrpcServiceObject { method: 'getSession', reqOpts, gaxOpts, + headers: this.resourceHeader_, }, callback! ); @@ -371,10 +371,8 @@ export class Session extends GrpcServiceObject { optionsOrCallback?: CallOptions | KeepAliveCallback, cb?: KeepAliveCallback ): void | Promise { - const gaxOpts = addResourcePrefixHeader( - typeof optionsOrCallback === 'object' ? optionsOrCallback : {}, - (this.parent as Database).formattedName_ - ); + const gaxOpts = + typeof optionsOrCallback === 'object' ? optionsOrCallback : {}; const callback = typeof optionsOrCallback === 'function' ? optionsOrCallback : cb!; @@ -388,6 +386,7 @@ export class Session extends GrpcServiceObject { method: 'executeSql', reqOpts, gaxOpts, + headers: this.resourceHeader_, }, callback! ); diff --git a/src/transaction.ts b/src/transaction.ts index dd2debc7a..b8b3e545a 100644 --- a/src/transaction.ts +++ b/src/transaction.ts @@ -33,7 +33,7 @@ import { import {Session} from './session'; import {Key} from './table'; import {google as spannerClient} from '../protos/protos'; -import {NormalCallback, addResourcePrefixHeader} from './common'; +import {NormalCallback, CLOUD_RESOURCE_HEADER} from './common'; import {google} from '../protos/protos'; import IAny = google.protobuf.IAny; import IQueryOptions = google.spanner.v1.ExecuteSqlRequest.IQueryOptions; @@ -203,6 +203,7 @@ export class Snapshot extends EventEmitter { requestStream: (config: {}) => Readable; session: Session; queryOptions?: IQueryOptions; + resourceHeader_: {[k: string]: string}; /** * The transaction ID. @@ -262,6 +263,9 @@ export class Snapshot extends EventEmitter { const readOnly = Snapshot.encodeTimestampBounds(options || {}); this._options = {readOnly}; + this.resourceHeader_ = { + [CLOUD_RESOURCE_HEADER]: (this.session.parent as Database).formattedName_, + }; } begin(gaxOptions?: CallOptions): Promise; @@ -311,10 +315,8 @@ export class Snapshot extends EventEmitter { gaxOptionsOrCallback?: CallOptions | BeginTransactionCallback, cb?: BeginTransactionCallback ): void | Promise { - const gaxOpts = addResourcePrefixHeader( - typeof gaxOptionsOrCallback === 'object' ? gaxOptionsOrCallback : {}, - (this.session.parent as Database).formattedName_ - ); + const gaxOpts = + typeof gaxOptionsOrCallback === 'object' ? gaxOptionsOrCallback : {}; const callback = typeof gaxOptionsOrCallback === 'function' ? gaxOptionsOrCallback : cb!; @@ -331,6 +333,7 @@ export class Snapshot extends EventEmitter { method: 'beginTransaction', reqOpts, gaxOpts, + headers: this.resourceHeader_, }, ( err: null | grpc.ServiceError, @@ -531,10 +534,8 @@ export class Snapshot extends EventEmitter { client: 'SpannerClient', method: 'streamingRead', reqOpts: Object.assign({}, reqOpts, {resumeToken}), - gaxOpts: addResourcePrefixHeader( - gaxOptions!, - (this.session.parent as Database).formattedName_ - ), + gaxOpts: gaxOptions, + headers: this.resourceHeader_, }); }; @@ -932,10 +933,8 @@ export class Snapshot extends EventEmitter { client: 'SpannerClient', method: 'executeStreamingSql', reqOpts: Object.assign({}, reqOpts, {resumeToken}), - gaxOpts: addResourcePrefixHeader( - gaxOptions!, - (this.session.parent as Database).formattedName_ - ), + gaxOpts: gaxOptions, + headers: this.resourceHeader_, }); }; @@ -1317,10 +1316,8 @@ export class Transaction extends Dml { gaxOptionsOrCallback?: CallOptions | BatchUpdateCallback, cb?: BatchUpdateCallback ): Promise | void { - const gaxOpts = addResourcePrefixHeader( - typeof gaxOptionsOrCallback === 'object' ? gaxOptionsOrCallback : {}, - (this.session.parent as Database).formattedName_ - ); + const gaxOpts = + typeof gaxOptionsOrCallback === 'object' ? gaxOptionsOrCallback : {}; const callback = typeof gaxOptionsOrCallback === 'function' ? gaxOptionsOrCallback : cb!; @@ -1359,6 +1356,7 @@ export class Transaction extends Dml { method: 'executeBatchDml', reqOpts, gaxOpts, + headers: this.resourceHeader_, }, ( err: null | grpc.ServiceError, @@ -1470,10 +1468,8 @@ export class Transaction extends Dml { gaxOptionsOrCallback?: CallOptions | CommitCallback, cb?: CommitCallback ): void | Promise { - const gaxOpts = addResourcePrefixHeader( - typeof gaxOptionsOrCallback === 'object' ? gaxOptionsOrCallback : {}, - (this.session.parent as Database).formattedName_ - ); + const gaxOpts = + typeof gaxOptionsOrCallback === 'object' ? gaxOptionsOrCallback : {}; const callback = typeof gaxOptionsOrCallback === 'function' ? gaxOptionsOrCallback : cb!; @@ -1493,6 +1489,7 @@ export class Transaction extends Dml { method: 'commit', reqOpts, gaxOpts, + headers: this.resourceHeader_, }, (err: null | Error, resp: spannerClient.spanner.v1.ICommitResponse) => { this.end(); @@ -1701,10 +1698,8 @@ export class Transaction extends Dml { | spannerClient.spanner.v1.Spanner.RollbackCallback, cb?: spannerClient.spanner.v1.Spanner.RollbackCallback ): void | Promise { - const gaxOpts = addResourcePrefixHeader( - typeof gaxOptionsOrCallback === 'object' ? gaxOptionsOrCallback : {}, - (this.session.parent as Database).formattedName_ - ); + const gaxOpts = + typeof gaxOptionsOrCallback === 'object' ? gaxOptionsOrCallback : {}; const callback = typeof gaxOptionsOrCallback === 'function' ? gaxOptionsOrCallback : cb!; @@ -1730,6 +1725,7 @@ export class Transaction extends Dml { method: 'rollback', reqOpts, gaxOpts, + headers: this.resourceHeader_, }, (err: null | ServiceError) => { this.end(); diff --git a/test/backup.ts b/test/backup.ts index ce3d5d096..2c612e569 100644 --- a/test/backup.ts +++ b/test/backup.ts @@ -27,7 +27,7 @@ import {Instance, Spanner} from '../src'; import * as bu from '../src/backup'; import {GetMetadataResponse} from '../src/backup'; import {grpc} from 'google-gax'; -import {addResourcePrefixHeader} from '../src/common'; +import {CLOUD_RESOURCE_HEADER} from '../src/common'; let promisified = false; // let callbackified = false; @@ -68,6 +68,7 @@ describe('Backup', () => { // tslint:disable-next-line variable-name let Backup: typeof bu.Backup; + let resourceHeader: {[k: string]: string}; const INSTANCE = ({ request: util.noop, @@ -99,6 +100,7 @@ describe('Backup', () => { beforeEach(() => { fakeCodec.encode = util.noop; backup = new Backup(INSTANCE, BACKUP_NAME); + resourceHeader = {[CLOUD_RESOURCE_HEADER]: backup.instanceFormattedName_}; }); afterEach(() => sandbox.restore()); @@ -165,6 +167,7 @@ describe('Backup', () => { assert.notStrictEqual(config.reqOpts, QUERY); assert.deepStrictEqual(QUERY, ORIGINAL_QUERY); + assert.deepStrictEqual(config.headers, resourceHeader); done(); }; @@ -183,10 +186,7 @@ describe('Backup', () => { }; backup.request = config => { - assert.deepStrictEqual( - config.gaxOpts, - addResourcePrefixHeader(gaxOptions, backup.instanceFormattedName_) - ); + assert.deepStrictEqual(config.gaxOpts, gaxOptions); done(); }; @@ -300,6 +300,7 @@ describe('Backup', () => { assert.notStrictEqual(config.reqOpts, QUERY); assert.deepStrictEqual(QUERY, ORIGINAL_QUERY); + assert.deepStrictEqual(config.headers, resourceHeader); done(); }; @@ -312,10 +313,7 @@ describe('Backup', () => { }; backup.request = config => { - assert.deepStrictEqual( - config.gaxOpts, - addResourcePrefixHeader(gaxOptions, backup.instanceFormattedName_) - ); + assert.deepStrictEqual(config.gaxOpts, gaxOptions); done(); }; @@ -558,6 +556,7 @@ describe('Backup', () => { assert.notStrictEqual(config.reqOpts, QUERY); assert.deepStrictEqual(QUERY, ORIGINAL_QUERY); + assert.deepStrictEqual(config.headers, resourceHeader); done(); }; @@ -570,10 +569,7 @@ describe('Backup', () => { }; backup.request = config => { - assert.deepStrictEqual( - config.gaxOpts, - addResourcePrefixHeader(gaxOpts, backup.instanceFormattedName_) - ); + assert.deepStrictEqual(config.gaxOpts, gaxOpts); done(); }; @@ -614,6 +610,7 @@ describe('Backup', () => { assert.notStrictEqual(config.reqOpts, QUERY); assert.deepStrictEqual(QUERY, ORIGINAL_QUERY); + assert.deepStrictEqual(config.headers, resourceHeader); done(); }; @@ -626,10 +623,7 @@ describe('Backup', () => { }; backup.request = config => { - assert.deepStrictEqual( - config.gaxOpts, - addResourcePrefixHeader(gaxOpts, backup.instanceFormattedName_) - ); + assert.deepStrictEqual(config.gaxOpts, gaxOpts); done(); }; diff --git a/test/batch-transaction.ts b/test/batch-transaction.ts index 5fff059e2..329cd5eed 100644 --- a/test/batch-transaction.ts +++ b/test/batch-transaction.ts @@ -27,7 +27,7 @@ import * as sinon from 'sinon'; import {Session, Database} from '../src'; import * as bt from '../src/batch-transaction'; import {PartialResultStream} from '../src/partial-result-stream'; -import {addResourcePrefixHeader} from '../src/common'; +import {CLOUD_RESOURCE_HEADER} from '../src/common'; let promisified = false; const fakePfy = extend({}, pfy, { @@ -210,16 +210,13 @@ describe('BatchTransaction', () => { assert.deepStrictEqual(reqOpts.transaction, {id: ID}); }); - it('should add resource prefix to `gaxOpts`', done => { + it('should add pass headers argument', done => { batchTransaction.createPartitions_(CONFIG, assert.ifError); - const {gaxOpts} = REQUEST.lastCall.args[0]; - assert.deepStrictEqual( - gaxOpts, - addResourcePrefixHeader( - CONFIG.gaxOpts, - (batchTransaction.session.parent as Database).formattedName_ - ) - ); + const {headers} = REQUEST.lastCall.args[0]; + assert.deepStrictEqual(headers, { + [CLOUD_RESOURCE_HEADER]: (batchTransaction.session.parent as Database) + .formattedName_, + }); done(); }); diff --git a/test/database.ts b/test/database.ts index d33607c27..15c1e442d 100644 --- a/test/database.ts +++ b/test/database.ts @@ -31,7 +31,7 @@ import * as db from '../src/database'; import {Instance} from '../src'; import {MockError} from './mockserver/mockspanner'; import {IOperation} from '../src/instance'; -import {addResourcePrefixHeader} from '../src/common'; +import {CLOUD_RESOURCE_HEADER} from '../src/common'; let promisified = false; const fakePfy = extend({}, pfy, { @@ -184,6 +184,7 @@ describe('Database', () => { let Database: typeof db.Database; // tslint:disable-next-line variable-name let DatabaseCached: typeof db.Database; + let resourceHeader: {[k: string]: string}; const INSTANCE = ({ request: util.noop, @@ -228,6 +229,7 @@ describe('Database', () => { extend(Database, DatabaseCached); database = new Database(INSTANCE, NAME, POOL_OPTIONS); database.parent = INSTANCE; + resourceHeader = {[CLOUD_RESOURCE_HEADER]: database.formattedName_}; }); afterEach(() => sandbox.restore()); @@ -350,12 +352,14 @@ describe('Database', () => { database.batchCreateSessions({count}, assert.ifError); - const {client, method, reqOpts} = stub.lastCall.args[0]; + const {client, method, reqOpts, gaxOpts, headers} = stub.lastCall.args[0]; assert.strictEqual(client, 'SpannerClient'); assert.strictEqual(method, 'batchCreateSessions'); assert.strictEqual(reqOpts.database, DATABASE_FORMATTED_NAME); assert.strictEqual(reqOpts.sessionCount, count); + assert.strictEqual(gaxOpts, undefined); + assert.deepStrictEqual(headers, resourceHeader); }); it('should accept just a count number', () => { @@ -387,10 +391,7 @@ describe('Database', () => { const {gaxOpts} = stub.lastCall.args[0]; - assert.deepStrictEqual( - gaxOpts, - addResourcePrefixHeader(gaxOptions, database.formattedName_) - ); + assert.deepStrictEqual(gaxOpts, gaxOptions); }); it('should return any request errors', done => { @@ -709,10 +710,8 @@ describe('Database', () => { assert.deepStrictEqual(config.reqOpts, { database: database.formattedName_, }); - assert.deepStrictEqual( - config.gaxOpts, - addResourcePrefixHeader({}, database.formattedName_) - ); + assert.strictEqual(config.gaxOpts, undefined); + assert.deepStrictEqual(config.headers, resourceHeader); assert.strictEqual(callback, assert.ifError); }; @@ -972,6 +971,8 @@ describe('Database', () => { assert.deepStrictEqual(config.reqOpts, { name: database.formattedName_, }); + assert.deepStrictEqual(config.gaxOpts, {}); + assert.deepStrictEqual(config.headers, resourceHeader); assert.strictEqual(callback, assert.ifError); return requestReturnValue; }; @@ -983,10 +984,7 @@ describe('Database', () => { it('should accept gaxOptions', done => { const gaxOptions = {}; database.request = config => { - assert.deepStrictEqual( - config.gaxOpts, - addResourcePrefixHeader(gaxOptions, database.formattedName_) - ); + assert.deepStrictEqual(config.gaxOpts, gaxOptions); done(); }; database.getMetadata(gaxOptions, assert.ifError); @@ -1001,6 +999,8 @@ describe('Database', () => { assert.deepStrictEqual(config.reqOpts, { database: database.formattedName_, }); + assert.deepStrictEqual(config.gaxOpts, {}); + assert.deepStrictEqual(config.headers, resourceHeader); done(); }; @@ -1010,10 +1010,7 @@ describe('Database', () => { it('should accept gaxOptions', done => { const gaxOptions = {}; database.request = config => { - assert.deepStrictEqual( - config.gaxOpts, - addResourcePrefixHeader(gaxOptions, database.formattedName_) - ); + assert.deepStrictEqual(config.gaxOpts, gaxOptions); done(); }; @@ -1606,6 +1603,8 @@ describe('Database', () => { database: database.formattedName_, statements: STATEMENTS, }); + assert.deepStrictEqual(config.gaxOpts, {}); + assert.deepStrictEqual(config.headers, resourceHeader); assert.strictEqual(callback, assert.ifError); return requestReturnValue; }; @@ -1644,10 +1643,7 @@ describe('Database', () => { it('should accept gaxOptions', done => { const gaxOptions = {}; database.request = config => { - assert.deepStrictEqual( - config.gaxOpts, - addResourcePrefixHeader(gaxOptions, database.formattedName_) - ); + assert.deepStrictEqual(config.gaxOpts, gaxOptions); done(); }; database.updateSchema(STATEMENTS, gaxOptions, assert.ifError); @@ -1665,11 +1661,8 @@ describe('Database', () => { assert.deepStrictEqual(config.reqOpts, { database: database.formattedName_, }); - - assert.deepStrictEqual( - config.gaxOpts, - addResourcePrefixHeader(gaxOptions, database.formattedName_) - ); + assert.deepStrictEqual(config.gaxOpts, gaxOptions); + assert.deepStrictEqual(config.headers, resourceHeader); done(); }; @@ -1683,10 +1676,7 @@ describe('Database', () => { database: database.formattedName_, }); - assert.deepStrictEqual( - config.gaxOpts, - addResourcePrefixHeader({}, database.formattedName_) - ); + assert.strictEqual(config.gaxOpts, undefined); done(); }; @@ -1999,10 +1989,8 @@ describe('Database', () => { assert.strictEqual(config.client, 'SpannerClient'); assert.strictEqual(config.method, 'listSessions'); assert.deepStrictEqual(config.reqOpts, expectedReqOpts); - assert.deepStrictEqual( - config.gaxOpts, - addResourcePrefixHeader(gaxOpts, database.formattedName_) - ); + assert.deepStrictEqual(config.gaxOpts, gaxOpts); + assert.deepStrictEqual(config.headers, resourceHeader); done(); }; @@ -2013,10 +2001,7 @@ describe('Database', () => { const pageSize = 3; const pageToken = 'token'; const gaxOptions = {pageSize, pageToken, timeout: 1000}; - const expectedGaxOpts = addResourcePrefixHeader( - {timeout: 1000}, - database.formattedName_ - ); + const expectedGaxOpts = {timeout: 1000}; const options = {a: 'a', gaxOptions: gaxOptions}; const expectedReqOpts = extend( {}, @@ -2044,10 +2029,7 @@ describe('Database', () => { const pageSize = 3; const pageToken = 'token'; const gaxOptions = {pageSize, pageToken, timeout: 1000}; - const expectedGaxOpts = addResourcePrefixHeader( - {timeout: 1000}, - database.formattedName_ - ); + const expectedGaxOpts = {timeout: 1000}; const optionsPageSize = 5; const optionsPageToken = 'optionsToken'; @@ -2086,10 +2068,7 @@ describe('Database', () => { assert.deepStrictEqual(config.reqOpts, { database: database.formattedName_, }); - assert.deepStrictEqual( - config.gaxOpts, - addResourcePrefixHeader({}, database.formattedName_) - ); + assert.deepStrictEqual(config.gaxOpts, {}); done(); }; database.getSessions(assert.ifError); @@ -2148,10 +2127,8 @@ describe('Database', () => { assert.notStrictEqual(config.reqOpts, OPTIONS); - assert.deepStrictEqual( - config.gaxOpts, - addResourcePrefixHeader(OPTIONS.gaxOptions!, database.formattedName_) - ); + assert.deepStrictEqual(config.gaxOpts, OPTIONS.gaxOptions); + assert.deepStrictEqual(config.headers, resourceHeader); return returnValue; }; @@ -2163,10 +2140,7 @@ describe('Database', () => { const pageSize = 3; const pageToken = 'token'; const gaxOptions = {pageSize, pageToken, timeout: 1000}; - const expectedGaxOpts = addResourcePrefixHeader( - {timeout: 1000}, - database.formattedName_ - ); + const expectedGaxOpts = {timeout: 1000}; const options = {gaxOptions}; const expectedReqOpts = extend( {}, @@ -2193,10 +2167,7 @@ describe('Database', () => { const pageSize = 3; const pageToken = 'token'; const gaxOptions = {pageSize, pageToken, timeout: 1000}; - const expectedGaxOpts = addResourcePrefixHeader( - {timeout: 1000}, - database.formattedName_ - ); + const expectedGaxOpts = {timeout: 1000}; const optionsPageSize = 5; const optionsPageToken = 'optionsToken'; @@ -2232,10 +2203,7 @@ describe('Database', () => { database: database.formattedName_, }); - assert.deepStrictEqual( - config.gaxOpts, - addResourcePrefixHeader({}, database.formattedName_) - ); + assert.deepStrictEqual(config.gaxOpts, {}); return returnValue; }; @@ -2627,6 +2595,8 @@ describe('Database', () => { assert.notStrictEqual(config.reqOpts, QUERY); assert.deepStrictEqual(QUERY, ORIGINAL_QUERY); + assert.deepStrictEqual(config.gaxOpts, {}); + assert.deepStrictEqual(config.headers, resourceHeader); done(); }; @@ -2656,10 +2626,7 @@ describe('Database', () => { }; database.request = config => { - assert.deepStrictEqual( - config.gaxOpts, - addResourcePrefixHeader(options, database.instance.formattedName_) - ); + assert.deepStrictEqual(config.gaxOpts, options); done(); }; diff --git a/test/index.ts b/test/index.ts index 293e87d76..7db674c99 100644 --- a/test/index.ts +++ b/test/index.ts @@ -32,7 +32,7 @@ import * as spnr from '../src'; import {Duplex} from 'stream'; import {CreateInstanceRequest} from '../src/index'; import {GetInstanceConfigsOptions, GetInstancesOptions} from '../src'; -import {addResourcePrefixHeader} from '../src/common'; +import {CLOUD_RESOURCE_HEADER, addResourcePrefixHeader} from '../src/common'; // eslint-disable-next-line @typescript-eslint/no-var-requires const apiConfig = require('../src/spanner_grpc_config.json'); @@ -130,6 +130,7 @@ describe('Spanner', () => { let Spanner: typeof spnr.Spanner; let spanner: spnr.Spanner; let sandbox: sinon.SinonSandbox; + let resourceHeader: {[k: string]: string}; const OPTIONS = { projectId: 'project-id', @@ -167,6 +168,7 @@ describe('Spanner', () => { spanner = new Spanner(OPTIONS); spanner.projectId = OPTIONS.projectId; replaceProjectIdTokenOverride = null; + resourceHeader = {[CLOUD_RESOURCE_HEADER]: spanner.projectFormattedName_}; }); afterEach(() => sandbox.restore()); @@ -527,10 +529,8 @@ describe('Spanner', () => { config: `projects/project-id/instanceConfigs/${CONFIG.config}`, }, }); - assert.deepStrictEqual( - config.gaxOpts, - addResourcePrefixHeader(CONFIG.gaxOptions, reqOpts.parent) - ); + assert.strictEqual(config.gaxOpts, undefined); + assert.deepStrictEqual(config.headers, resourceHeader); done(); }; spanner.createInstance(NAME, CONFIG, assert.ifError); @@ -559,10 +559,7 @@ describe('Spanner', () => { it('should accept gaxOptions', done => { const cfg = Object.assign({}, CONFIG, {gaxOptions: {}}); spanner.request = config => { - assert.deepStrictEqual( - config.gaxOpts, - addResourcePrefixHeader(cfg.gaxOptions, config.reqOpts.parent) - ); + assert.strictEqual(config.gaxOpts, cfg.gaxOptions); done(); }; spanner.createInstance(NAME, cfg, assert.ifError); @@ -674,10 +671,8 @@ describe('Spanner', () => { assert.notStrictEqual(config.reqOpts, OPTIONS); assert.deepStrictEqual(OPTIONS, ORIGINAL_OPTIONS); - assert.deepStrictEqual( - config.gaxOpts, - addResourcePrefixHeader(OPTIONS.gaxOptions!, expectedReqOpts.parent) - ); + assert.deepStrictEqual(config.gaxOpts, {}); + assert.deepStrictEqual(config.headers, resourceHeader); done(); }; @@ -698,16 +693,14 @@ describe('Spanner', () => { }, {pageSize: gaxOptions.pageSize, pageToken: gaxOptions.pageToken} ); - const expectedGaxOpts = addResourcePrefixHeader( - {timeout: 1000}, - expectedReqOpts.parent - ); + const expectedGaxOpts = {timeout: 1000}; spanner.request = config => { assert.deepStrictEqual(config.reqOpts, expectedReqOpts); assert.notStrictEqual(config.gaxOpts, gaxOptions); assert.notDeepStrictEqual(config.gaxOpts, gaxOptions); assert.deepStrictEqual(config.gaxOpts, expectedGaxOpts); + assert.deepStrictEqual(config.headers, resourceHeader); done(); }; @@ -736,16 +729,14 @@ describe('Spanner', () => { {pageSize: optionsPageSize, pageToken: optionsPageToken} ); - const expectedGaxOpts = addResourcePrefixHeader( - {timeout: 1000}, - expectedReqOpts.parent - ); + const expectedGaxOpts = {timeout: 1000}; spanner.request = config => { assert.deepStrictEqual(config.reqOpts, expectedReqOpts); assert.notStrictEqual(config.gaxOpts, gaxOptions); assert.notDeepStrictEqual(config.gaxOpts, gaxOptions); assert.deepStrictEqual(config.gaxOpts, expectedGaxOpts); + assert.deepStrictEqual(config.headers, resourceHeader); done(); }; @@ -759,10 +750,7 @@ describe('Spanner', () => { parent: 'projects/' + spanner.projectId, }); - assert.deepStrictEqual( - config.gaxOpts, - addResourcePrefixHeader({}, config.reqOpts.parent) - ); + assert.deepStrictEqual(config.gaxOpts, {}); done(); }; @@ -843,10 +831,8 @@ describe('Spanner', () => { assert.notStrictEqual(config.reqOpts, OPTIONS); assert.deepStrictEqual(OPTIONS, ORIGINAL_OPTIONS); - assert.deepStrictEqual( - config.gaxOpts, - addResourcePrefixHeader(OPTIONS.gaxOptions!, expectedReqOpts.parent) - ); + assert.deepStrictEqual(config.gaxOpts, {}); + assert.deepStrictEqual(config.headers, resourceHeader); return returnValue as Duplex; }; @@ -866,16 +852,14 @@ describe('Spanner', () => { }, {pageSize: gaxOptions.pageSize, pageToken: gaxOptions.pageToken} ); - const expectedGaxOpts = addResourcePrefixHeader( - {timeout: 1000}, - expectedReqOpts.parent - ); + const expectedGaxOpts = {timeout: 1000}; spanner.requestStream = config => { assert.deepStrictEqual(config.reqOpts, expectedReqOpts); assert.notStrictEqual(config.gaxOpts, gaxOptions); assert.notDeepStrictEqual(config.gaxOpts, gaxOptions); assert.deepStrictEqual(config.gaxOpts, expectedGaxOpts); + assert.deepStrictEqual(config.headers, resourceHeader); return returnValue; }; @@ -903,16 +887,14 @@ describe('Spanner', () => { }, {pageSize: optionsPageSize, pageToken: optionsPageToken} ); - const expectedGaxOpts = addResourcePrefixHeader( - {timeout: 1000}, - expectedReqOpts.parent - ); + const expectedGaxOpts = {timeout: 1000}; spanner.requestStream = config => { assert.deepStrictEqual(config.reqOpts, expectedReqOpts); assert.notStrictEqual(config.gaxOpts, gaxOptions); assert.notDeepStrictEqual(config.gaxOpts, gaxOptions); assert.deepStrictEqual(config.gaxOpts, expectedGaxOpts); + assert.deepStrictEqual(config.headers, resourceHeader); return returnValue; }; @@ -927,10 +909,7 @@ describe('Spanner', () => { parent: 'projects/' + spanner.projectId, }); - assert.deepStrictEqual( - config.gaxOpts, - addResourcePrefixHeader({}, config.reqOpts.parent) - ); + assert.deepStrictEqual(config.gaxOpts, {}); return returnValue; }; @@ -967,11 +946,8 @@ describe('Spanner', () => { assert.deepStrictEqual(reqOpts, expectedQuery); assert.notStrictEqual(reqOpts, options); - const gaxOpts = config.gaxOpts; - assert.deepStrictEqual( - gaxOpts, - addResourcePrefixHeader(options.gaxOptions!, expectedQuery.parent) - ); + assert.deepStrictEqual(config.gaxOpts, options.gaxOptions); + assert.deepStrictEqual(config.headers, resourceHeader); assert.strictEqual(callback_, callback); return returnValue; @@ -994,16 +970,14 @@ describe('Spanner', () => { }, {pageSize: gaxOptions.pageSize, pageToken: gaxOptions.pageToken} ); - const expectedGaxOpts = addResourcePrefixHeader( - {timeout: 1000}, - expectedReqOpts.parent - ); + const expectedGaxOpts = {timeout: 1000}; spanner.request = config => { assert.deepStrictEqual(config.reqOpts, expectedReqOpts); assert.notStrictEqual(config.gaxOpts, gaxOptions); assert.notDeepStrictEqual(config.gaxOpts, gaxOptions); assert.deepStrictEqual(config.gaxOpts, expectedGaxOpts); + assert.deepStrictEqual(config.headers, resourceHeader); done(); }; @@ -1031,16 +1005,14 @@ describe('Spanner', () => { }, {pageSize: optionsPageSize, pageToken: optionsPageToken} ); - const expectedGaxOpts = addResourcePrefixHeader( - {timeout: 1000}, - expectedReqOpts.parent - ); + const expectedGaxOpts = {timeout: 1000}; spanner.request = config => { assert.deepStrictEqual(config.reqOpts, expectedReqOpts); assert.notStrictEqual(config.gaxOpts, gaxOptions); assert.notDeepStrictEqual(config.gaxOpts, gaxOptions); assert.deepStrictEqual(config.gaxOpts, expectedGaxOpts); + assert.deepStrictEqual(config.headers, resourceHeader); done(); }; @@ -1054,10 +1026,7 @@ describe('Spanner', () => { assert.deepStrictEqual(reqOpts, { parent: 'projects/' + spanner.projectId, }); - assert.deepStrictEqual( - config.gaxOpts, - addResourcePrefixHeader({}, config.reqOpts.parent) - ); + assert.deepStrictEqual(config.gaxOpts, {}); done(); }; @@ -1091,10 +1060,8 @@ describe('Spanner', () => { assert.deepStrictEqual(reqOpts, expectedOptions); assert.notStrictEqual(reqOpts, OPTIONS); - assert.deepStrictEqual( - config.gaxOpts, - addResourcePrefixHeader(OPTIONS.gaxOptions!, expectedOptions.parent) - ); + assert.deepStrictEqual(config.gaxOpts, OPTIONS.gaxOptions); + assert.deepStrictEqual(config.headers, resourceHeader); return returnValue; }; @@ -1118,10 +1085,7 @@ describe('Spanner', () => { const reqOpts = config.reqOpts; assert.deepStrictEqual(reqOpts, expectedOptions); - assert.deepStrictEqual( - config.gaxOpts, - addResourcePrefixHeader({}, config.reqOpts.parent) - ); + assert.deepStrictEqual(config.gaxOpts, {}); return returnValue; }; @@ -1144,16 +1108,14 @@ describe('Spanner', () => { {pageSize: gaxOptions.pageSize, pageToken: gaxOptions.pageToken} ); delete expectedReqOpts.gaxOptions; - const expectedGaxOpts = addResourcePrefixHeader( - {timeout: 1000}, - expectedReqOpts.parent - ); + const expectedGaxOpts = {timeout: 1000}; spanner.requestStream = config => { assert.deepStrictEqual(config.reqOpts, expectedReqOpts); assert.notStrictEqual(config.gaxOpts, gaxOptions); assert.notDeepStrictEqual(config.gaxOpts, gaxOptions); assert.deepStrictEqual(config.gaxOpts, expectedGaxOpts); + assert.deepStrictEqual(config.headers, resourceHeader); return returnValue; }; @@ -1186,16 +1148,14 @@ describe('Spanner', () => { {pageSize: optionsPageSize, pageToken: optionsPageToken} ); delete expectedReqOpts.gaxOptions; - const expectedGaxOpts = addResourcePrefixHeader( - {timeout: 1000}, - expectedReqOpts.parent - ); + const expectedGaxOpts = {timeout: 1000}; spanner.request = config => { assert.deepStrictEqual(config.reqOpts, expectedReqOpts); assert.notStrictEqual(config.gaxOpts, gaxOptions); assert.notDeepStrictEqual(config.gaxOpts, gaxOptions); assert.deepStrictEqual(config.gaxOpts, expectedGaxOpts); + assert.deepStrictEqual(config.headers, resourceHeader); return returnValue; }; @@ -1245,6 +1205,9 @@ describe('Spanner', () => { c: 'd', }, gaxOpts: {}, + headers: { + [CLOUD_RESOURCE_HEADER]: 'header', + }, }; // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -1341,7 +1304,10 @@ describe('Spanner', () => { assert.strictEqual(this, FAKE_GAPIC_CLIENT); assert.deepStrictEqual(reqOpts, CONFIG.reqOpts); assert.notStrictEqual(reqOpts, CONFIG.reqOpts); - assert.strictEqual(gaxOpts, CONFIG.gaxOpts); + assert.deepStrictEqual( + gaxOpts, + addResourcePrefixHeader(CONFIG.gaxOpts, CONFIG.headers) + ); arg(); // done() }; diff --git a/test/instance.ts b/test/instance.ts index bba8ac515..bdea4cda6 100644 --- a/test/instance.ts +++ b/test/instance.ts @@ -33,7 +33,7 @@ import arrify = require('arrify'); import {SessionPoolOptions} from '../src/session-pool'; import {Backup} from '../src/backup'; import {PreciseDate} from '@google-cloud/precise-date'; -import {addResourcePrefixHeader} from '../src/common'; +import {CLOUD_RESOURCE_HEADER} from '../src/common'; let promisified = false; const fakePfy = extend({}, pfy, { @@ -71,6 +71,8 @@ describe('Instance', () => { // tslint:disable-next-line variable-name let Instance: typeof inst.Instance; let instance: inst.Instance; + let resourceHeader: {[k: string]: string}; + const sandbox = sinon.createSandbox(); const SPANNER = ({ @@ -96,6 +98,7 @@ describe('Instance', () => { beforeEach(() => { instance = new Instance(SPANNER, NAME); + resourceHeader = {[CLOUD_RESOURCE_HEADER]: instance.formattedName_}; }); describe('instantiation', () => { @@ -216,6 +219,8 @@ describe('Instance', () => { parent: instance.formattedName_, createStatement: 'CREATE DATABASE `' + NAME + '`', }); + assert.strictEqual(config.gaxOpts, undefined); + assert.deepStrictEqual(config.headers, resourceHeader); done(); }; @@ -266,10 +271,7 @@ describe('Instance', () => { it('should accept gaxOptions', done => { const options = Object.assign({}, OPTIONS, {gaxOptions: {}}); instance.request = config => { - assert.deepStrictEqual( - config.gaxOpts, - addResourcePrefixHeader(options.gaxOptions, instance.formattedName_) - ); + assert.deepStrictEqual(config.gaxOpts, options.gaxOptions); assert.strictEqual(config.reqOpts.gaxOptions, undefined); done(); @@ -539,6 +541,8 @@ describe('Instance', () => { assert.deepStrictEqual(config.reqOpts, { name: instance.formattedName_, }); + assert.deepStrictEqual(config.gaxOpts, {}); + assert.deepStrictEqual(config.headers, resourceHeader); callback(); // done() }; @@ -566,10 +570,7 @@ describe('Instance', () => { const gaxOptions = {}; instance.request = (config, callback: Function) => { - assert.deepStrictEqual( - config.gaxOpts, - addResourcePrefixHeader(gaxOptions, instance.formattedName_) - ); + assert.deepStrictEqual(config.gaxOpts, gaxOptions); callback(); // done() }; @@ -914,10 +915,8 @@ describe('Instance', () => { assert.notStrictEqual(config.reqOpts, OPTIONS); assert.deepStrictEqual(OPTIONS, ORIGINAL_OPTIONS); - assert.deepStrictEqual( - config.gaxOpts, - addResourcePrefixHeader(OPTIONS.gaxOptions!, instance.formattedName_) - ); + assert.deepStrictEqual(config.gaxOpts, OPTIONS.gaxOptions); + assert.deepStrictEqual(config.headers, resourceHeader); done(); }; @@ -928,10 +927,7 @@ describe('Instance', () => { it('should pass pageSize and pageToken from gaxOptions into reqOpts', done => { const pageToken = 'token'; const gaxOptions = {pageSize, pageToken, timeout: 1000}; - const expectedGaxOpts = addResourcePrefixHeader( - {timeout: 1000}, - instance.formattedName_ - ); + const expectedGaxOpts = {timeout: 1000}; const options = {gaxOptions}; const expectedReqOpts = extend( {}, @@ -958,10 +954,7 @@ describe('Instance', () => { it('pageSize and pageToken in options should take precedence over gaxOptions', done => { const pageToken = 'token'; const gaxOptions = {pageSize, pageToken, timeout: 1000}; - const expectedGaxOpts = addResourcePrefixHeader( - {timeout: 1000}, - instance.formattedName_ - ); + const expectedGaxOpts = {timeout: 1000}; const optionsPageSize = 5; const optionsPageToken = 'optionsToken'; @@ -998,10 +991,7 @@ describe('Instance', () => { parent: instance.formattedName_, }); - assert.deepStrictEqual( - config.gaxOpts, - addResourcePrefixHeader({}, instance.formattedName_) - ); + assert.deepStrictEqual(config.gaxOpts, {}); done(); }; @@ -1082,10 +1072,9 @@ describe('Instance', () => { assert.notStrictEqual(config.reqOpts, OPTIONS); - assert.deepStrictEqual( - config.gaxOpts, - addResourcePrefixHeader(OPTIONS.gaxOptions!, instance.formattedName_) - ); + assert.deepStrictEqual(config.gaxOpts, OPTIONS.gaxOptions); + assert.deepStrictEqual(config.headers, resourceHeader); + return returnValue; }; @@ -1097,10 +1086,7 @@ describe('Instance', () => { const pageSize = 3; const pageToken = 'token'; const gaxOptions = {pageSize, pageToken, timeout: 1000}; - const expectedGaxOpts = addResourcePrefixHeader( - {timeout: 1000}, - instance.formattedName_ - ); + const expectedGaxOpts = {timeout: 1000}; const options = {gaxOptions}; const expectedReqOpts = extend( {}, @@ -1127,10 +1113,7 @@ describe('Instance', () => { const pageSize = 3; const pageToken = 'token'; const gaxOptions = {pageSize, pageToken, timeout: 1000}; - const expectedGaxOpts = addResourcePrefixHeader( - {timeout: 1000}, - instance.formattedName_ - ); + const expectedGaxOpts = {timeout: 1000}; const optionsPageSize = 5; const optionsPageToken = 'optionsToken'; @@ -1168,10 +1151,7 @@ describe('Instance', () => { parent: instance.formattedName_, }); - assert.deepStrictEqual( - config.gaxOpts, - addResourcePrefixHeader({}, instance.formattedName_) - ); + assert.deepStrictEqual(config.gaxOpts, {}); return returnValue; }; @@ -1193,6 +1173,9 @@ describe('Instance', () => { assert.deepStrictEqual(config.reqOpts, { name: instance.formattedName_, }); + assert.strictEqual(config.gaxOpts, undefined); + assert.deepStrictEqual(config.headers, resourceHeader); + assert.strictEqual(callback_, callback); return requestReturnValue; }; @@ -1234,10 +1217,7 @@ describe('Instance', () => { it('should accept gaxOptions', done => { const gaxOptions = {}; instance.request = config => { - assert.deepStrictEqual( - config.gaxOpts, - addResourcePrefixHeader(gaxOptions, instance.formattedName_) - ); + assert.deepStrictEqual(config.gaxOpts, gaxOptions); done(); }; instance.getMetadata({gaxOptions}, assert.ifError); @@ -1269,6 +1249,8 @@ describe('Instance', () => { }); assert.deepStrictEqual(METADATA, ORIGINAL_METADATA); + assert.deepStrictEqual(config.gaxOpts, {}); + assert.deepStrictEqual(config.headers, resourceHeader); assert.strictEqual(callback_, callback); @@ -1282,10 +1264,7 @@ describe('Instance', () => { it('should accept gaxOptions', done => { const gaxOptions = {}; instance.request = config => { - assert.deepStrictEqual( - config.gaxOpts, - addResourcePrefixHeader(gaxOptions, instance.formattedName_) - ); + assert.deepStrictEqual(config.gaxOpts, gaxOptions); done(); }; instance.setMetadata(METADATA, gaxOptions, assert.ifError); @@ -1322,10 +1301,8 @@ describe('Instance', () => { assert.notStrictEqual(config.reqOpts, OPTIONS); assert.deepStrictEqual(OPTIONS, ORIGINAL_OPTIONS); - assert.deepStrictEqual( - config.gaxOpts, - addResourcePrefixHeader(options.gaxOptions, instance.formattedName_) - ); + assert.deepStrictEqual(config.gaxOpts, options.gaxOptions); + assert.deepStrictEqual(config.headers, resourceHeader); done(); }; @@ -1336,10 +1313,7 @@ describe('Instance', () => { const pageSize = 3; const pageToken = 'token'; const gaxOptions = {pageSize, pageToken, timeout: 1000}; - const expectedGaxOpts = addResourcePrefixHeader( - {timeout: 1000}, - instance.formattedName_ - ); + const expectedGaxOpts = {timeout: 1000}; const options = {gaxOptions}; const expectedReqOpts = extend( {}, @@ -1365,10 +1339,7 @@ describe('Instance', () => { const pageSize = 3; const pageToken = 'token'; const gaxOptions = {pageSize, pageToken, timeout: 1000}; - const expectedGaxOpts = addResourcePrefixHeader( - {timeout: 1000}, - instance.formattedName_ - ); + const expectedGaxOpts = {timeout: 1000}; const optionsPageSize = 5; const optionsPageToken = 'optionsToken'; @@ -1402,10 +1373,7 @@ describe('Instance', () => { assert.deepStrictEqual(config.reqOpts, { parent: instance.formattedName_, }); - assert.deepStrictEqual( - config.gaxOpts, - addResourcePrefixHeader({}, instance.formattedName_) - ); + assert.deepStrictEqual(config.gaxOpts, {}); done(); }; @@ -1486,10 +1454,9 @@ describe('Instance', () => { assert.notStrictEqual(config.reqOpts, OPTIONS); - assert.deepStrictEqual( - config.gaxOpts, - addResourcePrefixHeader(OPTIONS.gaxOptions!, instance.formattedName_) - ); + assert.deepStrictEqual(config.gaxOpts, OPTIONS.gaxOptions); + assert.deepStrictEqual(config.headers, resourceHeader); + return returnValue; }; @@ -1501,10 +1468,7 @@ describe('Instance', () => { const pageSize = 3; const pageToken = 'token'; const gaxOptions = {pageSize, pageToken, timeout: 1000}; - const expectedGaxOpts = addResourcePrefixHeader( - {timeout: 1000}, - instance.formattedName_ - ); + const expectedGaxOpts = {timeout: 1000}; const options = {gaxOptions}; const expectedReqOpts = extend( {}, @@ -1531,10 +1495,7 @@ describe('Instance', () => { const pageSize = 3; const pageToken = 'token'; const gaxOptions = {pageSize, pageToken, timeout: 1000}; - const expectedGaxOpts = addResourcePrefixHeader( - {timeout: 1000}, - instance.formattedName_ - ); + const expectedGaxOpts = {timeout: 1000}; const optionsPageSize = 5; const optionsPageToken = 'optionsToken'; @@ -1572,10 +1533,7 @@ describe('Instance', () => { parent: instance.formattedName_, }); - assert.deepStrictEqual( - config.gaxOpts, - addResourcePrefixHeader({}, instance.formattedName_) - ); + assert.deepStrictEqual(config.gaxOpts, {}); return returnValue; }; @@ -1626,10 +1584,7 @@ describe('Instance', () => { assert.notStrictEqual(config.reqOpts, OPTIONS); assert.deepStrictEqual(OPTIONS, ORIGINAL_OPTIONS); - assert.deepStrictEqual( - config.gaxOpts, - addResourcePrefixHeader(options.gaxOptions, instance.formattedName_) - ); + assert.deepStrictEqual(config.gaxOpts, options.gaxOptions); done(); }; @@ -1640,10 +1595,7 @@ describe('Instance', () => { const pageSize = 3; const pageToken = 'token'; const gaxOptions = {pageSize, pageToken, timeout: 1000}; - const expectedGaxOpts = addResourcePrefixHeader( - {timeout: 1000}, - instance.formattedName_ - ); + const expectedGaxOpts = {timeout: 1000}; const options = Object.assign({}, OPTIONS, {gaxOptions}); const expectedReqOpts = extend( {}, @@ -1670,10 +1622,7 @@ describe('Instance', () => { const pageSize = 3; const pageToken = 'token'; const gaxOptions = {pageSize, pageToken, timeout: 1000}; - const expectedGaxOpts = addResourcePrefixHeader( - {timeout: 1000}, - instance.formattedName_ - ); + const expectedGaxOpts = {timeout: 1000}; const optionsPageSize = 5; const optionsPageToken = 'optionsToken'; @@ -1709,10 +1658,7 @@ describe('Instance', () => { parent: instance.formattedName_, }); - assert.deepStrictEqual( - config.gaxOpts, - addResourcePrefixHeader({}, instance.formattedName_) - ); + assert.deepStrictEqual(config.gaxOpts, {}); done(); }; @@ -1744,10 +1690,8 @@ describe('Instance', () => { assert.notStrictEqual(config.reqOpts, OPTIONS); assert.deepStrictEqual(OPTIONS, ORIGINAL_OPTIONS); - assert.deepStrictEqual( - config.gaxOpts, - addResourcePrefixHeader(options.gaxOptions, instance.formattedName_) - ); + assert.deepStrictEqual(config.gaxOpts, options.gaxOptions); + assert.deepStrictEqual(config.headers, resourceHeader); done(); }; @@ -1758,10 +1702,7 @@ describe('Instance', () => { const pageSize = 3; const pageToken = 'token'; const gaxOptions = {pageSize, pageToken, timeout: 1000}; - const expectedGaxOpts = addResourcePrefixHeader( - {timeout: 1000}, - instance.formattedName_ - ); + const expectedGaxOpts = {timeout: 1000}; const options = Object.assign({}, OPTIONS, {gaxOptions}); const expectedReqOpts = extend( {}, @@ -1788,10 +1729,7 @@ describe('Instance', () => { const pageSize = 3; const pageToken = 'token'; const gaxOptions = {pageSize, pageToken, timeout: 1000}; - const expectedGaxOpts = addResourcePrefixHeader( - {timeout: 1000}, - instance.formattedName_ - ); + const expectedGaxOpts = {timeout: 1000}; const optionsPageSize = 5; const optionsPageToken = 'optionsToken'; @@ -1827,10 +1765,7 @@ describe('Instance', () => { parent: instance.formattedName_, }); - assert.deepStrictEqual( - config.gaxOpts, - addResourcePrefixHeader({}, instance.formattedName_) - ); + assert.deepStrictEqual(config.gaxOpts, {}); done(); }; diff --git a/test/session.ts b/test/session.ts index 92588e52d..b34d69932 100644 --- a/test/session.ts +++ b/test/session.ts @@ -21,7 +21,8 @@ import * as assert from 'assert'; import {before, beforeEach, describe, it} from 'mocha'; import * as extend from 'extend'; import * as proxyquire from 'proxyquire'; -import {addResourcePrefixHeader} from '../src/common'; +import {CLOUD_RESOURCE_HEADER} from '../src/common'; +import {Database} from '../src'; let promisified = false; const fakePfy = extend({}, pfy, { @@ -43,8 +44,10 @@ const fakePfy = extend({}, pfy, { class FakeGrpcServiceObject { calledWith_: IArguments; + parent: Database; constructor() { this.calledWith_ = arguments; + this.parent = arguments[0].parent; } } @@ -63,6 +66,7 @@ describe('Session', () => { let Session: any; // eslint-disable-next-line @typescript-eslint/no-explicit-any let session: any; + let resourceHeader: {[k: string]: string}; // eslint-disable-next-line @typescript-eslint/no-explicit-any const DATABASE: any = { @@ -88,6 +92,8 @@ describe('Session', () => { beforeEach(() => { session = new Session(DATABASE, NAME); + session.parent = DATABASE; + resourceHeader = {[CLOUD_RESOURCE_HEADER]: session.parent.formattedName_}; }); describe('instantiation', () => { @@ -229,9 +235,6 @@ describe('Session', () => { }); describe('delete', () => { - beforeEach(() => { - session.parent = DATABASE; - }); it('should correctly call and return the request', () => { const requestReturnValue = {}; @@ -243,10 +246,8 @@ describe('Session', () => { assert.deepStrictEqual(config.reqOpts, { name: session.formattedName_, }); - assert.deepStrictEqual( - config.gaxOpts, - addResourcePrefixHeader({}, session.parent.formattedName_) - ); + assert.strictEqual(config.gaxOpts, undefined); + assert.deepStrictEqual(config.headers, resourceHeader); assert.strictEqual(callback_, callback); return requestReturnValue; @@ -258,10 +259,6 @@ describe('Session', () => { }); describe('getMetadata', () => { - beforeEach(() => { - session.parent = DATABASE; - }); - it('should correctly call and return the request', () => { const requestReturnValue = {}; @@ -273,6 +270,8 @@ describe('Session', () => { assert.deepStrictEqual(config.reqOpts, { name: session.formattedName_, }); + assert.deepStrictEqual(config.gaxOpts, {}); + assert.deepStrictEqual(config.headers, resourceHeader); assert.strictEqual(callback_, callback); return requestReturnValue; }; @@ -284,10 +283,7 @@ describe('Session', () => { it('should accept and pass gaxOptions to getMetadata', done => { const gaxOptions = {}; session.request = config => { - assert.deepStrictEqual( - config.gaxOpts, - addResourcePrefixHeader(gaxOptions, session.parent.formattedName_) - ); + assert.deepStrictEqual(config.gaxOpts, gaxOptions); done(); }; session.getMetadata(gaxOptions, assert.ifError); @@ -295,10 +291,6 @@ describe('Session', () => { }); describe('keepAlive', () => { - beforeEach(() => { - session.parent = DATABASE; - }); - it('should correctly call and return the request', () => { const requestReturnValue = {}; @@ -311,6 +303,8 @@ describe('Session', () => { session: session.formattedName_, sql: 'SELECT 1', }); + assert.deepStrictEqual(config.gaxOpts, {}); + assert.deepStrictEqual(config.headers, resourceHeader); assert.strictEqual(callback_, callback); return requestReturnValue; }; @@ -322,10 +316,7 @@ describe('Session', () => { it('should accept gaxOptions', done => { const gaxOptions = {}; session.request = config => { - assert.deepStrictEqual( - config.gaxOpts, - addResourcePrefixHeader({}, session.parent.formattedName_) - ); + assert.deepStrictEqual(config.gaxOpts, {}); done(); }; session.keepAlive(gaxOptions, assert.ifError); diff --git a/test/transaction.ts b/test/transaction.ts index 504739769..74ac660f3 100644 --- a/test/transaction.ts +++ b/test/transaction.ts @@ -24,7 +24,7 @@ import * as sinon from 'sinon'; import {codec} from '../src/codec'; import {google} from '../protos/protos'; -import {addResourcePrefixHeader} from '../src/common'; +import {CLOUD_RESOURCE_HEADER} from '../src/common'; describe('Transaction', () => { const sandbox = sinon.createSandbox(); @@ -52,6 +52,7 @@ describe('Transaction', () => { let Transaction; // eslint-disable-next-line @typescript-eslint/no-explicit-any let PartitionedDml; + let resourceHeader: {[k: string]: string}; before(() => { const txns = proxyquire('../src/transaction', { @@ -76,6 +77,9 @@ describe('Transaction', () => { beforeEach(() => { sandbox.stub(Snapshot, 'encodeTimestampBounds').returns(OPTIONS); snapshot = new Snapshot(SESSION); + resourceHeader = { + [CLOUD_RESOURCE_HEADER]: snapshot.session.parent.formattedName_, + }; }); describe('initialization', () => { @@ -120,11 +124,19 @@ describe('Transaction', () => { it('should send the correct request', () => { snapshot.begin(); - const {client, method, reqOpts} = REQUEST.lastCall.args[0]; + const { + client, + method, + reqOpts, + gaxOpts, + headers, + } = REQUEST.lastCall.args[0]; assert.strictEqual(client, 'SpannerClient'); assert.strictEqual(method, 'beginTransaction'); assert.strictEqual(reqOpts.session, SESSION_NAME); + assert.deepStrictEqual(gaxOpts, {}); + assert.deepStrictEqual(headers, resourceHeader); }); it('should send the formatted options', () => { @@ -210,10 +222,11 @@ describe('Transaction', () => { it('should send the correct request', () => { snapshot.createReadStream(TABLE); - const {client, method} = REQUEST_STREAM.lastCall.args[0]; + const {client, method, headers} = REQUEST_STREAM.lastCall.args[0]; assert.strictEqual(client, 'SpannerClient'); assert.strictEqual(method, 'streamingRead'); + assert.deepStrictEqual(headers, resourceHeader); }); it('should use the transaction id if present', () => { @@ -279,13 +292,7 @@ describe('Transaction', () => { const {gaxOpts, reqOpts} = REQUEST_STREAM.lastCall.args[0]; - assert.deepStrictEqual( - gaxOpts, - addResourcePrefixHeader( - fakeOptions, - snapshot.session.parent.formattedName_ - ) - ); + assert.deepStrictEqual(gaxOpts, fakeOptions); assert.strictEqual(reqOpts.gaxOptions, undefined); }); @@ -483,10 +490,11 @@ describe('Transaction', () => { it('should send the correct request', () => { snapshot.runStream(QUERY); - const {client, method} = REQUEST_STREAM.lastCall.args[0]; + const {client, method, headers} = REQUEST_STREAM.lastCall.args[0]; assert.strictEqual(client, 'SpannerClient'); assert.strictEqual(method, 'executeStreamingSql'); + assert.deepStrictEqual(headers, resourceHeader); }); it('should use the transaction id if present', () => { @@ -565,13 +573,7 @@ describe('Transaction', () => { const {gaxOpts, reqOpts} = REQUEST_STREAM.lastCall.args[0]; assert.strictEqual(reqOpts.gaxOptions, undefined); - assert.deepStrictEqual( - gaxOpts, - addResourcePrefixHeader( - fakeQuery.gaxOptions, - snapshot.session.parent.formattedName_ - ) - ); + assert.deepStrictEqual(gaxOpts, fakeQuery.gaxOptions); }); it('should update the `seqno` for each call', () => { @@ -1035,13 +1037,7 @@ describe('Transaction', () => { it('should accept gaxOptions', done => { const gaxOptions = {}; transaction.request = config => { - assert.deepStrictEqual( - config.gaxOpts, - addResourcePrefixHeader( - gaxOptions, - transaction.session.parent.formattedName_ - ) - ); + assert.deepStrictEqual(config.gaxOpts, gaxOptions); done(); }; transaction.batchUpdate(STRING_STATEMENTS, gaxOptions, assert.ifError); @@ -1078,13 +1074,14 @@ describe('Transaction', () => { transaction.id = fakeId; transaction.batchUpdate(STRING_STATEMENTS, assert.ifError); - const {client, method, reqOpts} = stub.lastCall.args[0]; + const {client, method, reqOpts, headers} = stub.lastCall.args[0]; assert.strictEqual(client, 'SpannerClient'); assert.strictEqual(method, 'executeBatchDml'); assert.strictEqual(reqOpts.session, SESSION_NAME); assert.deepStrictEqual(reqOpts.transaction, {id: fakeId}); assert.strictEqual(reqOpts.seqno, 1); + assert.deepStrictEqual(headers, resourceHeader); }); it('should encode sql string statements', () => { @@ -1209,21 +1206,18 @@ describe('Transaction', () => { transaction.begin(); const expectedOptions = {readWrite: {}}; - const {reqOpts} = stub.lastCall.args[0]; + const {client, method, reqOpts, headers} = stub.lastCall.args[0]; + assert.strictEqual(client, 'SpannerClient'); + assert.strictEqual(method, 'beginTransaction'); assert.deepStrictEqual(reqOpts.options, expectedOptions); + assert.deepStrictEqual(headers, resourceHeader); }); it('should accept gaxOptions', done => { const gaxOptions = {}; transaction.request = config => { - assert.deepStrictEqual( - config.gaxOpts, - addResourcePrefixHeader( - gaxOptions, - transaction.session.parent.formattedName_ - ) - ); + assert.deepStrictEqual(config.gaxOpts, gaxOptions); done(); }; transaction.begin(gaxOptions, assert.ifError); @@ -1236,24 +1230,19 @@ describe('Transaction', () => { transaction.commit(); - const {client, method, reqOpts} = stub.lastCall.args[0]; + const {client, method, reqOpts, headers} = stub.lastCall.args[0]; assert.strictEqual(client, 'SpannerClient'); assert.strictEqual(method, 'commit'); assert.strictEqual(reqOpts.session, SESSION_NAME); assert.deepStrictEqual(reqOpts.mutations, []); + assert.deepStrictEqual(headers, resourceHeader); }); it('should accept gaxOptions', done => { const gaxOptions = {}; transaction.request = config => { - assert.deepStrictEqual( - config.gaxOpts, - addResourcePrefixHeader( - gaxOptions, - transaction.session.parent.formattedName_ - ) - ); + assert.deepStrictEqual(config.gaxOpts, gaxOptions); done(); }; transaction.commit(gaxOptions, assert.ifError); @@ -1442,23 +1431,18 @@ describe('Transaction', () => { transaction.rollback(); - const {client, method, reqOpts} = stub.lastCall.args[0]; + const {client, method, reqOpts, headers} = stub.lastCall.args[0]; assert.strictEqual(client, 'SpannerClient'); assert.strictEqual(method, 'rollback'); assert.deepStrictEqual(reqOpts, expectedReqOpts); + assert.deepStrictEqual(headers, resourceHeader); }); it('should accept gaxOptions', done => { const gaxOptions = {}; transaction.request = config => { - assert.deepStrictEqual( - config.gaxOpts, - addResourcePrefixHeader( - gaxOptions, - transaction.session.parent.formattedName_ - ) - ); + assert.deepStrictEqual(config.gaxOpts, gaxOptions); done(); }; transaction.rollback(gaxOptions, assert.ifError); From 33d4f49826694aa2ec1b3a50ff3d186947e85b56 Mon Sep 17 00:00:00 2001 From: alex Date: Thu, 6 Aug 2020 18:13:38 -0400 Subject: [PATCH 07/13] chore: revert Instance.formatName_ --- src/index.ts | 5 +---- src/instance.ts | 9 +++------ test/index.ts | 4 ++-- test/instance.ts | 16 +++++----------- 4 files changed, 11 insertions(+), 23 deletions(-) diff --git a/src/index.ts b/src/index.ts index 0a4a0b2b6..c2caae477 100644 --- a/src/index.ts +++ b/src/index.ts @@ -374,10 +374,7 @@ class Spanner extends GrpcService { ['A configuration object is required to create an instance.'].join('') ); } - const formattedName = Instance.formatName_( - this.projectFormattedName_, - name - ); + const formattedName = Instance.formatName_(this.projectId, name); const displayName = config.displayName || formattedName.split('/').pop(); const reqOpts = { parent: this.projectFormattedName_, diff --git a/src/instance.ts b/src/instance.ts index e9a3bd772..7afa38e09 100644 --- a/src/instance.ts +++ b/src/instance.ts @@ -154,10 +154,7 @@ class Instance extends common.GrpcServiceObject { metadata?: IInstance; resourceHeader_: {[k: string]: string}; constructor(spanner: Spanner, name: string) { - const formattedName_ = Instance.formatName_( - spanner.projectFormattedName_, - name - ); + const formattedName_ = Instance.formatName_(spanner.projectId, name); const methods = { /** * Create an instance. @@ -1489,12 +1486,12 @@ class Instance extends common.GrpcServiceObject { * Instance.formatName_('grape-spaceship-123', 'my-instance'); * // 'projects/grape-spaceship-123/instances/my-instance' */ - static formatName_(projectName: string, name: string) { + static formatName_(projectId: string, name: string) { if (name.indexOf('/') > -1) { return name; } const instanceName = name.split('/').pop(); - return projectName + '/instances/' + instanceName; + return 'projects/' + projectId + '/instances/' + instanceName; } } diff --git a/test/index.ts b/test/index.ts index 7db674c99..b4a3156f0 100644 --- a/test/index.ts +++ b/test/index.ts @@ -510,8 +510,8 @@ describe('Spanner', () => { const stub = sandbox.stub(FakeInstance, 'formatName_').returns(PATH); spanner.request = config => { - const [projectName, name] = stub.lastCall.args; - assert.strictEqual(projectName, spanner.projectFormattedName_); + const [projectId, name] = stub.lastCall.args; + assert.strictEqual(projectId, spanner.projectId); assert.strictEqual(name, NAME); assert.deepStrictEqual(CONFIG, ORIGINAL_CONFIG); diff --git a/test/instance.ts b/test/instance.ts index bdea4cda6..b0a18baaa 100644 --- a/test/instance.ts +++ b/test/instance.ts @@ -114,10 +114,10 @@ describe('Instance', () => { const formatName_ = Instance.formatName_; const formattedName = 'formatted-name'; - Instance.formatName_ = (projectName, name) => { + Instance.formatName_ = (projectId, name) => { Instance.formatName_ = formatName_; - assert.strictEqual(projectName, SPANNER.projectFormattedName_); + assert.strictEqual(projectId, SPANNER.projectId); assert.strictEqual(name, NAME); return formattedName; @@ -178,20 +178,14 @@ describe('Instance', () => { }); describe('formatName_', () => { - const PATH = SPANNER.projectFormattedName_ + '/instances/' + NAME; + const PATH = 'projects/' + SPANNER.projectId + '/instances/' + NAME; it('should return the name if already formatted', () => { - assert.strictEqual( - Instance.formatName_(SPANNER.projectFormattedName_, PATH), - PATH - ); + assert.strictEqual(Instance.formatName_(SPANNER.projectId, PATH), PATH); }); it('should format the name', () => { - const formattedName = Instance.formatName_( - SPANNER.projectFormattedName_, - NAME - ); + const formattedName = Instance.formatName_(SPANNER.projectId, NAME); assert.strictEqual(formattedName, PATH); }); }); From 2c3f3d07c6b789b3a48d74432a97177ae74c7b8a Mon Sep 17 00:00:00 2001 From: alex Date: Sun, 9 Aug 2020 23:03:04 -0400 Subject: [PATCH 08/13] chore: refactor --- src/common.ts | 16 ---------------- src/index.ts | 8 ++++++-- test/index.ts | 12 +++++++----- 3 files changed, 13 insertions(+), 23 deletions(-) diff --git a/src/common.ts b/src/common.ts index d205aad9a..ddc79d4fd 100644 --- a/src/common.ts +++ b/src/common.ts @@ -17,7 +17,6 @@ import {grpc, CallOptions, Operation as GaxOperation} from 'google-gax'; import {google as instanceAdmin} from '../protos/protos'; import {google as databaseAdmin} from '../protos/protos'; -import * as extend from 'extend'; export type IOperation = instanceAdmin.longrunning.IOperation; @@ -76,18 +75,3 @@ export interface PagedOptionsWithFilter extends PagedOptions { * by the backend. */ export const CLOUD_RESOURCE_HEADER = 'google-cloud-resource-prefix'; - -/** - * Returns GAX call options that set the cloud resource header. - * @private - */ -export function addResourcePrefixHeader( - gaxOpts: CallOptions, - headers: {[k: string]: string} -): CallOptions { - return extend(true, {}, gaxOpts, { - otherArgs: { - headers, - }, - }); -} diff --git a/src/index.ts b/src/index.ts index c2caae477..512d5f52c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -39,7 +39,6 @@ import { PagedResponse, PagedCallback, PagedOptionsWithFilter, - addResourcePrefixHeader, CLOUD_RESOURCE_HEADER, } from './common'; import {Session} from './session'; @@ -851,7 +850,12 @@ class Spanner extends GrpcService { const requestFn = gaxClient[config.method].bind( gaxClient, reqOpts, - addResourcePrefixHeader(config.gaxOpts, config.headers) + // Add headers to `gaxOpts` + extend(true, {}, config.gaxOpts, { + otherArgs: { + headers: config.headers, + }, + }) ); callback(null, requestFn); }); diff --git a/test/index.ts b/test/index.ts index b4a3156f0..b9d629b52 100644 --- a/test/index.ts +++ b/test/index.ts @@ -32,7 +32,7 @@ import * as spnr from '../src'; import {Duplex} from 'stream'; import {CreateInstanceRequest} from '../src/index'; import {GetInstanceConfigsOptions, GetInstancesOptions} from '../src'; -import {CLOUD_RESOURCE_HEADER, addResourcePrefixHeader} from '../src/common'; +import {CLOUD_RESOURCE_HEADER} from '../src/common'; // eslint-disable-next-line @typescript-eslint/no-var-requires const apiConfig = require('../src/spanner_grpc_config.json'); @@ -1299,15 +1299,17 @@ describe('Spanner', () => { replaceProjectIdTokenOverride = reqOpts => { return reqOpts; }; + const expectedGaxOpts = extend(true, {}, CONFIG.gaxOpts, { + otherArgs: { + headers: CONFIG.headers, + }, + }); FAKE_GAPIC_CLIENT[CONFIG.method] = function (reqOpts, gaxOpts, arg) { assert.strictEqual(this, FAKE_GAPIC_CLIENT); assert.deepStrictEqual(reqOpts, CONFIG.reqOpts); assert.notStrictEqual(reqOpts, CONFIG.reqOpts); - assert.deepStrictEqual( - gaxOpts, - addResourcePrefixHeader(CONFIG.gaxOpts, CONFIG.headers) - ); + assert.deepStrictEqual(gaxOpts, expectedGaxOpts); arg(); // done() }; From b100d287b15521aa5e7f04f96d75c08275fa6376 Mon Sep 17 00:00:00 2001 From: alex Date: Mon, 10 Aug 2020 11:38:03 -0400 Subject: [PATCH 09/13] chore: revert unrelated refactoring --- src/database.ts | 59 +++++++++-------- src/index.ts | 115 ++++++++++++++++++-------------- src/instance.ts | 171 ++++++++++++++++++++++++++++-------------------- 3 files changed, 199 insertions(+), 146 deletions(-) diff --git a/src/database.ts b/src/database.ts index 71592399f..ad3f14a31 100644 --- a/src/database.ts +++ b/src/database.ts @@ -1316,22 +1316,25 @@ class Database extends GrpcServiceObject { ? optionsOrCallback : ({} as GetSessionsOptions); const gaxOpts = extend(true, {}, options.gaxOptions); + let reqOpts = extend({}, options, { + database: this.formattedName_, + }); + delete reqOpts.gaxOptions; // Copy over pageSize and pageToken values from gaxOptions. // However values set on options take precedence. - const reqOpts = extend( - {}, - { - database: this.formattedName_, - pageSize: gaxOpts.pageSize, - pageToken: gaxOpts.pageToken, - }, - options - ); - - delete reqOpts.gaxOptions; - delete gaxOpts.pageSize; - delete gaxOpts.pageToken; + if (gaxOpts) { + reqOpts = extend( + {}, + { + pageSize: gaxOpts.pageSize, + pageToken: gaxOpts.pageToken, + }, + reqOpts + ); + delete gaxOpts.pageSize; + delete gaxOpts.pageToken; + } this.request< google.spanner.v1.ISession, @@ -1399,21 +1402,25 @@ class Database extends GrpcServiceObject { getSessionsStream(options: GetSessionsOptions = {}): NodeJS.ReadableStream { const gaxOpts = extend(true, {}, options.gaxOptions); + let reqOpts = extend({}, options, { + database: this.formattedName_, + }); + delete reqOpts.gaxOptions; + // Copy over pageSize and pageToken values from gaxOptions. // However values set on options take precedence. - const reqOpts = extend( - {}, - { - database: this.formattedName_, - pageSize: gaxOpts.pageSize, - pageToken: gaxOpts.pageToken, - }, - options - ); - - delete reqOpts.gaxOptions; - delete gaxOpts.pageSize; - delete gaxOpts.pageToken; + if (gaxOpts) { + reqOpts = extend( + {}, + { + pageSize: gaxOpts.pageSize, + pageToken: gaxOpts.pageToken, + }, + reqOpts + ); + delete gaxOpts.pageSize; + delete gaxOpts.pageToken; + } return this.requestStream({ client: 'SpannerClient', diff --git a/src/index.ts b/src/index.ts index 512d5f52c..c43da81d3 100644 --- a/src/index.ts +++ b/src/index.ts @@ -515,20 +515,26 @@ class Spanner extends GrpcService { const gaxOpts = extend(true, {}, options.gaxOptions); + let reqOpts = extend({}, options, { + parent: 'projects/' + this.projectId, + }); + + delete reqOpts.gaxOptions; + // Copy over pageSize and pageToken values from gaxOptions. // However values set on options take precedence. - const reqOpts = extend( - {}, - { - parent: this.projectFormattedName_, - pageSize: gaxOpts.pageSize, - pageToken: gaxOpts.pageToken, - }, - options - ); - delete gaxOpts.pageSize; - delete gaxOpts.pageToken; - delete reqOpts.gaxOptions; + if (gaxOpts) { + reqOpts = extend( + {}, + { + pageSize: gaxOpts.pageSize, + pageToken: gaxOpts.pageToken, + }, + reqOpts + ); + delete gaxOpts.pageToken; + delete gaxOpts.pageSize; + } this.request( { @@ -590,20 +596,25 @@ class Spanner extends GrpcService { getInstancesStream(options: GetInstancesOptions = {}): NodeJS.ReadableStream { const gaxOpts = extend(true, {}, options.gaxOptions); + let reqOpts = extend({}, options, { + parent: 'projects/' + this.projectId, + }); + delete reqOpts.gaxOptions; + // Copy over pageSize and pageToken values from gaxOptions. // However values set on options take precedence. - const reqOpts = extend( - {}, - { - parent: this.projectFormattedName_, - pageSize: gaxOpts.pageSize, - pageToken: gaxOpts.pageToken, - }, - options - ); - delete gaxOpts.pageSize; - delete gaxOpts.pageToken; - delete reqOpts.gaxOptions; + if (gaxOpts) { + reqOpts = extend( + {}, + { + pageSize: gaxOpts.pageSize, + pageToken: gaxOpts.pageToken, + }, + reqOpts + ); + delete gaxOpts.pageSize; + delete gaxOpts.pageToken; + } return this.requestStream({ client: 'InstanceAdminClient', @@ -710,21 +721,25 @@ class Spanner extends GrpcService { : ({} as GetInstanceConfigsOptions); const gaxOpts = extend(true, {}, options.gaxOptions); + let reqOpts = extend({}, options, { + parent: 'projects/' + this.projectId, + }); + delete reqOpts.gaxOptions; // Copy over pageSize and pageToken values from gaxOptions. // However values set on options take precedence. - const reqOpts = extend( - {}, - { - parent: this.projectFormattedName_, - pageSize: gaxOpts.pageSize, - pageToken: gaxOpts.pageToken, - }, - options - ); - delete gaxOpts.pageSize; - delete gaxOpts.pageToken; - delete reqOpts.gaxOptions; + if (gaxOpts) { + reqOpts = extend( + {}, + { + pageSize: gaxOpts.pageSize, + pageToken: gaxOpts.pageToken, + }, + reqOpts + ); + delete gaxOpts.pageSize; + delete gaxOpts.pageToken; + } return this.request( { @@ -776,20 +791,24 @@ class Spanner extends GrpcService { ): NodeJS.ReadableStream { const gaxOpts = extend(true, {}, options.gaxOptions); + let reqOpts = extend({}, options, { + parent: 'projects/' + this.projectId, + }); + // Copy over pageSize and pageToken values from gaxOptions. // However values set on options take precedence. - const reqOpts = extend( - {}, - { - parent: this.projectFormattedName_, - pageSize: gaxOpts.pageSize, - pageToken: gaxOpts.pageToken, - }, - options - ); - delete gaxOpts.pageSize; - delete gaxOpts.pageToken; - delete reqOpts.gaxOptions; + if (gaxOpts) { + reqOpts = extend( + {}, + { + pageSize: gaxOpts.pageSize, + pageToken: gaxOpts.pageToken, + }, + reqOpts + ); + delete gaxOpts.pageSize; + delete gaxOpts.pageToken; + } delete reqOpts.gaxOptions; return this.requestStream({ diff --git a/src/instance.ts b/src/instance.ts index 7afa38e09..9ef764a32 100644 --- a/src/instance.ts +++ b/src/instance.ts @@ -326,21 +326,25 @@ class Instance extends common.GrpcServiceObject { ? optionsOrCallback : ({} as GetBackupsOptions); const gaxOpts = extend(true, {}, options.gaxOptions); + let reqOpts = extend({}, options, { + parent: this.formattedName_, + }); + delete reqOpts.gaxOptions; // Copy over pageSize and pageToken values from gaxOptions. // However values set on options take precedence. - const reqOpts = extend( - {}, - { - parent: this.formattedName_, - pageSize: gaxOpts.pageSize, - pageToken: gaxOpts.pageToken, - }, - options - ); - delete gaxOpts.pageSize; - delete gaxOpts.pageToken; - delete reqOpts.gaxOptions; + if (gaxOpts) { + reqOpts = extend( + {}, + { + pageSize: gaxOpts.pageSize, + pageToken: gaxOpts.pageToken, + }, + reqOpts + ); + delete gaxOpts.pageSize; + delete gaxOpts.pageToken; + } this.request< IBackup, @@ -406,20 +410,25 @@ class Instance extends common.GrpcServiceObject { getBackupsStream(options: GetBackupsOptions = {}): NodeJS.ReadableStream { const gaxOpts = extend(true, {}, options.gaxOptions); + let reqOpts = extend({}, options, { + parent: this.formattedName_, + }); + delete reqOpts.gaxOptions; + // Copy over pageSize and pageToken values from gaxOptions. // However values set on options take precedence. - const reqOpts = extend( - {}, - { - parent: this.formattedName_, - pageSize: gaxOpts.pageSize, - pageToken: gaxOpts.pageToken, - }, - options - ); - delete gaxOpts.pageSize; - delete gaxOpts.pageToken; - delete reqOpts.gaxOptions; + if (gaxOpts) { + reqOpts = extend( + {}, + { + pageSize: gaxOpts.pageSize, + pageToken: gaxOpts.pageToken, + }, + reqOpts + ); + delete gaxOpts.pageSize; + delete gaxOpts.pageToken; + } return this.requestStream({ client: 'DatabaseAdminClient', @@ -513,21 +522,25 @@ class Instance extends common.GrpcServiceObject { ? optionsOrCallback : ({} as GetBackupOperationsOptions); const gaxOpts = extend(true, {}, options.gaxOptions); + let reqOpts = extend({}, options, { + parent: this.formattedName_, + }); + delete reqOpts.gaxOptions; // Copy over pageSize and pageToken values from gaxOptions. // However values set on options take precedence. - const reqOpts = extend( - {}, - { - parent: this.formattedName_, - pageSize: gaxOpts.pageSize, - pageToken: gaxOpts.pageToken, - }, - options - ); - delete gaxOpts.pageSize; - delete gaxOpts.pageToken; - delete reqOpts.gaxOptions; + if (gaxOpts) { + reqOpts = extend( + {}, + { + pageSize: gaxOpts.pageSize, + pageToken: gaxOpts.pageToken, + }, + reqOpts + ); + delete gaxOpts.pageSize; + delete gaxOpts.pageToken; + } this.request< IOperation, @@ -628,21 +641,25 @@ class Instance extends common.GrpcServiceObject { ? optionsOrCallback : ({} as GetDatabaseOperationsOptions); const gaxOpts = extend(true, {}, options.gaxOptions); + let reqOpts = extend({}, options, { + parent: this.formattedName_, + }); + delete reqOpts.gaxOptions; // Copy over pageSize and pageToken values from gaxOptions. // However values set on options take precedence. - const reqOpts = extend( - {}, - { - parent: this.formattedName_, - pageSize: gaxOpts.pageSize, - pageToken: gaxOpts.pageToken, - }, - options - ); - delete gaxOpts.pageSize; - delete gaxOpts.pageToken; - delete reqOpts.gaxOptions; + if (gaxOpts) { + reqOpts = extend( + {}, + { + pageSize: gaxOpts.pageSize, + pageToken: gaxOpts.pageToken, + }, + reqOpts + ); + delete gaxOpts.pageSize; + delete gaxOpts.pageToken; + } this.request< IOperation, @@ -1185,20 +1202,25 @@ class Instance extends common.GrpcServiceObject { : ({} as GetDatabasesOptions); const gaxOpts = extend(true, {}, options.gaxOptions); + let reqOpts = extend({}, options, { + parent: this.formattedName_, + }); + delete reqOpts.gaxOptions; + // Copy over pageSize and pageToken values from gaxOptions. // However values set on options take precedence. - const reqOpts = extend( - {}, - { - parent: this.formattedName_, - pageSize: gaxOpts.pageSize, - pageToken: gaxOpts.pageToken, - }, - options - ); - delete gaxOpts.pageSize; - delete gaxOpts.pageToken; - delete reqOpts.gaxOptions; + if (gaxOpts) { + reqOpts = extend( + {}, + { + pageSize: gaxOpts.pageSize, + pageToken: gaxOpts.pageToken, + }, + reqOpts + ); + delete gaxOpts.pageSize; + delete gaxOpts.pageToken; + } this.request< IDatabase, @@ -1265,20 +1287,25 @@ class Instance extends common.GrpcServiceObject { getDatabasesStream(options: GetDatabasesOptions = {}): NodeJS.ReadableStream { const gaxOpts = extend(true, {}, options.gaxOptions); + let reqOpts = extend({}, options, { + parent: this.formattedName_, + }); + delete reqOpts.gaxOptions; + // Copy over pageSize and pageToken values from gaxOptions. // However values set on options take precedence. - const reqOpts = extend( - {}, - { - parent: this.formattedName_, - pageSize: gaxOpts.pageSize, - pageToken: gaxOpts.pageToken, - }, - options - ); - delete gaxOpts.pageSize; - delete gaxOpts.pageToken; - delete reqOpts.gaxOptions; + if (gaxOpts) { + reqOpts = extend( + {}, + { + pageSize: gaxOpts.pageSize, + pageToken: gaxOpts.pageToken, + }, + reqOpts + ); + delete gaxOpts.pageSize; + delete gaxOpts.pageToken; + } return this.requestStream({ client: 'DatabaseAdminClient', From 83d6e10f527a81bfe76a4d06d222d7fc48216f58 Mon Sep 17 00:00:00 2001 From: alex Date: Mon, 17 Aug 2020 13:53:51 -0400 Subject: [PATCH 10/13] chore: improve unit tests --- test/backup.ts | 16 ++++++++------ test/batch-transaction.ts | 2 +- test/database.ts | 28 ++++++++++++++----------- test/index.ts | 44 ++++++++++++++++++++++++++------------- test/instance.ts | 26 +++++++++++++---------- test/session.ts | 16 ++++++++------ test/transaction.ts | 24 +++++++++++---------- 7 files changed, 94 insertions(+), 62 deletions(-) diff --git a/test/backup.ts b/test/backup.ts index 2c612e569..b41b9b314 100644 --- a/test/backup.ts +++ b/test/backup.ts @@ -68,7 +68,6 @@ describe('Backup', () => { // tslint:disable-next-line variable-name let Backup: typeof bu.Backup; - let resourceHeader: {[k: string]: string}; const INSTANCE = ({ request: util.noop, @@ -100,7 +99,6 @@ describe('Backup', () => { beforeEach(() => { fakeCodec.encode = util.noop; backup = new Backup(INSTANCE, BACKUP_NAME); - resourceHeader = {[CLOUD_RESOURCE_HEADER]: backup.instanceFormattedName_}; }); afterEach(() => sandbox.restore()); @@ -141,6 +139,12 @@ describe('Backup', () => { it('should set the backup id', () => { assert.strictEqual(backup.id, BACKUP_NAME); }); + + it('should set the resourceHeader_', () => { + assert.deepStrictEqual(backup.resourceHeader_, { + [CLOUD_RESOURCE_HEADER]: backup.instanceFormattedName_, + }); + }); }); describe('create', () => { @@ -167,7 +171,7 @@ describe('Backup', () => { assert.notStrictEqual(config.reqOpts, QUERY); assert.deepStrictEqual(QUERY, ORIGINAL_QUERY); - assert.deepStrictEqual(config.headers, resourceHeader); + assert.deepStrictEqual(config.headers, backup.resourceHeader_); done(); }; @@ -300,7 +304,7 @@ describe('Backup', () => { assert.notStrictEqual(config.reqOpts, QUERY); assert.deepStrictEqual(QUERY, ORIGINAL_QUERY); - assert.deepStrictEqual(config.headers, resourceHeader); + assert.deepStrictEqual(config.headers, backup.resourceHeader_); done(); }; @@ -556,7 +560,7 @@ describe('Backup', () => { assert.notStrictEqual(config.reqOpts, QUERY); assert.deepStrictEqual(QUERY, ORIGINAL_QUERY); - assert.deepStrictEqual(config.headers, resourceHeader); + assert.deepStrictEqual(config.headers, backup.resourceHeader_); done(); }; @@ -610,7 +614,7 @@ describe('Backup', () => { assert.notStrictEqual(config.reqOpts, QUERY); assert.deepStrictEqual(QUERY, ORIGINAL_QUERY); - assert.deepStrictEqual(config.headers, resourceHeader); + assert.deepStrictEqual(config.headers, backup.resourceHeader_); done(); }; diff --git a/test/batch-transaction.ts b/test/batch-transaction.ts index 437995bd9..73f18c614 100644 --- a/test/batch-transaction.ts +++ b/test/batch-transaction.ts @@ -208,7 +208,7 @@ describe('BatchTransaction', () => { assert.deepStrictEqual(reqOpts.transaction, {id: ID}); }); - it('should add pass headers argument', done => { + it('should pass headers', done => { batchTransaction.createPartitions_(CONFIG, assert.ifError); const {headers} = REQUEST.lastCall.args[0]; assert.deepStrictEqual(headers, { diff --git a/test/database.ts b/test/database.ts index 324971c64..5f480239b 100644 --- a/test/database.ts +++ b/test/database.ts @@ -184,7 +184,6 @@ describe('Database', () => { let Database: typeof db.Database; // tslint:disable-next-line variable-name let DatabaseCached: typeof db.Database; - let resourceHeader: {[k: string]: string}; const INSTANCE = ({ request: util.noop, @@ -229,7 +228,6 @@ describe('Database', () => { extend(Database, DatabaseCached); database = new Database(INSTANCE, NAME, POOL_OPTIONS); database.parent = INSTANCE; - resourceHeader = {[CLOUD_RESOURCE_HEADER]: database.formattedName_}; }); afterEach(() => sandbox.restore()); @@ -326,6 +324,12 @@ describe('Database', () => { calledWith.createMethod(null, options, done); }); + + it('should set the resourceHeader_', () => { + assert.deepStrictEqual(database.resourceHeader_, { + [CLOUD_RESOURCE_HEADER]: database.formattedName_, + }); + }); }); describe('formatName_', () => { @@ -359,7 +363,7 @@ describe('Database', () => { assert.strictEqual(reqOpts.database, DATABASE_FORMATTED_NAME); assert.strictEqual(reqOpts.sessionCount, count); assert.strictEqual(gaxOpts, undefined); - assert.deepStrictEqual(headers, resourceHeader); + assert.deepStrictEqual(headers, database.resourceHeader_); }); it('should accept just a count number', () => { @@ -717,8 +721,8 @@ describe('Database', () => { assert.deepStrictEqual(config.reqOpts, { database: database.formattedName_, }); - assert.strictEqual(config.gaxOpts, undefined); - assert.deepStrictEqual(config.headers, resourceHeader); + assert.deepStrictEqual(config.gaxOpts, {}); + assert.deepStrictEqual(config.headers, database.resourceHeader_); assert.strictEqual(callback, assert.ifError); }; @@ -990,7 +994,7 @@ describe('Database', () => { name: database.formattedName_, }); assert.deepStrictEqual(config.gaxOpts, {}); - assert.deepStrictEqual(config.headers, resourceHeader); + assert.deepStrictEqual(config.headers, database.resourceHeader_); assert.strictEqual(callback, assert.ifError); return requestReturnValue; }; @@ -1018,7 +1022,7 @@ describe('Database', () => { database: database.formattedName_, }); assert.deepStrictEqual(config.gaxOpts, {}); - assert.deepStrictEqual(config.headers, resourceHeader); + assert.deepStrictEqual(config.headers, database.resourceHeader_); done(); }; @@ -1622,7 +1626,7 @@ describe('Database', () => { statements: STATEMENTS, }); assert.deepStrictEqual(config.gaxOpts, {}); - assert.deepStrictEqual(config.headers, resourceHeader); + assert.deepStrictEqual(config.headers, database.resourceHeader_); assert.strictEqual(callback, assert.ifError); return requestReturnValue; }; @@ -1680,7 +1684,7 @@ describe('Database', () => { database: database.formattedName_, }); assert.deepStrictEqual(config.gaxOpts, gaxOptions); - assert.deepStrictEqual(config.headers, resourceHeader); + assert.deepStrictEqual(config.headers, database.resourceHeader_); done(); }; @@ -2008,7 +2012,7 @@ describe('Database', () => { assert.strictEqual(config.method, 'listSessions'); assert.deepStrictEqual(config.reqOpts, expectedReqOpts); assert.deepStrictEqual(config.gaxOpts, gaxOpts); - assert.deepStrictEqual(config.headers, resourceHeader); + assert.deepStrictEqual(config.headers, database.resourceHeader_); done(); }; @@ -2176,7 +2180,7 @@ describe('Database', () => { assert.notStrictEqual(config.reqOpts, OPTIONS); assert.deepStrictEqual(config.gaxOpts, OPTIONS.gaxOptions); - assert.deepStrictEqual(config.headers, resourceHeader); + assert.deepStrictEqual(config.headers, database.resourceHeader_); return returnValue; }; @@ -2647,7 +2651,7 @@ describe('Database', () => { assert.notStrictEqual(config.reqOpts, QUERY); assert.deepStrictEqual(QUERY, ORIGINAL_QUERY); assert.deepStrictEqual(config.gaxOpts, {}); - assert.deepStrictEqual(config.headers, resourceHeader); + assert.deepStrictEqual(config.headers, database.resourceHeader_); done(); }; diff --git a/test/index.ts b/test/index.ts index 4dbfc481f..859177ee7 100644 --- a/test/index.ts +++ b/test/index.ts @@ -34,6 +34,9 @@ import {CreateInstanceRequest} from '../src/index'; import {GetInstanceConfigsOptions, GetInstancesOptions} from '../src'; import {CLOUD_RESOURCE_HEADER} from '../src/common'; +// Verify that CLOUD_RESOURCE_HEADER is set to a correct value. +assert.strictEqual(CLOUD_RESOURCE_HEADER, 'google-cloud-resource-prefix'); + // eslint-disable-next-line @typescript-eslint/no-var-requires const apiConfig = require('../src/spanner_grpc_config.json'); @@ -129,7 +132,6 @@ describe('Spanner', () => { let Spanner: typeof spnr.Spanner; let spanner: spnr.Spanner; let sandbox: sinon.SinonSandbox; - let resourceHeader: {[k: string]: string}; const OPTIONS = { projectId: 'project-id', @@ -167,7 +169,6 @@ describe('Spanner', () => { spanner = new Spanner(OPTIONS); spanner.projectId = OPTIONS.projectId; replaceProjectIdTokenOverride = null; - resourceHeader = {[CLOUD_RESOURCE_HEADER]: spanner.projectFormattedName_}; }); afterEach(() => sandbox.restore()); @@ -256,6 +257,19 @@ describe('Spanner', () => { assert.strictEqual(config.baseUrl, SERVICE_PATH); }); + it('should set projectFormattedName_', () => { + assert.strictEqual( + spanner.projectFormattedName_, + `projects/${spanner.projectId}` + ); + }); + + it('should set the resourceHeader_', () => { + assert.deepStrictEqual(spanner.resourceHeader_, { + [CLOUD_RESOURCE_HEADER]: spanner.projectFormattedName_, + }); + }); + describe('SPANNER_EMULATOR_HOST', () => { let currentEmulator: string | undefined; @@ -529,7 +543,7 @@ describe('Spanner', () => { }, }); assert.strictEqual(config.gaxOpts, undefined); - assert.deepStrictEqual(config.headers, resourceHeader); + assert.deepStrictEqual(config.headers, spanner.resourceHeader_); done(); }; spanner.createInstance(NAME, CONFIG, assert.ifError); @@ -671,7 +685,7 @@ describe('Spanner', () => { assert.deepStrictEqual(OPTIONS, ORIGINAL_OPTIONS); assert.deepStrictEqual(config.gaxOpts, {}); - assert.deepStrictEqual(config.headers, resourceHeader); + assert.deepStrictEqual(config.headers, spanner.resourceHeader_); done(); }; @@ -699,7 +713,7 @@ describe('Spanner', () => { assert.notStrictEqual(config.gaxOpts, gaxOptions); assert.notDeepStrictEqual(config.gaxOpts, gaxOptions); assert.deepStrictEqual(config.gaxOpts, expectedGaxOpts); - assert.deepStrictEqual(config.headers, resourceHeader); + assert.deepStrictEqual(config.headers, spanner.resourceHeader_); done(); }; @@ -735,7 +749,7 @@ describe('Spanner', () => { assert.notStrictEqual(config.gaxOpts, gaxOptions); assert.notDeepStrictEqual(config.gaxOpts, gaxOptions); assert.deepStrictEqual(config.gaxOpts, expectedGaxOpts); - assert.deepStrictEqual(config.headers, resourceHeader); + assert.deepStrictEqual(config.headers, spanner.resourceHeader_); done(); }; @@ -863,7 +877,7 @@ describe('Spanner', () => { assert.deepStrictEqual(OPTIONS, ORIGINAL_OPTIONS); assert.deepStrictEqual(config.gaxOpts, {}); - assert.deepStrictEqual(config.headers, resourceHeader); + assert.deepStrictEqual(config.headers, spanner.resourceHeader_); return returnValue as Duplex; }; @@ -890,7 +904,7 @@ describe('Spanner', () => { assert.notStrictEqual(config.gaxOpts, gaxOptions); assert.notDeepStrictEqual(config.gaxOpts, gaxOptions); assert.deepStrictEqual(config.gaxOpts, expectedGaxOpts); - assert.deepStrictEqual(config.headers, resourceHeader); + assert.deepStrictEqual(config.headers, spanner.resourceHeader_); return returnValue; }; @@ -925,7 +939,7 @@ describe('Spanner', () => { assert.notStrictEqual(config.gaxOpts, gaxOptions); assert.notDeepStrictEqual(config.gaxOpts, gaxOptions); assert.deepStrictEqual(config.gaxOpts, expectedGaxOpts); - assert.deepStrictEqual(config.headers, resourceHeader); + assert.deepStrictEqual(config.headers, spanner.resourceHeader_); return returnValue; }; @@ -979,7 +993,7 @@ describe('Spanner', () => { const gaxOpts = config.gaxOpts; assert.deepStrictEqual(gaxOpts, options.gaxOptions); - assert.deepStrictEqual(config.headers, resourceHeader); + assert.deepStrictEqual(config.headers, spanner.resourceHeader_); return returnValue; }; @@ -1008,7 +1022,7 @@ describe('Spanner', () => { assert.notStrictEqual(config.gaxOpts, gaxOptions); assert.notDeepStrictEqual(config.gaxOpts, gaxOptions); assert.deepStrictEqual(config.gaxOpts, expectedGaxOpts); - assert.deepStrictEqual(config.headers, resourceHeader); + assert.deepStrictEqual(config.headers, spanner.resourceHeader_); done(); }; @@ -1043,7 +1057,7 @@ describe('Spanner', () => { assert.notStrictEqual(config.gaxOpts, gaxOptions); assert.notDeepStrictEqual(config.gaxOpts, gaxOptions); assert.deepStrictEqual(config.gaxOpts, expectedGaxOpts); - assert.deepStrictEqual(config.headers, resourceHeader); + assert.deepStrictEqual(config.headers, spanner.resourceHeader_); done(); }; @@ -1123,7 +1137,7 @@ describe('Spanner', () => { assert.notStrictEqual(reqOpts, OPTIONS); assert.deepStrictEqual(config.gaxOpts, OPTIONS.gaxOptions); - assert.deepStrictEqual(config.headers, resourceHeader); + assert.deepStrictEqual(config.headers, spanner.resourceHeader_); return returnValue; }; @@ -1177,7 +1191,7 @@ describe('Spanner', () => { assert.notStrictEqual(config.gaxOpts, gaxOptions); assert.notDeepStrictEqual(config.gaxOpts, gaxOptions); assert.deepStrictEqual(config.gaxOpts, expectedGaxOpts); - assert.deepStrictEqual(config.headers, resourceHeader); + assert.deepStrictEqual(config.headers, spanner.resourceHeader_); return returnValue; }; @@ -1217,7 +1231,7 @@ describe('Spanner', () => { assert.notStrictEqual(config.gaxOpts, gaxOptions); assert.notDeepStrictEqual(config.gaxOpts, gaxOptions); assert.deepStrictEqual(config.gaxOpts, expectedGaxOpts); - assert.deepStrictEqual(config.headers, resourceHeader); + assert.deepStrictEqual(config.headers, spanner.resourceHeader_); return returnValue; }; diff --git a/test/instance.ts b/test/instance.ts index b67ecdb99..7ce7c4d24 100644 --- a/test/instance.ts +++ b/test/instance.ts @@ -71,7 +71,6 @@ describe('Instance', () => { // tslint:disable-next-line variable-name let Instance: typeof inst.Instance; let instance: inst.Instance; - let resourceHeader: {[k: string]: string}; const sandbox = sinon.createSandbox(); @@ -98,7 +97,6 @@ describe('Instance', () => { beforeEach(() => { instance = new Instance(SPANNER, NAME); - resourceHeader = {[CLOUD_RESOURCE_HEADER]: instance.formattedName_}; }); describe('instantiation', () => { @@ -175,6 +173,12 @@ describe('Instance', () => { calledWith.createMethod(null, options, done); }); + + it('should set the resourceHeader_', () => { + assert.deepStrictEqual(instance.resourceHeader_, { + [CLOUD_RESOURCE_HEADER]: instance.formattedName_, + }); + }); }); describe('formatName_', () => { @@ -214,7 +218,7 @@ describe('Instance', () => { createStatement: 'CREATE DATABASE `' + NAME + '`', }); assert.strictEqual(config.gaxOpts, undefined); - assert.deepStrictEqual(config.headers, resourceHeader); + assert.deepStrictEqual(config.headers, instance.resourceHeader_); done(); }; @@ -536,7 +540,7 @@ describe('Instance', () => { name: instance.formattedName_, }); assert.deepStrictEqual(config.gaxOpts, {}); - assert.deepStrictEqual(config.headers, resourceHeader); + assert.deepStrictEqual(config.headers, instance.resourceHeader_); callback(); // done() }; @@ -910,7 +914,7 @@ describe('Instance', () => { assert.deepStrictEqual(OPTIONS, ORIGINAL_OPTIONS); assert.deepStrictEqual(config.gaxOpts, OPTIONS.gaxOptions); - assert.deepStrictEqual(config.headers, resourceHeader); + assert.deepStrictEqual(config.headers, instance.resourceHeader_); done(); }; @@ -1099,7 +1103,7 @@ describe('Instance', () => { assert.notStrictEqual(config.reqOpts, OPTIONS); assert.deepStrictEqual(config.gaxOpts, OPTIONS.gaxOptions); - assert.deepStrictEqual(config.headers, resourceHeader); + assert.deepStrictEqual(config.headers, instance.resourceHeader_); return returnValue; }; @@ -1200,7 +1204,7 @@ describe('Instance', () => { name: instance.formattedName_, }); assert.strictEqual(config.gaxOpts, undefined); - assert.deepStrictEqual(config.headers, resourceHeader); + assert.deepStrictEqual(config.headers, instance.resourceHeader_); assert.strictEqual(callback_, callback); return requestReturnValue; @@ -1276,7 +1280,7 @@ describe('Instance', () => { assert.deepStrictEqual(METADATA, ORIGINAL_METADATA); assert.deepStrictEqual(config.gaxOpts, {}); - assert.deepStrictEqual(config.headers, resourceHeader); + assert.deepStrictEqual(config.headers, instance.resourceHeader_); assert.strictEqual(callback_, callback); @@ -1328,7 +1332,7 @@ describe('Instance', () => { assert.deepStrictEqual(OPTIONS, ORIGINAL_OPTIONS); assert.deepStrictEqual(config.gaxOpts, options.gaxOptions); - assert.deepStrictEqual(config.headers, resourceHeader); + assert.deepStrictEqual(config.headers, instance.resourceHeader_); done(); }; @@ -1513,7 +1517,7 @@ describe('Instance', () => { assert.notStrictEqual(config.reqOpts, OPTIONS); assert.deepStrictEqual(config.gaxOpts, OPTIONS.gaxOptions); - assert.deepStrictEqual(config.headers, resourceHeader); + assert.deepStrictEqual(config.headers, instance.resourceHeader_); return returnValue; }; @@ -1780,7 +1784,7 @@ describe('Instance', () => { assert.deepStrictEqual(OPTIONS, ORIGINAL_OPTIONS); assert.deepStrictEqual(config.gaxOpts, options.gaxOptions); - assert.deepStrictEqual(config.headers, resourceHeader); + assert.deepStrictEqual(config.headers, instance.resourceHeader_); done(); }; diff --git a/test/session.ts b/test/session.ts index 15489e831..771479815 100644 --- a/test/session.ts +++ b/test/session.ts @@ -66,7 +66,6 @@ describe('Session', () => { let Session: any; // eslint-disable-next-line @typescript-eslint/no-explicit-any let session: any; - let resourceHeader: {[k: string]: string}; // eslint-disable-next-line @typescript-eslint/no-explicit-any const DATABASE: any = { @@ -93,7 +92,6 @@ describe('Session', () => { beforeEach(() => { session = new Session(DATABASE, NAME); session.parent = DATABASE; - resourceHeader = {[CLOUD_RESOURCE_HEADER]: session.parent.formattedName_}; }); describe('instantiation', () => { @@ -138,6 +136,12 @@ describe('Session', () => { }); }); + it('should set the resourceHeader_', () => { + assert.deepStrictEqual(session.resourceHeader_, { + [CLOUD_RESOURCE_HEADER]: session.parent.formattedName_, + }); + }); + describe('createMethod', () => { it('should create and return a Session', done => { const options = {}; @@ -246,8 +250,8 @@ describe('Session', () => { assert.deepStrictEqual(config.reqOpts, { name: session.formattedName_, }); - assert.strictEqual(config.gaxOpts, undefined); - assert.deepStrictEqual(config.headers, resourceHeader); + assert.deepStrictEqual(config.gaxOpts, {}); + assert.deepStrictEqual(config.headers, session.resourceHeader_); assert.strictEqual(callback_, callback); return requestReturnValue; @@ -281,7 +285,7 @@ describe('Session', () => { name: session.formattedName_, }); assert.deepStrictEqual(config.gaxOpts, {}); - assert.deepStrictEqual(config.headers, resourceHeader); + assert.deepStrictEqual(config.headers, session.resourceHeader_); assert.strictEqual(callback_, callback); return requestReturnValue; }; @@ -314,7 +318,7 @@ describe('Session', () => { sql: 'SELECT 1', }); assert.deepStrictEqual(config.gaxOpts, {}); - assert.deepStrictEqual(config.headers, resourceHeader); + assert.deepStrictEqual(config.headers, session.resourceHeader_); assert.strictEqual(callback_, callback); return requestReturnValue; }; diff --git a/test/transaction.ts b/test/transaction.ts index 74ac660f3..ac19a84b0 100644 --- a/test/transaction.ts +++ b/test/transaction.ts @@ -52,7 +52,6 @@ describe('Transaction', () => { let Transaction; // eslint-disable-next-line @typescript-eslint/no-explicit-any let PartitionedDml; - let resourceHeader: {[k: string]: string}; before(() => { const txns = proxyquire('../src/transaction', { @@ -77,9 +76,6 @@ describe('Transaction', () => { beforeEach(() => { sandbox.stub(Snapshot, 'encodeTimestampBounds').returns(OPTIONS); snapshot = new Snapshot(SESSION); - resourceHeader = { - [CLOUD_RESOURCE_HEADER]: snapshot.session.parent.formattedName_, - }; }); describe('initialization', () => { @@ -114,6 +110,12 @@ describe('Transaction', () => { snapshot.requestStream(); assert.strictEqual(REQUEST_STREAM.callCount, 1); }); + + it('should set the resourceHeader_', () => { + assert.deepStrictEqual(snapshot.resourceHeader_, { + [CLOUD_RESOURCE_HEADER]: snapshot.session.parent.formattedName_, + }); + }); }); describe('begin', () => { @@ -136,7 +138,7 @@ describe('Transaction', () => { assert.strictEqual(method, 'beginTransaction'); assert.strictEqual(reqOpts.session, SESSION_NAME); assert.deepStrictEqual(gaxOpts, {}); - assert.deepStrictEqual(headers, resourceHeader); + assert.deepStrictEqual(headers, snapshot.resourceHeader_); }); it('should send the formatted options', () => { @@ -226,7 +228,7 @@ describe('Transaction', () => { assert.strictEqual(client, 'SpannerClient'); assert.strictEqual(method, 'streamingRead'); - assert.deepStrictEqual(headers, resourceHeader); + assert.deepStrictEqual(headers, snapshot.resourceHeader_); }); it('should use the transaction id if present', () => { @@ -494,7 +496,7 @@ describe('Transaction', () => { assert.strictEqual(client, 'SpannerClient'); assert.strictEqual(method, 'executeStreamingSql'); - assert.deepStrictEqual(headers, resourceHeader); + assert.deepStrictEqual(headers, snapshot.resourceHeader_); }); it('should use the transaction id if present', () => { @@ -1081,7 +1083,7 @@ describe('Transaction', () => { assert.strictEqual(reqOpts.session, SESSION_NAME); assert.deepStrictEqual(reqOpts.transaction, {id: fakeId}); assert.strictEqual(reqOpts.seqno, 1); - assert.deepStrictEqual(headers, resourceHeader); + assert.deepStrictEqual(headers, transaction.resourceHeader_); }); it('should encode sql string statements', () => { @@ -1211,7 +1213,7 @@ describe('Transaction', () => { assert.strictEqual(client, 'SpannerClient'); assert.strictEqual(method, 'beginTransaction'); assert.deepStrictEqual(reqOpts.options, expectedOptions); - assert.deepStrictEqual(headers, resourceHeader); + assert.deepStrictEqual(headers, transaction.resourceHeader_); }); it('should accept gaxOptions', done => { @@ -1236,7 +1238,7 @@ describe('Transaction', () => { assert.strictEqual(method, 'commit'); assert.strictEqual(reqOpts.session, SESSION_NAME); assert.deepStrictEqual(reqOpts.mutations, []); - assert.deepStrictEqual(headers, resourceHeader); + assert.deepStrictEqual(headers, transaction.resourceHeader_); }); it('should accept gaxOptions', done => { @@ -1436,7 +1438,7 @@ describe('Transaction', () => { assert.strictEqual(client, 'SpannerClient'); assert.strictEqual(method, 'rollback'); assert.deepStrictEqual(reqOpts, expectedReqOpts); - assert.deepStrictEqual(headers, resourceHeader); + assert.deepStrictEqual(headers, transaction.resourceHeader_); }); it('should accept gaxOptions', done => { From 06384ed630b1e83452d181ac5c9737d83e57bef1 Mon Sep 17 00:00:00 2001 From: alex Date: Mon, 17 Aug 2020 16:34:51 -0400 Subject: [PATCH 11/13] test: improve test 2 --- test/database.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/database.ts b/test/database.ts index 5f480239b..f7aa21347 100644 --- a/test/database.ts +++ b/test/database.ts @@ -1006,7 +1006,7 @@ describe('Database', () => { it('should accept gaxOptions', done => { const gaxOptions = {}; database.request = config => { - assert.deepStrictEqual(config.gaxOpts, gaxOptions); + assert.strictEqual(config.gaxOpts, gaxOptions); done(); }; database.getMetadata(gaxOptions, assert.ifError); @@ -1665,7 +1665,7 @@ describe('Database', () => { it('should accept gaxOptions', done => { const gaxOptions = {}; database.request = config => { - assert.deepStrictEqual(config.gaxOpts, gaxOptions); + assert.strictEqual(config.gaxOpts, gaxOptions); done(); }; database.updateSchema(STATEMENTS, gaxOptions, assert.ifError); From 0514abcd1851757f17475264c76349f302f107cb Mon Sep 17 00:00:00 2001 From: alex Date: Thu, 20 Aug 2020 15:36:21 -0400 Subject: [PATCH 12/13] fix: improve gaxOptions tests --- test/backup.ts | 4 ++-- test/batch-transaction.ts | 2 +- test/database.ts | 6 +++--- test/instance.ts | 12 ++++++------ test/session.ts | 4 ++-- test/transaction.ts | 12 ++++++------ 6 files changed, 20 insertions(+), 20 deletions(-) diff --git a/test/backup.ts b/test/backup.ts index b41b9b314..ed3bf46eb 100644 --- a/test/backup.ts +++ b/test/backup.ts @@ -190,7 +190,7 @@ describe('Backup', () => { }; backup.request = config => { - assert.deepStrictEqual(config.gaxOpts, gaxOptions); + assert.strictEqual(config.gaxOpts, gaxOptions); done(); }; @@ -317,7 +317,7 @@ describe('Backup', () => { }; backup.request = config => { - assert.deepStrictEqual(config.gaxOpts, gaxOptions); + assert.strictEqual(config.gaxOpts, gaxOptions); done(); }; diff --git a/test/batch-transaction.ts b/test/batch-transaction.ts index 73f18c614..945428156 100644 --- a/test/batch-transaction.ts +++ b/test/batch-transaction.ts @@ -190,7 +190,7 @@ describe('BatchTransaction', () => { const RESPONSE = {partitions: PARTITIONS}; const QUERY = {a: 'b'}; - const CONFIG = {reqOpts: QUERY, gaxOpts: {timeout: 1000}}; + const CONFIG = {reqOpts: QUERY}; beforeEach(() => { batchTransaction.session = (SESSION as {}) as Session; diff --git a/test/database.ts b/test/database.ts index f7aa21347..fa8f8b516 100644 --- a/test/database.ts +++ b/test/database.ts @@ -395,7 +395,7 @@ describe('Database', () => { const {gaxOpts} = stub.lastCall.args[0]; - assert.deepStrictEqual(gaxOpts, gaxOptions); + assert.strictEqual(gaxOpts, gaxOptions); }); it('should return any request errors', done => { @@ -1032,7 +1032,7 @@ describe('Database', () => { it('should accept gaxOptions', done => { const gaxOptions = {}; database.request = config => { - assert.deepStrictEqual(config.gaxOpts, gaxOptions); + assert.strictEqual(config.gaxOpts, gaxOptions); done(); }; @@ -1683,7 +1683,7 @@ describe('Database', () => { assert.deepStrictEqual(config.reqOpts, { database: database.formattedName_, }); - assert.deepStrictEqual(config.gaxOpts, gaxOptions); + assert.strictEqual(config.gaxOpts, gaxOptions); assert.deepStrictEqual(config.headers, database.resourceHeader_); done(); diff --git a/test/instance.ts b/test/instance.ts index 7ce7c4d24..b640e5a63 100644 --- a/test/instance.ts +++ b/test/instance.ts @@ -269,7 +269,7 @@ describe('Instance', () => { it('should accept gaxOptions', done => { const options = Object.assign({}, OPTIONS, {gaxOptions: {}}); instance.request = config => { - assert.deepStrictEqual(config.gaxOpts, options.gaxOptions); + assert.strictEqual(config.gaxOpts, options.gaxOptions); assert.strictEqual(config.reqOpts.gaxOptions, undefined); done(); @@ -568,7 +568,7 @@ describe('Instance', () => { const gaxOptions = {}; instance.request = (config, callback: Function) => { - assert.deepStrictEqual(config.gaxOpts, gaxOptions); + assert.strictEqual(config.gaxOpts, gaxOptions); callback(); // done() }; @@ -672,7 +672,7 @@ describe('Instance', () => { it('should accept and pass gaxOptions to getMetadata', done => { const gaxOptions = {}; (instance.getMetadata as Function) = options => { - assert.deepStrictEqual(options.gaxOptions, gaxOptions); + assert.strictEqual(options.gaxOptions, gaxOptions); done(); }; @@ -757,7 +757,7 @@ describe('Instance', () => { }); it('should accept and pass gaxOptions to instance#create', done => { - const gaxOptions = {}; + const gaxOptions = {timeout: 1000}; const options = Object.assign({}, OPTIONS, {gaxOptions}); instance.create = options => { assert.deepStrictEqual(options.gaxOptions, gaxOptions); @@ -1247,7 +1247,7 @@ describe('Instance', () => { it('should accept gaxOptions', done => { const gaxOptions = {}; instance.request = config => { - assert.deepStrictEqual(config.gaxOpts, gaxOptions); + assert.strictEqual(config.gaxOpts, gaxOptions); done(); }; instance.getMetadata({gaxOptions}, assert.ifError); @@ -1294,7 +1294,7 @@ describe('Instance', () => { it('should accept gaxOptions', done => { const gaxOptions = {}; instance.request = config => { - assert.deepStrictEqual(config.gaxOpts, gaxOptions); + assert.strictEqual(config.gaxOpts, gaxOptions); done(); }; instance.setMetadata(METADATA, gaxOptions, assert.ifError); diff --git a/test/session.ts b/test/session.ts index 771479815..aeb9c45eb 100644 --- a/test/session.ts +++ b/test/session.ts @@ -297,7 +297,7 @@ describe('Session', () => { it('should accept and pass gaxOptions to getMetadata', done => { const gaxOptions = {}; session.request = config => { - assert.deepStrictEqual(config.gaxOpts, gaxOptions); + assert.strictEqual(config.gaxOpts, gaxOptions); done(); }; session.getMetadata(gaxOptions, assert.ifError); @@ -330,7 +330,7 @@ describe('Session', () => { it('should accept gaxOptions', done => { const gaxOptions = {}; session.request = config => { - assert.deepStrictEqual(config.gaxOpts, {}); + assert.strictEqual(config.gaxOpts, gaxOptions); done(); }; session.keepAlive(gaxOptions, assert.ifError); diff --git a/test/transaction.ts b/test/transaction.ts index ac19a84b0..59cbd2313 100644 --- a/test/transaction.ts +++ b/test/transaction.ts @@ -294,7 +294,7 @@ describe('Transaction', () => { const {gaxOpts, reqOpts} = REQUEST_STREAM.lastCall.args[0]; - assert.deepStrictEqual(gaxOpts, fakeOptions); + assert.strictEqual(gaxOpts, fakeOptions); assert.strictEqual(reqOpts.gaxOptions, undefined); }); @@ -575,7 +575,7 @@ describe('Transaction', () => { const {gaxOpts, reqOpts} = REQUEST_STREAM.lastCall.args[0]; assert.strictEqual(reqOpts.gaxOptions, undefined); - assert.deepStrictEqual(gaxOpts, fakeQuery.gaxOptions); + assert.strictEqual(gaxOpts, fakeQuery.gaxOptions); }); it('should update the `seqno` for each call', () => { @@ -1039,7 +1039,7 @@ describe('Transaction', () => { it('should accept gaxOptions', done => { const gaxOptions = {}; transaction.request = config => { - assert.deepStrictEqual(config.gaxOpts, gaxOptions); + assert.strictEqual(config.gaxOpts, gaxOptions); done(); }; transaction.batchUpdate(STRING_STATEMENTS, gaxOptions, assert.ifError); @@ -1219,7 +1219,7 @@ describe('Transaction', () => { it('should accept gaxOptions', done => { const gaxOptions = {}; transaction.request = config => { - assert.deepStrictEqual(config.gaxOpts, gaxOptions); + assert.strictEqual(config.gaxOpts, gaxOptions); done(); }; transaction.begin(gaxOptions, assert.ifError); @@ -1244,7 +1244,7 @@ describe('Transaction', () => { it('should accept gaxOptions', done => { const gaxOptions = {}; transaction.request = config => { - assert.deepStrictEqual(config.gaxOpts, gaxOptions); + assert.strictEqual(config.gaxOpts, gaxOptions); done(); }; transaction.commit(gaxOptions, assert.ifError); @@ -1444,7 +1444,7 @@ describe('Transaction', () => { it('should accept gaxOptions', done => { const gaxOptions = {}; transaction.request = config => { - assert.deepStrictEqual(config.gaxOpts, gaxOptions); + assert.strictEqual(config.gaxOpts, gaxOptions); done(); }; transaction.rollback(gaxOptions, assert.ifError); From 73abe18924a36b5b410bb5bb98721381652ecdd8 Mon Sep 17 00:00:00 2001 From: alex Date: Tue, 25 Aug 2020 12:13:09 -0400 Subject: [PATCH 13/13] chore: remove commented out imports --- src/session.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/session.ts b/src/session.ts index 11ac9ac4f..ea7e78796 100644 --- a/src/session.ts +++ b/src/session.ts @@ -37,8 +37,6 @@ import { } from './database'; import {ServiceObjectConfig} from '@google-cloud/common'; import {NormalCallback, CLOUD_RESOURCE_HEADER} from './common'; -// import {ServiceObjectConfig} from '@google-cloud/common'; -// import {NormalCallback} from './common'; import {grpc, CallOptions} from 'google-gax'; export type GetSessionResponse = [Session, r.Response];