public void Generate_WhenNullInstance_ThrowsException()
        {
            // Arrange
            var systemUnderTest = new CombinedComplianceReport();

            // Act
            var actualException = Record.Exception(() => systemUnderTest.Generate(null));

            // Assert
            actualException.Should().NotBeNull();
            actualException.Should().BeOfType <ArgumentNullException>();
        }
        public void DataOptions_WhenCalled_ShouldRequestBuildAndArtifacts()
        {
            // Arrange
            var expected        = DataOptions.Build | DataOptions.BuildArtifacts | DataOptions.Git | DataOptions.GitPolicies | DataOptions.Release | DataOptions.ReleaseDetails | DataOptions.ReleaseDefinitions;
            var systemUnderTest = new CombinedComplianceReport();

            // Act
            var actual = systemUnderTest.DataOptions;

            // Assert
            actual.Should().Be(expected);
        }
        public async Task Title_WhenCalled_ShouldReturnUniqueString()
        {
            // Arrange
            var systemUnderTest = new CombinedComplianceReport();

            // Act
            var actual = systemUnderTest.Title;
            await Task.Delay(2000).ConfigureAwait(false); // Wait 2 seconds

            var secondTitle = systemUnderTest.Title;

            // Assert
            actual.Should().NotBeNullOrEmpty();
            actual.Should().NotBe(secondTitle);
        }
        public void Generate_WithInstance_GeneratesReport()
        {
            // Arrange
            var expected    = this.GetExpectedReport();
            var testUri     = new Uri("https://www.example.com/");
            var testString  = "testValue";
            var testInt     = 1;
            var testGuid    = Guid.NewGuid();
            var testResult  = AzureDevOpsTaskResult.Succeeded;
            var testState   = AzureDevOpsTimelineRecordState.Completed;
            var testProject = new AzureDevOpsProject
            {
                Name   = testString,
                Builds = new HashSet <AzureDevOpsBuild>
                {
                    new AzureDevOpsBuild
                    {
                        Reason      = AzureDevOpsBuildReason.Manual,
                        BuildNumber = testString,
                        Links       = new AzureDevOpsBuildLinks
                        {
                            Web = new AzureDevOpsLink
                            {
                                Href = testUri,
                            },
                        },
                    },
                    new AzureDevOpsBuild
                    {
                        Reason      = AzureDevOpsBuildReason.Schedule,
                        BuildNumber = testString,
                        Timeline    = new AzureDevOpsBuildTimeline
                        {
                            Records = new HashSet <AzureDevOpsTimelineRecord>
                            {
                                new AzureDevOpsTimelineRecord
                                {
                                    Name   = "nope",
                                    Order  = testInt,
                                    Result = testResult,
                                    State  = testState,
                                    Task   = new AzureDevOpsTask
                                    {
                                        Id      = testGuid,
                                        Name    = testString,
                                        Version = testString,
                                    },
                                    Type = testString,
                                },
                            },
                        },
                        Links = new AzureDevOpsBuildLinks
                        {
                            Web = new AzureDevOpsLink
                            {
                                Href = testUri,
                            },
                        },
                    },
                    new AzureDevOpsBuild
                    {
                        Reason      = AzureDevOpsBuildReason.BatchedCI,
                        BuildNumber = testString,
                        Timeline    = new AzureDevOpsBuildTimeline
                        {
                            Records = new HashSet <AzureDevOpsTimelineRecord>
                            {
                                new AzureDevOpsTimelineRecord
                                {
                                    Name   = "Sonarstep",
                                    Order  = 1,
                                    Result = AzureDevOpsTaskResult.Succeeded,
                                    State  = AzureDevOpsTimelineRecordState.Completed,
                                    Task   = new AzureDevOpsTask
                                    {
                                        Id      = testGuid,
                                        Name    = "SonarQubePublish",
                                        Version = testString,
                                    },
                                    Type = testString,
                                },
                                new AzureDevOpsTimelineRecord
                                {
                                    Name   = "execTest",
                                    Order  = 2,
                                    Result = AzureDevOpsTaskResult.Succeeded,
                                    State  = AzureDevOpsTimelineRecordState.Completed,
                                    Task   = new AzureDevOpsTask
                                    {
                                        Id      = testGuid,
                                        Name    = testString,
                                        Version = testString,
                                    },
                                    Type = testString,
                                },
                            },
                        },
                        Links = new AzureDevOpsBuildLinks
                        {
                            Web = new AzureDevOpsLink
                            {
                                Href = testUri,
                            },
                        },
                    },
                },
                Repositories = new HashSet <AzureDevOpsRepository>
                {
                    new AzureDevOpsRepository
                    {
                        Name     = testString,
                        WebUrl   = testUri,
                        Policies = new HashSet <AzureDevOpsPolicy>(),
                    },
                    new AzureDevOpsRepository
                    {
                        Name     = testString,
                        WebUrl   = testUri,
                        Policies = new HashSet <AzureDevOpsPolicy>
                        {
                            new AzureDevOpsPolicy
                            {
                                IsBlocking = true,
                                IsEnabled  = true,
                                PolicyType = new AzureDevOpsPolicyType
                                {
                                    Id = new Guid(PolicyType.MinimumNumberOfReviewers),
                                },
                                Settings = new AzureDevOpsPolicySettings
                                {
                                    MinimumApproverCount = 2,
                                    ResetOnSourcePush    = true,
                                    Scope = new HashSet <AzureDevOpsPolicyScope>
                                    {
                                        new AzureDevOpsPolicyScope
                                        {
                                            RefName = "refs/heads/master",
                                        },
                                    },
                                },
                            },
                            new AzureDevOpsPolicy
                            {
                                IsBlocking = true,
                                IsEnabled  = true,
                                PolicyType = new AzureDevOpsPolicyType
                                {
                                    Id = new Guid(PolicyType.ActiveComments),
                                },
                                Settings = new AzureDevOpsPolicySettings
                                {
                                    Scope = new HashSet <AzureDevOpsPolicyScope>
                                    {
                                        new AzureDevOpsPolicyScope
                                        {
                                            RefName = "refs/heads/master",
                                        },
                                    },
                                },
                            },
                            new AzureDevOpsPolicy
                            {
                                IsBlocking = true,
                                IsEnabled  = true,
                                PolicyType = new AzureDevOpsPolicyType
                                {
                                    Id = new Guid(PolicyType.SuccessfulBuild),
                                },
                                Settings = new AzureDevOpsPolicySettings
                                {
                                    Scope = new HashSet <AzureDevOpsPolicyScope>
                                    {
                                        new AzureDevOpsPolicyScope
                                        {
                                            RefName = "refs/heads/master",
                                        },
                                    },
                                },
                            },
                        },
                    },
                },
                ReleaseDefinitions = new HashSet <AzureDevOpsReleaseDefinition>
                {
                    new AzureDevOpsReleaseDefinition
                    {
                        Name  = testString,
                        Url   = testUri,
                        Links = new AzureDevOpsReleaseLinks
                        {
                            Web = new AzureDevOpsLink
                            {
                                Href = testUri,
                            },
                        },
                        Triggers = new HashSet <AzureDevOpsTrigger>
                        {
                            new AzureDevOpsTrigger
                            {
                                TriggerType       = AzureDevOpsTriggerType.ArtifactSource,
                                TriggerConditions = new HashSet <AzureDevOpsTriggerCondition>
                                {
                                    new AzureDevOpsTriggerCondition
                                    {
                                        SourceBranch = testString,
                                    },
                                },
                            },
                        },
                        Environments = new HashSet <AzureDevOpsReleaseDefinitionEnvironment>
                        {
                            new AzureDevOpsReleaseDefinitionEnvironment
                            {
                                Name = testString,
                                PreDeployApprovals = new AzureDevOpsReleaseDefinitionApproval
                                {
                                    Approvals = new HashSet <AzureDevOpsReleaseDefinitionApprovalStep>
                                    {
                                        new AzureDevOpsReleaseDefinitionApprovalStep
                                        {
                                            IsAutomated = true,
                                        },
                                    },
                                },
                                PostDeployApprovals = new AzureDevOpsReleaseDefinitionApproval
                                {
                                    Approvals = new HashSet <AzureDevOpsReleaseDefinitionApprovalStep>
                                    {
                                        new AzureDevOpsReleaseDefinitionApprovalStep
                                        {
                                            IsAutomated = true,
                                        },
                                    },
                                },
                                Conditions = new HashSet <AzureDevOpsCondition>
                                {
                                    new AzureDevOpsCondition
                                    {
                                        ConditionType = AzureDevOpsConditionType.Event,
                                        Name          = testString,
                                        Value         = testString,
                                    },
                                },
                            },
                            new AzureDevOpsReleaseDefinitionEnvironment
                            {
                                Name = testString,
                                PreDeployApprovals = new AzureDevOpsReleaseDefinitionApproval
                                {
                                    Approvals = new HashSet <AzureDevOpsReleaseDefinitionApprovalStep>
                                    {
                                        new AzureDevOpsReleaseDefinitionApprovalStep
                                        {
                                            IsAutomated = false,
                                            Approver    = new AzureDevOpsIdentity
                                            {
                                                DisplayName = testString,
                                            },
                                        },
                                    },
                                },
                                PostDeployApprovals = new AzureDevOpsReleaseDefinitionApproval
                                {
                                    Approvals = new HashSet <AzureDevOpsReleaseDefinitionApprovalStep>
                                    {
                                        new AzureDevOpsReleaseDefinitionApprovalStep
                                        {
                                            IsAutomated = false,
                                            Approver    = new AzureDevOpsIdentity
                                            {
                                                DisplayName = testString,
                                            },
                                        },
                                    },
                                },
                                Conditions = new HashSet <AzureDevOpsCondition>
                                {
                                    new AzureDevOpsCondition
                                    {
                                        ConditionType = AzureDevOpsConditionType.EnvironmentState,
                                        Name          = testString,
                                        Value         = testString,
                                    },
                                },
                                DeployPhases = new HashSet <AzureDevOpsDeployPhase>
                                {
                                    new AzureDevOpsDeployPhase
                                    {
                                        WorkflowTasks = new HashSet <AzureDevOpsWorkflowTask>
                                        {
                                            new AzureDevOpsWorkflowTask
                                            {
                                                Name = testString,
                                            },
                                            new AzureDevOpsWorkflowTask
                                            {
                                                Name = testString,
                                            },
                                        },
                                    },
                                },
                            },
                        },
                    },
                },
                Releases = new HashSet <AzureDevOpsRelease>
                {
                    new AzureDevOpsRelease
                    {
                        Name         = testString,
                        Environments = new HashSet <AzureDevOpsEnvironment>
                        {
                            new AzureDevOpsEnvironment
                            {
                                Name               = testString,
                                TriggerReason      = "Manual",
                                PreDeployApprovals = new HashSet <AzureDevOpsDeployApproval>
                                {
                                    new AzureDevOpsDeployApproval
                                    {
                                        Attempt     = testInt,
                                        IsAutomated = true,
                                    },
                                },
                                DeploySteps = new HashSet <AzureDevOpsDeployStep>
                                {
                                    new AzureDevOpsDeployStep
                                    {
                                        Attempt = testInt,
                                    },
                                },
                            },
                        },
                        Links = new AzureDevOpsReleaseLinks
                        {
                            Web = new AzureDevOpsLink
                            {
                                Href = testUri,
                            },
                        },
                    },
                    new AzureDevOpsRelease
                    {
                        Name         = testString,
                        Environments = new HashSet <AzureDevOpsEnvironment>
                        {
                            new AzureDevOpsEnvironment
                            {
                                Name               = testString,
                                TriggerReason      = testString,
                                PreDeployApprovals = new HashSet <AzureDevOpsDeployApproval>
                                {
                                    new AzureDevOpsDeployApproval
                                    {
                                        Attempt     = testInt,
                                        IsAutomated = false,
                                        ApprovedBy  = new AzureDevOpsIdentity(),
                                    },
                                },
                                DeploySteps = new HashSet <AzureDevOpsDeployStep>
                                {
                                    new AzureDevOpsDeployStep
                                    {
                                        Attempt             = testInt,
                                        ReleaseDeployPhases = new HashSet <AzureDevOpsReleaseDeployPhase>
                                        {
                                            new AzureDevOpsReleaseDeployPhase
                                            {
                                                DeploymentJobs = new HashSet <AzureDevOpsDeploymentJob>
                                                {
                                                    new AzureDevOpsDeploymentJob
                                                    {
                                                        Tasks = new HashSet <AzureDevOpsDeploymentTask>
                                                        {
                                                            new AzureDevOpsDeploymentTask
                                                            {
                                                                Name = "execTest",
                                                            },
                                                        },
                                                    },
                                                },
                                            },
                                        },
                                    },
                                },
                            },
                        },
                        Links = new AzureDevOpsReleaseLinks
                        {
                            Web = new AzureDevOpsLink
                            {
                                Href = testUri,
                            },
                        },
                    },
                },
            };
            var testCollection = new AzureDevOpsCollection {
                Name = testString
            };

            testCollection.Projects.Add(testProject);
            var testAzureDevOpsInstance = new AzureDevOpsInstance();

            testAzureDevOpsInstance.Collections.Add(testCollection);

            var systemUnderTest = new CombinedComplianceReport();

            // Act
            var actual = systemUnderTest.Generate(testAzureDevOpsInstance);

            // Assert
            actual.Should().NotBeNull();
            actual.Should().Be(expected);
        }