From 62e863e3433048e9eb5f1d957c30ff1857829aee Mon Sep 17 00:00:00 2001 From: Paul Schneider Date: Mon, 14 Jul 2025 18:58:04 +0100 Subject: [PATCH] testing --- .vscode/settings.json | 16 +--- Directory.Packages.props | 50 ++++++++++ src/Api/Api.csproj | 10 +- src/Directory.Build.props | 4 +- src/Yavsc.Abstract/Constants.cs | 2 +- src/Yavsc.Abstract/Yavsc.Abstract.csproj | 8 +- src/Yavsc.Server/Helpers/WorkflowHelpers.cs | 93 ++++++++++--------- .../ApplicationDbContextModelSnapshot.cs | 2 +- .../Models/ApplicationDbContext.cs | 27 ++---- src/Yavsc.Server/Yavsc.Server.csproj | 37 ++++---- src/Yavsc/Extensions/HostingExtensions.cs | 4 +- src/Yavsc/Yavsc.csproj | 56 ++++++----- .../sampleWebAsWebApiClient.csproj | 9 +- test/yavscTests/Mandatory/BatchTests.cs | 46 --------- test/yavscTests/NonRegression/Database.cs | 20 +--- .../Settings/DbConnectionSettings.cs | 3 +- test/yavscTests/WebServerFixture.cs | 68 +++++++------- test/yavscTests/appsettings.json | 5 +- test/yavscTests/yavscTests.csproj | 32 ++++--- yavsc.sln | 7 +- 20 files changed, 233 insertions(+), 266 deletions(-) create mode 100644 Directory.Packages.props diff --git a/.vscode/settings.json b/.vscode/settings.json index bc1f86d8..51abeffb 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,18 +1,6 @@ { - "dotnet-test-explorer.testProjectPath": "**/*Tests.@(csproj|vbproj|fsproj)", - "sqltools.connections": [ - { - "previewLimit": 50, - "server": "localhost", - "port": 5432, - "driver": "PostgreSQL", - "name": "yavscdev", - "group": "yavsc", - "database": "YavscDev", - "username": "yavscdev", - "password": "admin" - } - ], + "dotnet-test-explorer.testProjectPath": "test/**/*Tests.csproj", + "cSpell.words": [ "appsettings", "Newtonsoft", diff --git a/Directory.Packages.props b/Directory.Packages.props new file mode 100644 index 00000000..60c5ad84 --- /dev/null +++ b/Directory.Packages.props @@ -0,0 +1,50 @@ + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Api/Api.csproj b/src/Api/Api.csproj index aa256182..31d7553d 100644 --- a/src/Api/Api.csproj +++ b/src/Api/Api.csproj @@ -1,12 +1,12 @@ - + net9.0 enable enable 1c73094f-959f-4211-b1a1-6a69b236c283 - - + + - - + + \ No newline at end of file diff --git a/src/Directory.Build.props b/src/Directory.Build.props index f53f4fe8..10cfa82d 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,5 +1,5 @@ - + 1.0.8 - + \ No newline at end of file diff --git a/src/Yavsc.Abstract/Constants.cs b/src/Yavsc.Abstract/Constants.cs index 033cdecd..ca641ccc 100644 --- a/src/Yavsc.Abstract/Constants.cs +++ b/src/Yavsc.Abstract/Constants.cs @@ -37,7 +37,7 @@ namespace Yavsc public const string FrontOfficeGroupName = "FrontOffice"; public const string DefaultAvatar = "/images/Users/icon_user.png"; public const string AnonAvatar = "/images/Users/icon_anon_user.png"; - public const string YavscConnectionStringEnvName = "DEFAULTCONNECTION_CONNECTIONSTRING"; + public const string YavscConnectionStringEnvName = "YAVSC_CONNECTION_STRING"; // at the end, let 4*4 bytes in peace public const int WebSocketsMaxBufLen = 4096; diff --git a/src/Yavsc.Abstract/Yavsc.Abstract.csproj b/src/Yavsc.Abstract/Yavsc.Abstract.csproj index 2ade24d2..d92c9313 100644 --- a/src/Yavsc.Abstract/Yavsc.Abstract.csproj +++ b/src/Yavsc.Abstract/Yavsc.Abstract.csproj @@ -1,16 +1,12 @@ - net9.0 enable enable A shared model for a little client/server app, dealing about establishing some contract, between some human client and provider. - - - + - - + \ No newline at end of file diff --git a/src/Yavsc.Server/Helpers/WorkflowHelpers.cs b/src/Yavsc.Server/Helpers/WorkflowHelpers.cs index c45c7f0c..a1180ed2 100644 --- a/src/Yavsc.Server/Helpers/WorkflowHelpers.cs +++ b/src/Yavsc.Server/Helpers/WorkflowHelpers.cs @@ -16,75 +16,80 @@ namespace Yavsc.Helpers public static class WorkflowHelpers { - public static async Task> - ListPerformersAsync(this ApplicationDbContext context, + public static async Task> + ListPerformersAsync(this ApplicationDbContext context, IBillingService billing, string actCode) { - + var actors = context.Performers - .Include(p=>p.Activity) - .Include(p=>p.Performer) - .Where(p => p.Active && p.Activity.Any(u=>u.DoesCode==actCode)).OrderBy( x => x.Rate ) + .Include(p => p.Activity) + .Include(p => p.Performer) + .Where(p => p.Active && p.Activity.Any(u => u.DoesCode == actCode)).OrderBy(x => x.Rate) .ToArray(); - List result = new (); + List result = new(); foreach (var a in actors) { var settings = await billing.GetPerformersSettingsAsync(actCode, a.PerformerId); - result.Add(new PerformerProfileViewModel(a, actCode,settings)); + result.Add(new PerformerProfileViewModel(a, actCode, settings)); } return result; } - public static void RegisterBilling(string code, Func getter) where T : IBillable - { - BillingService.Billing.Add(code, getter); - BillingService.GlobalBillingMap.Add(typeof(T).Name, code); - } - - public static void ConfigureBillingService() - { - foreach (var a in System.AppDomain.CurrentDomain.GetAssemblies()) + public static void RegisterBilling(string code, Func getter) where T : IBillable { - foreach (var c in a.GetTypes()) + if (BillingService.Billing.ContainsKey(code) + || BillingService.GlobalBillingMap.ContainsKey(code)) { - if (c.IsClass && !c.IsAbstract && - c.GetInterface("ISpecializationSettings") != null) - { - Config.ProfileTypes.Add(c); - } + throw new InvalidOperationException("Billing setup"); } + BillingService.Billing.Add(code, getter); + BillingService.GlobalBillingMap.Add(typeof(T).Name, code); } - foreach (var propertyInfo in typeof(ApplicationDbContext).GetProperties()) + public static void ConfigureBillingService() { - foreach (var attr in propertyInfo.CustomAttributes) + foreach (var a in System.AppDomain.CurrentDomain.GetAssemblies()) { - // something like a DbSet? - if (typeof(Yavsc.Attributes.ActivitySettingsAttribute).IsAssignableFrom(attr.AttributeType)) + foreach (var c in a.GetTypes()) { - BillingService.UserSettings.Add(propertyInfo); + if (c.IsClass && !c.IsAbstract && + c.GetInterface("ISpecializationSettings") != null) + { + Config.ProfileTypes.Add(c); + } } } + + foreach (var propertyInfo in typeof(ApplicationDbContext).GetProperties()) + { + foreach (var attr in propertyInfo.CustomAttributes) + { + // something like a DbSet? + if (typeof(Yavsc.Attributes.ActivitySettingsAttribute).IsAssignableFrom(attr.AttributeType)) + { + BillingService.UserSettings.Add(propertyInfo); + } + } + } + + RegisterBilling(BillingCodes.Brush, new Func + ((db, id) => + { + var query = db.HairCutQueries.Include(q => q.Prestation).Include(q => q.Regularisation).Single(q => q.Id == id); + query.SelectedProfile = db.BrusherProfile.Single(b => b.UserId == query.PerformerId); + return query; + })); + + RegisterBilling(BillingCodes.MBrush, new Func + ((db, id) => db.HairMultiCutQueries.Include(q => q.Regularisation).Single(q => q.Id == id))); + + RegisterBilling(BillingCodes.Rdv, new Func + ((db, id) => db.RdvQueries.Include(q => q.Regularisation).Single(q => q.Id == id))); } - RegisterBilling(BillingCodes.Brush, new Func - ((db, id) => - { - var query = db.HairCutQueries.Include(q => q.Prestation).Include(q => q.Regularisation).Single(q => q.Id == id); - query.SelectedProfile = db.BrusherProfile.Single(b => b.UserId == query.PerformerId); - return query; - })); - - RegisterBilling(BillingCodes.MBrush, new Func - ((db, id) => db.HairMultiCutQueries.Include(q => q.Regularisation).Single(q => q.Id == id))); - - RegisterBilling(BillingCodes.Rdv, new Func - ((db, id) => db.RdvQueries.Include(q => q.Regularisation).Single(q => q.Id == id))); - } - } } diff --git a/src/Yavsc.Server/Migrations/ApplicationDbContextModelSnapshot.cs b/src/Yavsc.Server/Migrations/ApplicationDbContextModelSnapshot.cs index 79ff71a6..cd43e81d 100644 --- a/src/Yavsc.Server/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/src/Yavsc.Server/Migrations/ApplicationDbContextModelSnapshot.cs @@ -17,7 +17,7 @@ namespace Yavsc.Migrations { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("ProductVersion", "9.0.6") + .HasAnnotation("ProductVersion", "9.0.7") .HasAnnotation("Relational:MaxIdentifierLength", 63); NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); diff --git a/src/Yavsc.Server/Models/ApplicationDbContext.cs b/src/Yavsc.Server/Models/ApplicationDbContext.cs index ca9bd8b8..be5b62c7 100644 --- a/src/Yavsc.Server/Models/ApplicationDbContext.cs +++ b/src/Yavsc.Server/Models/ApplicationDbContext.cs @@ -35,17 +35,18 @@ namespace Yavsc.Models using Microsoft.EntityFrameworkCore.ChangeTracking; using Yavsc.Abstract.Models.Messaging; + using Microsoft.Extensions.Logging; + using System.Configuration; public class ApplicationDbContext : IdentityDbContext { - public ApplicationDbContext() - { + private readonly ILogger logger; - } - public ApplicationDbContext(DbContextOptions options) : base(options) + public ApplicationDbContext(ILoggerFactory loggerFactory, + DbContextOptions options) : base(options) { - + logger = loggerFactory.CreateLogger(); } protected override void OnModelCreating(ModelBuilder builder) @@ -89,22 +90,6 @@ namespace Yavsc.Models // builder.Entity>().HasKey(i=> new { i.LoginProvider, i.UserId, i.ProviderKey }); } - // this is not a failback procedure. - - protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) - { - var appSetup = (string)AppDomain.CurrentDomain.GetData(Constants.YavscConnectionStringEnvName); - if (!string.IsNullOrWhiteSpace(appSetup)) - { - optionsBuilder.UseNpgsql(appSetup); - return; - } - var envSetup = Environment.GetEnvironmentVariable(Constants.YavscConnectionStringEnvName); - if (envSetup != null) - optionsBuilder.UseNpgsql(envSetup); - else optionsBuilder.UseNpgsql(); - } - public DbSet Applications { get; set; } public DbSet RefreshTokens { get; set; } diff --git a/src/Yavsc.Server/Yavsc.Server.csproj b/src/Yavsc.Server/Yavsc.Server.csproj index 31044854..44632c58 100644 --- a/src/Yavsc.Server/Yavsc.Server.csproj +++ b/src/Yavsc.Server/Yavsc.Server.csproj @@ -1,33 +1,32 @@ - + net9.0 enable enable 53bd70e8-ff81-497a-847f-a15fd8ea7a09 - - - - - - - + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - - - - - - - - - - + + + + + + + + + + - + \ No newline at end of file diff --git a/src/Yavsc/Extensions/HostingExtensions.cs b/src/Yavsc/Extensions/HostingExtensions.cs index 96e9ef56..02b8187a 100644 --- a/src/Yavsc/Extensions/HostingExtensions.cs +++ b/src/Yavsc/Extensions/HostingExtensions.cs @@ -44,7 +44,7 @@ namespace Yavsc.Extensions; public static class HostingExtensions { - internal static WebApplication ConfigureWebAppServices(this WebApplicationBuilder builder) + public static WebApplication ConfigureWebAppServices(this WebApplicationBuilder builder) { IServiceCollection services = LoadConfiguration(builder); @@ -300,7 +300,7 @@ public static class HostingExtensions } - internal async static Task ConfigurePipeline(this WebApplication app) + public async static Task ConfigurePipeline(this WebApplication app) { if (app.Environment.IsDevelopment()) diff --git a/src/Yavsc/Yavsc.csproj b/src/Yavsc/Yavsc.csproj index a2238d72..a6a7c6d6 100644 --- a/src/Yavsc/Yavsc.csproj +++ b/src/Yavsc/Yavsc.csproj @@ -1,4 +1,4 @@ - + net9.0 enable @@ -7,44 +7,42 @@ 76e56fc2-1619-40d8-8393-365258b7a21d - - all + + all - - all + + all - - - - - - - - - + + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all - - - - - - - - - - - - - + + + + + + + + + + + + - + \ No newline at end of file diff --git a/src/sampleWebAsWebApiClient/sampleWebAsWebApiClient.csproj b/src/sampleWebAsWebApiClient/sampleWebAsWebApiClient.csproj index 854fb0d7..458131a3 100644 --- a/src/sampleWebAsWebApiClient/sampleWebAsWebApiClient.csproj +++ b/src/sampleWebAsWebApiClient/sampleWebAsWebApiClient.csproj @@ -4,18 +4,15 @@ enable enable - - - + + - true PreserveNewest - - + \ No newline at end of file diff --git a/test/yavscTests/Mandatory/BatchTests.cs b/test/yavscTests/Mandatory/BatchTests.cs index e77bdca0..077e051a 100644 --- a/test/yavscTests/Mandatory/BatchTests.cs +++ b/test/yavscTests/Mandatory/BatchTests.cs @@ -40,7 +40,6 @@ namespace yavscTests [Fact] public void GitClone() { - Assert.True(_serverFixture.EnsureTestDb()); Assert.NotNull (_serverFixture.DbContext.Project); var firstProject = _serverFixture.DbContext.Project.Include(p=>p.Repository).FirstOrDefault(); Assert.NotNull (firstProject); @@ -54,8 +53,6 @@ namespace yavscTests string gitRepo=null; private IConfigurationRoot configurationRoot; - - [Fact] public void HaveConfigurationRoot() @@ -66,55 +63,12 @@ namespace yavscTests configurationRoot = builder.Build(); } - - - internal static IConfigurationRoot CreateConfiguration(string prjDir) - { - var builder = new ConfigurationBuilder(); - - builder.AddJsonFile(Path.Combine(prjDir, "appsettings.json"), false); - builder.AddJsonFile(Path.Combine(prjDir, "appsettings.Development.json"), true); - return builder.Build(); - } - static IConfigurationRoot ConfigurationRoot; - internal static void ConfigureServices - (ServiceCollection serviceCollection, - string prjDir, - out IConfigurationRoot configuration, - out IServiceProvider provider) - { - ConfigurationRoot = configuration = CreateConfiguration(prjDir); - - serviceCollection.AddOptions(); - var siteSettingsconf = configuration.GetSection("Site"); - serviceCollection.Configure(siteSettingsconf); - var smtpSettingsconf = configuration.GetSection("Smtp"); - serviceCollection.Configure(smtpSettingsconf); - var locOptions = configuration.GetSection("Localization"); - serviceCollection.Configure(locOptions); - - serviceCollection.AddSingleton(typeof(ILoggerFactory), typeof(LoggerFactory)); - serviceCollection.AddTransient(typeof(IEmailSender), typeof(MailSender)); - - serviceCollection.AddLogging(); - serviceCollection.AddMvcCore(); - serviceCollection.AddLocalization(options => - { - options.ResourcesPath = "Resources"; - }); - serviceCollection.AddDbContext(options => - options.UseNpgsql(o => ConfigurationRoot.GetConnectionString("DefaultConnection"))); - provider = serviceCollection.BuildServiceProvider(); - } - - public void Dispose() { if (gitRepo!=null) { Directory.Delete(Path.Combine(gitRepo,"yavsc"), true); } - _serverFixture.DropTestDb(); } } } diff --git a/test/yavscTests/NonRegression/Database.cs b/test/yavscTests/NonRegression/Database.cs index c0b05aef..12157e09 100644 --- a/test/yavscTests/NonRegression/Database.cs +++ b/test/yavscTests/NonRegression/Database.cs @@ -5,6 +5,7 @@ using Xunit.Abstractions; namespace yavscTests.Mandatory { + [Collection("Database")] [Trait("regression", "II")] [Trait("dev", "wip")] @@ -16,29 +17,14 @@ namespace yavscTests.Mandatory { this.output = output; _serverFixture = serverFixture; - try { - if (_serverFixture.DbCreated) - - _serverFixture.DropTestDb(); - - } - catch (Exception) - { - output.WriteLine("db not dropped"); - } - output.WriteLine($"Startup.Testing.ConnectionStrings.Default is {_serverFixture.TestingSetup.ConnectionStrings.Default}"); + + output.WriteLine($"Testing connection string is {_serverFixture?.TestingSetup?.ConnectionStrings.DefaultConnection}"); } /// /// Assuming we're using an account that may create databases, /// Install all our migrations in a fresh new database. /// - [Fact] - public void InstallFromScratchUsingPoweredNpgsqlUser() - { - Assert.True(_serverFixture.EnsureTestDb()); - Assert.True(_serverFixture.UpgradeDb()==0); - } public void Dispose() { diff --git a/test/yavscTests/Settings/DbConnectionSettings.cs b/test/yavscTests/Settings/DbConnectionSettings.cs index 1c11ebf3..ad2e43c0 100644 --- a/test/yavscTests/Settings/DbConnectionSettings.cs +++ b/test/yavscTests/Settings/DbConnectionSettings.cs @@ -2,7 +2,6 @@ namespace yavscTests.Settings { public class DbConnectionSettings { - public string DatabaseCtor { get; set; } - public string Default { get; set; } + public string? DefaultConnection { get; set; } } } diff --git a/test/yavscTests/WebServerFixture.cs b/test/yavscTests/WebServerFixture.cs index e7fbe22c..57626891 100644 --- a/test/yavscTests/WebServerFixture.cs +++ b/test/yavscTests/WebServerFixture.cs @@ -1,5 +1,6 @@ using System.Net; using Microsoft.AspNetCore; +using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting.Server; using Microsoft.AspNetCore.Hosting.Server.Features; @@ -13,6 +14,8 @@ using Yavsc; using Yavsc.Models; using Yavsc.Services; using yavscTests.Settings; +using Yavsc.Extensions; +using Microsoft.EntityFrameworkCore; namespace isnd.tests { @@ -20,12 +23,14 @@ namespace isnd.tests [CollectionDefinition("Web server collection")] public class WebServerFixture : IDisposable { - public IWebHost Host { get; private set;} public List Addresses { get; private set; } = new List(); public Microsoft.Extensions.Logging.ILogger Logger { get; internal set; } private SiteSettings siteSettings; + public IConfigurationRoot Configuration { get; private set; } + + private WebApplication app; public string TestingUserName { get; private set; } public string ProtectedTestingApiKey { get; internal set; } @@ -38,34 +43,41 @@ namespace isnd.tests public WebServerFixture() { - SetupHost(); + SetupHost().Wait(); } public void Dispose() { - Host.StopAsync().Wait(); - Host.Dispose(); + if (app!=null) + app.StopAsync().Wait(); } - public void SetupHost() + public async Task SetupHost() { - var builder = WebHost.CreateDefaultBuilder(new string[0]); + var builder = WebApplication.CreateBuilder(); + + Configuration = builder.Configuration + .AddJsonFile("appsettings.json") + .AddJsonFile($"appsettings.{builder.Environment.EnvironmentName}.json", optional: true) + .AddEnvironmentVariables() + .Build(); - // .UseContentRoot("../../../../../src/isnd") - builder.UseStartup(typeof(Startup)) - .ConfigureAppConfiguration((builderContext, config) => + this.app = builder.ConfigureWebAppServices(); + using (var migrationScope = app.Services.CreateScope()) { - config.AddJsonFile("appsettings.json", true); - config.AddJsonFile("appsettings.Development.json", false); - }); + var db = migrationScope.ServiceProvider.GetRequiredService(); + await db.Database.MigrateAsync(); + } + await app.ConfigurePipeline(); + app.UseSession(); + await app.StartAsync(); + + - Host = builder.Build(); - - var logFactory = Host.Services.GetRequiredService(); + var logFactory = app.Services.GetRequiredService(); Logger = logFactory.CreateLogger(); - Host.Start(); //Starts listening on the configured addresses. - var server = Host.Services.GetRequiredService(); + var server = app.Services.GetRequiredService(); var addressFeatures = server.Features.Get(); @@ -73,12 +85,13 @@ namespace isnd.tests { Addresses.Add(address); } - SiteSettings = Host.Services.GetRequiredService>().Value; + SiteSettings = app.Services.GetRequiredService>().Value; - using IServiceScope scope = Host.Services.CreateScope(); + using IServiceScope scope = app.Services.CreateScope(); ApplicationDbContext dbContext = scope.ServiceProvider.GetRequiredService(); - + //dbContext.Database.EnsureCreated(); + dbContext.Database.Migrate(); TestingUserName = "Tester"; TestingUser = dbContext.Users.FirstOrDefault(u => u.UserName == TestingUserName); @@ -93,7 +106,7 @@ namespace isnd.tests { if (TestingUser == null) { - using IServiceScope scope = Host.Services.CreateScope(); + using IServiceScope scope = app.Services.CreateScope(); var userManager = scope.ServiceProvider.GetRequiredService>(); @@ -114,19 +127,6 @@ namespace isnd.tests } } - internal void DropTestDb() - { - throw new NotImplementedException(); - } - internal bool EnsureTestDb() - { - throw new NotImplementedException(); - } - - internal int UpgradeDb() - { - throw new NotImplementedException(); - } } } diff --git a/test/yavscTests/appsettings.json b/test/yavscTests/appsettings.json index 02914457..383712b6 100644 --- a/test/yavscTests/appsettings.json +++ b/test/yavscTests/appsettings.json @@ -41,9 +41,8 @@ } }, "ConnectionStrings": { - "Default": "Server=lame-NpgsqlHostName;Port=5432;Database=lame-DataBase;Username=lame-Username;Password=lame-dbPassword;", - "DatabaseCtor": "Server=lame-NpgsqlHostName;Port=5432;Database=lame-ctor-DataBase;Username=lame-ctor-Username;Password=lame-ctordbPassword;" - }, + "DefaultConnection": "Server=lame-NpgsqlHostName;Port=5432;Database=lame-DataBase;Username=lame-Username;Password=lame-dbPassword;", + }, "DataProtection": { "Keys": { "Dir": "DataProtection-Keys" diff --git a/test/yavscTests/yavscTests.csproj b/test/yavscTests/yavscTests.csproj index d7cb966b..a1135b78 100644 --- a/test/yavscTests/yavscTests.csproj +++ b/test/yavscTests/yavscTests.csproj @@ -1,26 +1,32 @@ - net9.0 enable enable + false - - - - - - - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + + + - - - + + + + \ No newline at end of file diff --git a/yavsc.sln b/yavsc.sln index 710b9674..19b3666d 100644 --- a/yavsc.sln +++ b/yavsc.sln @@ -1,4 +1,4 @@ - + Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.0.31903.59 @@ -21,6 +21,11 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{27336229-4 EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "yavscTests", "test\yavscTests\yavscTests.csproj", "{D565C5C8-19A6-4134-A18B-FE71986FBA35}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution items", "Solution items", "{9EB76B06-CA8E-4211-A16D-6646ED584311}" + ProjectSection(SolutionItems) = preProject + Directory.Packages.props = Directory.Packages.props + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU