public void GIVENAnyTelemetryClientAndEmptySettings_WHENBotInstrumentationMiddlewareIsConstructed_THENExceptionIsBeingThrown()
        {
            // Arrange
            const SentimentInstrumentationMiddlewareSettings emptySettings = null;

            // Act
            // Assert
            Assert.Throws <ArgumentNullException>(() => new SentimentInstrumentationMiddleware(this.telemetryClient, emptySettings));
        }
        public void GIVENEmptyTelemetryClientAndAnySettings_WHENSentimentInstrumentationMiddlewareIsConstructed_THENExceptionIsBeingThrown(
            SentimentInstrumentationMiddlewareSettings settings)
        {
            // Arrange
            const TelemetryClient emptyTelemetryClient = null;

            // Act
            // Assert
            Assert.Throws <ArgumentNullException>(() => new SentimentInstrumentationMiddleware(emptyTelemetryClient, settings));
        }
        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 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);
        }