public CInterface BuildSqlScriptInterface(KDataStoreTestProject sqlTestKProject)
        {
            var @interface = new CInterface()
            {
                InterfaceName = "ISqlScript",
                Namespace     = new CNamespace()
                {
                    NamespaceName =
                        $"{sqlTestKProject.ProjectFullName}.DataAccess"
                },
            };

            AddNamespaceRefs(@interface);

            @interface.Method.Add(new CMethod()
            {
                SignatureOnly = true, ReturnType = "ICommand", MethodName = "ToCommand"
            });
            @interface.Method.Add(new CMethod()
            {
                SignatureOnly = true, ReturnType = "IQuery<IEnumerable<T>>", MethodName = "ToQuery<T>"
            });

            return(@interface);
        }
        public CClass ReadSqlScriptClass(KDataStoreTestProject sqlTestKProject, KDataLayerProject dataLayerKProject)
        {
            var @class = new CClass("ReadSqlScript")
            {
                IsStatic  = true,
                Namespace = new CNamespace()
                {
                    NamespaceName =
                        $"{sqlTestKProject.ProjectFullName}.DataAccess"
                }
            };

            AddNamespaceRefs(sqlTestKProject, @class);

            @class.Method.Add(new CMethod()
            {
                AccessModifier = CAccessModifier.Internal,
                IsStatic       = true,
                ReturnType     = "string",
                MethodName     = "FromEmbeddedResource",
                Parameter      = new List <CParameter>()
                {
                    new CParameter()
                    {
                        Type = "string", ParameterName = "scriptName"
                    }
                },
                CodeSnippet = $@"var sourceName = $""{dataLayerKProject.ProjectFullName}.EmbeddedSql.{{scriptName}}.esql"";
                                var assemblies = AppDomain.CurrentDomain.GetAssemblies().Where(a => a.FullName.Contains("".Data.SqlServer""));
                                var dataAssembly = assemblies.First();
                                return dataAssembly.ReadToEndEmbeddedResource(sourceName);"
            });

            return(@class);
        }
예제 #3
0
        public CClass BuildSqlScriptClass(KDataStoreTestProject sqlTestKProject)
        {
            var @class = new CClass("SqlScript")
            {
                Namespace = new CNamespace()
                {
                    NamespaceName =
                        $"{sqlTestKProject.ProjectFullName}.DataAccess"
                },
                Implements = new List <CInterface>()
                {
                    new CInterface()
                    {
                        InterfaceName = "ISqlScript"
                    }
                }
            };

            AddNamespaceRefs(@class);

            @class.Constructor.Add(new CConstructor()
            {
                AccessModifier  = CAccessModifier.Public,
                ConstructorName = "SqlScript",
                Parameter       = new List <CParameter>()
                {
                    new CParameter()
                    {
                        Type = "string", ParameterName = "name"
                    }, new CParameter()
                    {
                        Type = "object", ParameterName = "parameters", DefaultValue = "null"
                    }
                },
                CodeSnippet = @"Name = name;
                                Parameters = parameters; "
            });

            @class.Property.Add(new CProperty()
            {
                Type = "string", PropertyName = "Name"
            });
            @class.Property.Add(new CProperty()
            {
                Type = "object", PropertyName = "Parameters"
            });

            @class.Method.Add(new CMethod()
            {
                AccessModifier = CAccessModifier.Public, ReturnType = "ICommand", MethodName = "ToCommand", UseExpressionDefinition = true, CodeSnippet = "new EmbeddedSqlCommand(Name, Parameters);"
            });
            @class.Method.Add(new CMethod()
            {
                AccessModifier = CAccessModifier.Public, ReturnType = "IQuery<IEnumerable<T>>", MethodName = "ToQuery<T>", UseExpressionDefinition = true, CodeSnippet = "new EmbeddedSqlQuery<T>(Name, Parameters);"
            });

            return(@class);
        }
