public void CallingGetEnumeratorTwiceThrows()
    {
        var mockClient = new MockTelegramBotClient();
        var receiver   = new BlockingUpdateReceiver(mockClient);

        _ = receiver.GetAsyncEnumerator();

        Assert.Throws <InvalidOperationException>(() => receiver.GetAsyncEnumerator());
    }
    public async Task MoveNextThrowsIfEnumeratorIsDisposed()
    {
        var mockClient = new MockTelegramBotClient("foo");
        var receiver   = new BlockingUpdateReceiver(mockClient);

        var enumerator = receiver.GetAsyncEnumerator();
        await enumerator.MoveNextAsync();

        await enumerator.DisposeAsync();

        await Assert.ThrowsAnyAsync <OperationCanceledException>(
            async() => await enumerator.MoveNextAsync()
            );
    }
    public async Task ThrowsOnMoveNextIfCancelled()
    {
        var mockClient = new MockTelegramBotClient("foo", "bar");
        var receiver   = new BlockingUpdateReceiver(mockClient);

        var cts = new CancellationTokenSource();

        await using var enumerator = receiver.GetAsyncEnumerator(cts.Token);

        Assert.True(await enumerator.MoveNextAsync());
        Assert.Equal("foo", enumerator.Current.Message !.Text);

        mockClient.Options.RequestDelay = 1000;
        cts.CancelAfter(200);

        await Assert.ThrowsAnyAsync <OperationCanceledException>(async() => await enumerator.MoveNextAsync());
    }
    public async Task ExceptionIsNotCaughtIfThereIsNoErrorHandler()
    {
        var mockClient = new MockTelegramBotClient
        {
            Options =
            {
                ExceptionToThrow = new("Oops")
            }
        };

        var receiver = new BlockingUpdateReceiver(mockClient);

        await using var enumerator = receiver.GetAsyncEnumerator();

        Exception ex = await Assert.ThrowsAsync <Exception>(async() => await enumerator.MoveNextAsync());

        Assert.Same(mockClient.Options.ExceptionToThrow, ex);
    }
    public async Task ReceivesOnlyOnMoveNextAsync()
    {
        var mockClient = new MockTelegramBotClient("foo", "bar");
        var receiver   = new BlockingUpdateReceiver(mockClient);

        Assert.Equal(2, mockClient.MessageGroupsLeft);

        await using var enumerator = receiver.GetAsyncEnumerator();

        Assert.Equal(2, mockClient.MessageGroupsLeft);

        Assert.True(await enumerator.MoveNextAsync());
        Assert.Equal("foo", enumerator.Current.Message !.Text);

        Assert.Equal(1, mockClient.MessageGroupsLeft);

        Assert.True(await enumerator.MoveNextAsync());
        Assert.Equal("bar", enumerator.Current.Message !.Text);

        Assert.Equal(0, mockClient.MessageGroupsLeft);
    }