public async Task ApplySecurityContractAsync_WithApplicationServiceThrowingException_ExceptionThrown()
        {
            //Arrange
            var securityContractClientService = Substitute.For <ISecurityContractClientService>();
            var securityContractDefaultConfigurationService = Substitute.For <ISecurityContractDefaultConfigurationService>();
            var securityContractApplicationService          = Substitute.For <ISecurityContractApplicationService>();

            // A security contract with all it's sub components set to null is a valid security contract.
            var securityContract = new SecurityContract();

            securityContract.DefaultConfigurations = new List <SecurityContractDefaultConfiguration>
            {
                new SecurityContractDefaultConfiguration
                {
                    Name = "test default configuration"
                }
            };

            securityContractDefaultConfigurationService.ApplyDefaultConfigurationDefinitionAsync(Arg.Any <SecurityContractDefaultConfiguration>(), Arg.Any <Guid>(), Arg.Any <bool>(), Arg.Any <SecurityContractDryRunResult>()).Returns(x => throw new Exception());

            var securityContractService = new SecurityContractService(securityContractApplicationService, securityContractClientService, securityContractDefaultConfigurationService);

            Exception caughtException = null;

            try
            {
                await securityContractService.ApplySecurityContractDefinitionAsync(securityContract, Guid.NewGuid());
            }
            catch (Exception ex)
            {
                caughtException = ex;
            }

            Assert.True(caughtException is Exception);
        }
        public async Task ApplySecurityContractAsync_WithValidNoSectionsInput_NoExceptionsThrown()
        {
            //Arrange
            var securityContractClientService = Substitute.For <ISecurityContractClientService>();
            var securityContractDefaultConfigurationService = Substitute.For <ISecurityContractDefaultConfigurationService>();
            var securityContractApplicationService          = Substitute.For <ISecurityContractApplicationService>();

            // A security contract with all it's sub components set to null is a valid security contract.
            var securityContract        = new SecurityContract();
            var securityContractService = new SecurityContractService(securityContractApplicationService, securityContractClientService, securityContractDefaultConfigurationService);

            try
            {
                await securityContractService.ApplySecurityContractDefinitionAsync(securityContract, Guid.NewGuid());

                Assert.True(true);
            }
            catch (Exception e)
            {
                Assert.True(false, $"Unexpected Exception: '{e.Message}' thrown when applying security contract");
            }
        }
        public async Task ApplySecurityContractAsync_WithValidHighLevelSecurityContractInput_NoExceptionsThrown()
        {
            //Arrange
            var securityContractClientService = Substitute.For <ISecurityContractClientService>();
            var securityContractDefaultConfigurationService = Substitute.For <ISecurityContractDefaultConfigurationService>();
            var securityContractApplicationService          = Substitute.For <ISecurityContractApplicationService>();

            // A security contract with all it's sub components set to null is a valid security contract.
            var securityContract = new SecurityContract();

            securityContract.Applications = new List <SecurityContractApplication>
            {
                new SecurityContractApplication
                {
                    Fullname = "Test application"
                }
            };

            securityContract.Clients = new List <Oauth2ClientSubmit>
            {
                new Oauth2ClientSubmit
                {
                    ClientId             = "test-client-id",
                    Name                 = "Test-Client-Name",
                    AllowedOfflineAccess = true,
                    AllowedCorsOrigins   = new List <string>
                    {
                        "http://test-cors-origin.com"
                    },
                    ClientSecrets = new List <string>
                    {
                        "test-client-secret"
                    },
                    PostLogoutRedirectUris = new List <string>
                    {
                        "http://test-post-logout-uri.com"
                    },
                    AllowedGrantTypes = new List <string>
                    {
                        "password"
                    },
                    AllowedScopes = new List <string>
                    {
                        "test-client-scope"
                    },
                    RedirectUris = new List <string>
                    {
                        "http://test-redirect-uri.com"
                    }
                }
            };

            securityContract.DefaultConfigurations = new List <SecurityContractDefaultConfiguration>
            {
                new SecurityContractDefaultConfiguration
                {
                    Name = "test default configuration"
                }
            };

            var securityContractService = new SecurityContractService(securityContractApplicationService, securityContractClientService, securityContractDefaultConfigurationService);

            try
            {
                await securityContractService.ApplySecurityContractDefinitionAsync(securityContract, Guid.NewGuid());

                Assert.True(true);
            }
            catch (Exception e)
            {
                Assert.True(false, $"Unexpected Exception: '{e.Message}' thrown when applying security contract");
            }
        }