public void ActionsTelemetryService_EmitActionEvent_OperationNoOp(NuGetOperationType operationType)
        {
            // Arrange
            var            telemetrySession   = new Mock <ITelemetrySession>();
            TelemetryEvent lastTelemetryEvent = null;

            telemetrySession
            .Setup(x => x.PostEvent(It.IsAny <TelemetryEvent>()))
            .Callback <TelemetryEvent>(x => lastTelemetryEvent = x);

            string operationId = Guid.NewGuid().ToString();

            var actionTelemetryData = new ActionsTelemetryEvent(
                operationId: operationId,
                projectIds: new[] { Guid.NewGuid().ToString() },
                operationType: operationType,
                source: OperationSource.PMC,
                startTime: DateTimeOffset.Now.AddSeconds(-1),
                status: NuGetOperationStatus.NoOp,
                packageCount: 1,
                endTime: DateTimeOffset.Now,
                duration: .40);
            var service = new ActionsTelemetryService(telemetrySession.Object);

            // Act
            service.EmitActionEvent(actionTelemetryData, null);

            // Assert
            VerifyTelemetryEventData(actionTelemetryData, lastTelemetryEvent);
        }
        public void EmitActionEvent(ActionsTelemetryEvent actionTelemetryData, IReadOnlyDictionary <string, double> detailedEvents)
        {
            if (actionTelemetryData == null)
            {
                throw new ArgumentNullException(nameof(actionTelemetryData));
            }

            if (detailedEvents != null)
            {
                // emit granular level events for current operation
                foreach (var eventName in detailedEvents.Keys)
                {
                    EmitActionStepsEvent(actionTelemetryData.OperationId, eventName, detailedEvents[eventName]);
                }
            }

            var telemetryEvent = new TelemetryEvent(
                TelemetryConstants.NugetActionEventName,
                new Dictionary <string, object>
            {
                { TelemetryConstants.OperationIdPropertyName, actionTelemetryData.OperationId },
                { TelemetryConstants.ProjectIdsPropertyName, string.Join(",", actionTelemetryData.ProjectIds) },
                { TelemetryConstants.OperationTypePropertyName, actionTelemetryData.OperationType },
                { TelemetryConstants.OperationSourcePropertyName, actionTelemetryData.Source },
                { TelemetryConstants.PackagesCountPropertyName, actionTelemetryData.PackagesCount },
                { TelemetryConstants.OperationStatusPropertyName, actionTelemetryData.Status },
                { TelemetryConstants.StartTimePropertyName, actionTelemetryData.StartTime.ToString() },
                { TelemetryConstants.EndTimePropertyName, actionTelemetryData.EndTime.ToString() },
                { TelemetryConstants.DurationPropertyName, actionTelemetryData.Duration },
                { TelemetryConstants.ProjectsCountPropertyName, actionTelemetryData.ProjectsCount }
            }
                );

            _telemetrySession.PostEvent(telemetryEvent);
        }
        private void VerifyTelemetryEventData(ActionsTelemetryEvent expected, TelemetryEvent actual)
        {
            Assert.NotNull(actual);
            Assert.Equal(TelemetryConstants.NugetActionEventName, actual.Name);
            Assert.Equal(10, actual.Properties.Count);

            Assert.Equal(expected.OperationType.ToString(), actual.Properties[TelemetryConstants.OperationTypePropertyName].ToString());
            Assert.Equal(expected.Source.ToString(), actual.Properties[TelemetryConstants.OperationSourcePropertyName].ToString());

            TestTelemetryUtility.VerifyTelemetryEventData(expected, actual);
        }