The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/env perl
use lib 't/lib';
use strict;
use warnings;
use Test::More;
use Test::Exception;
use Catmandu::Fix;
use Catmandu::Importer::Mock;
use Cpanel::JSON::XS qw(decode_json);
use Catmandu::Util qw(:is);
use Capture::Tiny ':all';

my $pkg;

BEGIN {
    $pkg = 'Catmandu::Fix::Bind::hashmap';
    use_ok $pkg;
}
require_ok $pkg;

my $fixes = <<EOF;
do hashmap()
  add_field(foo,bar)
end
EOF

my $fixer = Catmandu::Fix->new(fixes => [$fixes]);

ok $fixer , 'create fixer';

is_deeply $fixer->fix({}), {foo => 'bar'}, 'testing add_field';

$fixes = <<EOF;
do hashmap()
end
EOF

$fixer = Catmandu::Fix->new(fixes => [$fixes]);

is_deeply $fixer->fix({foo => 'bar'}), {foo => 'bar'},
    'testing zero fix functions';

$fixes = <<EOF;
do hashmap()
  unless exists(foo)
    add_field(foo,bar)
  end
end
EOF

$fixer = Catmandu::Fix->new(fixes => [$fixes]);

is_deeply $fixer->fix({}), {foo => 'bar'}, 'testing unless';

$fixes = <<EOF;
do hashmap()
  if exists(foo)
    add_field(foo2,bar)
  end
end
EOF

$fixer = Catmandu::Fix->new(fixes => [$fixes]);

is_deeply $fixer->fix({foo => 'bar'}), {foo => 'bar', foo2 => 'bar'},
    'testing if';

$fixes = <<EOF;
do hashmap()
  select exists(foo)
end
EOF

$fixer = Catmandu::Fix->new(fixes => [$fixes]);

is_deeply $fixer->fix({foo => 'bar'}), {foo => 'bar'}, 'testing select';

$fixes = <<EOF;
do hashmap()
 do hashmap()
  do hashmap()
   add_field(foo,bar)
  end
 end
end
EOF

$fixer = Catmandu::Fix->new(fixes => [$fixes]);

is_deeply $fixer->fix({foo => 'bar'}), {foo => 'bar'}, 'testing nesting';

$fixes = <<EOF;
add_field(before,ok)
do hashmap()
   add_field(inside,ok)
end
add_field(after,ok)
EOF

$fixer = Catmandu::Fix->new(fixes => [$fixes]);

is_deeply $fixer->fix({foo => 'bar'}),
    {foo => 'bar', before => 'ok', inside => 'ok', after => 'ok'},
    'before/after testing';

# Specific tests
{
    my ($stdout, $stderr, $exit) = capture {
        $fixes = <<EOF;
  do hashmap(exporter: CSV, join: ',')
   do identity()
    copy_field(isbn,key)
    copy_field(_id,value)
   end
  end
EOF
        $fixer = Catmandu::Fix->new(fixes => [$fixes]);
        $fixer->fix(
            [
                {_id => 1, isbn => '1234567890'},
                {_id => 2, isbn => '1234567890'},
                {_id => 3, isbn => '0987654321'},
            ]
        );
        undef($fixer);
    };

    my $exp = <<EOF;
_id,value
0987654321,3
1234567890,"1,2"
EOF

    is $stdout , $exp, 'grouping isbn join';
}

{
    my ($stdout, $stderr, $exit) = capture {
        $fixes = <<EOF;
  do hashmap(exporter: JSON, uniq: 1)
   do identity()
    copy_field(isbn,key)
    copy_field(_id,value)
   end
  end
EOF
        $fixer = Catmandu::Fix->new(fixes => [$fixes]);
        $fixer->fix(
            [
                {_id => 1, isbn => '1234567890'},
                {_id => 2, isbn => '1234567890'},
                {_id => 3, isbn => '0987654321'},
            ]
        );
        undef($fixer);
    };

    my $exp
        = '[{"_id":"0987654321","value":["3"]},{"_id":"1234567890","value":["1","2"]}]';

    is_deeply decode_json($stdout), decode_json($exp), 'grouping isbn uniq';
}

{
    my ($stdout, $stderr, $exit) = capture {
        $fixes = <<EOF;
  do hashmap(exporter: CSV, count: 1)
   do identity()
    copy_field(isbn,key)
    copy_field(_id,value)
   end
  end
EOF
        $fixer = Catmandu::Fix->new(fixes => [$fixes]);
        $fixer->fix(
            [
                {_id => 1, isbn => '1234567890'},
                {_id => 2, isbn => '1234567890'},
                {_id => 3, isbn => '0987654321'},
            ]
        );
        undef($fixer);
    };

    my $exp = <<EOF;
_id,value
1234567890,2
0987654321,1
EOF

    is $stdout , $exp, 'grouping isbn count';
}

done_testing;