diff --git a/packages/pubsub/src/Subscriber.ts b/packages/pubsub/src/Subscriber.ts index 54aeba4..f583f55 100644 --- a/packages/pubsub/src/Subscriber.ts +++ b/packages/pubsub/src/Subscriber.ts @@ -228,9 +228,9 @@ export class Subscriber { this.logger?.info(`PubSub: Subscription ${subscriptionName} is created`) } else if (options) { const [existingSubscription] = await subscription.getMetadata() - if (options.filter != existingSubscription.filter) { + if ((options.filter || existingSubscription.filter) && options.filter != existingSubscription.filter) { throw new Error(`PubSub: Subscriptions filters are immutable, they can't be changed, subscription: ${subscriptionName},` + - ` currentFilter: ${existingSubscription.filter || 'undefined'}, newFilter: ${options.filter || 'undefined'}`) + ` currentFilter: ${existingSubscription.filter as string}, newFilter: ${options.filter as string}`) } if (this.isMetadataChanged(existingSubscription, options)) { await subscription.setMetadata(options) diff --git a/packages/pubsub/src/__tests__/Subscriber.test.ts b/packages/pubsub/src/__tests__/Subscriber.test.ts index cf0c562..976e66c 100644 --- a/packages/pubsub/src/__tests__/Subscriber.test.ts +++ b/packages/pubsub/src/__tests__/Subscriber.test.ts @@ -74,6 +74,9 @@ describe('Subscriber', () => { iamTopicMock.setPolicy.mockReset() iamSubscriptionMock.setPolicy.mockReset() schemaClientMock.getSchema.mockReset() + loggerMock.info.mockReset() + loggerMock.warn.mockReset() + loggerMock.error.mockReset() }) describe('initialize', () => { @@ -182,6 +185,27 @@ describe('Subscriber', () => { processAbortSpy.mockClear() }) + it('does not throw when deployed again without filter', async () => { + topicMock.exists.mockResolvedValue([true]) + subscriptionMock.exists.mockResolvedValue([true]) + // google cloud returns filter as empty string when no filter is set + subscriptionMock.getMetadata.mockResolvedValue([{ + filter: '', + }]) + + const subscriberWithFilter = new Subscriber({ + topicName, subscriptionName, + subscriptionOptions: { + ...subscriptionOptions, + }, + }, clientMock as unknown as PubSub, + schemaClientMock as unknown as SchemaServiceClient, undefined as unknown as SubscriberClient, loggerMock) + + await subscriberWithFilter.initialize() + + expect(loggerMock.error).not.toHaveBeenCalled() + }) + it('updates metadata if backoff has changed', async () => { topicMock.exists.mockResolvedValue([true]) subscriptionMock.exists.mockResolvedValue([true])