public async void GIVENDisposedSentimentInstrumentationMiddleware_WHENOnTurnAsyncIsInvoked_THENExceptionIsBeingThrown(
            SentimentInstrumentationMiddlewareSettings settings)
        {
            // Arrange
            var instrumentation = new SentimentInstrumentationMiddleware(this.telemetryClient, settings);

            instrumentation.Dispose();

            // Act
            // Assert
            await Assert.ThrowsAsync <ObjectDisposedException>(() => instrumentation.OnTurnAsync(null, null))
            .ConfigureAwait(false);
        }
        public void GIVENSentimentInstrumentationMiddleware_WHENDisposeIsInvoked_THENOtherResourcesAreBeingDisposedAsWell(
            InstrumentationSettings settings,
            ISentimentClient sentimentClient)
        {
            // Arrange
            var instrumentation = new SentimentInstrumentationMiddleware(this.telemetryClient, sentimentClient, settings);

            // Act
            instrumentation.Dispose();

            // Assert
            Mock.Get(sentimentClient).Verify(sc => sc.Dispose(), Times.Once);
        }
        public async void GIVENEmptyTurnContext_WHENOnTurnAsyncIsInvoked_THENExceptionIsBeingThrown(
            SentimentInstrumentationMiddlewareSettings settings)
        {
            // Arrange
            var instrumentation = new SentimentInstrumentationMiddleware(this.telemetryClient, settings);
            const ITurnContext emptyTurnContext = null;
            NextDelegate       nextDelegate     = Task.FromCanceled;

            // Act
            // Assert
            await Assert.ThrowsAsync <ArgumentNullException>(() => instrumentation.OnTurnAsync(emptyTurnContext, nextDelegate))
            .ConfigureAwait(false);
        }
        public async void GIVENNextTurn_WHENOnTurnAsyncIsInvoked_THENNextTurnIsBeingInvoked(
            ITurnContext turnContext,
            SentimentInstrumentationMiddlewareSettings settings)
        {
            // Arrange
            var instrumentation = new SentimentInstrumentationMiddleware(this.telemetryClient, settings);
            var nextTurnInvoked = false;

            // Act
            await instrumentation.OnTurnAsync(turnContext, token => Task.Run(() => nextTurnInvoked = true, token))
            .ConfigureAwait(false);

            // Assert
            nextTurnInvoked.Should().Be(true);
        }
        public async void GIVENTurnContextWithAnyActivity_WHENOnTurnAsyncIsInvoked_THENSentimentRetrievedEventTelemetryIsBeingSent(
            string activityType,
            int expectedNumberOfInvocations,
            Activity activity,
            ITurnContext turnContext,
            ISentimentClient sentimentClient,
            InstrumentationSettings settings)
        {
            // Arrange
            activity.Type      = activityType;
            activity.ReplyToId = null;
            Mock.Get(turnContext)
            .SetupGet(c => c.Activity)
            .Returns(activity);
            var middleware = new SentimentInstrumentationMiddleware(this.telemetryClient, sentimentClient, settings);

            // Act
            await middleware.OnTurnAsync(turnContext, null)
            .ConfigureAwait(false);

            // Assert
            Mock.Get(sentimentClient).Verify(sc => sc.GetSentiment(It.IsAny <IActivityAdapter>()), Times.Exactly(expectedNumberOfInvocations));
            this.mockTelemetryChannel.Verify(tc => tc.Send(It.IsAny <EventTelemetry>()), Times.Exactly(expectedNumberOfInvocations));
        }