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_StreamMessages()
        {
            // Arrange
            var pubsub = new PubSubMessenger(new PubSubJsonAuthConfig()
            {
                JsonAuthFile   = _fixture.CredentialPath,
                ProjectId      = _fixture.ProjectId,
                ReceiverConfig = new ReceiverConfig
                {
                    EntityName = _fixture.StreamTopicName,
                    CreateEntityIfNotExists = true
                },
                Sender = new SenderConfig
                {
                    EntityName = _fixture.StreamTopicName,
                    CreateEntityIfNotExists = true
                }
            });
            var lorem                     = Lorem.GetSentences(10);
            var waitTimer                 = new Stopwatch();
            var messagesProcessed         = 0;
            var processedAfterCancelCount = 0;

            // Act
            pubsub.Send(lorem).GetAwaiter().GetResult();
            pubsub.Receive <string>((m) =>
            {
                pubsub.Complete(m).GetAwaiter().GetResult();
                messagesProcessed++;
                processedAfterCancelCount++;
            }, (e) =>
            {
            });
            waitTimer.Start();

            do
            {
                Task.Delay(500).GetAwaiter().GetResult();
            } while (waitTimer.Elapsed.TotalSeconds < 5);

            pubsub.CancelReceive <string>();

            Task.Delay(500).GetAwaiter().GetResult();

            waitTimer.Reset();
            waitTimer.Start();
            processedAfterCancelCount = 0; // verify no more messages were processed after cancellation.
            do
            {
                Task.Delay(500).GetAwaiter().GetResult();
            } while (waitTimer.Elapsed.TotalSeconds < 5);

            // Assert
            messagesProcessed.Should().BeGreaterOrEqualTo(1);
            processedAfterCancelCount.Should().Be(0);
        }