App-migrate

 view release on metacpan or  search on metacpan

t/example.t  view on Meta::CPAN

use strict;
use POSIX qw(locale_h); BEGIN { setlocale(LC_MESSAGES,'en_US.UTF-8') } # avoid UTF-8 in $!
use Test::More;
use Test::Exception;
use Test::Output qw( :all );
use Path::Tiny qw( path tempdir tempfile );
use App::migrate;

plan skip_all => 'pgrep not installed'      if !grep {-x "$_/pgrep"} split /:/, $ENV{PATH};


my $migrate = App::migrate->new;
my $file    = tempfile('migrate.XXXXXX');

my $proj    = tempdir('migrate.project.XXXXXX');
my $guard   = bless {};
sub DESTROY { chdir q{/} }
chdir $proj or die "chdir($proj): $!";

my (@backup, @restore);
$migrate->on(BACKUP  => sub { push @backup,  shift->{version} });
$migrate->on(RESTORE => sub { push @restore, shift->{version} });
$migrate->on(error   => sub { diag 'on ERROR was called'      });

ok $migrate, 'new';

# Make sure example from documentation actually works
$file->spew_utf8(<<'MIGRATE');
VERSION 0.0.0
# To upgrade from 0.0.0 to 0.1.0 we need to create new empty file and
# empty directory.
upgrade     touch   empty_file
downgrade   rm      empty_file
upgrade     mkdir   empty_dir
downgrade   rmdir   empty_dir
VERSION 0.1.0
# To upgrade from 0.1.0 to 0.2.0 we need to drop old database. This
# change can't be undone, so only way to downgrade from 0.2.0 is to
# restore 0.1.0 from backup.
upgrade     rm      useless.db
RESTORE
VERSION 0.2.0
# To upgrade from 0.2.0 to 1.0.0 we need to run several commands,
# and after downgrading we need to kill some background service.
before_upgrade
  patch -E   <0.2.0.patch >/dev/null
  rm -f *.orig
  chmod +x some_daemon
downgrade
  patch -E -R <0.2.0.patch >/dev/null
  rm -f *.orig
upgrade
  ./some_daemon &
after_downgrade
  pkill -9 -x -f '/bin/sh ./some_daemon'
VERSION 1.0.0

# Let's define some lazy helpers:
DEFINE2 only_upgrade
upgrade
downgrade true

DEFINE2 mkdir
upgrade
  mkdir "$@"
downgrade
  rm -rf "$@"

# ... and use it:
only_upgrade
  echo "Just upgraded to $MIGRATE_NEXT_VERSION"

VERSION 1.0.1

# another lazy macro (must be defined above in same file)
mkdir dir1 dir2

VERSION 1.1.0
MIGRATE

lives_ok { $migrate->load($file) } 'load';

subtest '0.0.0 <-> 0.1.0', sub {
    ok !$proj->children,                    'proj is empty';
    run('0.0.0' => '0.1.0');
    is $proj->children, 2,                  'proj is not empty:';
    ok $proj->child('empty_file')->is_file, '... has empty_file';
    ok $proj->child('empty_dir')->is_dir,   '... has empty_dir/';

    run('0.1.0' => '0.0.0');
    ok !$proj->children,                    'proj is empty';

    done_testing;
};

subtest '0.1.0 <-> 0.2.0', sub {
    path('useless.db')->touch;
    ok -e 'useless.db', 'created useless.db';
    run('0.1.0' => '0.2.0');
    ok !-e 'useless.db', 'useless.db was removed';

    run('0.2.0' => '0.1.0');
    is_deeply \@restore, [qw(0.1.0)], '... RESTORE 0.1.0';

    done_testing;
};

subtest '0.2.0 <-> 1.0.0', sub {



( run in 1.845 second using v1.01-cache-2.11-cpan-39bf76dae61 )