Skip to content

Commit 7736080

Browse files
authored
feat: support callbacks for exists(), getState(), getExpireTime() methods (#1070)
1 parent 558692f commit 7736080

File tree

2 files changed

+122
-2
lines changed

2 files changed

+122
-2
lines changed

src/backup.ts

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,14 @@
1313
* limitations under the License.
1414
*/
1515

16-
import {promisifyAll} from '@google-cloud/promisify';
16+
import {promisifyAll, callbackifyAll} from '@google-cloud/promisify';
1717
import {Instance} from './instance';
1818
import {
1919
IOperation,
2020
LongRunningCallback,
2121
RequestCallback,
2222
ResourceCallback,
23+
NormalCallback,
2324
} from './common';
2425
import {EnumKey, Spanner, RequestConfig, TranslateEnumKeys} from '.';
2526
import {
@@ -77,6 +78,11 @@ interface BackupRequest {
7778
): void;
7879
<T>(config: RequestConfig, callback: RequestCallback<T>): void;
7980
}
81+
export type GetStateCallback = NormalCallback<
82+
EnumKey<typeof databaseAdmin.spanner.admin.database.v1.Backup.State>
83+
>;
84+
export type GetExpireTimeCallback = NormalCallback<PreciseDate>;
85+
export type ExistsCallback = NormalCallback<boolean>;
8086
/**
8187
* The {@link Backup} class represents a Cloud Spanner backup.
8288
*
@@ -185,7 +191,6 @@ class Backup {
185191
);
186192
}
187193

188-
getMetadata(): Promise<GetMetadataResponse>;
189194
getMetadata(gaxOptions?: CallOptions): Promise<GetMetadataResponse>;
190195
getMetadata(callback: GetMetadataCallback): void;
191196
getMetadata(gaxOptions: CallOptions, callback: GetMetadataCallback): void;
@@ -248,6 +253,12 @@ class Backup {
248253
);
249254
}
250255

256+
getState(): Promise<
257+
| EnumKey<typeof databaseAdmin.spanner.admin.database.v1.Backup.State>
258+
| undefined
259+
| null
260+
>;
261+
getState(callback: GetStateCallback): void;
251262
/**
252263
* Retrieves the state of the backup.
253264
*
@@ -256,6 +267,7 @@ class Backup {
256267
* @see {@link #getMetadata}
257268
*
258269
* @method Backup#getState
270+
* @param {GetStateCallback} [callback] Callback function.
259271
* @returns {Promise<EnumKey<typeof, databaseAdmin.spanner.admin.database.v1.Backup.State> | undefined>}
260272
* When resolved, contains the current state of the backup if it exists.
261273
*
@@ -276,6 +288,8 @@ class Backup {
276288
return backupInfo.state;
277289
}
278290

291+
getExpireTime(): Promise<PreciseDate | undefined>;
292+
getExpireTime(callback: GetExpireTimeCallback): void;
279293
/**
280294
* Retrieves the expiry time of the backup.
281295
*
@@ -299,6 +313,8 @@ class Backup {
299313
return new PreciseDate(backupInfo.expireTime as DateStruct);
300314
}
301315

316+
exists(): Promise<boolean>;
317+
exists(callback: ExistsCallback): void;
302318
/**
303319
* Checks whether the backup exists.
304320
*
@@ -492,6 +508,15 @@ promisifyAll(Backup, {
492508
exclude: ['getState', 'getExpireTime', 'exists'],
493509
});
494510

511+
/*! Developer Documentation
512+
*
513+
* All async methods (except for streams) will return a Promise in the event
514+
* that a callback is omitted.
515+
*/
516+
callbackifyAll(Backup, {
517+
exclude: ['create', 'getMetadata', 'updateExpireTime', 'delete'],
518+
});
519+
495520
/**
496521
* Reference to the {@link Backup} class.
497522
* @name module:@google-cloud/spanner.Backup

test/backup.ts

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import {GetMetadataResponse} from '../src/backup';
2929
import {grpc} from 'google-gax';
3030

3131
let promisified = false;
32+
// let callbackified = false;
3233
const fakePfy = extend({}, pfy, {
3334
promisifyAll(klass, options) {
3435
if (klass.name !== 'Backup') {
@@ -364,6 +365,35 @@ describe('Backup', () => {
364365
assert.deepStrictEqual(thrown, err);
365366
}
366367
});
368+
369+
it('should accept callback and return state', done => {
370+
const BACKUP_INFO_RESPONSE: GetMetadataResponse = [
371+
{
372+
state: 'CREATING',
373+
},
374+
];
375+
backup.getMetadata = async () => BACKUP_INFO_RESPONSE;
376+
377+
backup.getState((err, state) => {
378+
if (err) {
379+
assert.ifError(err);
380+
}
381+
assert.strictEqual(state, 'CREATING');
382+
done();
383+
});
384+
});
385+
386+
it('should accept callback and return errors', done => {
387+
const err = {code: grpc.status.INTERNAL};
388+
backup.getMetadata = async () => {
389+
throw err;
390+
};
391+
392+
backup.getState(error => {
393+
assert.strictEqual(error, err);
394+
done();
395+
});
396+
});
367397
});
368398

369399
describe('getExpireTime', () => {
@@ -392,6 +422,32 @@ describe('Backup', () => {
392422
assert.deepStrictEqual(thrown, err);
393423
}
394424
});
425+
426+
it('should accept callback and return the expire time from backup info', done => {
427+
const BACKUP_INFO_RESPONSE: GetMetadataResponse = [
428+
{
429+
expireTime: EXP_BACKUP_EXPIRE_TIME.toStruct(),
430+
},
431+
];
432+
backup.getMetadata = async () => BACKUP_INFO_RESPONSE;
433+
434+
backup.getExpireTime((err, result) => {
435+
assert.deepStrictEqual(result, EXP_BACKUP_EXPIRE_TIME);
436+
done();
437+
});
438+
});
439+
440+
it('should accept callback and return errors', done => {
441+
const err = {code: grpc.status.INTERNAL};
442+
backup.getMetadata = async () => {
443+
throw err;
444+
};
445+
446+
backup.getExpireTime(error => {
447+
assert.deepStrictEqual(error, err);
448+
done();
449+
});
450+
});
395451
});
396452

397453
describe('exists', () => {
@@ -425,6 +481,45 @@ describe('Backup', () => {
425481
assert.deepStrictEqual(thrown, err);
426482
}
427483
});
484+
485+
it('should accept backup and return true when backup info indicates backup exists', done => {
486+
const BACKUP_INFO_RESPONSE: GetMetadataResponse = [{}];
487+
backup.getMetadata = async () => BACKUP_INFO_RESPONSE;
488+
489+
backup.exists((err, result) => {
490+
if (err) {
491+
assert.ifError(err);
492+
}
493+
assert.strictEqual(result, true);
494+
done();
495+
});
496+
});
497+
498+
it('should accept callback and return false when backup does not exist', done => {
499+
backup.getMetadata = async () => {
500+
throw {code: grpc.status.NOT_FOUND};
501+
};
502+
503+
backup.exists((err, result) => {
504+
if (err) {
505+
assert.ifError(err);
506+
}
507+
assert.strictEqual(result, false);
508+
done();
509+
});
510+
});
511+
512+
it('should accept callback and return other errors', done => {
513+
const err = {code: grpc.status.INTERNAL};
514+
backup.getMetadata = async () => {
515+
throw err;
516+
};
517+
518+
backup.exists(error => {
519+
assert.strictEqual(error, err);
520+
done();
521+
});
522+
});
428523
});
429524

430525
describe('updateExpireTime', () => {

0 commit comments

Comments
 (0)