예제 #4
0
        public KDataStoreTestProject BuildDatabaseTestProject(KickstartWizardModel kickstartWizardModel, KProtoFile kProtoFile)
        {
            var databaseProject = new KDataStoreTestProject {
                CompanyName = kickstartWizardModel.CompanyName, ProjectName = kickstartWizardModel.ProjectName,
                Kickstart   = kickstartWizardModel.CreateDatabaseTestProject
            };

            databaseProject.DataStoreType = kickstartWizardModel.DatabaseType;

            return(databaseProject);
        }
        public CClass BuildAssemblyExtensionsClass(KDataStoreTestProject sqlTestKProject)
        {
            var @class = new CClass("AssemblyExtensions")
            {
                AccessModifier = CAccessModifier.Internal,
                IsStatic       = true,
                Namespace      = new CNamespace()
                {
                    NamespaceName =
                        $"{sqlTestKProject.ProjectFullName}.Extensions"
                }
            };

            AddNamespaceRefs(@class);

            @class.Method.Add(new CMethod()
            {
                AccessModifier    = CAccessModifier.Internal,
                IsStatic          = true,
                IsExtensionMethod = true,
                ReturnType        = "string",
                MethodName        = "ReadToEndEmbeddedResource",
                Parameter         = new List <CParameter>()
                {
                    new CParameter()
                    {
                        Type = "Assembly", ParameterName = "assembly"
                    },
                    new CParameter()
                    {
                        Type = "string", ParameterName = "resourceName"
                    }
                },
                CodeSnippet = $@"if (assembly == null)
                                {{
                                    throw new ArgumentNullException(nameof(assembly));
                                }}

                                var stream = assembly.GetManifestResourceStream(resourceName);
                                if (stream == null)
                                {{
                                    throw new InvalidOperationException($""Embedded resource {{resourceName}} was not found in assembly <{{assembly.FullName}}>"");
                                }}

                                using (stream)
                                using (var reader = new StreamReader(stream))
                                {{
                                    return reader.ReadToEnd();
                                }}"
            });

            return(@class);
        }
        private void AddNamespaceRefs(KDataStoreTestProject sqlTestKProject, CClass @class)
        {
            var namespaces = new List <string>
            {
                "System",
                "System.Linq",
                $"{sqlTestKProject.ProjectFullName}.Extensions"
            };

            foreach (var ns in namespaces)
            {
                @class.NamespaceRef.Add(new CNamespaceRef
                {
                    ReferenceTo = new CNamespace {
                        NamespaceName = ns
                    }
                });
            }
        }
        public CProject BuildProject(KSolution kSolution, KDataStoreProject dataStoreKProject, KDataStoreTestProject sqlTestKProject,
                                     KDataLayerProject dataLayerKProject,
                                     CProject dataStoreProject, CInterface dbProviderInterface, CClass dbProviderClass)
        {
            _dataStoreKProject   = dataStoreKProject;
            _sqlTestKProject     = sqlTestKProject;
            _dataLayerKProject   = dataLayerKProject;
            _dataStoreProject    = dataStoreProject;
            _dbProviderInterface = dbProviderInterface;
            _dbProviderClass     = dbProviderClass;

            var dbTestProject = new CProject
            {
                ProjectName      = sqlTestKProject.ProjectFullName,
                ProjectShortName = sqlTestKProject.ProjectName,
                ProjectFolder    = sqlTestKProject.ProjectFolder,
                ProjectType      = CProjectType.CsProj
            };

            dbTestProject.ProjectReference.Add(dataStoreProject);

            dbTestProject.TemplateProjectPath = @"templates\NetCore31ConsoleApp.csproj";

            AddTestInitializationClass(dbTestProject);
            AddStartupContainerClass(dbTestProject);
            AddTestDataServiceClass(dbTestProject);
            AddTestDataServiceBuilderInterface(dbTestProject);
            AddTestDataServiceBuilderClass(dbTestProject);
            AddReadSqlScriptClass(dbTestProject);
            AddSqlScriptInterface(dbTestProject);
            AddSqlScriptClass(dbTestProject);
            AddEmbeddedSqlCommandClass(dbTestProject);
            AddEmbeddedSqlQueryClass(dbTestProject);
            AddAssemblyExtensionClass(dbTestProject);
            AddAppSettingsJson(dbTestProject);
            AddDataServiceTestClass(dbTestProject);
            AddNuGetRefs(dbTestProject);

            return(dbTestProject);
        }
