public void ConvertSkippedWithMissingMessageBus(SC002PropertySchemaGenerator generator, IFileRepository fileRepository, ILogger logger, MigrationContext context, AzureIntegrationServicesModel model, Exception e)
        {
            "Given a model"
            .x(() => model = new AzureIntegrationServicesModel());

            "And a file repository"
            .x(() => fileRepository = _mockFileRepository.Object);

            "And a logger"
            .x(() => logger = new Mock <ILogger>().Object);

            "And a context"
            .x(() => context = new MigrationContext());

            "And a generator"
            .x(() => generator = new SC002PropertySchemaGenerator(fileRepository, model, context, logger));

            "When converting"
            .x(async() => e = await Record.ExceptionAsync(async() => await generator.ConvertAsync(CancellationToken.None).ConfigureAwait(false)).ConfigureAwait(false));

            "Then the code should not throw an exception"
            .x(() => e.Should().BeNull());

            "And there should be no context error"
            .x(() =>
            {
                context.Errors.Should().BeNullOrEmpty();
            });
        }
        public void ConvertWithMissingAppConfig(SC002PropertySchemaGenerator generator, IFileRepository fileRepository, ILogger logger, MigrationContext context, AzureIntegrationServicesModel model, Exception e)
        {
            var messageName = "testMessageName";

            "Given a model"
            .x(() => model = new AzureIntegrationServicesModel());

            "And a message with no appConfig"
            .x(() =>
            {
                var documentMessage = new DocumentMessage
                {
                    Name = messageName
                };

                documentMessage.RoutingProperties.Add("routingPropertyKey1", "routingPropertyValue1");

                var application = new Application();
                application.Messages.Add(documentMessage);

                model.MigrationTarget.MessageBus = new MessageBus();
                model.MigrationTarget.MessageBus.Applications.Add(application);
            });

            "And a file repository"
            .x(() => fileRepository = _mockFileRepository.Object);

            "And a logger"
            .x(() => logger = new Mock <ILogger>().Object);

            "And a context"
            .x(() => context = new MigrationContext());

            "And a generator"
            .x(() => generator = new SC002PropertySchemaGenerator(fileRepository, model, context, logger));

            "When converting"
            .x(async() => e = await Record.ExceptionAsync(async() => await generator.ConvertAsync(CancellationToken.None).ConfigureAwait(false)).ConfigureAwait(false));

            "Then the code should not throw an exception"
            .x(() => e.Should().BeNull());

            "And there should be a context error"
            .x(() =>
            {
                context.Errors.Should().NotBeEmpty();
                context.Errors.Should().HaveCount(1);
                context.Errors.First().Message.Should().Contain(ModelConstants.ResourceTypeRoutingProperties);
                context.Errors.First().Message.Should().Contain(messageName);
            });
        }
        public void ConstructWithNullFileRepository(SC002PropertySchemaGenerator generator, IFileRepository fileRepository, ILogger logger, IApplicationModel model, MigrationContext context, Exception e)
        {
            "Given an generator"
            .x(() => generator.Should().BeNull());

            "And a null file repository"
            .x(() => fileRepository.Should().BeNull());

            "And a model"
            .x(() => model = new AzureIntegrationServicesModel());

            "And a context"
            .x(() => context = TestHelper.BuildContext());

            "And a logger"
            .x(() => logger = _mockLogger.Object);

            "When constructing with a null file repository"
            .x(() => e = Record.Exception(() => new SC002PropertySchemaGenerator(fileRepository, model, context, logger)));

            "Then the constructor should throw an exception"
            .x(() => e.Should().NotBeNull().And.Subject.Should().BeOfType <ArgumentNullException>().Which.ParamName.Should().Be("fileRepository"));
        }
        public void ConstructWithSuccess(SC002PropertySchemaGenerator generator, IFileRepository fileRepository, ILogger logger, IApplicationModel model, MigrationContext context, Exception e)
        {
            "Given an generator"
            .x(() => generator.Should().BeNull());

            "And a file repository"
            .x(() => fileRepository = _mockFileRepository.Object);

            "And a model"
            .x(() => model = new AzureIntegrationServicesModel());

            "And a context"
            .x(() => context = TestHelper.BuildContext());

            "And a logger"
            .x(() => logger = _mockLogger.Object);

            "When constructing"
            .x(() => e = Record.Exception(() => new SC002PropertySchemaGenerator(fileRepository, model, context, logger)));

            "Then the constructor should NOT throw an exception"
            .x(() => e.Should().BeNull());
        }
        public void ConvertWithSuccess(SC002PropertySchemaGenerator generator, IFileRepository fileRepository, ILogger logger, MigrationContext context, AzureIntegrationServicesModel model, Exception e)
        {
            var messageName        = "testMessageName";
            var conversionFolder   = @"c:\conversionFolder";
            var templateOutputPath = "templateOutputPath";
            var messageSchemaName  = "testMessageSchemaName";

            var    generatedFileName = string.Empty;
            JToken generatedJson     = null;

            "Given a model"
            .x(() => model = new AzureIntegrationServicesModel());

            "And a message with no appConfig"
            .x(() =>
            {
                var documentMessage = new DocumentMessage
                {
                    Name          = messageName,
                    MessageSchema = new MessageSchema
                    {
                        Name = messageSchemaName
                    }
                };

                documentMessage.RoutingProperties.Add("routingPropertyKey1", "routingPropertyValue1");

                documentMessage.Resources.Add(new TargetResourceTemplate
                {
                    OutputPath   = templateOutputPath,
                    ResourceType = ModelConstants.ResourceTypeRoutingProperties
                });

                var application = new Application();
                application.Messages.Add(documentMessage);

                model.MigrationTarget.MessageBus = new MessageBus();
                model.MigrationTarget.MessageBus.Applications.Add(application);
            });

            "And a file repository"
            .x(() =>
            {
                _mockFileRepository.Setup(f => f.WriteJsonFile(
                                              It.IsAny <string>(),
                                              It.IsAny <JToken>()
                                              ))
                .Callback <string, JToken>(
                    (p1, p2) =>
                {
                    generatedFileName = p1;
                    generatedJson     = p2;
                });

                fileRepository = _mockFileRepository.Object;
            });

            "And a logger"
            .x(() => logger = new Mock <ILogger>().Object);

            "And a context"
            .x(() =>
            {
                context = new MigrationContext
                {
                    ConversionFolder = conversionFolder
                };
            });

            "And a generator"
            .x(() => generator = new SC002PropertySchemaGenerator(fileRepository, model, context, logger));

            "When converting"
            .x(async() => e = await Record.ExceptionAsync(async() => await generator.ConvertAsync(CancellationToken.None).ConfigureAwait(false)).ConfigureAwait(false));

            "Then the code should not throw an exception"
            .x(() => e.Should().BeNull());

            "And there should be no context errors"
            .x(() => context.Errors.Should().BeNullOrEmpty());

            "And the file should be generated"
            .x(() =>
            {
                _mockFileRepository.Verify(f => f.WriteJsonFile(
                                               It.IsAny <string>(),
                                               It.IsAny <JObject>()), Times.Once);

                var expectedPath = Path.Combine(conversionFolder, templateOutputPath);

                generatedFileName.Should().StartWith(expectedPath);
                generatedJson.Should().NotBeNull();
            });
        }