public void WhenNoApplicationData_Throws()
        {
            var builder = new TelemetryDataBuilder();

            Assert.Throws <ArgumentNullException>(() => builder.BuildTelemetryData(null, _host, null, null, null, sendHeartbeat: true));
            Assert.Throws <ArgumentNullException>(() => builder.BuildTelemetryData(_application, null, null, null, null, sendHeartbeat: true));

            Assert.Throws <ArgumentNullException>(() => builder.BuildAppClosingTelemetryData(null, _host));
            Assert.Throws <ArgumentNullException>(() => builder.BuildAppClosingTelemetryData(_application, null));
        }
        public void GeneratesExpectedRequestType(
            bool hasConfiguration,
            bool hasDependencies,
            bool hasIntegrations,
            bool sendHeartBeat,
            string expectedRequests)
        {
            var config       = hasConfiguration ? Array.Empty <TelemetryValue>() : null;
            var dependencies = hasDependencies ? new List <DependencyTelemetryData>() : null;
            var integrations = hasIntegrations ? new List <IntegrationTelemetryData>() : null;
            var expected     = string.IsNullOrEmpty(expectedRequests) ? Array.Empty <string>() : expectedRequests.Split(',');
            var builder      = new TelemetryDataBuilder();

            var result = builder.BuildTelemetryData(_application, _host, config, dependencies, integrations, sendHeartBeat);

            result.Should().NotBeNull();
            result.Select(x => x.RequestType)
            .ToArray()
            .Should().BeEquivalentTo(expected);

            using var scope = new AssertionScope();

            // should have incrementing IDs
            result
            .Select(x => x.SeqId)
            .Should()
            .OnlyHaveUniqueItems();

            foreach (var data in result)
            {
                data.Application.Should().Be(_application);
                data.ApiVersion.Should().NotBeNullOrEmpty();
                data.RuntimeId.Should().Be(Tracer.RuntimeId);
                data.TracerTime.Should().BeInRange(0, DateTimeOffset.UtcNow.ToUnixTimeSeconds());

                if (data.Payload is AppDependenciesLoadedPayload appDeps)
                {
                    appDeps.Dependencies.Should().BeSameAs(dependencies);
                }
                else if (data.Payload is AppIntegrationsChangedPayload appIntegrations)
                {
                    appIntegrations.Integrations.Should().BeSameAs(integrations);
                }
                else if (data.Payload is AppStartedPayload appStarted)
                {
                    appStarted.Configuration.Should().BeSameAs(config);
                    appStarted.Dependencies.Should().BeSameAs(dependencies);
                    appStarted.Integrations.Should().BeSameAs(integrations);
                }
                else
                {
                    data.Payload.Should().BeNull();
                }
            }
        }
        public void WhenHasApplicationAndHostData_GeneratesAppClosingTelemetry()
        {
            var builder = new TelemetryDataBuilder();

            var result = builder.BuildAppClosingTelemetryData(_application, _host);

            result.Should().NotBeNull();
            result.Application.Should().Be(_application);
            result.SeqId.Should().Be(1);
            result.Payload.Should().BeNull();
        }
        public void ShouldGenerateIncrementingIds()
        {
            var builder = new TelemetryDataBuilder();

            var config = Array.Empty <TelemetryValue>();
            var data   = builder.BuildTelemetryData(_application, _host, config, null, null, sendHeartbeat: true);

            data.Should().ContainSingle().Which.SeqId.Should().Be(1);

            data = builder.BuildTelemetryData(_application, _host, config, null, null, sendHeartbeat: true);
            data.Should().ContainSingle().Which.SeqId.Should().Be(2);

            var closingData = builder.BuildAppClosingTelemetryData(_application, _host);

            closingData.Should().NotBeNull();
            closingData.SeqId.Should().Be(3);
        }