예제 #8
0
        public CClass BuildTestInitializationClass(CProject dbTestProject, KDataStoreTestProject sqlTestKProject, CInterface dbProviderInterface)
        {
            var @class = new CClass("TestInitialization")
            {
                Namespace = new CNamespace()
                {
                    NamespaceName =
                        $"{sqlTestKProject.ProjectFullName}"
                }
            };

            AddNamespaceRefs(@class, dbProviderInterface);
            @class.ClassAttribute.Add(new CClassAttribute()
            {
                AttributeName = "TestClass"
            });

            @class.Field.Add(new CField()
            {
                AccessModifier = CAccessModifier.Public,
                FieldType      = "IServiceProvider",
                IsStatic       = true,
                FieldName      = "ServiceProvider"
            });

            @class.Field.Add(new CField()
            {
                AccessModifier = CAccessModifier.Private,
                IsConst        = true,
                FieldType      = "string",
                FieldName      = "EnvPrefix",
                DefaultValue   = @"""SAMPLE_SVC_TESTS_"""
            });

            @class.Property.Add(new CProperty()
            {
                AccessModifier = CAccessModifier.Private,
                IsStatic       = true,
                Type           = "string",
                PropertyName   = "EnvironmentName",
                DefaultValue   = @"Environment.GetEnvironmentVariable(""ASPNETCORE_ENVIRONMENT"")"
            });
            @class.Property.Add(new CProperty()
            {
                AccessModifier = CAccessModifier.Private, IsStatic = true, Type = "string", PropertyName = "ApplicationName", DefaultValue = "Environment.GetEnvironmentVariable(EnvPrefix + \"ApplicationName\") ?? \"daypart-integration-test\""
            });

            @class.Method.Add(new CMethod()
            {
                AccessModifier = CAccessModifier.Public,
                IsStatic       = true,
                ReturnType     = "void",
                MethodName     = "AssemblySetup",
                Attribute      = new List <CMethodAttribute>()
                {
                    new CMethodAttribute()
                    {
                        AttributeName = "AssemblyInitialize"
                    }
                },
                Parameter = new List <CParameter>()
                {
                    new CParameter()
                    {
                        Type = "TestContext", ParameterName = "testContext"
                    }
                },
                CodeSnippet = "ServiceProvider = InitializeServiceProvider();"
            });

            @class.Method.Add(new CMethod()
            {
                AccessModifier = CAccessModifier.Public,
                IsStatic       = true,
                ReturnType     = "void",
                MethodName     = "AssemblyCleanup",
                Attribute      = new List <CMethodAttribute>()
                {
                    new CMethodAttribute()
                    {
                        AttributeName = "AssemblyCleanup"
                    }
                },
                CodeSnippet = "ServiceProvider.Dispose();"
            });

            @class.Method.Add(new CMethod()
            {
                AccessModifier = CAccessModifier.Public,
                ReturnType     = "void",
                MethodName     = "TestServiceProvider",
                Attribute      = new List <CMethodAttribute>()
                {
                    new CMethodAttribute()
                    {
                        AttributeName = "TestMethod"
                    }
                },
                CodeSnippet = @"var container = ((StructureMapServiceProvider)ServiceProvider).Container;
                                /*
                                 * Some of these could be intentional
                                 */
                                var dbConnectionMock = new Mock<DbConnection>();
                                var dbTransactionMock = new Mock<DbTransaction>();
                                container.Configure(c =>
                                {
                                    c.For<IDbConnection>().Use(dbConnectionMock.Object);
                                    c.For<IDbTransaction>().Use(dbTransactionMock.Object);
                                });

                                container.AssertConfigurationIsValid();"
            });

            @class.Method.Add(new CMethod()
            {
                AccessModifier = CAccessModifier.Private,
                IsStatic       = true,
                ReturnType     = "IServiceProvider",
                MethodName     = "InitializeServiceProvider",
                CodeSnippet    = $@"var configuration = InitializeConfiguration();
                                var serviceCollection = InitializeServiceCollection(configuration);
                               serviceCollection.AddTransient<{dbProviderInterface.InterfaceName}>(
                                            p =>
                                            {{

                                                return new EventCaptureDbProvider(configuration.GetConnectionString(""EventCapture""));
                                            }});
                                return serviceCollection.ConfigureContainer();//configuration);"
            });

            @class.Method.Add(new CMethod()
            {
                AccessModifier = CAccessModifier.Private,
                IsStatic       = true,
                ReturnType     = "IServiceCollection",
                MethodName     = "InitializeServiceCollection",
                Parameter      = new List <CParameter>()
                {
                    new CParameter()
                    {
                        Type = "IConfigurationRoot", ParameterName = "config"
                    }
                },
                CodeSnippet = @"var serviceCollection = new ServiceCollection();

                                /*ServiceCollectionExtensions.ConfigureServiceCollection(serviceCollection, config)
                                    .Configure<AppSettings>(config)
                                    .Configure<DaypartConfig>(config.GetSection(""zzzzz""));*/

                                    return serviceCollection; "
            });

            @class.Method.Add(new CMethod()
            {
                AccessModifier = CAccessModifier.Private,
                IsStatic       = true,
                ReturnType     = "IConfigurationRoot",
                MethodName     = "InitializeConfiguration",
                CodeSnippet    = @"return new ConfigurationBuilder()
                                        .AddJsonFile(""appsettings.json"", false)
                                        .AddJsonFile($""appsettings.{EnvironmentName}.json"", true)
                                            .AddEnvironmentVariables(EnvPrefix)
                                        .AddConfigCenter(ApplicationName, EnvPrefix)
                                            .Build(); "
            });

            return(@class);
        }
