private static void AssertTrailOnResponse()

in src/Elastic.Transport.VirtualizedCluster/Audit/Auditor.cs [232:266]


	private static void AssertTrailOnResponse(ClientCall callTrace, IEnumerable<Diagnostics.Auditing.Audit> auditTrail, bool sync, int nthCall)
	{
		var typeOfTrail = (sync ? "synchronous" : "asynchronous") + " audit trail";
		var nthClientCall = (nthCall + 1).ToOrdinal();

		var actualAuditTrail = auditTrail.Aggregate(new StringBuilder(Environment.NewLine),
			(sb, a) => sb.AppendLine($"-> {a}"),
			sb => sb.ToString());

		var traceEvents = callTrace.Select(c => c.Event).ToList();
		var auditEvents = auditTrail.Select(a => a.Event).ToList();
		if (!traceEvents.SequenceEqual(auditEvents))
			throw new Exception($"the {nthClientCall} client call's {typeOfTrail} should assert ALL audit trail items{actualAuditTrail}");

		foreach (var t in auditTrail.Select((a, i) => new { a, i }))
		{
			var i = t.i;
			var audit = t.a;
			var nthAuditTrailItem = (i + 1).ToOrdinal();
			var because = $"thats the {{0}} specified on the {nthAuditTrailItem} item in the {nthClientCall} client call's {typeOfTrail}";
			var c = callTrace[i];
			if (audit.Event != c.Event)
				throw new Exception(string.Format(because, "event"));
			if (c.Port.HasValue && audit.Node.Uri.Port != c.Port.Value)
				throw new Exception(string.Format(because, "port"));

			c.SimpleAssert?.Invoke(audit);
			c.AssertWithBecause?.Invoke(string.Format(because, "custom assertion"), audit);
		}

		if (auditTrail is ICollection<Diagnostics.Auditing.Audit> at && callTrace.Count != at.Count)
			throw new Exception($"callTrace has {callTrace.Count} items. Actual auditTrail {actualAuditTrail}");
		else if (callTrace.Count != auditTrail.Count())
			throw new Exception($"callTrace has {callTrace.Count} items. Actual auditTrail {actualAuditTrail}");
	}