The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use lib qw(lib t/lib);
use Test::More;
use Net::Braintree::TestHelper;

{
package Net::Braintree::AdvancedSearchTest;
use Moose;
use Net::Braintree::AdvancedSearch qw(search_to_hash);
my $meta = __PACKAGE__->meta();

my $field = Net::Braintree::AdvancedSearchFields->new(metaclass => $meta);
$field->text("billing_company");
$field->equality("credit_card_expiration_date");
$field->range("amount");
$field->text("order_id");
$field->multiple_values("created_using", "full_information", "token");
$field->multiple_values("ids");
$field->key_value("refund");



1;
}

subtest "search_to_hash" => sub {
  subtest "empty if search is empty" => sub {
    my $search = Net::Braintree::AdvancedSearchTest->new;
    is_deeply(Net::Braintree::AdvancedSearch->search_to_hash($search), {});
  };

  subtest "is method" => sub {
    my $search = Net::Braintree::AdvancedSearchTest->new;
    $search->credit_card_expiration_date->is("foo");
    is_deeply(Net::Braintree::AdvancedSearch->search_to_hash($search), {credit_card_expiration_date => {is => "foo"}});
  };
};
subtest "Equality Nodes" => sub {
  { my $search = Net::Braintree::AdvancedSearchTest->new;
    $search->order_id->is("2132");
    $result_hash = Net::Braintree::AdvancedSearch->search_to_hash($search);
    is $result_hash->{'order_id'}->{'is'}, "2132";
  }

  { my $search = Net::Braintree::AdvancedSearchTest->new;
    $search->credit_card_expiration_date->is_not("12/11");
    $result_hash = Net::Braintree::AdvancedSearch->search_to_hash($search);
    is $result_hash->{'credit_card_expiration_date'}->{'is_not'}, "12/11";
  }

  { my $search = Net::Braintree::AdvancedSearchTest->new;
    should_throw("Can't locate object method \"starts_with\"", sub {
      $search->credit_card_expiration_date->starts_with("12");
    })
  }

  subtest "Overrides is with new value" => sub {
    my $search = Net::Braintree::AdvancedSearchTest->new;
    $search->order_id->is("2132");
    $search->order_id->is("4376");
    $result_hash = Net::Braintree::AdvancedSearch->search_to_hash($search);
    is $result_hash->{'order_id'}->{'is'}, "4376";
  }
};

subtest "Partial Matches" => sub {
  { my $search = Net::Braintree::AdvancedSearchTest->new;
    $search->billing_company->starts_with("Brain");
    $result_hash = Net::Braintree::AdvancedSearch->search_to_hash($search);
    is $result_hash->{'billing_company'}->{'starts_with'}, "Brain";
  }
};

subtest "Text" => sub {
  { my $search = Net::Braintree::AdvancedSearchTest->new;
    $search->billing_company->contains("12345");
    $result_hash = Net::Braintree::AdvancedSearch->search_to_hash($search);
    is $result_hash->{'billing_company'}->{'contains'}, "12345";
  }
};

subtest "Range Nodes" => sub {
  { my $search = Net::Braintree::AdvancedSearchTest->new;
    $search->amount >= ("10.01");
    $result_hash = Net::Braintree::AdvancedSearch->search_to_hash($search);
    is $result_hash->{'amount'}->{'min'}, "10.01", "Minimum"
  }

  { my $search = Net::Braintree::AdvancedSearchTest->new;
    $search->amount <= ("10.01");
    $result_hash = Net::Braintree::AdvancedSearch->search_to_hash($search);
    is $result_hash->{'amount'}->{'max'}, "10.01", "Maximum";
  }

  { my $search = Net::Braintree::AdvancedSearchTest->new;
    $search->amount->between("10.00", "10.02");
    $result_hash = Net::Braintree::AdvancedSearch->search_to_hash($search);
    is $result_hash->{'amount'}->{'min'}, "10.00", "Between Min";
    is $result_hash->{'amount'}->{'max'}, "10.02", "Between Max";
  }
};

subtest "Key Value Nodes" => sub {
  { my $search = Net::Braintree::AdvancedSearchTest->new;
    $search->refund->is("10.00");;
    $result_hash = Net::Braintree::AdvancedSearch->search_to_hash($search);
    is $result_hash->{'refund'}, "10.00";
  }
};

subtest "Multiple Values Nodes" => sub {
  { my $search = Net::Braintree::AdvancedSearchTest->new;
    $search->created_using->is("token");
    $result_hash = Net::Braintree::AdvancedSearch->search_to_hash($search);
    is_deeply $result_hash->{'created_using'}, ["token"];
  }

  {
    my $ids = [1, 2, 3];
    my $search = Net::Braintree::AdvancedSearchTest->new;
    $search->ids->in($ids);
    $result_hash = Net::Braintree::AdvancedSearch->search_to_hash($search);
    is_deeply $result_hash->{'ids'}, [1, 2, 3];
  }

  { my $search = Net::Braintree::AdvancedSearchTest->new;
    $search->created_using->in("token", "full_information");
    $result_hash = Net::Braintree::AdvancedSearch->search_to_hash($search);
    is_deeply $result_hash->{'created_using'}, ["token", "full_information"];
  }

  { my $search = Net::Braintree::AdvancedSearchTest->new;
    should_throw "Invalid Argument\\(s\\) for created_using: invalid value", sub {
      $search->created_using->in("token", "invalid value");
    }
  }

  { my $search = Net::Braintree::AdvancedSearchTest->new;
    should_throw "Invalid Argument\\(s\\) for created_using: invalid value, foobar", sub {
      $search->created_using->is("invalid value", "foobar");
    }
  }
};

done_testing();