예제 #9
0
        public CClass BuildTestDataServiceBuilderClass(KDataStoreTestProject sqlTestKProject)
        {
            var @class = new CClass("TestDataServiceBuilder<T>")
            {
                Namespace = new CNamespace()
                {
                    NamespaceName =
                        $"{sqlTestKProject.ProjectFullName}.DataAccess"
                },
                Implements = new List <CInterface>()
                {
                    new CInterface()
                    {
                        InterfaceName = "ITestDataServiceBuilder<T>"
                    }
                },

                Where = new List <CWhere> {
                    new CWhere()
                    {
                        WhereName = "T : IDbProvider"
                    }
                }
            };

            AddNamespaceRefs(@class);

            @class.Field.Add(new CField {
                AccessModifier = CAccessModifier.Private, IsReadonly = true, FieldType = "TestDataService<T>", FieldName = "_dataService"
            });

            @class.Constructor.Add(new CConstructor()
            {
                AccessModifier  = CAccessModifier.Public,
                ConstructorName = "TestDataServiceBuilder",
                Parameter       = new List <CParameter>()
                {
                    new CParameter()
                    {
                        Type = "TestDataService<T>", ParameterName = "dataService"
                    }
                },
                CodeSnippet = @"_dataService = dataService;"
            });

            @class.Method.Add(new CMethod()
            {
                AccessModifier = CAccessModifier.Public,
                ReturnType     = "ITestDataServiceBuilder<T>",
                MethodName     = "NewSetup",

                CodeSnippet = @"_dataService.Reset();
                                return this;"
            });

            @class.Method.Add(new CMethod()
            {
                AccessModifier = CAccessModifier.Public,
                ReturnType     = "ITestDataServiceBuilder<T>",
                MethodName     = "WithSeedScript",
                Parameter      = new List <CParameter>()
                {
                    new CParameter {
                        Type = "string", ParameterName = "scriptName"
                    },
                    new CParameter {
                        Type = "object", ParameterName = "parameters", DefaultValue = "null"
                    }
                },
                CodeSnippet = @" _dataService.AddSeedScript(new SqlScript(scriptName, parameters));
                                return this;"
            });

            @class.Method.Add(new CMethod()
            {
                AccessModifier = CAccessModifier.Public,
                ReturnType     = "ITestDataServiceBuilder<T>",
                MethodName     = "WithSeedQuery",
                Parameter      = new List <CParameter>()
                {
                    new CParameter {
                        Type = "string", ParameterName = "scriptName"
                    },
                    new CParameter {
                        Type = "object", ParameterName = "parameters", DefaultValue = "null"
                    }
                },
                CodeSnippet = @" _dataService.AddSeedQuery(new SqlScript(scriptName, parameters));
                                return this;"
            });

            @class.Method.Add(new CMethod()
            {
                AccessModifier = CAccessModifier.Public,
                ReturnType     = "ITestDataServiceBuilder<T>",
                MethodName     = "WithCleanScript",
                Parameter      = new List <CParameter>()
                {
                    new CParameter {
                        Type = "string", ParameterName = "scriptName"
                    },
                    new CParameter {
                        Type = "object", ParameterName = "parameters", DefaultValue = "null"
                    }
                },
                CodeSnippet = @" _dataService.AddCleanupScript(new SqlScript(scriptName, parameters));
                                return this;"
            });

            @class.Method.Add(new CMethod()
            {
                AccessModifier = CAccessModifier.Public,
                ReturnType     = "TestDataService<T>",
                MethodName     = "Create",
                CodeSnippet    = @"return _dataService;"
            });

            return(@class);
        }
