public async Task ShouldNotSendAcknowledgeReceived_WhenMessageDoesNotHaveMetadata(
        [Frozen] Mock <IConnection> connection,
        ReceivedAcknowledgingConnection sut)
    {
        await sut.ReceiveAsync(Cts.Token);

        connection.Verify(x => x.SendAsync(It.IsAny <object>(), Cts.Token), Times.Never);
    }
    public async Task ShouldSendAsUsual(
        object message,
        [Frozen] Mock <IConnection> connection,
        ReceivedAcknowledgingConnection sut)
    {
        await sut.SendAsync(message, Cts.Token);

        connection.Verify(x => x.SendAsync(message, Cts.Token));
    }
    public async Task ShouldNotSendAcknowledgeReceived_WhenAcknowledgementTypeIsNotReceived(
        AcknowledgementType acknowledgementType,
        MessageWithMetadata message,
        [Frozen] Mock <IConnection> connection,
        ReceivedAcknowledgingConnection sut)
    {
        connection.Setup(x => x.ReceiveAsync(Cts.Token))
        .ReturnsAsync(message);

        message.Metadata !.AcknowledgementType = acknowledgementType;

        await sut.ReceiveAsync(Cts.Token);

        connection.Verify(x => x.SendAsync(It.IsAny <object>(), Cts.Token), Times.Never);
    }
    public async Task ShouldNotSendAcknowledgeReceived_WhenMessageHasId_AndAcknowledgementTypeIsReceived_ButMessageIsAcknowledgement(
        MessageWithMetadata message,
        [Frozen] Mock <IConnection> connection,
        ReceivedAcknowledgingConnection sut)
    {
        connection.Setup(x => x.ReceiveAsync(Cts.Token))
        .ReturnsAsync(message);

        message.Metadata !.AcknowledgementType = AcknowledgementType.Received;

        message.Message = new AcknowledgeReceived();
        await sut.ReceiveAsync(Cts.Token);

        message.Message = new AcknowledgeHandled();
        await sut.ReceiveAsync(Cts.Token);

        connection.Verify(x => x.SendAsync(It.IsAny <object>(), Cts.Token), Times.Never);
    }
    public async Task ShouldSendAcknowledgeReceived_WhenMessageHasId_AndAcknowledgementTypeIsReceived(
        MessageWithMetadata message,
        [Frozen] Mock <IConnection> connection,
        ReceivedAcknowledgingConnection sut)
    {
        connection.Setup(x => x.ReceiveAsync(Cts.Token))
        .ReturnsAsync(message);

        message.Metadata !.AcknowledgementType = AcknowledgementType.Received;

        await sut.ReceiveAsync(Cts.Token);

#pragma warning disable S2219 // Runtime type checking should be simplified
        connection.Verify(x => x.SendAsync(
                              It.Is <MessageWithMetadata>(
                                  y => y.Message.GetType() == typeof(AcknowledgeReceived) &&
                                  ((AcknowledgeReceived)y.Message).MessageId == message.Metadata.MessageId &&
                                  y.Metadata !.MessageId == message.Metadata.MessageId),
                              Cts.Token));
#pragma warning restore S2219
    }