public Task TestTrackAppOpened()
        {
            var mockController            = new Mock <IParseAnalyticsController>();
            var mockCorePlugins           = new Mock <IParseCorePlugins>();
            var mockCurrentUserController = new Mock <IParseCurrentUserController>();

            mockCorePlugins
            .Setup(corePlugins => corePlugins.CurrentUserController)
            .Returns(mockCurrentUserController.Object);

            mockCurrentUserController
            .Setup(controller => controller.GetCurrentSessionTokenAsync(It.IsAny <CancellationToken>()))
            .Returns(Task.FromResult("sessionToken"));

            ParseAnalyticsPlugins plugins = new ParseAnalyticsPlugins();

            plugins.AnalyticsController    = mockController.Object;
            plugins.CorePlugins            = mockCorePlugins.Object;
            ParseAnalyticsPlugins.Instance = plugins;

            return(ParseAnalytics.TrackAppOpenedAsync().ContinueWith(t => {
                Assert.IsFalse(t.IsFaulted);
                Assert.IsFalse(t.IsCanceled);
                mockController.Verify(obj => obj.TrackAppOpenedAsync(It.Is <string>(pushHash => pushHash == null),
                                                                     It.IsAny <string>(),
                                                                     It.IsAny <CancellationToken>()), Times.Exactly(1));
            }));
        }
        public Task TestTrackEventWithDimension()
        {
            var mockController            = new Mock <IParseAnalyticsController>();
            var mockCorePlugins           = new Mock <IParseCorePlugins>();
            var mockCurrentUserController = new Mock <IParseCurrentUserController>();

            mockCorePlugins
            .Setup(corePlugins => corePlugins.CurrentUserController)
            .Returns(mockCurrentUserController.Object);

            mockCurrentUserController
            .Setup(controller => controller.GetCurrentSessionTokenAsync(It.IsAny <CancellationToken>()))
            .Returns(Task.FromResult("sessionToken"));

            ParseAnalyticsPlugins plugins = new ParseAnalyticsPlugins();

            plugins.AnalyticsController    = mockController.Object;
            plugins.CorePlugins            = mockCorePlugins.Object;
            ParseAnalyticsPlugins.Instance = plugins;

            var dimensions = new Dictionary <string, string>()
            {
                { "facebook", "hq" }
            };

            return(ParseAnalytics.TrackEventAsync("SomeEvent", dimensions).ContinueWith(t => {
                Assert.IsFalse(t.IsFaulted);
                Assert.IsFalse(t.IsCanceled);
                mockController.Verify(obj => obj.TrackEventAsync(It.Is <string>(eventName => eventName == "SomeEvent"),
                                                                 It.Is <IDictionary <string, string> >(dict => dict != null && dict.Count == 1),
                                                                 It.IsAny <string>(),
                                                                 It.IsAny <CancellationToken>()), Times.Exactly(1));
            }));
        }