예제 #10
0
        public CClass BuildStartupContainerClass(KDataStoreTestProject sqlTestKProject, CInterface dbProviderInterface, CClass dbProviderClass)
        {
            var @class = new CClass("ServiceCollectionExtensions")
            {
                Namespace = new CNamespace
                {
                    NamespaceName =
                        $"{sqlTestKProject.CompanyName}.{sqlTestKProject.ProjectName}{sqlTestKProject.NamespaceSuffix}.{sqlTestKProject.ProjectSuffix}.Startup"
                },

                AccessModifier = CAccessModifier.Public,
                IsStatic       = true
            };


            AddNamespaceRefs(@class, dbProviderInterface);

            @class.Field.Add(new CField
            {
                AccessModifier = CAccessModifier.Private,
                IsStatic       = true,
                FieldType      = "IContainer",
                FieldName      = "_container"
            });

            @class.Method.Add(new CMethod
            {
                IsStatic          = true,
                IsExtensionMethod = true,
                ReturnType        = "IServiceProvider",
                MethodName        = "ConfigureContainer",
                Parameter         = new List <CParameter>
                {
                    new CParameter {
                        Type = "IServiceCollection", ParameterName = "services"
                    }
                },
                CodeSnippet =
                    $@"
            r.Scan(scanner =>
            {{
                scanner.AssembliesAndExecutablesFromApplicationBaseDirectory(a => a.FullName.StartsWith(""Company""));
                scanner.WithDefaultConventions();
                scanner.ConnectImplementationsToTypesClosing(typeof(IRequestHandler<,>));
                scanner.ConnectImplementationsToTypesClosing(typeof(INotificationHandler<>));
            }});

            r.For<IMediator>().Use<Mediator>().Transient();
            r.For<ServiceFactory>().Use(ctx => ctx.GetInstance);
            r.For<IMediatorExecutor>().Use(ctx => new MediatorExecutor(ctx.GetInstance<IServiceScopeFactory>()));

            r.AddAppServices(configuration);

            r.AddSingleton(configuration)
                .AddLogging()
                .AddOptions()
                .Configure<CloudformationOutputs>(configuration.GetSection(""CloudformationOutputs""))
                .Configure<AuthenticationSettings>(configuration.GetSection(""Authentication""));

            var tracingOptions = new TracingOptions(configuration);
            if (tracingOptions.Enabled)
            {{
                r.AddDatadogOpenTracing(new TracingSettings
                {{
                    TracingAddress = tracingOptions.TracingAddress,
                    ServiceName = tracingOptions.ServiceName
                }});

                r.AddTransient<IDbDiagnosticsFactory, ServiceDbDiagnosticsFactory>();
            }}
        "
            });

            @class.Method.Add(
                new CMethod
            {
                AccessModifier    = CAccessModifier.Public,
                IsStatic          = true,
                IsExtensionMethod = true,
                ReturnType        = "void",
                MethodName        = "Dispose",
                Parameter         = new List <CParameter>
                {
                    new CParameter {
                        Type = "IServiceProvider", ParameterName = "services"
                    }
                },
                CodeSnippet = "_container.Dispose();"
            });


            return(@class);
        }
예제 #11
0
        public CClass BuildEmbeddedSqlCommandBuilderClass(KDataStoreTestProject sqlTestKProject)
        {
            var @class = new CClass("EmbeddedSqlCommand")
            {
                Namespace = new CNamespace()
                {
                    NamespaceName =
                        $"{sqlTestKProject.ProjectFullName}.DataAccess"
                },
                Implements = new List <CInterface>()
                {
                    new CInterface()
                    {
                        InterfaceName = "ICommand"
                    }
                }
            };

            AddNamespaceRefs(@class);

            @class.Constructor.Add(new CConstructor()
            {
                AccessModifier  = CAccessModifier.Public,
                ConstructorName = "EmbeddedSqlCommand",
                Parameter       = new List <CParameter>()
                {
                    new CParameter()
                    {
                        Type = "string", ParameterName = "scriptName"
                    },
                    new CParameter()
                    {
                        Type = "object", ParameterName = "param", DefaultValue = "null"
                    },
                    new CParameter()
                    {
                        Type = "int?", ParameterName = "commandTimeout", DefaultValue = "null"
                    },
                    new CParameter()
                    {
                        Type = "CommandType?", ParameterName = "commandType", DefaultValue = "null"
                    },
                },
                CodeSnippet = @"_query = ReadSqlScript.FromEmbeddedResource(scriptName);
                                _parameters = param;
                                _commandTimeout = commandTimeout;
                                _commandType = commandType;"
            });

            @class.Field.Add(new CField()
            {
                IsReadonly = true, FieldType = "string", FieldName = "_query"
            });
            @class.Field.Add(new CField()
            {
                IsReadonly = true, FieldType = "object", FieldName = "_parameters"
            });
            @class.Field.Add(new CField()
            {
                IsReadonly = true, FieldType = "int?", FieldName = "_commandTimeout"
            });
            @class.Field.Add(new CField()
            {
                IsReadonly = true, FieldType = "CommandType?", FieldName = "_commandType"
            });

            @class.Method.Add(new CMethod()
            {
                AccessModifier = CAccessModifier.Public,
                IsAsync        = true,
                ReturnType     = "Task<int>",
                MethodName     = "Execute",
                Parameter      = new List <CParameter> {
                    new CParameter()
                    {
                        Type = "IDatastoreConnectionProxy", ParameterName = "datastoreConnectionProxy"
                    }
                },
                CodeSnippet = @"return await datastoreConnectionProxy.Execute(_query, _parameters, _commandTimeout, _commandType)
                                        .ConfigureAwait(false); "
            });

            return(@class);
        }
