public async Task TestCallingDispatchWithoutNewEvents()
        {
            var payload = await PiwikMocker.SubmitAndReceive(analytics, url);

            Assert.That(payload, Is.Empty);
            analytics.TrackPage("Main");
            payload = await PiwikMocker.SubmitAndReceive(analytics, url);

            Assert.That(payload, Is.Not.Empty);
        }
        public async Task TestServerErrorWhileDispatching()
        {
            analytics.TrackPage("Main");

            var receivedData = await PiwikMocker.SubmitAndReceive(analytics, url, statusCode : 500);

            Assert.That(analytics.UnsentActions, Is.EqualTo(1));

            receivedData = await PiwikMocker.SubmitAndReceive(analytics, url);

            await analytics.Dispatch();

            Assert.That(analytics.UnsentActions, Is.EqualTo(0));
        }
        public static async Task <string> SubmitAndReceive(PiwikAnalytics analytics, string url, int statusCode = 200)
        {
            var tokenSource = new CancellationTokenSource();

            var receivedData = PiwikMocker.Receive(url, tokenSource.Token, statusCode);
            var dispatched   = await analytics.Dispatch();

            if (dispatched)
            {
                return(await receivedData);
            }

            tokenSource.Cancel();
            return("");
        }
        public async Task TestTrackEvent()
        {
            analytics.TrackEvent("cat", "some action");

            var receivedData = await PiwikMocker.SubmitAndReceive(analytics, url);

            Assert.That(analytics.UnsentActions, Is.EqualTo(0));

            var json = JObject.Parse(receivedData);
            var main = json["requests"][0].ToString();

            Assert.That(main, Does.Not.Contain("action_name="), "events do not have an action name (checked with javascript and android sdk)");
            Assert.That(main, Does.Contain("e_a=some+action"));
            Assert.That(main, Does.Contain("e_c=cat"));
            Assert.That(main, Does.Contain("url="), "events should always send an url because piwik can be configured to drop data which are not targeted at a specific domain");
        }
        public async Task TestTrackingPageVisits()
        {
            analytics.TrackPage("Main");
            analytics.TrackPage("LevelA / Sub");

            var receivedData = await PiwikMocker.SubmitAndReceive(analytics, url);

            Assert.That(analytics.UnsentActions, Is.EqualTo(0));

            var json = JObject.Parse(receivedData);
            var main = json["requests"][0].ToString();

            Assert.That(main, Does.Contain("action_name=Main"));
            var sub = json["requests"][1].ToString();

            Assert.That(sub, Does.Contain("action_name=LevelA+%2f+Sub"));
        }
        public async Task TestConnectionErrorWhileDispatching()
        {
            analytics.TrackPage("Main");

            await analytics.Dispatch();

            Assert.That(analytics.UnsentActions, Is.EqualTo(1));

            var receivedData = PiwikMocker.Receive(url);

            Thread.Sleep(100); // delay before dispaching to make sure the mocked server has opend the port
            await analytics.Dispatch();

            await receivedData;

            Assert.That(analytics.UnsentActions, Is.EqualTo(0));
        }