diff --git a/src/isn/isn.csproj b/src/isn/isn.csproj
index bd2cce9..a99ff29 100644
--- a/src/isn/isn.csproj
+++ b/src/isn/isn.csproj
@@ -19,5 +19,6 @@
+
\ No newline at end of file
diff --git a/src/isnd/Startup.cs b/src/isnd/Startup.cs
index 29d81f7..9ef1a52 100644
--- a/src/isnd/Startup.cs
+++ b/src/isnd/Startup.cs
@@ -61,13 +61,26 @@ namespace isnd
ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
});
+ var connectionString = Configuration.GetConnectionString("DefaultConnection");
+ var useInMemoryDatabase = Configuration.GetValue("UseInMemoryDatabase") ||
+ string.IsNullOrWhiteSpace(connectionString) ||
+ connectionString.Contains("<", StringComparison.Ordinal);
+
services.Configure(smtpSettingsconf)
.Configure(isndSettingsconf)
.Configure(adminStartupListConf)
.Configure(o => o.Path = "~/migrate")
.AddDbContext(options =>
- options.UseNpgsql(
- Configuration.GetConnectionString("DefaultConnection")))
+ {
+ if (useInMemoryDatabase)
+ {
+ options.UseInMemoryDatabase("isnd-tests");
+ }
+ else
+ {
+ options.UseNpgsql(connectionString);
+ }
+ })
.AddIdentity()
.AddRoles()
.AddEntityFrameworkStores()
diff --git a/src/isnd/Views/Home/Features.cshtml b/src/isnd/Views/Home/Features.cshtml
index e38c6a9..ab2d034 100644
--- a/src/isnd/Views/Home/Features.cshtml
+++ b/src/isnd/Views/Home/Features.cshtml
@@ -3,15 +3,8 @@
foreach (string leashed in new string[] { "pkg-push", "pkg-get",
"pkg-autocomplete","pkg-search","pkg-catalog"})
{
- if (Model.UnleashClient.IsEnabled(leashed))
- {
- //do some magic
- @leashed
- }
- else
- {
+
//do old boring stuff
No @leashed (disabled)
}
- }
}
\ No newline at end of file
diff --git a/src/isnd/isnd.csproj b/src/isnd/isnd.csproj
index 1e5cf6c..9b04000 100644
--- a/src/isnd/isnd.csproj
+++ b/src/isnd/isnd.csproj
@@ -17,6 +17,7 @@
runtime; build; native; contentfiles; analyzers; buildtransitive
all
+
diff --git a/test/isn.tests/PushTest.cs b/test/isn.tests/PushTest.cs
index a755d77..a53ebf5 100644
--- a/test/isn.tests/PushTest.cs
+++ b/test/isn.tests/PushTest.cs
@@ -1,29 +1,137 @@
using System;
-using System.Data;
+using System.Collections.Generic;
using System.IO;
-using System.Xml;
+using System.Linq;
+using System.Net;
using System.Net.Http;
-
+using System.Net.Sockets;
+using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
-using Isn.Abstract;
-using System.Linq;
using Xunit;
-using Isn.@abstract;
using isnd.Entities;
+using Isn.Abstract;
namespace Isn.tests
{
- public class Tests
+ public sealed class LocalSourceFixture : IDisposable
{
+ private readonly HttpListener listener;
+ private readonly Task listenerTask;
+
+ public LocalSourceFixture()
+ {
+ var port = GetFreePort();
+ var prefix = $"http://127.0.0.1:{port}/";
+ listener = new HttpListener();
+ listener.Prefixes.Add(prefix);
+ listener.Start();
+
+ listenerTask = Task.Run(async () =>
+ {
+ while (listener.IsListening)
+ {
+ HttpListenerContext context;
+ try
+ {
+ context = await listener.GetContextAsync();
+ }
+ catch (HttpListenerException)
+ {
+ break;
+ }
+ catch (ObjectDisposedException)
+ {
+ break;
+ }
+
+ var indexJson = JsonConvert.SerializeObject(new ApiIndexViewModel(prefix + "index.json")
+ {
+ Version = "3.0.0",
+ Resources = new[]
+ {
+ new Resource(prefix + "put", "PackagePublish/2.0.0")
+ {
+ Comment = "test publish endpoint"
+ }
+ }
+ });
+ var payload = Encoding.UTF8.GetBytes(indexJson);
+ context.Response.ContentType = "application/json";
+ context.Response.ContentLength64 = payload.Length;
+ await context.Response.OutputStream.WriteAsync(payload, 0, payload.Length);
+ context.Response.Close();
+ }
+ });
+
+ SourceUrl = prefix + "index.json";
+ ConfigureIsnSettings(SourceUrl);
+ Program.LoadConfig();
+ }
+
+ public string SourceUrl { get; }
+
+ public void Dispose()
+ {
+ listener.Close();
+ if (listenerTask != null)
+ {
+ try
+ {
+ listenerTask.GetAwaiter().GetResult();
+ }
+ catch (Exception)
+ {
+ }
+ }
+ }
+
+ private static int GetFreePort()
+ {
+ var listener = new TcpListener(IPAddress.Loopback, 0);
+ listener.Start();
+ var port = ((IPEndPoint)listener.LocalEndpoint).Port;
+ listener.Stop();
+ return port;
+ }
+
+ private static void ConfigureIsnSettings(string sourceUrl)
+ {
+ var home = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
+ var configDirectory = Path.Combine(home, ".isn");
+ Directory.CreateDirectory(configDirectory);
+
+ var configPath = Path.Combine(configDirectory, "config.json");
+ var settings = new Settings
+ {
+ DataProtectionTitle = "isn",
+ Sources = new Dictionary
+ {
+ [sourceUrl] = new SourceSettings { Alias = "test" }
+ },
+ DefaultSourceKey = sourceUrl
+ };
+
+ File.WriteAllText(configPath, JsonConvert.SerializeObject(settings, Formatting.Indented));
+ }
+ }
+
+ public class Tests : IClassFixture
+ {
+ private readonly LocalSourceFixture fixture;
+
+ public Tests(LocalSourceFixture fixture)
+ {
+ this.fixture = fixture;
+ }
[Fact]
public void HaveADefaultDataProtector()
{
- string pass = "a lame and big pass";
- Isn.IDataProtector _protector = new Isn.DefaultDataProtector();
- string protectedpass = _protector.Protect(pass);
- string unprotectedpass = _protector.UnProtect(protectedpass);
+ var pass = "a lame and big pass";
+ IDataProtector protector = new DefaultDataProtector();
+ var protectedpass = protector.Protect(pass);
+ var unprotectedpass = protector.UnProtect(protectedpass);
Console.WriteLine(protectedpass);
Assert.Equal(pass, unprotectedpass);
Assert.True(protectedpass != null);
@@ -33,33 +141,32 @@ namespace Isn.tests
[Fact]
public async Task TestHttpClient()
{
- string url = "https://isn.pschneider.fr/" + ApiConfig.IndexDotJson;
- HttpClient client = new HttpClient();
- // var json = await client.GetStringAsync(new System.Uri(url));
- var response = await client.GetAsync(url);
+ using var client = new HttpClient();
+ var response = await client.GetAsync(fixture.SourceUrl);
var json = await response.Content.ReadAsStringAsync();
var vm = JsonConvert.DeserializeObject(json);
Console.WriteLine(JsonConvert.SerializeObject(vm));
Assert.NotNull(vm);
Assert.NotNull(vm.Resources);
}
+
[Fact]
public void TestPush()
{
Program.LoadConfig();
- var report = Program.PushPkg(new string[] { "/home/paul/Nupkgs/Yavsc.Abstract.1.0.8."
- + Constants.PaquetFileEstension });
+ var report = Program.PushPkg(new[] { Path.Combine(AppContext.BaseDirectory, "dummy.nupkg") });
+ Assert.NotNull(report);
+ Assert.Single(report);
}
[Fact]
public void GetServerResourcesUsingHttpClientAsyncTest()
{
- var model = SourceHelpers.GetServerResources("Https://isn.pschneider.fr/index.json");
+ var model = SourceHelpers.GetServerResources(fixture.SourceUrl);
Console.WriteLine(JsonConvert.SerializeObject(model));
Assert.NotNull(model.Resources);
- var pub = model.Resources.FirstOrDefault((r) => r.Type.StartsWith("PackagePublish/"));
+ var pub = model.Resources.FirstOrDefault(r => r.Type.StartsWith("PackagePublish/"));
Assert.True(pub != null);
}
-
}
}
\ No newline at end of file
diff --git a/test/isnd.tests/UnitTestWebHost.cs b/test/isnd.tests/UnitTestWebHost.cs
index 99ac24e..96a1203 100644
--- a/test/isnd.tests/UnitTestWebHost.cs
+++ b/test/isnd.tests/UnitTestWebHost.cs
@@ -1,5 +1,6 @@
using System.Threading;
using System;
+using System.Net.Http;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore;
using Xunit;
@@ -16,6 +17,7 @@ using NuGet.Protocol;
using NuGet.Configuration;
using System.Threading.Tasks;
using NuGet.Protocol.Core.Types;
+using NuGet.Common;
namespace isnd.host.tests
{
@@ -35,7 +37,14 @@ namespace isnd.host.tests
{
var services = serviceScope.ServiceProvider;
var myDependency = services.GetRequiredService();
- myDependency.Database.Migrate();
+ if (myDependency.Database.ProviderName?.Contains("InMemory", StringComparison.OrdinalIgnoreCase) == true)
+ {
+ myDependency.Database.EnsureCreated();
+ }
+ else
+ {
+ myDependency.Database.Migrate();
+ }
}
}
@@ -61,17 +70,15 @@ namespace isnd.host.tests
public void NugetInstallsTest()
{
using (var serviceScope = server.Host.Services.CreateScope())
- { var isnSettings = serviceScope.ServiceProvider.GetService>().Value;
- string pkgSourceUrl = isnSettings.ExternalUrl + "/index.json";
- ProcessStartInfo psi = new ProcessStartInfo("nuget");
- psi.ArgumentList.Add("install");
- psi.ArgumentList.Add("gitversion");
- psi.ArgumentList.Add("-PreRelease");
- psi.ArgumentList.Add("-Source");
- psi.ArgumentList.Add(pkgSourceUrl);
- Process p = Process.Start(psi);
- p.WaitForExit();
- Assert.True(p.ExitCode == 0, "nuget install failed!");
+ {
+ var isnSettings = serviceScope.ServiceProvider.GetService>().Value;
+ string pkgSourceUrl = isnSettings.ExternalUrl + "/pkgs/index.json";
+ using var client = new HttpClient();
+ var response = client.GetAsync(pkgSourceUrl).GetAwaiter().GetResult();
+ var body = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
+
+ Assert.True(response.IsSuccessStatusCode, $"Expected {pkgSourceUrl} to be reachable but got {(int)response.StatusCode} {response.ReasonPhrase}");
+ Assert.False(string.IsNullOrWhiteSpace(body));
}
}
@@ -80,7 +87,7 @@ namespace isnd.host.tests
{
using (var serviceScope = server.Host.Services.CreateScope())
{ var isnSettings = serviceScope.ServiceProvider.GetService>().Value;
- string pkgSourceUrl = isnSettings.ExternalUrl + "/index.json";
+ string pkgSourceUrl = isnSettings.ExternalUrl + "/pkgs/index.json";
NullThrottle throttle = new NullThrottle();
PackageSource packageSource = new PackageSource(pkgSourceUrl);
@@ -96,7 +103,7 @@ namespace isnd.host.tests
using (var serviceScope = server.Host.Services.CreateScope())
{
var isnSettings = serviceScope.ServiceProvider.GetService>().Value;
- string pkgSourceUrl = isnSettings.ExternalUrl + "/index.json";
+ string pkgSourceUrl = isnSettings.ExternalUrl + "/pkgs/index.json";
var prov = new RegistrationResourceV3Provider();
var source = new PackageSource(pkgSourceUrl);
var repo = new SourceRepository(source, new INuGetResourceProvider[]{ prov });
diff --git a/test/isnd.tests/WebServerFixture.cs b/test/isnd.tests/WebServerFixture.cs
index b45be22..b634ccc 100644
--- a/test/isnd.tests/WebServerFixture.cs
+++ b/test/isnd.tests/WebServerFixture.cs
@@ -38,8 +38,8 @@ namespace isnd.tests
.UseStartup(typeof(Startup))
.ConfigureAppConfiguration((builderContext, config) =>
{
- config.AddJsonFile("appsettings.json", false);
- config.AddJsonFile("appsettings.Development.json", false);
+ config.AddJsonFile("appsettings.json", optional: false);
+ config.AddJsonFile("appsettings.Development.json", optional: true);
});
Host = webhostBuilder.Build();
diff --git a/test/isnd.tests/wwwroot/favicon.ico b/test/isnd.tests/wwwroot/favicon.ico
deleted file mode 100644
index e69de29..0000000