예제 #12
0
        public CClass BuildTestDataServiceClass(KDataStoreTestProject sqlTestKProject)
        {
            var @class = new CClass("TestDataService<T>")
            {
                Namespace = new CNamespace()
                {
                    NamespaceName =
                        $"{sqlTestKProject.ProjectFullName}.DataAccess"
                },
                InheritsFrom = new CClass("BaseDataService<T>")
                {
                },
                Where = new List <CWhere>()
                {
                    new CWhere()
                    {
                        WhereName = "T : IDbProvider"
                    }
                }
            };

            AddNamespaceRefs(@class);

            @class.Constructor.Add(new CConstructor()
            {
                AccessModifier  = CAccessModifier.Public,
                ConstructorName = "TestDataService",
                Parameter       = new List <CParameter>()
                {
                    new CParameter()
                    {
                        Type = "IDatastoreContext<T>", ParameterName = "datastoreContext", PassToBaseClass = true
                    }
                },
                CodeSnippet = "//EmptyConstructor"
            });
            @class.Field.Add(new CField()
            {
                AccessModifier = CAccessModifier.Private,
                IsReadonly     = true,
                FieldType      = "List<ISqlScript>",
                FieldName      = "_seedScripts",
                DefaultValue   = "new List<ISqlScript>()"
            });
            @class.Field.Add(new CField()
            {
                AccessModifier = CAccessModifier.Private,
                IsReadonly     = true,
                FieldType      = "List<ISqlScript>",
                FieldName      = "_seedQueries",
                DefaultValue   = "new List<ISqlScript>()"
            });
            @class.Field.Add(new CField()
            {
                AccessModifier = CAccessModifier.Private,
                IsReadonly     = true,
                FieldType      = "List<ISqlScript>",
                FieldName      = "_cleanScripts",
                DefaultValue   = "new List<ISqlScript>()"
            });


            @class.Method.Add(new CMethod()
            {
                AccessModifier = CAccessModifier.Public,
                ReturnType     = "void",
                MethodName     = "Reset",
                CodeSnippet    = @"_seedScripts.Clear();
                                _seedQueries.Clear();
                                _cleanScripts.Clear();"
            });

            @class.Method.Add(new CMethod()
            {
                AccessModifier = CAccessModifier.Public,
                ReturnType     = "void",
                MethodName     = "AddSeedScript",
                CodeSnippet    = @" _seedScripts.Add(script);",
                Parameter      = new List <CParameter> {
                    new CParameter()
                    {
                        Type = "ISqlScript", ParameterName = "script"
                    }
                }
            });

            @class.Method.Add(new CMethod()
            {
                AccessModifier = CAccessModifier.Public,
                ReturnType     = "void",
                MethodName     = "AddSeedQuery",
                CodeSnippet    = @" _seedQueries.Add(script);",
                Parameter      = new List <CParameter> {
                    new CParameter()
                    {
                        Type = "ISqlScript", ParameterName = "script"
                    }
                }
            });
            @class.Method.Add(new CMethod()
            {
                AccessModifier = CAccessModifier.Public,
                ReturnType     = "void",
                MethodName     = "AddCleanupScript",
                CodeSnippet    = @" _cleanScripts.Add(script);",
                Parameter      = new List <CParameter> {
                    new CParameter()
                    {
                        Type = "ISqlScript", ParameterName = "script"
                    }
                }
            });

            @class.Method.Add(new CMethod()
            {
                AccessModifier = CAccessModifier.Public,
                IsAsync        = true,
                ReturnType     = "Task<T1>",
                MethodName     = "Query<T1>",
                CodeSnippet    = @"return await DatastoreContext.Query(query)
                                    .ConfigureAwait(false);",
                Parameter      = new List <CParameter> {
                    new CParameter()
                    {
                        Type = "IQuery<T1>", ParameterName = "query"
                    }
                }
            });


            @class.Method.Add(new CMethod()
            {
                AccessModifier = CAccessModifier.Public,
                IsAsync        = true,
                ReturnType     = "Task<int>",
                MethodName     = "Execute",
                CodeSnippet    = @"return await DatastoreContext.Execute(command)
                                     .ConfigureAwait(false);",
                Parameter      = new List <CParameter> {
                    new CParameter()
                    {
                        Type = "ICommand", ParameterName = "command"
                    }
                }
            });


            @class.Method.Add(new CMethod()
            {
                AccessModifier = CAccessModifier.Public,
                IsAsync        = true,
                ReturnType     = "Task",
                MethodName     = "SeedAsync",
                CodeSnippet    = @"await ExecuteAsync(_seedScripts);"
            });

            @class.Method.Add(new CMethod()
            {
                AccessModifier = CAccessModifier.Public,
                IsAsync        = true,
                ReturnType     = "Task<IEnumerable<T1>>",
                MethodName     = "SeedQueryAsync<T1>",
                CodeSnippet    = @"return await QueryAsync<T1>(_seedQueries);"
            });

            @class.Method.Add(new CMethod()
            {
                AccessModifier = CAccessModifier.Public,
                IsAsync        = true,
                ReturnType     = "Task",
                MethodName     = "CleanUpAsync",
                CodeSnippet    = @"await ExecuteAsync(_cleanScripts);"
            });

            @class.Method.Add(new CMethod()
            {
                AccessModifier = CAccessModifier.Public,
                IsAsync        = true,
                ReturnType     = "Task<IEnumerable<T1>>",
                MethodName     = "QueryScriptAsync<T1>",
                CodeSnippet    = @"var query = new EmbeddedSqlQuery<T1>(scriptName, parameters);
                                return await DatastoreContext.Query(query);",
                Parameter      = new List <CParameter>
                {
                    new CParameter()
                    {
                        Type = "string", ParameterName = "scriptName"
                    },
                    new CParameter()
                    {
                        Type = "object", ParameterName = "parameters", DefaultValue = "null"
                    }
                }
            });

            @class.Method.Add(new CMethod()
            {
                AccessModifier = CAccessModifier.Public,
                IsAsync        = true,
                ReturnType     = "Task",
                MethodName     = "ExecuteAsync",
                CodeSnippet    = @"var command = new EmbeddedSqlCommand(scriptName, parameters);
                                await DatastoreContext.Execute(command);",
                Parameter      = new List <CParameter>
                {
                    new CParameter()
                    {
                        Type = "string", ParameterName = "scriptName"
                    },
                    new CParameter()
                    {
                        Type = "object", ParameterName = "parameters", DefaultValue = "null"
                    }
                }
            });

            @class.Method.Add(new CMethod()
            {
                AccessModifier = CAccessModifier.Private,
                IsAsync        = true,
                ReturnType     = "Task",
                MethodName     = "ExecuteAsync",
                CodeSnippet    = @"foreach (var script in scripts)
                                {
                                    await DatastoreContext.Execute(script.ToCommand());
                                }",
                Parameter      = new List <CParameter>
                {
                    new CParameter()
                    {
                        Type = "IEnumerable<ISqlScript>", ParameterName = "scripts"
                    }
                }
            });

            @class.Method.Add(new CMethod()
            {
                AccessModifier = CAccessModifier.Private,
                IsAsync        = true,
                ReturnType     = "Task<IEnumerable<T>>",
                MethodName     = "QueryAsync<T>",
                CodeSnippet    = @"var results = (await Task.WhenAll(scripts.Select(async s => await DatastoreContext.Query(s.ToQuery<T>()))))
                                    .Aggregate(Enumerable.Empty<T>(), (result, next) => result.Concat(next))
                                    .ToArray();

                                return results;",
                Parameter      = new List <CParameter>
                {
                    new CParameter()
                    {
                        Type = "IEnumerable<ISqlScript>", ParameterName = "scripts"
                    }
                }
            });

            return(@class);
        }
예제 #13
0
        public CInterface BuildTestDataServiceBuilderInterface(KDataStoreTestProject sqlTestKProject)
        {
            var @interface = new CInterface()
            {
                InterfaceName = "ITestDataServiceBuilder<T>",
                Namespace     = new CNamespace()
                {
                    NamespaceName =
                        $"{sqlTestKProject.ProjectFullName}.DataAccess"
                },

                Where = new List <CWhere> {
                    new CWhere()
                    {
                        WhereName = "T : IDbProvider"
                    }
                }
            };

            AddNamespaceRefs(@interface);



            @interface.Method.Add(new CMethod()
            {
                AccessModifier = CAccessModifier.Public,
                ReturnType     = "ITestDataServiceBuilder<T>",
                MethodName     = "NewSetup",
                SignatureOnly  = true
            });

            @interface.Method.Add(new CMethod()
            {
                AccessModifier = CAccessModifier.Public,
                ReturnType     = "ITestDataServiceBuilder<T>",
                MethodName     = "WithSeedScript",
                Parameter      = new List <CParameter>()
                {
                    new CParameter {
                        Type = "string", ParameterName = "scriptName"
                    },
                    new CParameter {
                        Type = "object", ParameterName = "parameters", DefaultValue = "null"
                    }
                },
                SignatureOnly = true
            });

            @interface.Method.Add(new CMethod()
            {
                AccessModifier = CAccessModifier.Public,
                ReturnType     = "ITestDataServiceBuilder<T>",
                MethodName     = "WithSeedQuery",
                Parameter      = new List <CParameter>()
                {
                    new CParameter {
                        Type = "string", ParameterName = "scriptName"
                    },
                    new CParameter {
                        Type = "object", ParameterName = "parameters", DefaultValue = "null"
                    }
                },
                SignatureOnly = true
            });

            @interface.Method.Add(new CMethod()
            {
                AccessModifier = CAccessModifier.Public,
                ReturnType     = "ITestDataServiceBuilder<T>",
                MethodName     = "WithCleanScript",
                Parameter      = new List <CParameter>()
                {
                    new CParameter {
                        Type = "string", ParameterName = "scriptName"
                    },
                    new CParameter {
                        Type = "object", ParameterName = "parameters", DefaultValue = "null"
                    }
                },
                SignatureOnly = true
            });

            @interface.Method.Add(new CMethod()
            {
                AccessModifier = CAccessModifier.Public,
                ReturnType     = "TestDataService<T>",
                MethodName     = "Create",
                SignatureOnly  = true
            });

            return(@interface);
        }
