@NonNull
    protected Mono<ContentVo> extendPostContent(Post post,
        ContentWrapper wrapper) {
        Assert.notNull(post, "Post name must not be null");
        Assert.notNull(wrapper, "Post content must not be null");
        return extensionGetter.getEnabledExtensions(ReactivePostContentHandler.class)
            .reduce(Mono.fromSupplier(() -> ReactivePostContentHandler.PostContentContext.builder()
                    .post(post)
                    .content(wrapper.getContent())
                    .raw(wrapper.getRaw())
                    .rawType(wrapper.getRawType())
                    .build()
                ),
                (contentMono, handler) -> contentMono.flatMap(handler::handle)
            )
            .flatMap(Function.identity())
            .map(postContent -> ContentVo.builder()
                .content(postContent.getContent())
                .raw(postContent.getRaw())
                .build()
            );
    }
@Test
    void extendPostContent() {
        when(extensionGetter.getEnabledExtensions(
            eq(ReactivePostContentHandler.class))).thenReturn(
            Flux.just(new PostContentHandlerB(), new PostContentHandlerA(),
                new PostContentHandlerC()));
        Post post = TestPost.postV1();
        post.getMetadata().setName("fake-post");
        ContentWrapper contentWrapper =
            ContentWrapper.builder().content("fake-content").raw("fake-raw").rawType("markdown")
                .build();
        postPublicQueryService.extendPostContent(post, contentWrapper)
            .as(StepVerifier::create).consumeNextWith(contentVo -> {
                assertThat(contentVo.getContent()).isEqualTo("fake-content-B-A-C");
            }).verifyComplete();
    }