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::More tests => 1;
use Test::Deep;
use Data::InputMonster;
use Data::InputMonster::Util::Catalyst '-all';

my $monster = Data::InputMonster->new({
  fields => {
    abc   => { sources => [ query_param        ] }, # get default name
    abc_2 => { sources => [ query_param('abc') ] }, # explicit name
    abc_3 => { sources => [ form_param('abc')  ] }, # from merged stuff
    ABC   => { sources => [ body_param('abc')  ] }, # no such body field

    ses_1 => { sources => [ session_entry('num')   ] }, # simple session
    ses_2 => { sources => [ session_entry(['num']) ] }, # simple session
    ses_3 => { sources => [ session_entry(sub{$_[0]->{num}}) ] }, # code
  }
});

my $output = $monster->consume('FakeCatalyst');

cmp_deeply(
  $output,
  {
    abc   => 1,
    abc_2 => 1,
    abc_3 => 1,
    ABC   => undef,

    ses_1 => 8675309,
    ses_2 => 8675309,
    ses_3 => 8675309,
  },
  'we got all the info out of our fake $c',
);

BEGIN {
  package FakeCatalyst;
  sub req { 'FakeCatalystReq' }

  my $session = {
    num => 8675309,
    foo => {
      x => [ 10, 20, 30 ],
      y => [ 11, 22, 33 ],
    },
  };

  sub session { $session }

  package FakeCatalystReq;
  my %query_param = (abc => 1, def => 2);
  my %body_param  = (uvw => 3, xyz => 4);
  sub query_params { \%query_param }
  sub body_params  { \%body_param  }
  sub params       { return { %query_param, %body_param } }
}