예제 #14
0
        public CClass BuildDataServiceTestClass(KDataStoreProject sqlKProject, KDataLayerProject dataLayerKProject, KDataStoreTestProject sqlTestKProject, CInterface dbProviderInterface)
        {
            var @class = new CClass("EventCaptureDataServiceTest")
            {
                Namespace = new CNamespace()
                {
                    NamespaceName =
                        $"{sqlTestKProject.ProjectFullName}"
                },
                ClassAttribute = new List <CClassAttribute>()
                {
                    new CClassAttribute()
                    {
                        AttributeName = "TestClass"
                    }
                }
            };

            AddNamespaceRefs(@class, dbProviderInterface);

            @class.Field.Add(new CField()
            {
                AccessModifier = CAccessModifier.Private,
                IsStatic       = true,
                FieldType      = $"TestDataService<{dbProviderInterface.InterfaceName}>",
                FieldName      = "_testDataService"
            });

            @class.Method.Add(new CMethod()
            {
                Attribute = new List <CMethodAttribute>()
                {
                    new CMethodAttribute()
                    {
                        AttributeName = "ClassInitialize"
                    }
                },
                AccessModifier = CAccessModifier.Public,
                IsStatic       = true,
                ReturnType     = "void",
                MethodName     = "ClassInitialize",
                Parameter      = new List <CParameter>()
                {
                    new CParameter()
                    {
                        Type = "TestContext", ParameterName = "context"
                    }
                },
                CodeSnippet = $@"var testDataServiceBuilder = 
                                     TestInitialization.ServiceProvider.GetService<ITestDataServiceBuilder<{dbProviderInterface.InterfaceName}>>();

                                _testDataService = testDataServiceBuilder.Create();

                                _testDataService.SeedAsync()
                                    .GetAwaiter()
                                    .GetResult();"
            });

            var service = new DataLayerServiceProjectServiceBase();

            foreach (var kStoredProcedure in sqlKProject.StoredProcedure)
            {
                if (!string.IsNullOrEmpty(kStoredProcedure.ParameterSetName))
                {
                    var @entityClass = service.BuildParameterEntityClass(kStoredProcedure.GeneratedStoredProcedure, kStoredProcedure.ParameterSetName);
                    int x            = 1;
                }

                if (!string.IsNullOrWhiteSpace(kStoredProcedure.ResultSetName))
                {
                    var @entityClass = service.BuildResultEntityClass(kStoredProcedure.GeneratedStoredProcedure, kStoredProcedure.ResultSetName, dataLayerKProject);
                    @class.Method.Add(new CMethod()
                    {
                        Attribute = new List <CMethodAttribute>()
                        {
                            new CMethodAttribute()
                            {
                                AttributeName = "TestMethod"
                            }
                        },

                        AccessModifier = CAccessModifier.Public,
                        IsAsync        = true,
                        ReturnType     = "Task",
                        MethodName     = $"Test{kStoredProcedure.StoredProcedureName}",
                        CodeSnippet    = $@"var result = await _testDataService.Query(new EmbeddedSqlQuery<{@entityClass.ClassName}>(""{kStoredProcedure.StoredProcedureName}""));"
                    });
                }
            }



            return(@class);
        }