using System.Net.Http.Json;
using System.Text;
using System.Text.Json;
using OpenNest.Data;
using static OpenNest.Server.Tests.DrawingLibraryFixtures;
namespace OpenNest.Server.Tests;
/// Neutral, code-built drawing set fixtures for the server tests.
internal static class DrawingSetFixtures
{
public static DrawingSetRecord Set(string name = "Synthetic kit", Guid? id = null, params (Guid Drawing, int Quantity)[] members) => new()
{
Id = id ?? Guid.NewGuid(),
Name = name,
Customer = "Synthetic customer",
Notes = "Synthetic set notes",
SavedBy = "Synthetic operator",
Members = members.Select(m => new DrawingSetMember { DrawingId = m.Drawing, Quantity = m.Quantity }).ToList(),
};
/// Stores a library drawing directly and returns its id.
public static Guid AddDrawing(NestDatabase database, string name = "Synthetic bracket")
{
var record = Record(name);
database.InsertDrawing(record.Id, record, Package(name));
return record.Id;
}
public static async Task AddDrawing(HttpClient client, string name = "Synthetic bracket", Action? edit = null)
{
var record = Record(name);
edit?.Invoke(record);
return (await Upload(client, record, Package(name))).Id;
}
public static StringContent Json(string json) => new(json, Encoding.UTF8, "application/json");
public static StringContent Json(DrawingSetRecord record) => Json(JsonSerializer.Serialize(record, Options));
public static async Task Create(HttpClient client, DrawingSetRecord record)
{
using var response = await client.PostAsync("/api/sets", Json(record));
response.EnsureSuccessStatusCode();
return (await response.Content.ReadFromJsonAsync(Options))!;
}
public static async Task Read(HttpResponseMessage response) =>
(await response.Content.ReadFromJsonAsync(Options))!;
public static IEnumerable<(Guid, int)> MembersOf(DrawingSetRecord record) =>
record.Members.Select(m => (m.DrawingId, m.Quantity));
/// Stores a draft nest directly and returns its id.
public static Guid AddNest(NestDatabase database, string name = "Synthetic nest") =>
database.Insert(Guid.NewGuid(), new NestRecord { Name = name, Status = NestStatus.Draft }, new byte[] { 1, 2, 3 }).Id;
public static async Task AddNest(HttpClient client, string name = "Synthetic nest", Guid? id = null)
{
var record = new NestRecord { Id = id ?? Guid.NewGuid(), Name = name, Status = NestStatus.Draft };
using var body = new MultipartFormDataContent
{
{ new StringContent(JsonSerializer.Serialize(record, Options), Encoding.UTF8, "application/json"), "metadata" },
{ new ByteArrayContent(new byte[] { 1, 2, 3 }), "file", "synthetic.nest" },
};
using var response = await client.PostAsync("/api/nests", body);
response.EnsureSuccessStatusCode();
return record.Id;
}
/// A release of making one nest per id, each in its own material.
public static SetReleaseRecord Release(int setRevision, params Guid[] nests) => new()
{
Id = Guid.NewGuid(),
SetRevision = setRevision,
Multiplier = 2,
Notes = "Synthetic release",
ReleasedBy = "Synthetic operator",
Nests = nests.Select((nest, i) => new SetReleaseNest
{
NestId = nest,
MaterialName = "Synthetic Steel " + i,
MaterialGrade = "Grade A",
Thickness = 0.25,
Units = Units.Inches,
CutType = CutType.Laser,
}).ToList(),
};
}