using System.Diagnostics; namespace NATS.Server.JetStream.Tests; public class JetStreamApiInventoryTests { [Fact] public void Go_inventory_contains_api_subjects_not_yet_mapped_in_dotnet() { var inventory = JetStreamApiInventory.LoadFromGoConstants(); inventory.GoSubjects.ShouldContain("$JS.API.STREAM.UPDATE.*"); inventory.GoSubjects.ShouldContain("$JS.API.CONSUMER.MSG.NEXT.*.*"); inventory.GoSubjects.Count.ShouldBeGreaterThan(20); } } internal sealed class JetStreamApiInventory { public IReadOnlyList GoSubjects { get; } private JetStreamApiInventory(IReadOnlyList goSubjects) { GoSubjects = goSubjects; } public static JetStreamApiInventory LoadFromGoConstants() { var script = Path.Combine(AppContext.BaseDirectory, "../../../../../scripts/jetstream/extract-go-js-api.sh"); script = Path.GetFullPath(script); if (!File.Exists(script)) throw new FileNotFoundException($"missing script: {script}"); var psi = new ProcessStartInfo { FileName = "bash", RedirectStandardOutput = true, RedirectStandardError = true, }; psi.ArgumentList.Add(script); using var process = Process.Start(psi) ?? throw new InvalidOperationException("failed to start inventory script"); var output = process.StandardOutput.ReadToEnd(); var errors = process.StandardError.ReadToEnd(); process.WaitForExit(); if (process.ExitCode != 0) throw new InvalidOperationException($"inventory script failed: {errors}"); var subjects = output .Split('\n', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries) .ToList(); return new JetStreamApiInventory(subjects); } }