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); } }