PAGI-Server

 view release on metacpan or  search on metacpan

t/integration/psgi-bridge.t  view on Meta::CPAN

};

# Test 5: PSGI filehandle body response works
subtest 'PSGI filehandle body response works' => sub {
    my $content = "Hello from filehandle";
    open my $fh, '<', \$content;

    my $fh_body_psgi = sub {
        my ($env) = @_;
        open my $body_fh, '<', \$content;
        return [200, ['Content-Type' => 'text/plain'], $body_fh];
    };

    my $wrapper = PAGI::App::WrapPSGI->new(psgi_app => $fh_body_psgi);
    my $pagi_app = $wrapper->to_app;

    # Wrap with lifespan handler
    my $wrapped_app = async sub  {
        my ($scope, $receive, $send) = @_;
        if ($scope->{type} eq 'lifespan') {
            while (1) {
                my $event = await $receive->();
                if ($event->{type} eq 'lifespan.startup') {
                    await $send->({ type => 'lifespan.startup.complete' });
                }
                elsif ($event->{type} eq 'lifespan.shutdown') {
                    await $send->({ type => 'lifespan.shutdown.complete' });
                    last;
                }
            }
            return;
        }
        await $pagi_app->($scope, $receive, $send);
    };

    my $server = PAGI::Server->new(
        app   => $wrapped_app,
        host  => '127.0.0.1',
        port  => 0,
        quiet => 1,
    );

    $loop->add($server);
    $server->listen->get;

    my $port = $server->port;

    my $http = Net::Async::HTTP->new;
    $loop->add($http);

    my $response = $http->GET("http://127.0.0.1:$port/")->get;

    is($response->code, 200, 'Response status is 200 OK');
    is($response->decoded_content, 'Hello from filehandle', 'Filehandle body is read correctly');

    $server->shutdown->get;
    $loop->remove($server);
    $loop->remove($http);
};

# Test 6: PSGI streaming response (coderef body) works
subtest 'PSGI streaming response (coderef body) works' => sub {
    my $streaming_psgi = sub {
        my ($env) = @_;
        return sub {
            my ($responder) = @_;
            # Immediate response with streaming body
            my $writer = $responder->([200, ['Content-Type' => 'text/plain']]);
            $writer->write("Streaming ");
            $writer->write("response");
            $writer->close;
        };
    };

    my $wrapper = PAGI::App::WrapPSGI->new(psgi_app => $streaming_psgi);
    my $pagi_app = $wrapper->to_app;

    # Wrap with lifespan handler
    my $wrapped_app = async sub  {
        my ($scope, $receive, $send) = @_;
        if ($scope->{type} eq 'lifespan') {
            while (1) {
                my $event = await $receive->();
                if ($event->{type} eq 'lifespan.startup') {
                    await $send->({ type => 'lifespan.startup.complete' });
                }
                elsif ($event->{type} eq 'lifespan.shutdown') {
                    await $send->({ type => 'lifespan.shutdown.complete' });
                    last;
                }
            }
            return;
        }
        await $pagi_app->($scope, $receive, $send);
    };

    my $server = PAGI::Server->new(
        app   => $wrapped_app,
        host  => '127.0.0.1',
        port  => 0,
        quiet => 1,
    );

    $loop->add($server);
    $server->listen->get;

    my $port = $server->port;

    my $http = Net::Async::HTTP->new;
    $loop->add($http);

    my $response = $http->GET("http://127.0.0.1:$port/")->get;

    is($response->code, 200, 'Streaming response status is 200 OK');
    is($response->decoded_content, 'Streaming response', 'Streaming body is collected correctly');

    $server->shutdown->get;
    $loop->remove($server);
    $loop->remove($http);
};

done_testing;



( run in 0.571 second using v1.01-cache-2.11-cpan-995e09ba956 )