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 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"));
        }