The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
use Test::Requires qw(Module::Refresh);
use File::Spec;
use File::Temp;
use HTTP::Request::Common;
use Plack::Middleware::Refresh;
use Plack::Test;
use Test::More;

sub write_file($$){
    my ( $path, $content ) = @_;
    open my $out, '>', $path or die "$path: $!";
    print $out $content;
}

my $tmpdir  = File::Temp::tempdir( CLEANUP => 1 );
my $pm_file = File::Spec->catfile($tmpdir, 'SomeModule.pm');
write_file $pm_file, qq/sub SomeModule::hello {'...'}; 1;\n/;

# Load SomeModule
unshift @INC, $tmpdir;
require SomeModule;

my $app = Plack::Middleware::Refresh->wrap(sub {
    [200, [ 'X-SomeModule' => SomeModule->hello ], ["OK\n"]]
}, cooldown => 0 );

test_psgi $app, sub {
    my $cb = shift;

    # Change SomeModule before the server gets requests.
    sleep 1;
    write_file $pm_file, qq/sub SomeModule::hello {'Hi.'}; 1;\n/;
    my $res = $cb->(GET "/");
    is $res->header('X-SomeModule'), 'Hi.';

    # Change again.
    sleep 1;
    write_file $pm_file, qq/sub SomeModule::hello {'Good-bye.'}; 1;\n/;
    $res = $cb->(GET "/");
    is $res->header('X-SomeModule'), 'Good-bye.';
};

done_testing;