Hypersonic

 view release on metacpan or  search on metacpan

t/0003-server.t  view on Meta::CPAN

    my $sock = IO::Socket::INET->new(
        PeerAddr => '127.0.0.1',
        PeerPort => $port,
        Proto    => 'tcp',
        Timeout  => 5,
    );

    return undef unless $sock;

    my $content_length = length($body);
    my $request = "$method $path HTTP/1.1\r\n"
                . "Host: localhost:$port\r\n"
                . "Content-Length: $content_length\r\n"
                . "Connection: close\r\n"
                . "\r\n"
                . $body;

    print $sock $request;

    my $response = '';
    while (my $line = <$sock>) {
        $response .= $line;
    }
    close($sock);

    return $response;
}

# Run tests
my $resp;

# Test 1: Basic GET request
$resp = http_request('GET', '/test');
ok($resp, 'Got response for GET /test');
like($resp, qr/HTTP\/1\.1 200 OK/, 'GET /test returns 200');
like($resp, qr/Hello from Hypersonic!/, 'GET /test has correct body');

# Test 2: JSON response
$resp = http_request('GET', '/json');
ok($resp, 'Got response for GET /json');
like($resp, qr/Content-Type: application\/json/, 'JSON content type');
like($resp, qr/"status":"ok"/, 'JSON body correct');

# Test 3: POST request
$resp = http_request('POST', '/echo', '{"data":"test"}');
ok($resp, 'Got response for POST /echo');
like($resp, qr/HTTP\/1\.1 200 OK/, 'POST returns 200');
like($resp, qr/"echo":"received"/, 'POST body correct');

# Test 4: 404 for unknown route
$resp = http_request('GET', '/unknown');
ok($resp, 'Got response for unknown route');
like($resp, qr/HTTP\/1\.1 404/, '404 for unknown route');
like($resp, qr/Not Found/, '404 body');

# Test 5: 404 for wrong method
$resp = http_request('DELETE', '/test');
ok($resp, 'Got response for wrong method');
like($resp, qr/HTTP\/1\.1 404/, '404 for wrong method');

# Test 6: Multiple requests (keep-alive simulation)
for my $i (1..5) {
    $resp = http_request('GET', '/test');
    ok($resp, "Request $i successful");
    like($resp, qr/200 OK/, "Request $i returns 200");
}

# Cleanup
kill('TERM', $pid);
waitpid($pid, 0);

# Clean up cache
do { local $@; eval { require File::Path; File::Path::remove_tree($_, { safe => 1, error => \my $e }) for grep { -e $_ } glob(qq($cache_dir)); }; };

done_testing();



( run in 2.770 seconds using v1.01-cache-2.11-cpan-97f6503c9c8 )