using System.Net;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using SQLInsight.Hub.Data;
namespace SQLInsight.IntegrationTests;
/// Support cases in the portal: suggested case numbers and the support report.
public partial class HubPortalTests
{
private async Task CustomerIdAsync(string customer)
{
await using var scope = hub.Factory.Services.CreateAsyncScope();
return await scope.ServiceProvider.GetRequiredService().Customers.Where(c => c.Name == customer).Select(c => c.Id).SingleAsync();
}
[Fact]
public async Task New_case_suggests_the_next_number_and_refuses_a_taken_one()
{
var customer = $"Forslag {Guid.NewGuid():N}"[..22];
var finding = await SeedAsync(customer, hub.License(customer));
var id = await CustomerIdAsync(customer);
var client = await SignedInAsync();
Assert.Contains("value=\"SUP-000001\"", await client.GetStringAsync($"/portal/fund/{finding}"), StringComparison.Ordinal);
var created = await PostFormAsync(client, $"/portal/kunder/{id}", $"/portal/actions/customers/{id}/cases", ("reference", ""), ("title", "Telefonopkald"), ("description", "Ringede om backup"));
Assert.Equal($"/portal/kunder/{id}", created.Headers.Location?.OriginalString);
var page = await client.GetStringAsync($"/portal/kunder/{id}");
Assert.Contains("SUP-000001", page, StringComparison.Ordinal);
Assert.Contains("value=\"SUP-000002\"", page, StringComparison.Ordinal);
var duplicate = await PostFormAsync(client, $"/portal/kunder/{id}", $"/portal/actions/customers/{id}/cases", ("reference", "SUP-000001"), ("title", "Igen"));
Assert.Equal(HttpStatusCode.BadRequest, duplicate.StatusCode);
}
[Fact]
public async Task Support_report_shows_cases_and_exports_csv()
{
var customer = $"Rapport {Guid.NewGuid():N}"[..22];
await SeedAsync(customer, hub.License(customer));
var id = await CustomerIdAsync(customer);
var client = await SignedInAsync();
await PostFormAsync(client, $"/portal/kunder/{id}", $"/portal/actions/customers/{id}/cases", ("reference", ""), ("title", "Til rapporten"));
var response = await client.GetAsync($"/portal/rapporter/support?kunde={id}");
var page = await response.Content.ReadAsStringAsync();
Assert.True(response.IsSuccessStatusCode, page);
var csv = await client.GetAsync($"/portal/actions/reports/support.csv?kunde={id}");
var bytes = await csv.Content.ReadAsByteArrayAsync();
Assert.Contains("Til rapporten", page, StringComparison.Ordinal);
Assert.Contains("median løsningstid", page, StringComparison.Ordinal);
Assert.Equal("text/csv", csv.Content.Headers.ContentType?.MediaType);
Assert.Equal([0xEF, 0xBB, 0xBF], bytes[..3]);
Assert.Contains("SUP-000001;" + customer + ";Til rapporten;SEOSoft;", System.Text.Encoding.UTF8.GetString(bytes), StringComparison.Ordinal);
}
[Fact]
public async Task Customer_page_filters_findings_to_one_instance()
{
var customer = $"Instans {Guid.NewGuid():N}"[..22];
var license = hub.License(customer);
await SeedAsync(customer, license);
using (var request = new HttpRequestMessage(HttpMethod.Post, "/api/v1/findings")
{
Content = System.Net.Http.Json.JsonContent.Create(HubApiTests.Submission("sql02", DateTimeOffset.UtcNow, ("SQLI-CFG-001", "", "High"))),
})
{
request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("SQLInsight-License", license);
(await hub.Factory.CreateClient().SendAsync(request)).EnsureSuccessStatusCode();
}
var other = $"Fremmed {Guid.NewGuid():N}"[..22];
await SeedAsync(other, hub.License(other));
int id, sql02, foreign;
await using (var scope = hub.Factory.Services.CreateAsyncScope())
{
var db = scope.ServiceProvider.GetRequiredService();
id = await db.Customers.Where(c => c.Name == customer).Select(c => c.Id).SingleAsync();
sql02 = await db.Instances.Where(i => i.CustomerId == id && i.InstanceKey == "sql02").Select(i => i.Id).SingleAsync();
foreign = await db.Instances.Where(i => i.Customer!.Name == other).Select(i => i.Id).SingleAsync();
}
var client = await SignedInAsync();
var all = await client.GetStringAsync($"/portal/kunder/{id}");
var filtered = await client.GetStringAsync($"/portal/kunder/{id}?instans={sql02}");
var ignored = await client.GetStringAsync($"/portal/kunder/{id}?instans={foreign}");
Assert.Contains("SQLI-DB-007", all, StringComparison.Ordinal);
Assert.Contains("SQLI-CFG-001", all, StringComparison.Ordinal);
Assert.Contains($"?instans={sql02}", all, StringComparison.Ordinal);
Assert.Contains("Aktive fund · sql02", filtered, StringComparison.Ordinal);
Assert.Contains("Vis alle instanser", filtered, StringComparison.Ordinal);
Assert.Contains("SQLI-CFG-001", filtered, StringComparison.Ordinal);
Assert.DoesNotContain("SQLI-DB-007", filtered, StringComparison.Ordinal);
Assert.Contains("SQLI-DB-007", ignored, StringComparison.Ordinal);
Assert.Contains("SQLI-CFG-001", ignored, StringComparison.Ordinal);
Assert.DoesNotContain("Vis alle instanser", ignored, StringComparison.Ordinal);
}
[Fact]
public async Task Support_report_csv_requires_login()
{
var response = await Client(hub.Factory).GetAsync("/portal/actions/reports/support.csv");
Assert.NotEqual(HttpStatusCode.OK, response.StatusCode);
}
}