public void Test_PubSubMessenger_InvalidOperation()
        {
            // Arrange
            var messenger = new PubSubMessenger(new PubSubJsonAuthConfig()
            {
                JsonAuthFile = new ConfigurationBuilder().AddJsonFile("appSettings.json").Build()["CredentialPath"],
                ProjectId    = "12345"
            });

            // Act/Assert
            Assert.Throws <InvalidOperationException>(() => messenger.Receive <object>(null, null));
            Assert.Throws <ArgumentException>(() => messenger.ReceiveOne <object>("").GetAwaiter().GetResult());
            Assert.Throws <InvalidOperationException>(() => messenger.StartReceive <object>());
            Assert.Throws <InvalidOperationException>(() => messenger.ReceiveOne <object>());
            Assert.Throws <InvalidOperationException>(() => messenger.ReceiveBatchEntity <object>().GetAwaiter().GetResult());

            // Additional runs here purely to increase code coverage. Not particularly useful tests but it does confirm functionality.
            messenger.Complete <object>(null).GetAwaiter().GetResult();
            messenger.CompleteAll(new object[] { null }).GetAwaiter().GetResult();
            messenger.Abandon(new object());
            messenger.Error <object>(null).GetAwaiter().GetResult();
            messenger.Error(new object()).GetAwaiter().GetResult();
            var props = messenger.ReadProperties <object>(null);

            props.Should().BeNull();
        }
        public void Test_PubSubMessenger_MessageFiltering()
        {
            // Arrange
            var messenger = new PubSubMessenger(new PubSubJsonAuthConfig()
            {
                JsonAuthFile = _fixture.CredentialPath,
                ProjectId    = _fixture.ProjectId
            });
            var manager = messenger.EntityManager as PubSubManager;

            // Act
            // Create the filter topic for testing.
            manager.CreateTopicDefaults(_fixture.MessageFilterTopic, null, "defaultsub").GetAwaiter().GetResult();
            manager.CreateSubscription(_fixture.MessageFilterTopic, "filteredsub", "attributes:pickme").GetAwaiter().GetResult();

            // Send two messages, one that wont be picked up by the filter subscription and the other that
            // will.  The result is two messages to the defaultsub, one to filteredsub
            messenger.Send(_fixture.MessageFilterTopic, "test").GetAwaiter().GetResult();
            messenger.Send(_fixture.MessageFilterTopic, "testfilter", new KeyValuePair <string, object>[]
            {
                new KeyValuePair <string, object>("pickme", "please")
            }).GetAwaiter().GetResult();

            // Receive from both subscriptions.
            var nonFilteredMessages = messenger.ReceiveBatch <string>("defaultsub", 100).GetAwaiter().GetResult();
            var filteredMessages    = messenger.ReceiveBatch <string>("filteredsub", 100).GetAwaiter().GetResult();
            var filteredMessage     = messenger.ReceiveOne <string>("filteredsub").GetAwaiter().GetResult();

            // Assert
            nonFilteredMessages.Count().Should().Be(2);
            filteredMessages.Count().Should().Be(1);
            filteredMessage.Should().NotBe(null);
            filteredMessage.Should().Be("testfilter");
        }